icmph->ttl = BATADV_TTL;
 
                res = batadv_send_skb_to_orig(skb, orig_node, NULL);
-               if (res == -1)
-                       goto out;
-
                ret = NET_RX_SUCCESS;
 
                break;
        icmp_packet->ttl = BATADV_TTL;
 
        res = batadv_send_skb_to_orig(skb, orig_node, NULL);
-       if (res != -1)
-               ret = NET_RX_SUCCESS;
+       ret = NET_RX_SUCCESS;
 
 out:
        if (primary_if)
 
        /* route it */
        res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
-       if (res != -1)
-               ret = NET_RX_SUCCESS;
+       ret = NET_RX_SUCCESS;
 
 out:
        if (orig_node)
 
        len = skb->len;
        res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
-       if (res == -1)
-               goto out;
 
        /* translate transmit result into receive result */
        if (res == NET_XMIT_SUCCESS) {
 
  * host, NULL can be passed as recv_if and no interface alternating is
  * attempted.
  *
- * Return: -1 on failure (and the skb is not consumed), -EINPROGRESS if the
- * skb is buffered for later transmit or the NET_XMIT status returned by the
+ * Return: negative errno code on a failure, -EINPROGRESS if the skb is
+ * buffered for later transmit or the NET_XMIT status returned by the
  * lower routine if the packet has been passed down.
- *
- * If the returning value is not -1 the skb has been consumed.
  */
 int batadv_send_skb_to_orig(struct sk_buff *skb,
                            struct batadv_orig_node *orig_node,
 {
        struct batadv_priv *bat_priv = orig_node->bat_priv;
        struct batadv_neigh_node *neigh_node;
-       int ret = -1;
+       int ret;
 
        /* batadv_find_router() increases neigh_nodes refcount if found. */
        neigh_node = batadv_find_router(bat_priv, orig_node, recv_if);
-       if (!neigh_node)
-               goto out;
+       if (!neigh_node) {
+               ret = -EINVAL;
+               goto free_skb;
+       }
 
        /* Check if the skb is too large to send in one piece and fragment
         * it if needed.
            skb->len > neigh_node->if_incoming->net_dev->mtu) {
                /* Fragment and send packet. */
                ret = batadv_frag_send_packet(skb, orig_node, neigh_node);
+               /* skb was consumed */
+               skb = NULL;
 
-               goto out;
+               goto put_neigh_node;
        }
 
        /* try to network code the packet, if it is received on an interface
        else
                ret = batadv_send_unicast_skb(skb, neigh_node);
 
-out:
-       if (neigh_node)
-               batadv_neigh_node_put(neigh_node);
+       /* skb was consumed */
+       skb = NULL;
+
+put_neigh_node:
+       batadv_neigh_node_put(neigh_node);
+free_skb:
+       kfree_skb(skb);
 
        return ret;
 }
 {
        struct batadv_unicast_packet *unicast_packet;
        struct ethhdr *ethhdr;
-       int res, ret = NET_XMIT_DROP;
+       int ret = NET_XMIT_DROP;
 
        if (!orig_node)
                goto out;
        if (batadv_tt_global_client_is_roaming(bat_priv, ethhdr->h_dest, vid))
                unicast_packet->ttvn = unicast_packet->ttvn - 1;
 
-       res = batadv_send_skb_to_orig(skb, orig_node, NULL);
-       if (res != -1)
-               ret = NET_XMIT_SUCCESS;
+       ret = batadv_send_skb_to_orig(skb, orig_node, NULL);
+        /* skb was consumed */
+       skb = NULL;
 
 out:
-       if (ret == NET_XMIT_DROP)
-               kfree_skb(skb);
+       kfree_skb(skb);
        return ret;
 }
 
 
        batadv_tp_fill_prerandom(tp_vars, data, data_len);
 
        r = batadv_send_skb_to_orig(skb, orig_node, NULL);
-       if (r == -1)
-               kfree_skb(skb);
-
        if (r == NET_XMIT_SUCCESS)
                return 0;
 
 
        /* send the ack */
        r = batadv_send_skb_to_orig(skb, orig_node, NULL);
-       if (r == -1)
-               kfree_skb(skb);
-
        if (unlikely(r < 0) || (r == NET_XMIT_DROP)) {
                ret = BATADV_TP_REASON_DST_UNREACHABLE;
                goto out;
 
        unsigned char *tvlv_buff;
        unsigned int tvlv_len;
        ssize_t hdr_len = sizeof(*unicast_tvlv_packet);
-       int res;
 
        orig_node = batadv_orig_hash_find(bat_priv, dst);
        if (!orig_node)
        tvlv_buff += sizeof(*tvlv_hdr);
        memcpy(tvlv_buff, tvlv_value, tvlv_value_len);
 
-       res = batadv_send_skb_to_orig(skb, orig_node, NULL);
-       if (res == -1)
-               kfree_skb(skb);
+       batadv_send_skb_to_orig(skb, orig_node, NULL);
 out:
        batadv_orig_node_put(orig_node);
 }