Commit 815cc21d authored by David S. Miller's avatar David S. Miller

Merge tag 'batadv-next-pullrequest-20210819' of git://git.open-mesh.org/linux-merge

Simon Wunderlich says:

====================
This cleanup patchset includes the following patches:

 - bump version strings, by Simon Wunderlich

 - update docs about move IRC channel away from freenode,
   by Sven Eckelmann

 - Switch to kstrtox.h for kstrtou64, by Sven Eckelmann

 - Update NULL checks, by Sven Eckelmann (2 patches)

 - remove remaining skb-copy calls for broadcast packets,
   by Linus Lüssing
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents f444fea7 808cfdfa
...@@ -157,7 +157,7 @@ Contact ...@@ -157,7 +157,7 @@ Contact
Please send us comments, experiences, questions, anything :) Please send us comments, experiences, questions, anything :)
IRC: IRC:
#batman on irc.freenode.org #batadv on ircs://irc.hackint.org/
Mailing-list: Mailing-list:
b.a.t.m.a.n@open-mesh.org (optional subscription at b.a.t.m.a.n@open-mesh.org (optional subscription at
https://lists.open-mesh.org/mailman3/postorius/lists/b.a.t.m.a.n.lists.open-mesh.org/) https://lists.open-mesh.org/mailman3/postorius/lists/b.a.t.m.a.n.lists.open-mesh.org/)
......
...@@ -3197,7 +3197,7 @@ S: Maintained ...@@ -3197,7 +3197,7 @@ S: Maintained
W: https://www.open-mesh.org/ W: https://www.open-mesh.org/
Q: https://patchwork.open-mesh.org/project/batman/list/ Q: https://patchwork.open-mesh.org/project/batman/list/
B: https://www.open-mesh.org/projects/batman-adv/issues B: https://www.open-mesh.org/projects/batman-adv/issues
C: irc://chat.freenode.net/batman C: ircs://irc.hackint.org/batadv
T: git https://git.open-mesh.org/linux-merge.git T: git https://git.open-mesh.org/linux-merge.git
F: Documentation/networking/batman-adv.rst F: Documentation/networking/batman-adv.rst
F: include/uapi/linux/batadv_packet.h F: include/uapi/linux/batadv_packet.h
......
...@@ -519,7 +519,6 @@ batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet, ...@@ -519,7 +519,6 @@ batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
} }
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return res; return res;
} }
...@@ -857,7 +856,6 @@ static void batadv_iv_ogm_schedule_buff(struct batadv_hard_iface *hard_iface) ...@@ -857,7 +856,6 @@ static void batadv_iv_ogm_schedule_buff(struct batadv_hard_iface *hard_iface)
rcu_read_unlock(); rcu_read_unlock();
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
} }
...@@ -1046,13 +1044,9 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, ...@@ -1046,13 +1044,9 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
unlock: unlock:
rcu_read_unlock(); rcu_read_unlock();
out: out:
if (neigh_node)
batadv_neigh_node_put(neigh_node); batadv_neigh_node_put(neigh_node);
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
if (neigh_ifinfo)
batadv_neigh_ifinfo_put(neigh_ifinfo); batadv_neigh_ifinfo_put(neigh_ifinfo);
if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
} }
...@@ -1194,7 +1188,6 @@ static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node, ...@@ -1194,7 +1188,6 @@ static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
ret = true; ret = true;
out: out:
if (neigh_node)
batadv_neigh_node_put(neigh_node); batadv_neigh_node_put(neigh_node);
return ret; return ret;
} }
...@@ -1496,15 +1489,10 @@ batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset, ...@@ -1496,15 +1489,10 @@ batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset,
if (orig_neigh_node && !is_single_hop_neigh) if (orig_neigh_node && !is_single_hop_neigh)
batadv_orig_node_put(orig_neigh_node); batadv_orig_node_put(orig_neigh_node);
out: out:
if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
if (router_router)
batadv_neigh_node_put(router_router); batadv_neigh_node_put(router_router);
if (orig_neigh_router)
batadv_neigh_node_put(orig_neigh_router); batadv_neigh_node_put(orig_neigh_router);
if (hardif_neigh)
batadv_hardif_neigh_put(hardif_neigh); batadv_hardif_neigh_put(hardif_neigh);
consume_skb(skb_priv); consume_skb(skb_priv);
...@@ -1926,7 +1914,6 @@ batadv_iv_ogm_orig_dump_entry(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -1926,7 +1914,6 @@ batadv_iv_ogm_orig_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
} }
out: out:
if (neigh_node_best)
batadv_neigh_node_put(neigh_node_best); batadv_neigh_node_put(neigh_node_best);
*sub_s = 0; *sub_s = 0;
...@@ -2049,9 +2036,7 @@ static bool batadv_iv_ogm_neigh_diff(struct batadv_neigh_node *neigh1, ...@@ -2049,9 +2036,7 @@ static bool batadv_iv_ogm_neigh_diff(struct batadv_neigh_node *neigh1,
*diff = (int)tq1 - (int)tq2; *diff = (int)tq1 - (int)tq2;
out: out:
if (neigh1_ifinfo)
batadv_neigh_ifinfo_put(neigh1_ifinfo); batadv_neigh_ifinfo_put(neigh1_ifinfo);
if (neigh2_ifinfo)
batadv_neigh_ifinfo_put(neigh2_ifinfo); batadv_neigh_ifinfo_put(neigh2_ifinfo);
return ret; return ret;
...@@ -2299,7 +2284,6 @@ batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv) ...@@ -2299,7 +2284,6 @@ batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv)
if (tmp_gw_factor > max_gw_factor || if (tmp_gw_factor > max_gw_factor ||
(tmp_gw_factor == max_gw_factor && (tmp_gw_factor == max_gw_factor &&
tq_avg > max_tq)) { tq_avg > max_tq)) {
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
curr_gw = gw_node; curr_gw = gw_node;
kref_get(&curr_gw->refcount); kref_get(&curr_gw->refcount);
...@@ -2314,7 +2298,6 @@ batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv) ...@@ -2314,7 +2298,6 @@ batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv)
* $routing_class more tq points) * $routing_class more tq points)
*/ */
if (tq_avg > max_tq) { if (tq_avg > max_tq) {
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
curr_gw = gw_node; curr_gw = gw_node;
kref_get(&curr_gw->refcount); kref_get(&curr_gw->refcount);
...@@ -2332,7 +2315,6 @@ batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv) ...@@ -2332,7 +2315,6 @@ batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv)
next: next:
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -2397,13 +2379,9 @@ static bool batadv_iv_gw_is_eligible(struct batadv_priv *bat_priv, ...@@ -2397,13 +2379,9 @@ static bool batadv_iv_gw_is_eligible(struct batadv_priv *bat_priv,
ret = true; ret = true;
out: out:
if (router_gw_ifinfo)
batadv_neigh_ifinfo_put(router_gw_ifinfo); batadv_neigh_ifinfo_put(router_gw_ifinfo);
if (router_orig_ifinfo)
batadv_neigh_ifinfo_put(router_orig_ifinfo); batadv_neigh_ifinfo_put(router_orig_ifinfo);
if (router_gw)
batadv_neigh_node_put(router_gw); batadv_neigh_node_put(router_gw);
if (router_orig)
batadv_neigh_node_put(router_orig); batadv_neigh_node_put(router_orig);
return ret; return ret;
...@@ -2479,11 +2457,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, ...@@ -2479,11 +2457,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid,
ret = 0; ret = 0;
out: out:
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
return ret; return ret;
} }
......
...@@ -106,7 +106,6 @@ static void batadv_v_iface_update_mac(struct batadv_hard_iface *hard_iface) ...@@ -106,7 +106,6 @@ static void batadv_v_iface_update_mac(struct batadv_hard_iface *hard_iface)
batadv_v_primary_iface_set(hard_iface); batadv_v_primary_iface_set(hard_iface);
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
} }
...@@ -366,7 +365,6 @@ batadv_v_orig_dump_entry(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -366,7 +365,6 @@ batadv_v_orig_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
} }
out: out:
if (neigh_node_best)
batadv_neigh_node_put(neigh_node_best); batadv_neigh_node_put(neigh_node_best);
*sub_s = 0; *sub_s = 0;
...@@ -568,9 +566,7 @@ static int batadv_v_gw_throughput_get(struct batadv_gw_node *gw_node, u32 *bw) ...@@ -568,9 +566,7 @@ static int batadv_v_gw_throughput_get(struct batadv_gw_node *gw_node, u32 *bw)
ret = 0; ret = 0;
out: out:
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
return ret; return ret;
...@@ -599,7 +595,6 @@ batadv_v_gw_get_best_gw_node(struct batadv_priv *bat_priv) ...@@ -599,7 +595,6 @@ batadv_v_gw_get_best_gw_node(struct batadv_priv *bat_priv)
if (curr_gw && bw <= max_bw) if (curr_gw && bw <= max_bw)
goto next; goto next;
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
curr_gw = gw_node; curr_gw = gw_node;
...@@ -662,9 +657,7 @@ static bool batadv_v_gw_is_eligible(struct batadv_priv *bat_priv, ...@@ -662,9 +657,7 @@ static bool batadv_v_gw_is_eligible(struct batadv_priv *bat_priv,
ret = true; ret = true;
out: out:
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
if (orig_gw)
batadv_gw_node_put(orig_gw); batadv_gw_node_put(orig_gw);
return ret; return ret;
...@@ -764,11 +757,8 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, ...@@ -764,11 +757,8 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid,
ret = 0; ret = 0;
out: out:
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
return ret; return ret;
} }
......
...@@ -486,13 +486,10 @@ static void batadv_v_elp_neigh_update(struct batadv_priv *bat_priv, ...@@ -486,13 +486,10 @@ static void batadv_v_elp_neigh_update(struct batadv_priv *bat_priv,
hardif_neigh->bat_v.elp_interval = ntohl(elp_packet->elp_interval); hardif_neigh->bat_v.elp_interval = ntohl(elp_packet->elp_interval);
hardif_free: hardif_free:
if (hardif_neigh)
batadv_hardif_neigh_put(hardif_neigh); batadv_hardif_neigh_put(hardif_neigh);
neigh_free: neigh_free:
if (neigh)
batadv_neigh_node_put(neigh); batadv_neigh_node_put(neigh);
orig_free: orig_free:
if (orig_neigh)
batadv_orig_node_put(orig_neigh); batadv_orig_node_put(orig_neigh);
} }
......
...@@ -584,11 +584,8 @@ static void batadv_v_ogm_forward(struct batadv_priv *bat_priv, ...@@ -584,11 +584,8 @@ static void batadv_v_ogm_forward(struct batadv_priv *bat_priv,
batadv_v_ogm_queue_on_if(skb, if_outgoing); batadv_v_ogm_queue_on_if(skb, if_outgoing);
out: out:
if (orig_ifinfo)
batadv_orig_ifinfo_put(orig_ifinfo); batadv_orig_ifinfo_put(orig_ifinfo);
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
if (neigh_ifinfo)
batadv_neigh_ifinfo_put(neigh_ifinfo); batadv_neigh_ifinfo_put(neigh_ifinfo);
} }
...@@ -669,9 +666,7 @@ static int batadv_v_ogm_metric_update(struct batadv_priv *bat_priv, ...@@ -669,9 +666,7 @@ static int batadv_v_ogm_metric_update(struct batadv_priv *bat_priv,
else else
ret = 0; ret = 0;
out: out:
if (orig_ifinfo)
batadv_orig_ifinfo_put(orig_ifinfo); batadv_orig_ifinfo_put(orig_ifinfo);
if (neigh_ifinfo)
batadv_neigh_ifinfo_put(neigh_ifinfo); batadv_neigh_ifinfo_put(neigh_ifinfo);
return ret; return ret;
...@@ -763,15 +758,10 @@ static bool batadv_v_ogm_route_update(struct batadv_priv *bat_priv, ...@@ -763,15 +758,10 @@ static bool batadv_v_ogm_route_update(struct batadv_priv *bat_priv,
batadv_update_route(bat_priv, orig_node, if_outgoing, neigh_node); batadv_update_route(bat_priv, orig_node, if_outgoing, neigh_node);
out: out:
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
if (orig_neigh_router)
batadv_neigh_node_put(orig_neigh_router); batadv_neigh_node_put(orig_neigh_router);
if (orig_neigh_node)
batadv_orig_node_put(orig_neigh_node); batadv_orig_node_put(orig_neigh_node);
if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
if (neigh_ifinfo)
batadv_neigh_ifinfo_put(neigh_ifinfo); batadv_neigh_ifinfo_put(neigh_ifinfo);
return forward; return forward;
...@@ -978,11 +968,8 @@ static void batadv_v_ogm_process(const struct sk_buff *skb, int ogm_offset, ...@@ -978,11 +968,8 @@ static void batadv_v_ogm_process(const struct sk_buff *skb, int ogm_offset,
} }
rcu_read_unlock(); rcu_read_unlock();
out: out:
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
if (neigh_node)
batadv_neigh_node_put(neigh_node); batadv_neigh_node_put(neigh_node);
if (hardif_neigh)
batadv_hardif_neigh_put(hardif_neigh); batadv_hardif_neigh_put(hardif_neigh);
} }
......
...@@ -162,6 +162,9 @@ static void batadv_backbone_gw_release(struct kref *ref) ...@@ -162,6 +162,9 @@ static void batadv_backbone_gw_release(struct kref *ref)
*/ */
static void batadv_backbone_gw_put(struct batadv_bla_backbone_gw *backbone_gw) static void batadv_backbone_gw_put(struct batadv_bla_backbone_gw *backbone_gw)
{ {
if (!backbone_gw)
return;
kref_put(&backbone_gw->refcount, batadv_backbone_gw_release); kref_put(&backbone_gw->refcount, batadv_backbone_gw_release);
} }
...@@ -197,6 +200,9 @@ static void batadv_claim_release(struct kref *ref) ...@@ -197,6 +200,9 @@ static void batadv_claim_release(struct kref *ref)
*/ */
static void batadv_claim_put(struct batadv_bla_claim *claim) static void batadv_claim_put(struct batadv_bla_claim *claim)
{ {
if (!claim)
return;
kref_put(&claim->refcount, batadv_claim_release); kref_put(&claim->refcount, batadv_claim_release);
} }
...@@ -439,7 +445,6 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, u8 *mac, ...@@ -439,7 +445,6 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, u8 *mac,
netif_rx_any_context(skb); netif_rx_any_context(skb);
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
} }
...@@ -1498,7 +1503,6 @@ static void batadv_bla_periodic_work(struct work_struct *work) ...@@ -1498,7 +1503,6 @@ static void batadv_bla_periodic_work(struct work_struct *work)
rcu_read_unlock(); rcu_read_unlock();
} }
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work, queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work,
...@@ -1808,7 +1812,6 @@ void batadv_bla_free(struct batadv_priv *bat_priv) ...@@ -1808,7 +1812,6 @@ void batadv_bla_free(struct batadv_priv *bat_priv)
batadv_hash_destroy(bat_priv->bla.backbone_hash); batadv_hash_destroy(bat_priv->bla.backbone_hash);
bat_priv->bla.backbone_hash = NULL; bat_priv->bla.backbone_hash = NULL;
} }
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
} }
...@@ -1996,9 +1999,7 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb, ...@@ -1996,9 +1999,7 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
ret = true; ret = true;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
if (claim)
batadv_claim_put(claim); batadv_claim_put(claim);
return ret; return ret;
} }
...@@ -2103,9 +2104,7 @@ bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb, ...@@ -2103,9 +2104,7 @@ bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
handled: handled:
ret = true; ret = true;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
if (claim)
batadv_claim_put(claim); batadv_claim_put(claim);
return ret; return ret;
} }
...@@ -2271,7 +2270,6 @@ int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -2271,7 +2270,6 @@ int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb)
ret = msg->len; ret = msg->len;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
dev_put(soft_iface); dev_put(soft_iface);
...@@ -2442,7 +2440,6 @@ int batadv_bla_backbone_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -2442,7 +2440,6 @@ int batadv_bla_backbone_dump(struct sk_buff *msg, struct netlink_callback *cb)
ret = msg->len; ret = msg->len;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
dev_put(soft_iface); dev_put(soft_iface);
......
...@@ -127,6 +127,9 @@ static void batadv_dat_entry_release(struct kref *ref) ...@@ -127,6 +127,9 @@ static void batadv_dat_entry_release(struct kref *ref)
*/ */
static void batadv_dat_entry_put(struct batadv_dat_entry *dat_entry) static void batadv_dat_entry_put(struct batadv_dat_entry *dat_entry)
{ {
if (!dat_entry)
return;
kref_put(&dat_entry->refcount, batadv_dat_entry_release); kref_put(&dat_entry->refcount, batadv_dat_entry_release);
} }
...@@ -405,7 +408,6 @@ static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip, ...@@ -405,7 +408,6 @@ static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip,
&dat_entry->ip, dat_entry->mac_addr, batadv_print_vid(vid)); &dat_entry->ip, dat_entry->mac_addr, batadv_print_vid(vid));
out: out:
if (dat_entry)
batadv_dat_entry_put(dat_entry); batadv_dat_entry_put(dat_entry);
} }
...@@ -594,7 +596,6 @@ static void batadv_choose_next_candidate(struct batadv_priv *bat_priv, ...@@ -594,7 +596,6 @@ static void batadv_choose_next_candidate(struct batadv_priv *bat_priv,
continue; continue;
max = tmp_max; max = tmp_max;
if (max_orig_node)
batadv_orig_node_put(max_orig_node); batadv_orig_node_put(max_orig_node);
max_orig_node = orig_node; max_orig_node = orig_node;
} }
...@@ -981,7 +982,6 @@ int batadv_dat_cache_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -981,7 +982,6 @@ int batadv_dat_cache_dump(struct sk_buff *msg, struct netlink_callback *cb)
ret = msg->len; ret = msg->len;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
dev_put(soft_iface); dev_put(soft_iface);
...@@ -1217,7 +1217,6 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, ...@@ -1217,7 +1217,6 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
BATADV_P_DAT_DHT_GET); BATADV_P_DAT_DHT_GET);
} }
out: out:
if (dat_entry)
batadv_dat_entry_put(dat_entry); batadv_dat_entry_put(dat_entry);
return ret; return ret;
} }
...@@ -1285,7 +1284,6 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv, ...@@ -1285,7 +1284,6 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
ret = true; ret = true;
} }
out: out:
if (dat_entry)
batadv_dat_entry_put(dat_entry); batadv_dat_entry_put(dat_entry);
if (ret) if (ret)
kfree_skb(skb); kfree_skb(skb);
...@@ -1419,7 +1417,6 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv, ...@@ -1419,7 +1417,6 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
out: out:
if (dropped) if (dropped)
kfree_skb(skb); kfree_skb(skb);
if (dat_entry)
batadv_dat_entry_put(dat_entry); batadv_dat_entry_put(dat_entry);
/* if dropped == false -> deliver to the interface */ /* if dropped == false -> deliver to the interface */
return dropped; return dropped;
...@@ -1829,7 +1826,6 @@ bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv, ...@@ -1829,7 +1826,6 @@ bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
ret = true; ret = true;
out: out:
if (dat_entry)
batadv_dat_entry_put(dat_entry); batadv_dat_entry_put(dat_entry);
return ret; return ret;
} }
...@@ -381,9 +381,7 @@ bool batadv_frag_skb_fwd(struct sk_buff *skb, ...@@ -381,9 +381,7 @@ bool batadv_frag_skb_fwd(struct sk_buff *skb,
} }
out: out:
if (orig_node_dst)
batadv_orig_node_put(orig_node_dst); batadv_orig_node_put(orig_node_dst);
if (neigh_node)
batadv_neigh_node_put(neigh_node); batadv_neigh_node_put(neigh_node);
return ret; return ret;
} }
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
* after rcu grace period * after rcu grace period
* @ref: kref pointer of the gw_node * @ref: kref pointer of the gw_node
*/ */
static void batadv_gw_node_release(struct kref *ref) void batadv_gw_node_release(struct kref *ref)
{ {
struct batadv_gw_node *gw_node; struct batadv_gw_node *gw_node;
...@@ -69,16 +69,6 @@ static void batadv_gw_node_release(struct kref *ref) ...@@ -69,16 +69,6 @@ static void batadv_gw_node_release(struct kref *ref)
kfree_rcu(gw_node, rcu); kfree_rcu(gw_node, rcu);
} }
/**
* batadv_gw_node_put() - decrement the gw_node refcounter and possibly release
* it
* @gw_node: gateway node to free
*/
void batadv_gw_node_put(struct batadv_gw_node *gw_node)
{
kref_put(&gw_node->refcount, batadv_gw_node_release);
}
/** /**
* batadv_gw_get_selected_gw_node() - Get currently selected gateway * batadv_gw_get_selected_gw_node() - Get currently selected gateway
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
...@@ -130,7 +120,6 @@ batadv_gw_get_selected_orig(struct batadv_priv *bat_priv) ...@@ -130,7 +120,6 @@ batadv_gw_get_selected_orig(struct batadv_priv *bat_priv)
unlock: unlock:
rcu_read_unlock(); rcu_read_unlock();
out: out:
if (gw_node)
batadv_gw_node_put(gw_node); batadv_gw_node_put(gw_node);
return orig_node; return orig_node;
} }
...@@ -148,7 +137,6 @@ static void batadv_gw_select(struct batadv_priv *bat_priv, ...@@ -148,7 +137,6 @@ static void batadv_gw_select(struct batadv_priv *bat_priv,
curr_gw_node = rcu_replace_pointer(bat_priv->gw.curr_gw, new_gw_node, curr_gw_node = rcu_replace_pointer(bat_priv->gw.curr_gw, new_gw_node,
true); true);
if (curr_gw_node)
batadv_gw_node_put(curr_gw_node); batadv_gw_node_put(curr_gw_node);
spin_unlock_bh(&bat_priv->gw.list_lock); spin_unlock_bh(&bat_priv->gw.list_lock);
...@@ -284,13 +272,9 @@ void batadv_gw_election(struct batadv_priv *bat_priv) ...@@ -284,13 +272,9 @@ void batadv_gw_election(struct batadv_priv *bat_priv)
batadv_gw_select(bat_priv, next_gw); batadv_gw_select(bat_priv, next_gw);
out: out:
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
if (next_gw)
batadv_gw_node_put(next_gw); batadv_gw_node_put(next_gw);
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
} }
...@@ -325,7 +309,6 @@ void batadv_gw_check_election(struct batadv_priv *bat_priv, ...@@ -325,7 +309,6 @@ void batadv_gw_check_election(struct batadv_priv *bat_priv,
reselect: reselect:
batadv_gw_reselect(bat_priv); batadv_gw_reselect(bat_priv);
out: out:
if (curr_gw_orig)
batadv_orig_node_put(curr_gw_orig); batadv_orig_node_put(curr_gw_orig);
} }
...@@ -466,12 +449,10 @@ void batadv_gw_node_update(struct batadv_priv *bat_priv, ...@@ -466,12 +449,10 @@ void batadv_gw_node_update(struct batadv_priv *bat_priv,
if (gw_node == curr_gw) if (gw_node == curr_gw)
batadv_gw_reselect(bat_priv); batadv_gw_reselect(bat_priv);
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
} }
out: out:
if (gw_node)
batadv_gw_node_put(gw_node); batadv_gw_node_put(gw_node);
} }
...@@ -555,7 +536,6 @@ int batadv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -555,7 +536,6 @@ int batadv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb)
ret = msg->len; ret = msg->len;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
dev_put(soft_iface); dev_put(soft_iface);
...@@ -779,15 +759,10 @@ bool batadv_gw_out_of_range(struct batadv_priv *bat_priv, ...@@ -779,15 +759,10 @@ bool batadv_gw_out_of_range(struct batadv_priv *bat_priv,
batadv_neigh_ifinfo_put(old_ifinfo); batadv_neigh_ifinfo_put(old_ifinfo);
out: out:
if (orig_dst_node)
batadv_orig_node_put(orig_dst_node); batadv_orig_node_put(orig_dst_node);
if (curr_gw)
batadv_gw_node_put(curr_gw); batadv_gw_node_put(curr_gw);
if (gw_node)
batadv_gw_node_put(gw_node); batadv_gw_node_put(gw_node);
if (neigh_old)
batadv_neigh_node_put(neigh_old); batadv_neigh_node_put(neigh_old);
if (neigh_curr)
batadv_neigh_node_put(neigh_curr); batadv_neigh_node_put(neigh_curr);
return out_of_range; return out_of_range;
} }
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "main.h" #include "main.h"
#include <linux/kref.h>
#include <linux/netlink.h> #include <linux/netlink.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -27,7 +28,7 @@ void batadv_gw_node_update(struct batadv_priv *bat_priv, ...@@ -27,7 +28,7 @@ void batadv_gw_node_update(struct batadv_priv *bat_priv,
void batadv_gw_node_delete(struct batadv_priv *bat_priv, void batadv_gw_node_delete(struct batadv_priv *bat_priv,
struct batadv_orig_node *orig_node); struct batadv_orig_node *orig_node);
void batadv_gw_node_free(struct batadv_priv *bat_priv); void batadv_gw_node_free(struct batadv_priv *bat_priv);
void batadv_gw_node_put(struct batadv_gw_node *gw_node); void batadv_gw_node_release(struct kref *ref);
struct batadv_gw_node * struct batadv_gw_node *
batadv_gw_get_selected_gw_node(struct batadv_priv *bat_priv); batadv_gw_get_selected_gw_node(struct batadv_priv *bat_priv);
int batadv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb); int batadv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb);
...@@ -38,4 +39,17 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len, ...@@ -38,4 +39,17 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len,
struct batadv_gw_node *batadv_gw_node_get(struct batadv_priv *bat_priv, struct batadv_gw_node *batadv_gw_node_get(struct batadv_priv *bat_priv,
struct batadv_orig_node *orig_node); struct batadv_orig_node *orig_node);
/**
* batadv_gw_node_put() - decrement the gw_node refcounter and possibly release
* it
* @gw_node: gateway node to free
*/
static inline void batadv_gw_node_put(struct batadv_gw_node *gw_node)
{
if (!gw_node)
return;
kref_put(&gw_node->refcount, batadv_gw_node_release);
}
#endif /* _NET_BATMAN_ADV_GATEWAY_CLIENT_H_ */ #endif /* _NET_BATMAN_ADV_GATEWAY_CLIENT_H_ */
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/byteorder/generic.h> #include <linux/byteorder/generic.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kernel.h> #include <linux/kstrtox.h>
#include <linux/limits.h> #include <linux/limits.h>
#include <linux/math64.h> #include <linux/math64.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
......
...@@ -236,7 +236,6 @@ static struct net_device *batadv_get_real_netdevice(struct net_device *netdev) ...@@ -236,7 +236,6 @@ static struct net_device *batadv_get_real_netdevice(struct net_device *netdev)
real_netdev = dev_get_by_index(real_net, ifindex); real_netdev = dev_get_by_index(real_net, ifindex);
out: out:
if (hard_iface)
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
return real_netdev; return real_netdev;
} }
...@@ -457,7 +456,6 @@ static void batadv_primary_if_update_addr(struct batadv_priv *bat_priv, ...@@ -457,7 +456,6 @@ static void batadv_primary_if_update_addr(struct batadv_priv *bat_priv,
batadv_dat_init_own_addr(bat_priv, primary_if); batadv_dat_init_own_addr(bat_priv, primary_if);
batadv_bla_update_orig_address(bat_priv, primary_if, oldif); batadv_bla_update_orig_address(bat_priv, primary_if, oldif);
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
} }
...@@ -481,7 +479,6 @@ static void batadv_primary_if_select(struct batadv_priv *bat_priv, ...@@ -481,7 +479,6 @@ static void batadv_primary_if_select(struct batadv_priv *bat_priv,
batadv_primary_if_update_addr(bat_priv, curr_hard_iface); batadv_primary_if_update_addr(bat_priv, curr_hard_iface);
out: out:
if (curr_hard_iface)
batadv_hardif_put(curr_hard_iface); batadv_hardif_put(curr_hard_iface);
} }
...@@ -657,7 +654,6 @@ batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface) ...@@ -657,7 +654,6 @@ batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface)
bat_priv->algo_ops->iface.activate(hard_iface); bat_priv->algo_ops->iface.activate(hard_iface);
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
} }
...@@ -811,7 +807,6 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface) ...@@ -811,7 +807,6 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface)
new_if = batadv_hardif_get_active(hard_iface->soft_iface); new_if = batadv_hardif_get_active(hard_iface->soft_iface);
batadv_primary_if_select(bat_priv, new_if); batadv_primary_if_select(bat_priv, new_if);
if (new_if)
batadv_hardif_put(new_if); batadv_hardif_put(new_if);
} }
...@@ -834,7 +829,6 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface) ...@@ -834,7 +829,6 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface)
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
} }
...@@ -990,7 +984,6 @@ static int batadv_hard_if_event(struct notifier_block *this, ...@@ -990,7 +984,6 @@ static int batadv_hard_if_event(struct notifier_block *this,
hardif_put: hardif_put:
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return NOTIFY_DONE; return NOTIFY_DONE;
} }
......
...@@ -89,6 +89,9 @@ int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing, ...@@ -89,6 +89,9 @@ int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing,
*/ */
static inline void batadv_hardif_put(struct batadv_hard_iface *hard_iface) static inline void batadv_hardif_put(struct batadv_hard_iface *hard_iface)
{ {
if (!hard_iface)
return;
kref_put(&hard_iface->refcount, batadv_hardif_release); kref_put(&hard_iface->refcount, batadv_hardif_release);
} }
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#define BATADV_DRIVER_DEVICE "batman-adv" #define BATADV_DRIVER_DEVICE "batman-adv"
#ifndef BATADV_SOURCE_VERSION #ifndef BATADV_SOURCE_VERSION
#define BATADV_SOURCE_VERSION "2021.2" #define BATADV_SOURCE_VERSION "2021.3"
#endif #endif
/* B.A.T.M.A.N. parameters */ /* B.A.T.M.A.N. parameters */
......
...@@ -2241,7 +2241,7 @@ batadv_mcast_netlink_get_primary(struct netlink_callback *cb, ...@@ -2241,7 +2241,7 @@ batadv_mcast_netlink_get_primary(struct netlink_callback *cb,
if (!ret && primary_if) if (!ret && primary_if)
*primary_if = hard_iface; *primary_if = hard_iface;
else if (hard_iface) else
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
return ret; return ret;
......
...@@ -359,14 +359,12 @@ static int batadv_netlink_mesh_fill(struct sk_buff *msg, ...@@ -359,14 +359,12 @@ static int batadv_netlink_mesh_fill(struct sk_buff *msg,
atomic_read(&bat_priv->orig_interval))) atomic_read(&bat_priv->orig_interval)))
goto nla_put_failure; goto nla_put_failure;
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
genlmsg_end(msg, hdr); genlmsg_end(msg, hdr);
return 0; return 0;
nla_put_failure: nla_put_failure:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
genlmsg_cancel(msg, hdr); genlmsg_cancel(msg, hdr);
......
...@@ -217,6 +217,9 @@ static void batadv_nc_node_release(struct kref *ref) ...@@ -217,6 +217,9 @@ static void batadv_nc_node_release(struct kref *ref)
*/ */
static void batadv_nc_node_put(struct batadv_nc_node *nc_node) static void batadv_nc_node_put(struct batadv_nc_node *nc_node)
{ {
if (!nc_node)
return;
kref_put(&nc_node->refcount, batadv_nc_node_release); kref_put(&nc_node->refcount, batadv_nc_node_release);
} }
...@@ -241,6 +244,9 @@ static void batadv_nc_path_release(struct kref *ref) ...@@ -241,6 +244,9 @@ static void batadv_nc_path_release(struct kref *ref)
*/ */
static void batadv_nc_path_put(struct batadv_nc_path *nc_path) static void batadv_nc_path_put(struct batadv_nc_path *nc_path)
{ {
if (!nc_path)
return;
kref_put(&nc_path->refcount, batadv_nc_path_release); kref_put(&nc_path->refcount, batadv_nc_path_release);
} }
...@@ -930,9 +936,7 @@ void batadv_nc_update_nc_node(struct batadv_priv *bat_priv, ...@@ -930,9 +936,7 @@ void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
out_nc_node->last_seen = jiffies; out_nc_node->last_seen = jiffies;
out: out:
if (in_nc_node)
batadv_nc_node_put(in_nc_node); batadv_nc_node_put(in_nc_node);
if (out_nc_node)
batadv_nc_node_put(out_nc_node); batadv_nc_node_put(out_nc_node);
} }
...@@ -1209,13 +1213,9 @@ static bool batadv_nc_code_packets(struct batadv_priv *bat_priv, ...@@ -1209,13 +1213,9 @@ static bool batadv_nc_code_packets(struct batadv_priv *bat_priv,
batadv_send_unicast_skb(skb_dest, first_dest); batadv_send_unicast_skb(skb_dest, first_dest);
res = true; res = true;
out: out:
if (router_neigh)
batadv_neigh_node_put(router_neigh); batadv_neigh_node_put(router_neigh);
if (router_coding)
batadv_neigh_node_put(router_coding); batadv_neigh_node_put(router_coding);
if (router_neigh_ifinfo)
batadv_neigh_ifinfo_put(router_neigh_ifinfo); batadv_neigh_ifinfo_put(router_neigh_ifinfo);
if (router_coding_ifinfo)
batadv_neigh_ifinfo_put(router_coding_ifinfo); batadv_neigh_ifinfo_put(router_coding_ifinfo);
return res; return res;
} }
......
...@@ -177,7 +177,7 @@ batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node, ...@@ -177,7 +177,7 @@ batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
* and queue for free after rcu grace period * and queue for free after rcu grace period
* @ref: kref pointer of the originator-vlan object * @ref: kref pointer of the originator-vlan object
*/ */
static void batadv_orig_node_vlan_release(struct kref *ref) void batadv_orig_node_vlan_release(struct kref *ref)
{ {
struct batadv_orig_node_vlan *orig_vlan; struct batadv_orig_node_vlan *orig_vlan;
...@@ -186,16 +186,6 @@ static void batadv_orig_node_vlan_release(struct kref *ref) ...@@ -186,16 +186,6 @@ static void batadv_orig_node_vlan_release(struct kref *ref)
kfree_rcu(orig_vlan, rcu); kfree_rcu(orig_vlan, rcu);
} }
/**
* batadv_orig_node_vlan_put() - decrement the refcounter and possibly release
* the originator-vlan object
* @orig_vlan: the originator-vlan object to release
*/
void batadv_orig_node_vlan_put(struct batadv_orig_node_vlan *orig_vlan)
{
kref_put(&orig_vlan->refcount, batadv_orig_node_vlan_release);
}
/** /**
* batadv_originator_init() - Initialize all originator structures * batadv_originator_init() - Initialize all originator structures
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
...@@ -231,7 +221,7 @@ int batadv_originator_init(struct batadv_priv *bat_priv) ...@@ -231,7 +221,7 @@ int batadv_originator_init(struct batadv_priv *bat_priv)
* free after rcu grace period * free after rcu grace period
* @ref: kref pointer of the neigh_ifinfo * @ref: kref pointer of the neigh_ifinfo
*/ */
static void batadv_neigh_ifinfo_release(struct kref *ref) void batadv_neigh_ifinfo_release(struct kref *ref)
{ {
struct batadv_neigh_ifinfo *neigh_ifinfo; struct batadv_neigh_ifinfo *neigh_ifinfo;
...@@ -243,22 +233,12 @@ static void batadv_neigh_ifinfo_release(struct kref *ref) ...@@ -243,22 +233,12 @@ static void batadv_neigh_ifinfo_release(struct kref *ref)
kfree_rcu(neigh_ifinfo, rcu); kfree_rcu(neigh_ifinfo, rcu);
} }
/**
* batadv_neigh_ifinfo_put() - decrement the refcounter and possibly release
* the neigh_ifinfo
* @neigh_ifinfo: the neigh_ifinfo object to release
*/
void batadv_neigh_ifinfo_put(struct batadv_neigh_ifinfo *neigh_ifinfo)
{
kref_put(&neigh_ifinfo->refcount, batadv_neigh_ifinfo_release);
}
/** /**
* batadv_hardif_neigh_release() - release hardif neigh node from lists and * batadv_hardif_neigh_release() - release hardif neigh node from lists and
* queue for free after rcu grace period * queue for free after rcu grace period
* @ref: kref pointer of the neigh_node * @ref: kref pointer of the neigh_node
*/ */
static void batadv_hardif_neigh_release(struct kref *ref) void batadv_hardif_neigh_release(struct kref *ref)
{ {
struct batadv_hardif_neigh_node *hardif_neigh; struct batadv_hardif_neigh_node *hardif_neigh;
...@@ -273,22 +253,12 @@ static void batadv_hardif_neigh_release(struct kref *ref) ...@@ -273,22 +253,12 @@ static void batadv_hardif_neigh_release(struct kref *ref)
kfree_rcu(hardif_neigh, rcu); kfree_rcu(hardif_neigh, rcu);
} }
/**
* batadv_hardif_neigh_put() - decrement the hardif neighbors refcounter
* and possibly release it
* @hardif_neigh: hardif neigh neighbor to free
*/
void batadv_hardif_neigh_put(struct batadv_hardif_neigh_node *hardif_neigh)
{
kref_put(&hardif_neigh->refcount, batadv_hardif_neigh_release);
}
/** /**
* batadv_neigh_node_release() - release neigh_node from lists and queue for * batadv_neigh_node_release() - release neigh_node from lists and queue for
* free after rcu grace period * free after rcu grace period
* @ref: kref pointer of the neigh_node * @ref: kref pointer of the neigh_node
*/ */
static void batadv_neigh_node_release(struct kref *ref) void batadv_neigh_node_release(struct kref *ref)
{ {
struct hlist_node *node_tmp; struct hlist_node *node_tmp;
struct batadv_neigh_node *neigh_node; struct batadv_neigh_node *neigh_node;
...@@ -308,16 +278,6 @@ static void batadv_neigh_node_release(struct kref *ref) ...@@ -308,16 +278,6 @@ static void batadv_neigh_node_release(struct kref *ref)
kfree_rcu(neigh_node, rcu); kfree_rcu(neigh_node, rcu);
} }
/**
* batadv_neigh_node_put() - decrement the neighbors refcounter and possibly
* release it
* @neigh_node: neigh neighbor to free
*/
void batadv_neigh_node_put(struct batadv_neigh_node *neigh_node)
{
kref_put(&neigh_node->refcount, batadv_neigh_node_release);
}
/** /**
* batadv_orig_router_get() - router to the originator depending on iface * batadv_orig_router_get() - router to the originator depending on iface
* @orig_node: the orig node for the router * @orig_node: the orig node for the router
...@@ -704,7 +664,6 @@ batadv_neigh_node_create(struct batadv_orig_node *orig_node, ...@@ -704,7 +664,6 @@ batadv_neigh_node_create(struct batadv_orig_node *orig_node,
out: out:
spin_unlock_bh(&orig_node->neigh_list_lock); spin_unlock_bh(&orig_node->neigh_list_lock);
if (hardif_neigh)
batadv_hardif_neigh_put(hardif_neigh); batadv_hardif_neigh_put(hardif_neigh);
return neigh_node; return neigh_node;
} }
...@@ -797,10 +756,8 @@ int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -797,10 +756,8 @@ int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb)
ret = msg->len; ret = msg->len;
out: out:
if (hardif)
batadv_hardif_put(hardif); batadv_hardif_put(hardif);
dev_put(hard_iface); dev_put(hard_iface);
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
dev_put(soft_iface); dev_put(soft_iface);
...@@ -812,7 +769,7 @@ int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -812,7 +769,7 @@ int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb)
* free after rcu grace period * free after rcu grace period
* @ref: kref pointer of the orig_ifinfo * @ref: kref pointer of the orig_ifinfo
*/ */
static void batadv_orig_ifinfo_release(struct kref *ref) void batadv_orig_ifinfo_release(struct kref *ref)
{ {
struct batadv_orig_ifinfo *orig_ifinfo; struct batadv_orig_ifinfo *orig_ifinfo;
struct batadv_neigh_node *router; struct batadv_neigh_node *router;
...@@ -824,22 +781,11 @@ static void batadv_orig_ifinfo_release(struct kref *ref) ...@@ -824,22 +781,11 @@ static void batadv_orig_ifinfo_release(struct kref *ref)
/* this is the last reference to this object */ /* this is the last reference to this object */
router = rcu_dereference_protected(orig_ifinfo->router, true); router = rcu_dereference_protected(orig_ifinfo->router, true);
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
kfree_rcu(orig_ifinfo, rcu); kfree_rcu(orig_ifinfo, rcu);
} }
/**
* batadv_orig_ifinfo_put() - decrement the refcounter and possibly release
* the orig_ifinfo
* @orig_ifinfo: the orig_ifinfo object to release
*/
void batadv_orig_ifinfo_put(struct batadv_orig_ifinfo *orig_ifinfo)
{
kref_put(&orig_ifinfo->refcount, batadv_orig_ifinfo_release);
}
/** /**
* batadv_orig_node_free_rcu() - free the orig_node * batadv_orig_node_free_rcu() - free the orig_node
* @rcu: rcu pointer of the orig_node * @rcu: rcu pointer of the orig_node
...@@ -863,7 +809,7 @@ static void batadv_orig_node_free_rcu(struct rcu_head *rcu) ...@@ -863,7 +809,7 @@ static void batadv_orig_node_free_rcu(struct rcu_head *rcu)
* free after rcu grace period * free after rcu grace period
* @ref: kref pointer of the orig_node * @ref: kref pointer of the orig_node
*/ */
static void batadv_orig_node_release(struct kref *ref) void batadv_orig_node_release(struct kref *ref)
{ {
struct hlist_node *node_tmp; struct hlist_node *node_tmp;
struct batadv_neigh_node *neigh_node; struct batadv_neigh_node *neigh_node;
...@@ -893,7 +839,6 @@ static void batadv_orig_node_release(struct kref *ref) ...@@ -893,7 +839,6 @@ static void batadv_orig_node_release(struct kref *ref)
orig_node->last_bonding_candidate = NULL; orig_node->last_bonding_candidate = NULL;
spin_unlock_bh(&orig_node->neigh_list_lock); spin_unlock_bh(&orig_node->neigh_list_lock);
if (last_candidate)
batadv_orig_ifinfo_put(last_candidate); batadv_orig_ifinfo_put(last_candidate);
spin_lock_bh(&orig_node->vlan_list_lock); spin_lock_bh(&orig_node->vlan_list_lock);
...@@ -909,16 +854,6 @@ static void batadv_orig_node_release(struct kref *ref) ...@@ -909,16 +854,6 @@ static void batadv_orig_node_release(struct kref *ref)
call_rcu(&orig_node->rcu, batadv_orig_node_free_rcu); call_rcu(&orig_node->rcu, batadv_orig_node_free_rcu);
} }
/**
* batadv_orig_node_put() - decrement the orig node refcounter and possibly
* release it
* @orig_node: the orig node to free
*/
void batadv_orig_node_put(struct batadv_orig_node *orig_node)
{
kref_put(&orig_node->refcount, batadv_orig_node_release);
}
/** /**
* batadv_originator_free() - Free all originator structures * batadv_originator_free() - Free all originator structures
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
...@@ -1211,7 +1146,6 @@ batadv_find_best_neighbor(struct batadv_priv *bat_priv, ...@@ -1211,7 +1146,6 @@ batadv_find_best_neighbor(struct batadv_priv *bat_priv,
if (!kref_get_unless_zero(&neigh->refcount)) if (!kref_get_unless_zero(&neigh->refcount))
continue; continue;
if (best)
batadv_neigh_node_put(best); batadv_neigh_node_put(best);
best = neigh; best = neigh;
...@@ -1257,7 +1191,6 @@ static bool batadv_purge_orig_node(struct batadv_priv *bat_priv, ...@@ -1257,7 +1191,6 @@ static bool batadv_purge_orig_node(struct batadv_priv *bat_priv,
BATADV_IF_DEFAULT); BATADV_IF_DEFAULT);
batadv_update_route(bat_priv, orig_node, BATADV_IF_DEFAULT, batadv_update_route(bat_priv, orig_node, BATADV_IF_DEFAULT,
best_neigh_node); best_neigh_node);
if (best_neigh_node)
batadv_neigh_node_put(best_neigh_node); batadv_neigh_node_put(best_neigh_node);
/* ... then for all other interfaces. */ /* ... then for all other interfaces. */
...@@ -1277,7 +1210,6 @@ static bool batadv_purge_orig_node(struct batadv_priv *bat_priv, ...@@ -1277,7 +1210,6 @@ static bool batadv_purge_orig_node(struct batadv_priv *bat_priv,
hard_iface); hard_iface);
batadv_update_route(bat_priv, orig_node, hard_iface, batadv_update_route(bat_priv, orig_node, hard_iface,
best_neigh_node); best_neigh_node);
if (best_neigh_node)
batadv_neigh_node_put(best_neigh_node); batadv_neigh_node_put(best_neigh_node);
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
...@@ -1408,10 +1340,8 @@ int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -1408,10 +1340,8 @@ int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb)
ret = msg->len; ret = msg->len;
out: out:
if (hardif)
batadv_hardif_put(hardif); batadv_hardif_put(hardif);
dev_put(hard_iface); dev_put(hard_iface);
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
dev_put(soft_iface); dev_put(soft_iface);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/if_ether.h> #include <linux/if_ether.h>
#include <linux/jhash.h> #include <linux/jhash.h>
#include <linux/kref.h>
#include <linux/netlink.h> #include <linux/netlink.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -20,19 +21,18 @@ bool batadv_compare_orig(const struct hlist_node *node, const void *data2); ...@@ -20,19 +21,18 @@ bool batadv_compare_orig(const struct hlist_node *node, const void *data2);
int batadv_originator_init(struct batadv_priv *bat_priv); int batadv_originator_init(struct batadv_priv *bat_priv);
void batadv_originator_free(struct batadv_priv *bat_priv); void batadv_originator_free(struct batadv_priv *bat_priv);
void batadv_purge_orig_ref(struct batadv_priv *bat_priv); void batadv_purge_orig_ref(struct batadv_priv *bat_priv);
void batadv_orig_node_put(struct batadv_orig_node *orig_node); void batadv_orig_node_release(struct kref *ref);
struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv, struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
const u8 *addr); const u8 *addr);
struct batadv_hardif_neigh_node * struct batadv_hardif_neigh_node *
batadv_hardif_neigh_get(const struct batadv_hard_iface *hard_iface, batadv_hardif_neigh_get(const struct batadv_hard_iface *hard_iface,
const u8 *neigh_addr); const u8 *neigh_addr);
void void batadv_hardif_neigh_release(struct kref *ref);
batadv_hardif_neigh_put(struct batadv_hardif_neigh_node *hardif_neigh);
struct batadv_neigh_node * struct batadv_neigh_node *
batadv_neigh_node_get_or_create(struct batadv_orig_node *orig_node, batadv_neigh_node_get_or_create(struct batadv_orig_node *orig_node,
struct batadv_hard_iface *hard_iface, struct batadv_hard_iface *hard_iface,
const u8 *neigh_addr); const u8 *neigh_addr);
void batadv_neigh_node_put(struct batadv_neigh_node *neigh_node); void batadv_neigh_node_release(struct kref *ref);
struct batadv_neigh_node * struct batadv_neigh_node *
batadv_orig_router_get(struct batadv_orig_node *orig_node, batadv_orig_router_get(struct batadv_orig_node *orig_node,
const struct batadv_hard_iface *if_outgoing); const struct batadv_hard_iface *if_outgoing);
...@@ -42,7 +42,7 @@ batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh, ...@@ -42,7 +42,7 @@ batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh,
struct batadv_neigh_ifinfo * struct batadv_neigh_ifinfo *
batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh, batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh,
struct batadv_hard_iface *if_outgoing); struct batadv_hard_iface *if_outgoing);
void batadv_neigh_ifinfo_put(struct batadv_neigh_ifinfo *neigh_ifinfo); void batadv_neigh_ifinfo_release(struct kref *ref);
int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb); int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb);
...@@ -52,7 +52,7 @@ batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node, ...@@ -52,7 +52,7 @@ batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node,
struct batadv_orig_ifinfo * struct batadv_orig_ifinfo *
batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node, batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node,
struct batadv_hard_iface *if_outgoing); struct batadv_hard_iface *if_outgoing);
void batadv_orig_ifinfo_put(struct batadv_orig_ifinfo *orig_ifinfo); void batadv_orig_ifinfo_release(struct kref *ref);
int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb); int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb);
struct batadv_orig_node_vlan * struct batadv_orig_node_vlan *
...@@ -61,7 +61,7 @@ batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node, ...@@ -61,7 +61,7 @@ batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
struct batadv_orig_node_vlan * struct batadv_orig_node_vlan *
batadv_orig_node_vlan_get(struct batadv_orig_node *orig_node, batadv_orig_node_vlan_get(struct batadv_orig_node *orig_node,
unsigned short vid); unsigned short vid);
void batadv_orig_node_vlan_put(struct batadv_orig_node_vlan *orig_vlan); void batadv_orig_node_vlan_release(struct kref *ref);
/** /**
* batadv_choose_orig() - Return the index of the orig entry in the hash table * batadv_choose_orig() - Return the index of the orig entry in the hash table
...@@ -82,4 +82,86 @@ static inline u32 batadv_choose_orig(const void *data, u32 size) ...@@ -82,4 +82,86 @@ static inline u32 batadv_choose_orig(const void *data, u32 size)
struct batadv_orig_node * struct batadv_orig_node *
batadv_orig_hash_find(struct batadv_priv *bat_priv, const void *data); batadv_orig_hash_find(struct batadv_priv *bat_priv, const void *data);
/**
* batadv_orig_node_vlan_put() - decrement the refcounter and possibly release
* the originator-vlan object
* @orig_vlan: the originator-vlan object to release
*/
static inline void
batadv_orig_node_vlan_put(struct batadv_orig_node_vlan *orig_vlan)
{
if (!orig_vlan)
return;
kref_put(&orig_vlan->refcount, batadv_orig_node_vlan_release);
}
/**
* batadv_neigh_ifinfo_put() - decrement the refcounter and possibly release
* the neigh_ifinfo
* @neigh_ifinfo: the neigh_ifinfo object to release
*/
static inline void
batadv_neigh_ifinfo_put(struct batadv_neigh_ifinfo *neigh_ifinfo)
{
if (!neigh_ifinfo)
return;
kref_put(&neigh_ifinfo->refcount, batadv_neigh_ifinfo_release);
}
/**
* batadv_hardif_neigh_put() - decrement the hardif neighbors refcounter
* and possibly release it
* @hardif_neigh: hardif neigh neighbor to free
*/
static inline void
batadv_hardif_neigh_put(struct batadv_hardif_neigh_node *hardif_neigh)
{
if (!hardif_neigh)
return;
kref_put(&hardif_neigh->refcount, batadv_hardif_neigh_release);
}
/**
* batadv_neigh_node_put() - decrement the neighbors refcounter and possibly
* release it
* @neigh_node: neigh neighbor to free
*/
static inline void batadv_neigh_node_put(struct batadv_neigh_node *neigh_node)
{
if (!neigh_node)
return;
kref_put(&neigh_node->refcount, batadv_neigh_node_release);
}
/**
* batadv_orig_ifinfo_put() - decrement the refcounter and possibly release
* the orig_ifinfo
* @orig_ifinfo: the orig_ifinfo object to release
*/
static inline void
batadv_orig_ifinfo_put(struct batadv_orig_ifinfo *orig_ifinfo)
{
if (!orig_ifinfo)
return;
kref_put(&orig_ifinfo->refcount, batadv_orig_ifinfo_release);
}
/**
* batadv_orig_node_put() - decrement the orig node refcounter and possibly
* release it
* @orig_node: the orig node to free
*/
static inline void batadv_orig_node_put(struct batadv_orig_node *orig_node)
{
if (!orig_node)
return;
kref_put(&orig_node->refcount, batadv_orig_node_release);
}
#endif /* _NET_BATMAN_ADV_ORIGINATOR_H_ */ #endif /* _NET_BATMAN_ADV_ORIGINATOR_H_ */
...@@ -101,7 +101,6 @@ static void _batadv_update_route(struct batadv_priv *bat_priv, ...@@ -101,7 +101,6 @@ static void _batadv_update_route(struct batadv_priv *bat_priv,
} }
/* decrease refcount of previous best neighbor */ /* decrease refcount of previous best neighbor */
if (curr_router)
batadv_neigh_node_put(curr_router); batadv_neigh_node_put(curr_router);
} }
...@@ -128,7 +127,6 @@ void batadv_update_route(struct batadv_priv *bat_priv, ...@@ -128,7 +127,6 @@ void batadv_update_route(struct batadv_priv *bat_priv,
_batadv_update_route(bat_priv, orig_node, recv_if, neigh_node); _batadv_update_route(bat_priv, orig_node, recv_if, neigh_node);
out: out:
if (router)
batadv_neigh_node_put(router); batadv_neigh_node_put(router);
} }
...@@ -269,9 +267,7 @@ static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv, ...@@ -269,9 +267,7 @@ static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
goto out; goto out;
} }
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
kfree_skb(skb); kfree_skb(skb);
...@@ -324,9 +320,7 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv, ...@@ -324,9 +320,7 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
skb = NULL; skb = NULL;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
kfree_skb(skb); kfree_skb(skb);
...@@ -425,7 +419,6 @@ int batadv_recv_icmp_packet(struct sk_buff *skb, ...@@ -425,7 +419,6 @@ int batadv_recv_icmp_packet(struct sk_buff *skb,
skb = NULL; skb = NULL;
put_orig_node: put_orig_node:
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
free_skb: free_skb:
kfree_skb(skb); kfree_skb(skb);
...@@ -513,7 +506,6 @@ batadv_last_bonding_replace(struct batadv_orig_node *orig_node, ...@@ -513,7 +506,6 @@ batadv_last_bonding_replace(struct batadv_orig_node *orig_node,
orig_node->last_bonding_candidate = new_candidate; orig_node->last_bonding_candidate = new_candidate;
spin_unlock_bh(&orig_node->neigh_list_lock); spin_unlock_bh(&orig_node->neigh_list_lock);
if (old_candidate)
batadv_orig_ifinfo_put(old_candidate); batadv_orig_ifinfo_put(old_candidate);
} }
...@@ -656,7 +648,6 @@ batadv_find_router(struct batadv_priv *bat_priv, ...@@ -656,7 +648,6 @@ batadv_find_router(struct batadv_priv *bat_priv,
batadv_orig_ifinfo_put(next_candidate); batadv_orig_ifinfo_put(next_candidate);
} }
if (last_candidate)
batadv_orig_ifinfo_put(last_candidate); batadv_orig_ifinfo_put(last_candidate);
return router; return router;
...@@ -785,9 +776,7 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, struct sk_buff *skb, ...@@ -785,9 +776,7 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
ret = true; ret = true;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
return ret; return ret;
...@@ -1031,7 +1020,6 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, ...@@ -1031,7 +1020,6 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
orig_node); orig_node);
rx_success: rx_success:
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
return NET_RX_SUCCESS; return NET_RX_SUCCESS;
...@@ -1279,7 +1267,6 @@ int batadv_recv_bcast_packet(struct sk_buff *skb, ...@@ -1279,7 +1267,6 @@ int batadv_recv_bcast_packet(struct sk_buff *skb,
kfree_skb(skb); kfree_skb(skb);
ret = NET_RX_DROP; ret = NET_RX_DROP;
out: out:
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
return ret; return ret;
} }
...@@ -152,7 +152,6 @@ int batadv_send_unicast_skb(struct sk_buff *skb, ...@@ -152,7 +152,6 @@ int batadv_send_unicast_skb(struct sk_buff *skb,
if (hardif_neigh && ret != NET_XMIT_DROP) if (hardif_neigh && ret != NET_XMIT_DROP)
hardif_neigh->bat_v.last_unicast_tx = jiffies; hardif_neigh->bat_v.last_unicast_tx = jiffies;
if (hardif_neigh)
batadv_hardif_neigh_put(hardif_neigh); batadv_hardif_neigh_put(hardif_neigh);
#endif #endif
...@@ -309,7 +308,6 @@ bool batadv_send_skb_prepare_unicast_4addr(struct batadv_priv *bat_priv, ...@@ -309,7 +308,6 @@ bool batadv_send_skb_prepare_unicast_4addr(struct batadv_priv *bat_priv,
ret = true; ret = true;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return ret; return ret;
} }
...@@ -425,7 +423,6 @@ int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv, ...@@ -425,7 +423,6 @@ int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv,
ret = batadv_send_skb_unicast(bat_priv, skb, packet_type, ret = batadv_send_skb_unicast(bat_priv, skb, packet_type,
packet_subtype, orig_node, vid); packet_subtype, orig_node, vid);
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
return ret; return ret;
...@@ -452,7 +449,6 @@ int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb, ...@@ -452,7 +449,6 @@ int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
ret = batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST_4ADDR, ret = batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST_4ADDR,
BATADV_P_DATA, orig_node, vid); BATADV_P_DATA, orig_node, vid);
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
return ret; return ret;
...@@ -474,9 +470,7 @@ void batadv_forw_packet_free(struct batadv_forw_packet *forw_packet, ...@@ -474,9 +470,7 @@ void batadv_forw_packet_free(struct batadv_forw_packet *forw_packet,
else else
consume_skb(forw_packet->skb); consume_skb(forw_packet->skb);
if (forw_packet->if_incoming)
batadv_hardif_put(forw_packet->if_incoming); batadv_hardif_put(forw_packet->if_incoming);
if (forw_packet->if_outgoing)
batadv_hardif_put(forw_packet->if_outgoing); batadv_hardif_put(forw_packet->if_outgoing);
if (forw_packet->queue_left) if (forw_packet->queue_left)
atomic_inc(forw_packet->queue_left); atomic_inc(forw_packet->queue_left);
...@@ -748,6 +742,10 @@ void batadv_forw_packet_ogmv1_queue(struct batadv_priv *bat_priv, ...@@ -748,6 +742,10 @@ void batadv_forw_packet_ogmv1_queue(struct batadv_priv *bat_priv,
* Adds a broadcast packet to the queue and sets up timers. Broadcast packets * Adds a broadcast packet to the queue and sets up timers. Broadcast packets
* are sent multiple times to increase probability for being received. * are sent multiple times to increase probability for being received.
* *
* This call clones the given skb, hence the caller needs to take into
* account that the data segment of the original skb might not be
* modifiable anymore.
*
* Return: NETDEV_TX_OK on success and NETDEV_TX_BUSY on errors. * Return: NETDEV_TX_OK on success and NETDEV_TX_BUSY on errors.
*/ */
static int batadv_forw_bcast_packet_to_list(struct batadv_priv *bat_priv, static int batadv_forw_bcast_packet_to_list(struct batadv_priv *bat_priv,
...@@ -761,7 +759,7 @@ static int batadv_forw_bcast_packet_to_list(struct batadv_priv *bat_priv, ...@@ -761,7 +759,7 @@ static int batadv_forw_bcast_packet_to_list(struct batadv_priv *bat_priv,
unsigned long send_time = jiffies; unsigned long send_time = jiffies;
struct sk_buff *newskb; struct sk_buff *newskb;
newskb = skb_copy(skb, GFP_ATOMIC); newskb = skb_clone(skb, GFP_ATOMIC);
if (!newskb) if (!newskb)
goto err; goto err;
...@@ -800,6 +798,10 @@ static int batadv_forw_bcast_packet_to_list(struct batadv_priv *bat_priv, ...@@ -800,6 +798,10 @@ static int batadv_forw_bcast_packet_to_list(struct batadv_priv *bat_priv,
* or if a delay is given after that. Furthermore, queues additional * or if a delay is given after that. Furthermore, queues additional
* retransmissions if this interface is a wireless one. * retransmissions if this interface is a wireless one.
* *
* This call clones the given skb, hence the caller needs to take into
* account that the data segment of the original skb might not be
* modifiable anymore.
*
* Return: NETDEV_TX_OK on success and NETDEV_TX_BUSY on errors. * Return: NETDEV_TX_OK on success and NETDEV_TX_BUSY on errors.
*/ */
static int batadv_forw_bcast_packet_if(struct batadv_priv *bat_priv, static int batadv_forw_bcast_packet_if(struct batadv_priv *bat_priv,
...@@ -814,7 +816,7 @@ static int batadv_forw_bcast_packet_if(struct batadv_priv *bat_priv, ...@@ -814,7 +816,7 @@ static int batadv_forw_bcast_packet_if(struct batadv_priv *bat_priv,
int ret = NETDEV_TX_OK; int ret = NETDEV_TX_OK;
if (!delay) { if (!delay) {
newskb = skb_copy(skb, GFP_ATOMIC); newskb = skb_clone(skb, GFP_ATOMIC);
if (!newskb) if (!newskb)
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
...@@ -867,7 +869,6 @@ static bool batadv_send_no_broadcast(struct batadv_priv *bat_priv, ...@@ -867,7 +869,6 @@ static bool batadv_send_no_broadcast(struct batadv_priv *bat_priv,
ret = batadv_hardif_no_broadcast(if_out, bcast_packet->orig, ret = batadv_hardif_no_broadcast(if_out, bcast_packet->orig,
orig_neigh); orig_neigh);
if (neigh_node)
batadv_hardif_neigh_put(neigh_node); batadv_hardif_neigh_put(neigh_node);
/* ok, may broadcast */ /* ok, may broadcast */
......
...@@ -383,9 +383,7 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb, ...@@ -383,9 +383,7 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
dropped_freed: dropped_freed:
batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED); batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED);
end: end:
if (mcast_single_orig)
batadv_orig_node_put(mcast_single_orig); batadv_orig_node_put(mcast_single_orig);
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
...@@ -501,7 +499,7 @@ void batadv_interface_rx(struct net_device *soft_iface, ...@@ -501,7 +499,7 @@ void batadv_interface_rx(struct net_device *soft_iface,
* after rcu grace period * after rcu grace period
* @ref: kref pointer of the vlan object * @ref: kref pointer of the vlan object
*/ */
static void batadv_softif_vlan_release(struct kref *ref) void batadv_softif_vlan_release(struct kref *ref)
{ {
struct batadv_softif_vlan *vlan; struct batadv_softif_vlan *vlan;
...@@ -514,19 +512,6 @@ static void batadv_softif_vlan_release(struct kref *ref) ...@@ -514,19 +512,6 @@ static void batadv_softif_vlan_release(struct kref *ref)
kfree_rcu(vlan, rcu); kfree_rcu(vlan, rcu);
} }
/**
* batadv_softif_vlan_put() - decrease the vlan object refcounter and
* possibly release it
* @vlan: the vlan object to release
*/
void batadv_softif_vlan_put(struct batadv_softif_vlan *vlan)
{
if (!vlan)
return;
kref_put(&vlan->refcount, batadv_softif_vlan_release);
}
/** /**
* batadv_softif_vlan_get() - get the vlan object for a specific vid * batadv_softif_vlan_get() - get the vlan object for a specific vid
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
...@@ -851,7 +836,6 @@ static int batadv_softif_slave_add(struct net_device *dev, ...@@ -851,7 +836,6 @@ static int batadv_softif_slave_add(struct net_device *dev,
ret = batadv_hardif_enable_interface(hard_iface, dev); ret = batadv_hardif_enable_interface(hard_iface, dev);
out: out:
if (hard_iface)
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
return ret; return ret;
} }
...@@ -878,7 +862,6 @@ static int batadv_softif_slave_del(struct net_device *dev, ...@@ -878,7 +862,6 @@ static int batadv_softif_slave_del(struct net_device *dev,
ret = 0; ret = 0;
out: out:
if (hard_iface)
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
return ret; return ret;
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "main.h" #include "main.h"
#include <linux/kref.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -21,8 +22,21 @@ void batadv_interface_rx(struct net_device *soft_iface, ...@@ -21,8 +22,21 @@ void batadv_interface_rx(struct net_device *soft_iface,
bool batadv_softif_is_valid(const struct net_device *net_dev); bool batadv_softif_is_valid(const struct net_device *net_dev);
extern struct rtnl_link_ops batadv_link_ops; extern struct rtnl_link_ops batadv_link_ops;
int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid); int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid);
void batadv_softif_vlan_put(struct batadv_softif_vlan *softif_vlan); void batadv_softif_vlan_release(struct kref *ref);
struct batadv_softif_vlan *batadv_softif_vlan_get(struct batadv_priv *bat_priv, struct batadv_softif_vlan *batadv_softif_vlan_get(struct batadv_priv *bat_priv,
unsigned short vid); unsigned short vid);
/**
* batadv_softif_vlan_put() - decrease the vlan object refcounter and
* possibly release it
* @vlan: the vlan object to release
*/
static inline void batadv_softif_vlan_put(struct batadv_softif_vlan *vlan)
{
if (!vlan)
return;
kref_put(&vlan->refcount, batadv_softif_vlan_release);
}
#endif /* _NET_BATMAN_ADV_SOFT_INTERFACE_H_ */ #endif /* _NET_BATMAN_ADV_SOFT_INTERFACE_H_ */
...@@ -358,6 +358,9 @@ static void batadv_tp_vars_release(struct kref *ref) ...@@ -358,6 +358,9 @@ static void batadv_tp_vars_release(struct kref *ref)
*/ */
static void batadv_tp_vars_put(struct batadv_tp_vars *tp_vars) static void batadv_tp_vars_put(struct batadv_tp_vars *tp_vars)
{ {
if (!tp_vars)
return;
kref_put(&tp_vars->refcount, batadv_tp_vars_release); kref_put(&tp_vars->refcount, batadv_tp_vars_release);
} }
...@@ -748,11 +751,8 @@ static void batadv_tp_recv_ack(struct batadv_priv *bat_priv, ...@@ -748,11 +751,8 @@ static void batadv_tp_recv_ack(struct batadv_priv *bat_priv,
wake_up(&tp_vars->more_bytes); wake_up(&tp_vars->more_bytes);
out: out:
if (likely(primary_if))
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
if (likely(orig_node))
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
if (likely(tp_vars))
batadv_tp_vars_put(tp_vars); batadv_tp_vars_put(tp_vars);
} }
...@@ -882,9 +882,7 @@ static int batadv_tp_send(void *arg) ...@@ -882,9 +882,7 @@ static int batadv_tp_send(void *arg)
} }
out: out:
if (likely(primary_if))
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
if (likely(orig_node))
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
batadv_tp_sender_end(bat_priv, tp_vars); batadv_tp_sender_end(bat_priv, tp_vars);
...@@ -1205,9 +1203,7 @@ static int batadv_tp_send_ack(struct batadv_priv *bat_priv, const u8 *dst, ...@@ -1205,9 +1203,7 @@ static int batadv_tp_send_ack(struct batadv_priv *bat_priv, const u8 *dst,
ret = 0; ret = 0;
out: out:
if (likely(orig_node))
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
if (likely(primary_if))
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return ret; return ret;
...@@ -1456,7 +1452,6 @@ static void batadv_tp_recv_msg(struct batadv_priv *bat_priv, ...@@ -1456,7 +1452,6 @@ static void batadv_tp_recv_msg(struct batadv_priv *bat_priv,
batadv_tp_send_ack(bat_priv, icmp->orig, tp_vars->last_recv, batadv_tp_send_ack(bat_priv, icmp->orig, tp_vars->last_recv,
icmp->timestamp, icmp->session, icmp->uid); icmp->timestamp, icmp->session, icmp->uid);
out: out:
if (likely(tp_vars))
batadv_tp_vars_put(tp_vars); batadv_tp_vars_put(tp_vars);
} }
......
...@@ -247,6 +247,9 @@ static void batadv_tt_local_entry_release(struct kref *ref) ...@@ -247,6 +247,9 @@ static void batadv_tt_local_entry_release(struct kref *ref)
static void static void
batadv_tt_local_entry_put(struct batadv_tt_local_entry *tt_local_entry) batadv_tt_local_entry_put(struct batadv_tt_local_entry *tt_local_entry)
{ {
if (!tt_local_entry)
return;
kref_put(&tt_local_entry->common.refcount, kref_put(&tt_local_entry->common.refcount,
batadv_tt_local_entry_release); batadv_tt_local_entry_release);
} }
...@@ -270,7 +273,7 @@ static void batadv_tt_global_entry_free_rcu(struct rcu_head *rcu) ...@@ -270,7 +273,7 @@ static void batadv_tt_global_entry_free_rcu(struct rcu_head *rcu)
* queue for free after rcu grace period * queue for free after rcu grace period
* @ref: kref pointer of the nc_node * @ref: kref pointer of the nc_node
*/ */
static void batadv_tt_global_entry_release(struct kref *ref) void batadv_tt_global_entry_release(struct kref *ref)
{ {
struct batadv_tt_global_entry *tt_global_entry; struct batadv_tt_global_entry *tt_global_entry;
...@@ -282,17 +285,6 @@ static void batadv_tt_global_entry_release(struct kref *ref) ...@@ -282,17 +285,6 @@ static void batadv_tt_global_entry_release(struct kref *ref)
call_rcu(&tt_global_entry->common.rcu, batadv_tt_global_entry_free_rcu); call_rcu(&tt_global_entry->common.rcu, batadv_tt_global_entry_free_rcu);
} }
/**
* batadv_tt_global_entry_put() - decrement the tt_global_entry refcounter and
* possibly release it
* @tt_global_entry: tt_global_entry to be free'd
*/
void batadv_tt_global_entry_put(struct batadv_tt_global_entry *tt_global_entry)
{
kref_put(&tt_global_entry->common.refcount,
batadv_tt_global_entry_release);
}
/** /**
* batadv_tt_global_hash_count() - count the number of orig entries * batadv_tt_global_hash_count() - count the number of orig entries
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
...@@ -452,6 +444,9 @@ static void batadv_tt_orig_list_entry_release(struct kref *ref) ...@@ -452,6 +444,9 @@ static void batadv_tt_orig_list_entry_release(struct kref *ref)
static void static void
batadv_tt_orig_list_entry_put(struct batadv_tt_orig_list_entry *orig_entry) batadv_tt_orig_list_entry_put(struct batadv_tt_orig_list_entry *orig_entry)
{ {
if (!orig_entry)
return;
kref_put(&orig_entry->refcount, batadv_tt_orig_list_entry_release); kref_put(&orig_entry->refcount, batadv_tt_orig_list_entry_release);
} }
...@@ -818,12 +813,9 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr, ...@@ -818,12 +813,9 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr,
ret = true; ret = true;
out: out:
if (in_hardif)
batadv_hardif_put(in_hardif); batadv_hardif_put(in_hardif);
dev_put(in_dev); dev_put(in_dev);
if (tt_local)
batadv_tt_local_entry_put(tt_local); batadv_tt_local_entry_put(tt_local);
if (tt_global)
batadv_tt_global_entry_put(tt_global); batadv_tt_global_entry_put(tt_global);
return ret; return ret;
} }
...@@ -1214,7 +1206,6 @@ int batadv_tt_local_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -1214,7 +1206,6 @@ int batadv_tt_local_dump(struct sk_buff *msg, struct netlink_callback *cb)
ret = msg->len; ret = msg->len;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
dev_put(soft_iface); dev_put(soft_iface);
...@@ -1303,7 +1294,6 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr, ...@@ -1303,7 +1294,6 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr,
batadv_tt_local_entry_put(tt_removed_entry); batadv_tt_local_entry_put(tt_removed_entry);
out: out:
if (tt_local_entry)
batadv_tt_local_entry_put(tt_local_entry); batadv_tt_local_entry_put(tt_local_entry);
return curr_flags; return curr_flags;
...@@ -1574,7 +1564,6 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global, ...@@ -1574,7 +1564,6 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
sync_flags: sync_flags:
batadv_tt_global_sync_flags(tt_global); batadv_tt_global_sync_flags(tt_global);
out: out:
if (orig_entry)
batadv_tt_orig_list_entry_put(orig_entry); batadv_tt_orig_list_entry_put(orig_entry);
spin_unlock_bh(&tt_global->list_lock); spin_unlock_bh(&tt_global->list_lock);
...@@ -1748,9 +1737,7 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv, ...@@ -1748,9 +1737,7 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_ROAM; tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_ROAM;
out: out:
if (tt_global_entry)
batadv_tt_global_entry_put(tt_global_entry); batadv_tt_global_entry_put(tt_global_entry);
if (tt_local_entry)
batadv_tt_local_entry_put(tt_local_entry); batadv_tt_local_entry_put(tt_local_entry);
return ret; return ret;
} }
...@@ -1787,14 +1774,12 @@ batadv_transtable_best_orig(struct batadv_priv *bat_priv, ...@@ -1787,14 +1774,12 @@ batadv_transtable_best_orig(struct batadv_priv *bat_priv,
} }
/* release the refcount for the "old" best */ /* release the refcount for the "old" best */
if (best_router)
batadv_neigh_node_put(best_router); batadv_neigh_node_put(best_router);
best_entry = orig_entry; best_entry = orig_entry;
best_router = router; best_router = router;
} }
if (best_router)
batadv_neigh_node_put(best_router); batadv_neigh_node_put(best_router);
return best_entry; return best_entry;
...@@ -2001,7 +1986,6 @@ int batadv_tt_global_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -2001,7 +1986,6 @@ int batadv_tt_global_dump(struct sk_buff *msg, struct netlink_callback *cb)
ret = msg->len; ret = msg->len;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
dev_put(soft_iface); dev_put(soft_iface);
...@@ -2193,9 +2177,7 @@ static void batadv_tt_global_del(struct batadv_priv *bat_priv, ...@@ -2193,9 +2177,7 @@ static void batadv_tt_global_del(struct batadv_priv *bat_priv,
} }
out: out:
if (tt_global_entry)
batadv_tt_global_entry_put(tt_global_entry); batadv_tt_global_entry_put(tt_global_entry);
if (local_entry)
batadv_tt_local_entry_put(local_entry); batadv_tt_local_entry_put(local_entry);
} }
...@@ -2423,9 +2405,7 @@ struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv, ...@@ -2423,9 +2405,7 @@ struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
rcu_read_unlock(); rcu_read_unlock();
out: out:
if (tt_global_entry)
batadv_tt_global_entry_put(tt_global_entry); batadv_tt_global_entry_put(tt_global_entry);
if (tt_local_entry)
batadv_tt_local_entry_put(tt_local_entry); batadv_tt_local_entry_put(tt_local_entry);
return orig_node; return orig_node;
...@@ -2603,6 +2583,9 @@ static void batadv_tt_req_node_release(struct kref *ref) ...@@ -2603,6 +2583,9 @@ static void batadv_tt_req_node_release(struct kref *ref)
*/ */
static void batadv_tt_req_node_put(struct batadv_tt_req_node *tt_req_node) static void batadv_tt_req_node_put(struct batadv_tt_req_node *tt_req_node)
{ {
if (!tt_req_node)
return;
kref_put(&tt_req_node->refcount, batadv_tt_req_node_release); kref_put(&tt_req_node->refcount, batadv_tt_req_node_release);
} }
...@@ -2984,7 +2967,6 @@ static bool batadv_send_tt_request(struct batadv_priv *bat_priv, ...@@ -2984,7 +2967,6 @@ static bool batadv_send_tt_request(struct batadv_priv *bat_priv,
ret = true; ret = true;
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
if (ret && tt_req_node) { if (ret && tt_req_node) {
...@@ -2996,7 +2978,6 @@ static bool batadv_send_tt_request(struct batadv_priv *bat_priv, ...@@ -2996,7 +2978,6 @@ static bool batadv_send_tt_request(struct batadv_priv *bat_priv,
spin_unlock_bh(&bat_priv->tt.req_list_lock); spin_unlock_bh(&bat_priv->tt.req_list_lock);
} }
if (tt_req_node)
batadv_tt_req_node_put(tt_req_node); batadv_tt_req_node_put(tt_req_node);
kfree(tvlv_tt_data); kfree(tvlv_tt_data);
...@@ -3128,9 +3109,7 @@ static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv, ...@@ -3128,9 +3109,7 @@ static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv,
spin_unlock_bh(&req_dst_orig_node->tt_buff_lock); spin_unlock_bh(&req_dst_orig_node->tt_buff_lock);
out: out:
if (res_dst_orig_node)
batadv_orig_node_put(res_dst_orig_node); batadv_orig_node_put(res_dst_orig_node);
if (req_dst_orig_node)
batadv_orig_node_put(req_dst_orig_node); batadv_orig_node_put(req_dst_orig_node);
kfree(tvlv_tt_data); kfree(tvlv_tt_data);
return ret; return ret;
...@@ -3245,9 +3224,7 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv, ...@@ -3245,9 +3224,7 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
spin_unlock_bh(&bat_priv->tt.last_changeset_lock); spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
out: out:
spin_unlock_bh(&bat_priv->tt.commit_lock); spin_unlock_bh(&bat_priv->tt.commit_lock);
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
kfree(tvlv_tt_data); kfree(tvlv_tt_data);
/* The packet was for this host, so it doesn't need to be re-routed */ /* The packet was for this host, so it doesn't need to be re-routed */
...@@ -3333,7 +3310,6 @@ static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv, ...@@ -3333,7 +3310,6 @@ static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
atomic_set(&orig_node->last_ttvn, ttvn); atomic_set(&orig_node->last_ttvn, ttvn);
out: out:
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
} }
...@@ -3375,7 +3351,6 @@ bool batadv_is_my_client(struct batadv_priv *bat_priv, const u8 *addr, ...@@ -3375,7 +3351,6 @@ bool batadv_is_my_client(struct batadv_priv *bat_priv, const u8 *addr,
goto out; goto out;
ret = true; ret = true;
out: out:
if (tt_local_entry)
batadv_tt_local_entry_put(tt_local_entry); batadv_tt_local_entry_put(tt_local_entry);
return ret; return ret;
} }
...@@ -3439,7 +3414,6 @@ static void batadv_handle_tt_response(struct batadv_priv *bat_priv, ...@@ -3439,7 +3414,6 @@ static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
spin_unlock_bh(&bat_priv->tt.req_list_lock); spin_unlock_bh(&bat_priv->tt.req_list_lock);
out: out:
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
} }
...@@ -3571,7 +3545,6 @@ static void batadv_send_roam_adv(struct batadv_priv *bat_priv, u8 *client, ...@@ -3571,7 +3545,6 @@ static void batadv_send_roam_adv(struct batadv_priv *bat_priv, u8 *client,
&tvlv_roam, sizeof(tvlv_roam)); &tvlv_roam, sizeof(tvlv_roam));
out: out:
if (primary_if)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
} }
...@@ -4167,7 +4140,6 @@ static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv, ...@@ -4167,7 +4140,6 @@ static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
atomic_read(&orig_node->last_ttvn) + 1); atomic_read(&orig_node->last_ttvn) + 1);
out: out:
if (orig_node)
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
return NET_RX_SUCCESS; return NET_RX_SUCCESS;
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "main.h" #include "main.h"
#include <linux/kref.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/netlink.h> #include <linux/netlink.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
...@@ -28,7 +29,7 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv, ...@@ -28,7 +29,7 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
struct batadv_tt_global_entry * struct batadv_tt_global_entry *
batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const u8 *addr, batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const u8 *addr,
unsigned short vid); unsigned short vid);
void batadv_tt_global_entry_put(struct batadv_tt_global_entry *tt_global_entry); void batadv_tt_global_entry_release(struct kref *ref);
int batadv_tt_global_hash_count(struct batadv_priv *bat_priv, int batadv_tt_global_hash_count(struct batadv_priv *bat_priv,
const u8 *addr, unsigned short vid); const u8 *addr, unsigned short vid);
struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv, struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
...@@ -55,4 +56,19 @@ bool batadv_tt_global_is_isolated(struct batadv_priv *bat_priv, ...@@ -55,4 +56,19 @@ bool batadv_tt_global_is_isolated(struct batadv_priv *bat_priv,
int batadv_tt_cache_init(void); int batadv_tt_cache_init(void);
void batadv_tt_cache_destroy(void); void batadv_tt_cache_destroy(void);
/**
* batadv_tt_global_entry_put() - decrement the tt_global_entry refcounter and
* possibly release it
* @tt_global_entry: tt_global_entry to be free'd
*/
static inline void
batadv_tt_global_entry_put(struct batadv_tt_global_entry *tt_global_entry)
{
if (!tt_global_entry)
return;
kref_put(&tt_global_entry->common.refcount,
batadv_tt_global_entry_release);
}
#endif /* _NET_BATMAN_ADV_TRANSLATION_TABLE_H_ */ #endif /* _NET_BATMAN_ADV_TRANSLATION_TABLE_H_ */
...@@ -50,6 +50,9 @@ static void batadv_tvlv_handler_release(struct kref *ref) ...@@ -50,6 +50,9 @@ static void batadv_tvlv_handler_release(struct kref *ref)
*/ */
static void batadv_tvlv_handler_put(struct batadv_tvlv_handler *tvlv_handler) static void batadv_tvlv_handler_put(struct batadv_tvlv_handler *tvlv_handler)
{ {
if (!tvlv_handler)
return;
kref_put(&tvlv_handler->refcount, batadv_tvlv_handler_release); kref_put(&tvlv_handler->refcount, batadv_tvlv_handler_release);
} }
...@@ -106,6 +109,9 @@ static void batadv_tvlv_container_release(struct kref *ref) ...@@ -106,6 +109,9 @@ static void batadv_tvlv_container_release(struct kref *ref)
*/ */
static void batadv_tvlv_container_put(struct batadv_tvlv_container *tvlv) static void batadv_tvlv_container_put(struct batadv_tvlv_container *tvlv)
{ {
if (!tvlv)
return;
kref_put(&tvlv->refcount, batadv_tvlv_container_release); kref_put(&tvlv->refcount, batadv_tvlv_container_release);
} }
...@@ -438,7 +444,6 @@ int batadv_tvlv_containers_process(struct batadv_priv *bat_priv, ...@@ -438,7 +444,6 @@ int batadv_tvlv_containers_process(struct batadv_priv *bat_priv,
ogm_source, orig_node, ogm_source, orig_node,
src, dst, tvlv_value, src, dst, tvlv_value,
tvlv_value_cont_len); tvlv_value_cont_len);
if (tvlv_handler)
batadv_tvlv_handler_put(tvlv_handler); batadv_tvlv_handler_put(tvlv_handler);
tvlv_value = (u8 *)tvlv_value + tvlv_value_cont_len; tvlv_value = (u8 *)tvlv_value + tvlv_value_cont_len;
tvlv_value_len -= tvlv_value_cont_len; tvlv_value_len -= tvlv_value_cont_len;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment