--- zzzz-none-000/linux-4.19.183/net/bridge/br_input.c 2021-03-24 10:07:39.000000000 +0000 +++ bcm63-7530ax-756/linux-4.19.183/net/bridge/br_input.c 2023-06-28 08:54:21.000000000 +0000 @@ -23,6 +23,10 @@ #include "br_private.h" #include "br_private_tunnel.h" +#if defined(CONFIG_BCM_KF_BR_HOOKS) +#include +#endif + /* Hook for brouter */ br_should_route_hook_t __rcu *br_should_route_hook __read_mostly; EXPORT_SYMBOL(br_should_route_hook); @@ -82,7 +86,11 @@ struct net_bridge *br; u16 vid = 0; +#if defined(CONFIG_BCM_KF_BR_HOOKS) + if (!p || (p->state == BR_STATE_DISABLED && !bcm_hook_br_handle_frame_finish(skb, BR_STATE_DISABLED))) +#else if (!p || p->state == BR_STATE_DISABLED) +#endif goto drop; if (!br_allowed_ingress(p->br, nbp_vlan_group_rcu(p), skb, &vid)) @@ -109,6 +117,9 @@ } if (p->state == BR_STATE_LEARNING) +#if defined(CONFIG_BCM_KF_BR_HOOKS) + if (!bcm_hook_br_handle_frame_finish(skb, BR_STATE_LEARNING)) +#endif goto drop; BR_INPUT_SKB_CB(skb)->brdev = br->dev; @@ -215,12 +226,23 @@ if (!is_valid_ether_addr(eth_hdr(skb)->h_source)) goto drop; - +#if defined(CONFIG_BCM_KF_BR_HOOKS) + if (bcm_br_fdb_mac_limit(skb)) + goto drop; +#endif skb = skb_share_check(skb, GFP_ATOMIC); if (!skb) return RX_HANDLER_CONSUMED; p = br_port_get_rcu(skb->dev); +#if defined(CONFIG_BCM_KF_KERN_BUG_FIX) +//6/15/16 CL#119413 [JIRA SWBCACPE-23220] G.FAST: CPE may crash or freeze when dsl line is repeatedly disconnected under bi-dir non accelerated traffic (CSP#1035299) + if (!p) + { + kfree_skb(skb); + return RX_HANDLER_CONSUMED; + } +#endif if (p->flags & BR_VLAN_TUNNEL) { if (br_handle_ingress_vlan_tunnel(skb, p, nbp_vlan_group_rcu(p))) @@ -288,6 +310,16 @@ } forward: +#if defined(CONFIG_BCM_KF_BR_HOOKS) + if (bcm_hook_br_handle_frame_finish(skb, p->state)) { + /* force to forward brcm_type event packet */ + NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, + dev_net(skb->dev), NULL, skb, skb->dev, NULL, + br_handle_frame_finish); + return RX_HANDLER_CONSUMED; + } +#endif + switch (p->state) { case BR_STATE_FORWARDING: rhook = rcu_dereference(br_should_route_hook);