Commit 0fecd750 authored by David S. Miller's avatar David S. Miller

Merge tag 'batman-adv-fix-for-davem' of git://git.open-mesh.org/linux-merge

Included changes:
- fix MAC address check in case of multiple mesh interfaces
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ea2f2fa1 fe8a93b9
...@@ -169,7 +169,7 @@ void batadv_mesh_free(struct net_device *soft_iface) ...@@ -169,7 +169,7 @@ void batadv_mesh_free(struct net_device *soft_iface)
atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE); atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
} }
int batadv_is_my_mac(const uint8_t *addr) int batadv_is_my_mac(struct batadv_priv *bat_priv, const uint8_t *addr)
{ {
const struct batadv_hard_iface *hard_iface; const struct batadv_hard_iface *hard_iface;
...@@ -178,6 +178,9 @@ int batadv_is_my_mac(const uint8_t *addr) ...@@ -178,6 +178,9 @@ int batadv_is_my_mac(const uint8_t *addr)
if (hard_iface->if_status != BATADV_IF_ACTIVE) if (hard_iface->if_status != BATADV_IF_ACTIVE)
continue; continue;
if (hard_iface->soft_iface != bat_priv->soft_iface)
continue;
if (batadv_compare_eth(hard_iface->net_dev->dev_addr, addr)) { if (batadv_compare_eth(hard_iface->net_dev->dev_addr, addr)) {
rcu_read_unlock(); rcu_read_unlock();
return 1; return 1;
......
...@@ -162,7 +162,7 @@ extern struct workqueue_struct *batadv_event_workqueue; ...@@ -162,7 +162,7 @@ extern struct workqueue_struct *batadv_event_workqueue;
int batadv_mesh_init(struct net_device *soft_iface); int batadv_mesh_init(struct net_device *soft_iface);
void batadv_mesh_free(struct net_device *soft_iface); void batadv_mesh_free(struct net_device *soft_iface);
int batadv_is_my_mac(const uint8_t *addr); int batadv_is_my_mac(struct batadv_priv *bat_priv, const uint8_t *addr);
struct batadv_hard_iface * struct batadv_hard_iface *
batadv_seq_print_text_primary_if_get(struct seq_file *seq); batadv_seq_print_text_primary_if_get(struct seq_file *seq);
int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev, int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
......
...@@ -402,7 +402,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb, ...@@ -402,7 +402,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb,
goto out; goto out;
/* not for me */ /* not for me */
if (!batadv_is_my_mac(ethhdr->h_dest)) if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
goto out; goto out;
icmp_packet = (struct batadv_icmp_packet_rr *)skb->data; icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
...@@ -416,7 +416,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb, ...@@ -416,7 +416,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb,
} }
/* packet for me */ /* packet for me */
if (batadv_is_my_mac(icmp_packet->dst)) if (batadv_is_my_mac(bat_priv, icmp_packet->dst))
return batadv_recv_my_icmp_packet(bat_priv, skb, hdr_size); return batadv_recv_my_icmp_packet(bat_priv, skb, hdr_size);
/* TTL exceeded */ /* TTL exceeded */
...@@ -548,7 +548,8 @@ batadv_find_ifalter_router(struct batadv_orig_node *primary_orig, ...@@ -548,7 +548,8 @@ batadv_find_ifalter_router(struct batadv_orig_node *primary_orig,
return router; return router;
} }
static int batadv_check_unicast_packet(struct sk_buff *skb, int hdr_size) static int batadv_check_unicast_packet(struct batadv_priv *bat_priv,
struct sk_buff *skb, int hdr_size)
{ {
struct ethhdr *ethhdr; struct ethhdr *ethhdr;
...@@ -567,7 +568,7 @@ static int batadv_check_unicast_packet(struct sk_buff *skb, int hdr_size) ...@@ -567,7 +568,7 @@ static int batadv_check_unicast_packet(struct sk_buff *skb, int hdr_size)
return -1; return -1;
/* not for me */ /* not for me */
if (!batadv_is_my_mac(ethhdr->h_dest)) if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
return -1; return -1;
return 0; return 0;
...@@ -582,7 +583,7 @@ int batadv_recv_tt_query(struct sk_buff *skb, struct batadv_hard_iface *recv_if) ...@@ -582,7 +583,7 @@ int batadv_recv_tt_query(struct sk_buff *skb, struct batadv_hard_iface *recv_if)
char tt_flag; char tt_flag;
size_t packet_size; size_t packet_size;
if (batadv_check_unicast_packet(skb, hdr_size) < 0) if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
return NET_RX_DROP; return NET_RX_DROP;
/* I could need to modify it */ /* I could need to modify it */
...@@ -614,7 +615,7 @@ int batadv_recv_tt_query(struct sk_buff *skb, struct batadv_hard_iface *recv_if) ...@@ -614,7 +615,7 @@ int batadv_recv_tt_query(struct sk_buff *skb, struct batadv_hard_iface *recv_if)
case BATADV_TT_RESPONSE: case BATADV_TT_RESPONSE:
batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_RX); batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_RX);
if (batadv_is_my_mac(tt_query->dst)) { if (batadv_is_my_mac(bat_priv, tt_query->dst)) {
/* packet needs to be linearized to access the TT /* packet needs to be linearized to access the TT
* changes * changes
*/ */
...@@ -657,14 +658,15 @@ int batadv_recv_roam_adv(struct sk_buff *skb, struct batadv_hard_iface *recv_if) ...@@ -657,14 +658,15 @@ int batadv_recv_roam_adv(struct sk_buff *skb, struct batadv_hard_iface *recv_if)
struct batadv_roam_adv_packet *roam_adv_packet; struct batadv_roam_adv_packet *roam_adv_packet;
struct batadv_orig_node *orig_node; struct batadv_orig_node *orig_node;
if (batadv_check_unicast_packet(skb, sizeof(*roam_adv_packet)) < 0) if (batadv_check_unicast_packet(bat_priv, skb,
sizeof(*roam_adv_packet)) < 0)
goto out; goto out;
batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_RX); batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_RX);
roam_adv_packet = (struct batadv_roam_adv_packet *)skb->data; roam_adv_packet = (struct batadv_roam_adv_packet *)skb->data;
if (!batadv_is_my_mac(roam_adv_packet->dst)) if (!batadv_is_my_mac(bat_priv, roam_adv_packet->dst))
return batadv_route_unicast_packet(skb, recv_if); return batadv_route_unicast_packet(skb, recv_if);
/* check if it is a backbone gateway. we don't accept /* check if it is a backbone gateway. we don't accept
...@@ -967,7 +969,7 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, ...@@ -967,7 +969,7 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
* last time) the packet had an updated information or not * last time) the packet had an updated information or not
*/ */
curr_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn); curr_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
if (!batadv_is_my_mac(unicast_packet->dest)) { if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
orig_node = batadv_orig_hash_find(bat_priv, orig_node = batadv_orig_hash_find(bat_priv,
unicast_packet->dest); unicast_packet->dest);
/* if it is not possible to find the orig_node representing the /* if it is not possible to find the orig_node representing the
...@@ -1044,14 +1046,14 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, ...@@ -1044,14 +1046,14 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
if (is4addr) if (is4addr)
hdr_size = sizeof(*unicast_4addr_packet); hdr_size = sizeof(*unicast_4addr_packet);
if (batadv_check_unicast_packet(skb, hdr_size) < 0) if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
return NET_RX_DROP; return NET_RX_DROP;
if (!batadv_check_unicast_ttvn(bat_priv, skb)) if (!batadv_check_unicast_ttvn(bat_priv, skb))
return NET_RX_DROP; return NET_RX_DROP;
/* packet for me */ /* packet for me */
if (batadv_is_my_mac(unicast_packet->dest)) { if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
if (is4addr) { if (is4addr) {
batadv_dat_inc_counter(bat_priv, batadv_dat_inc_counter(bat_priv,
unicast_4addr_packet->subtype); unicast_4addr_packet->subtype);
...@@ -1088,7 +1090,7 @@ int batadv_recv_ucast_frag_packet(struct sk_buff *skb, ...@@ -1088,7 +1090,7 @@ int batadv_recv_ucast_frag_packet(struct sk_buff *skb,
struct sk_buff *new_skb = NULL; struct sk_buff *new_skb = NULL;
int ret; int ret;
if (batadv_check_unicast_packet(skb, hdr_size) < 0) if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
return NET_RX_DROP; return NET_RX_DROP;
if (!batadv_check_unicast_ttvn(bat_priv, skb)) if (!batadv_check_unicast_ttvn(bat_priv, skb))
...@@ -1097,7 +1099,7 @@ int batadv_recv_ucast_frag_packet(struct sk_buff *skb, ...@@ -1097,7 +1099,7 @@ int batadv_recv_ucast_frag_packet(struct sk_buff *skb,
unicast_packet = (struct batadv_unicast_frag_packet *)skb->data; unicast_packet = (struct batadv_unicast_frag_packet *)skb->data;
/* packet for me */ /* packet for me */
if (batadv_is_my_mac(unicast_packet->dest)) { if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb); ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
if (ret == NET_RX_DROP) if (ret == NET_RX_DROP)
...@@ -1151,13 +1153,13 @@ int batadv_recv_bcast_packet(struct sk_buff *skb, ...@@ -1151,13 +1153,13 @@ int batadv_recv_bcast_packet(struct sk_buff *skb,
goto out; goto out;
/* ignore broadcasts sent by myself */ /* ignore broadcasts sent by myself */
if (batadv_is_my_mac(ethhdr->h_source)) if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
goto out; goto out;
bcast_packet = (struct batadv_bcast_packet *)skb->data; bcast_packet = (struct batadv_bcast_packet *)skb->data;
/* ignore broadcasts originated by myself */ /* ignore broadcasts originated by myself */
if (batadv_is_my_mac(bcast_packet->orig)) if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
goto out; goto out;
if (bcast_packet->header.ttl < 2) if (bcast_packet->header.ttl < 2)
...@@ -1243,14 +1245,14 @@ int batadv_recv_vis_packet(struct sk_buff *skb, ...@@ -1243,14 +1245,14 @@ int batadv_recv_vis_packet(struct sk_buff *skb,
ethhdr = (struct ethhdr *)skb_mac_header(skb); ethhdr = (struct ethhdr *)skb_mac_header(skb);
/* not for me */ /* not for me */
if (!batadv_is_my_mac(ethhdr->h_dest)) if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
return NET_RX_DROP; return NET_RX_DROP;
/* ignore own packets */ /* ignore own packets */
if (batadv_is_my_mac(vis_packet->vis_orig)) if (batadv_is_my_mac(bat_priv, vis_packet->vis_orig))
return NET_RX_DROP; return NET_RX_DROP;
if (batadv_is_my_mac(vis_packet->sender_orig)) if (batadv_is_my_mac(bat_priv, vis_packet->sender_orig))
return NET_RX_DROP; return NET_RX_DROP;
switch (vis_packet->vis_type) { switch (vis_packet->vis_type) {
......
...@@ -1953,7 +1953,7 @@ batadv_send_my_tt_response(struct batadv_priv *bat_priv, ...@@ -1953,7 +1953,7 @@ batadv_send_my_tt_response(struct batadv_priv *bat_priv,
bool batadv_send_tt_response(struct batadv_priv *bat_priv, bool batadv_send_tt_response(struct batadv_priv *bat_priv,
struct batadv_tt_query_packet *tt_request) struct batadv_tt_query_packet *tt_request)
{ {
if (batadv_is_my_mac(tt_request->dst)) { if (batadv_is_my_mac(bat_priv, tt_request->dst)) {
/* don't answer backbone gws! */ /* don't answer backbone gws! */
if (batadv_bla_is_backbone_gw_orig(bat_priv, tt_request->src)) if (batadv_bla_is_backbone_gw_orig(bat_priv, tt_request->src))
return true; return true;
......
...@@ -477,7 +477,7 @@ void batadv_receive_client_update_packet(struct batadv_priv *bat_priv, ...@@ -477,7 +477,7 @@ void batadv_receive_client_update_packet(struct batadv_priv *bat_priv,
/* Are we the target for this VIS packet? */ /* Are we the target for this VIS packet? */
if (vis_server == BATADV_VIS_TYPE_SERVER_SYNC && if (vis_server == BATADV_VIS_TYPE_SERVER_SYNC &&
batadv_is_my_mac(vis_packet->target_orig)) batadv_is_my_mac(bat_priv, vis_packet->target_orig))
are_target = 1; are_target = 1;
spin_lock_bh(&bat_priv->vis.hash_lock); spin_lock_bh(&bat_priv->vis.hash_lock);
...@@ -496,7 +496,7 @@ void batadv_receive_client_update_packet(struct batadv_priv *bat_priv, ...@@ -496,7 +496,7 @@ void batadv_receive_client_update_packet(struct batadv_priv *bat_priv,
batadv_send_list_add(bat_priv, info); batadv_send_list_add(bat_priv, info);
/* ... we're not the recipient (and thus need to forward). */ /* ... we're not the recipient (and thus need to forward). */
} else if (!batadv_is_my_mac(packet->target_orig)) { } else if (!batadv_is_my_mac(bat_priv, packet->target_orig)) {
batadv_send_list_add(bat_priv, info); batadv_send_list_add(bat_priv, info);
} }
......
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