Commit 371351731e9c2a7d8f4b169731495cb4f0589063

Authored by Antonio Quartulli
1 parent 30cfd02b60

batman-adv: change interface_rx to get orig node

In order to understand  where a broadcast packet is coming from and use
this information to detect not yet announced clients, this patch modifies the
interface_rx() function by passing a new argument: the orig node
corresponding to the node that originated the received packet (if known).
This new argument if not NULL for broadcast packets only (other packets does not
have source field).

Signed-off-by: Antonio Quartulli <ordex@autistici.org>

Showing 3 changed files with 14 additions and 7 deletions Side-by-side Diff

net/batman-adv/routing.c
... ... @@ -1012,8 +1012,9 @@
1012 1012  
1013 1013 /* packet for me */
1014 1014 if (batadv_is_my_mac(unicast_packet->dest)) {
1015   - batadv_interface_rx(recv_if->soft_iface, skb, recv_if,
1016   - hdr_size);
  1015 + batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
  1016 + NULL);
  1017 +
1017 1018 return NET_RX_SUCCESS;
1018 1019 }
1019 1020  
... ... @@ -1050,7 +1051,7 @@
1050 1051 return NET_RX_SUCCESS;
1051 1052  
1052 1053 batadv_interface_rx(recv_if->soft_iface, new_skb, recv_if,
1053   - sizeof(struct batadv_unicast_packet));
  1054 + sizeof(struct batadv_unicast_packet), NULL);
1054 1055 return NET_RX_SUCCESS;
1055 1056 }
1056 1057  
... ... @@ -1137,7 +1138,8 @@
1137 1138 goto out;
1138 1139  
1139 1140 /* broadcast for me */
1140   - batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size);
  1141 + batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
  1142 + orig_node);
1141 1143 ret = NET_RX_SUCCESS;
1142 1144 goto out;
1143 1145  
net/batman-adv/soft-interface.c
... ... @@ -270,7 +270,7 @@
270 270  
271 271 void batadv_interface_rx(struct net_device *soft_iface,
272 272 struct sk_buff *skb, struct batadv_hard_iface *recv_if,
273   - int hdr_size)
  273 + int hdr_size, struct batadv_orig_node *orig_node)
274 274 {
275 275 struct batadv_priv *bat_priv = netdev_priv(soft_iface);
276 276 struct ethhdr *ethhdr;
... ... @@ -321,6 +321,10 @@
321 321 skb->len + ETH_HLEN);
322 322  
323 323 soft_iface->last_rx = jiffies;
  324 +
  325 + if (orig_node)
  326 + batadv_tt_add_temporary_global_entry(bat_priv, orig_node,
  327 + ethhdr->h_source);
324 328  
325 329 if (batadv_is_ap_isolated(bat_priv, ethhdr->h_source, ethhdr->h_dest))
326 330 goto dropped;
net/batman-adv/soft-interface.h
... ... @@ -21,8 +21,9 @@
21 21 #define _NET_BATMAN_ADV_SOFT_INTERFACE_H_
22 22  
23 23 int batadv_skb_head_push(struct sk_buff *skb, unsigned int len);
24   -void batadv_interface_rx(struct net_device *soft_iface, struct sk_buff *skb,
25   - struct batadv_hard_iface *recv_if, int hdr_size);
  24 +void batadv_interface_rx(struct net_device *soft_iface,
  25 + struct sk_buff *skb, struct batadv_hard_iface *recv_if,
  26 + int hdr_size, struct batadv_orig_node *orig_node);
26 27 struct net_device *batadv_softif_create(const char *name);
27 28 void batadv_softif_destroy(struct net_device *soft_iface);
28 29 int batadv_softif_is_valid(const struct net_device *net_dev);