提交 9e794b6b 编写于 作者: A Andreas Pape 提交者: Simon Wunderlich

batman-adv: drop unicast packets from other backbone gw

Additional dropping of unicast packets received from another backbone gw if
the same backbone network before being forwarded to the same backbone again
is necessary. It was observed in a test setup that in rare cases these
frames lead to looping unicast traffic backbone->mesh->backbone.
Signed-off-by: NAndreas Pape <apape@phoenixcontact.com>
Acked-by: NSimon Wunderlich <sw@simonwunderlich.de>
[sven@narfation.org: fix conflicts with current version]
Signed-off-by: NSven Eckelmann <sven@narfation.org>
Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
上级 9aa5cd79
...@@ -941,15 +941,17 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, ...@@ -941,15 +941,17 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
struct batadv_unicast_packet *unicast_packet; struct batadv_unicast_packet *unicast_packet;
struct batadv_unicast_4addr_packet *unicast_4addr_packet; struct batadv_unicast_4addr_packet *unicast_4addr_packet;
u8 *orig_addr; u8 *orig_addr, *orig_addr_gw;
struct batadv_orig_node *orig_node = NULL; struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL;
int check, hdr_size = sizeof(*unicast_packet); int check, hdr_size = sizeof(*unicast_packet);
enum batadv_subtype subtype; enum batadv_subtype subtype;
bool is4addr; struct ethhdr *ethhdr;
int ret = NET_RX_DROP; int ret = NET_RX_DROP;
bool is4addr, is_gw;
unicast_packet = (struct batadv_unicast_packet *)skb->data; unicast_packet = (struct batadv_unicast_packet *)skb->data;
unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data; unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
ethhdr = eth_hdr(skb);
is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR; is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
/* the caller function should have already pulled 2 bytes */ /* the caller function should have already pulled 2 bytes */
...@@ -972,6 +974,23 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, ...@@ -972,6 +974,23 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
/* packet for me */ /* packet for me */
if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) { if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
/* If this is a unicast packet from another backgone gw,
* drop it.
*/
orig_addr_gw = ethhdr->h_source;
orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw);
if (orig_node_gw) {
is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw,
hdr_size);
batadv_orig_node_put(orig_node_gw);
if (is_gw) {
batadv_dbg(BATADV_DBG_BLA, bat_priv,
"Dropped unicast pkt received from another backbone gw %pM.\n",
orig_addr_gw);
return NET_RX_DROP;
}
}
if (is4addr) { if (is4addr) {
subtype = unicast_4addr_packet->subtype; subtype = unicast_4addr_packet->subtype;
batadv_dat_inc_counter(bat_priv, subtype); batadv_dat_inc_counter(bat_priv, subtype);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册