From ba6be6488f6b3fcaed5f72f445cf04edfdeaa49d Mon Sep 17 00:00:00 2001 From: Murat Sezgin Date: Tue, 9 Feb 2016 18:00:05 -0800 Subject: [PATCH 221/500] Fixed the br_dev_xmit function to call Hy-Fi hooks - Previously this wasn't calling the Hy-Fi hooks (meaning that all locally generated traffic was sent on a FDB selected port, and hence in a Hy-Fi environment, could be spread across all backhauls) - Fixed to be the same as the banana kernel, and call the br_get_dst_hook_t Change-Id: If5e964f385614beb5ebe9e1083ca947464165b9e Signed-off-by: Murat Sezgin Signed-off-by: Mughilan Ramajayam --- net/bridge/br_device.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -38,6 +38,8 @@ netdev_tx_t br_dev_xmit(struct sk_buff * struct net_bridge_vlan *vlan; const unsigned char *dest; u16 vid = 0; + struct net_bridge_port *pdst; + br_get_dst_hook_t *get_dst_hook; if (unlikely(reason != SKB_NOT_DROPPED_YET)) { kfree_skb_reason(skb, reason); @@ -85,6 +87,8 @@ netdev_tx_t br_dev_xmit(struct sk_buff * br_do_suppress_nd(skb, br, vid, NULL, msg); } + get_dst_hook = rcu_dereference(br_get_dst_hook); + dest = eth_hdr(skb)->h_dest; if (is_broadcast_ether_addr(dest)) { br_flood(br, skb, BR_PKT_BROADCAST, false, true, vid); @@ -109,11 +113,21 @@ netdev_tx_t br_dev_xmit(struct sk_buff * br_multicast_flood(mdst, skb, brmctx, false, true); else br_flood(br, skb, BR_PKT_MULTICAST, false, true, vid); - } else if ((dst = br_fdb_find_rcu(br, dest, vid)) != NULL) { - br_forward(dst->dst, skb, false, true); } else { - br_flood(br, skb, BR_PKT_UNICAST, false, true, vid); + pdst = __br_get(get_dst_hook, NULL, NULL, &skb); + if (pdst) { + if (!skb) + goto out; + br_forward(pdst, skb, false, true); + } else { + dst = br_fdb_find_rcu(br, dest, vid); + if (dst) + br_forward(dst->dst, skb, false, true); + else + br_flood(br, skb, BR_PKT_UNICAST, false, true, vid); + } } + out: rcu_read_unlock(); return NETDEV_TX_OK;