|
@@ -315,8 +315,7 @@ out:
|
|
|
*
|
|
|
* Wrap the given skb into a batman-adv unicast or unicast-4addr header
|
|
|
* depending on whether BATADV_UNICAST or BATADV_UNICAST_4ADDR was supplied
|
|
|
- * as packet_type. Then send this frame to the given orig_node and release a
|
|
|
- * reference to this orig_node.
|
|
|
+ * as packet_type. Then send this frame to the given orig_node.
|
|
|
*
|
|
|
* Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
|
|
|
*/
|
|
@@ -370,8 +369,6 @@ int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
|
|
|
ret = NET_XMIT_SUCCESS;
|
|
|
|
|
|
out:
|
|
|
- if (orig_node)
|
|
|
- batadv_orig_node_put(orig_node);
|
|
|
if (ret == NET_XMIT_DROP)
|
|
|
kfree_skb(skb);
|
|
|
return ret;
|
|
@@ -403,6 +400,7 @@ int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv,
|
|
|
struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
|
|
|
struct batadv_orig_node *orig_node;
|
|
|
u8 *src, *dst;
|
|
|
+ int ret;
|
|
|
|
|
|
src = ethhdr->h_source;
|
|
|
dst = ethhdr->h_dest;
|
|
@@ -414,8 +412,13 @@ int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv,
|
|
|
}
|
|
|
orig_node = batadv_transtable_search(bat_priv, src, dst, vid);
|
|
|
|
|
|
- return batadv_send_skb_unicast(bat_priv, skb, packet_type,
|
|
|
- packet_subtype, orig_node, vid);
|
|
|
+ ret = batadv_send_skb_unicast(bat_priv, skb, packet_type,
|
|
|
+ packet_subtype, orig_node, vid);
|
|
|
+
|
|
|
+ if (orig_node)
|
|
|
+ batadv_orig_node_put(orig_node);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -433,10 +436,16 @@ int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
|
unsigned short vid)
|
|
|
{
|
|
|
struct batadv_orig_node *orig_node;
|
|
|
+ int ret;
|
|
|
|
|
|
orig_node = batadv_gw_get_selected_orig(bat_priv);
|
|
|
- return batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST_4ADDR,
|
|
|
- BATADV_P_DATA, orig_node, vid);
|
|
|
+ ret = batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST_4ADDR,
|
|
|
+ BATADV_P_DATA, orig_node, vid);
|
|
|
+
|
|
|
+ if (orig_node)
|
|
|
+ batadv_orig_node_put(orig_node);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/**
|