--- zzzz-none-000/linux-4.9.279/net/bridge/br_input.c 2021-08-08 06:38:54.000000000 +0000 +++ puma7-atom-6591-750/linux-4.9.279/net/bridge/br_input.c 2023-02-08 11:43:43.000000000 +0000 @@ -22,6 +22,12 @@ #include #include "br_private.h" +#ifdef CONFIG_TI_L2_SELECTIVE_FORWARDER +extern int ti_selective_packet_handler (struct sk_buff *skb); +#endif /* CONFIG_TI_L2_SELECTIVE_FORWARDER */ +#ifdef CONFIG_INTEL_L2VPN_L2CP_FORWARD +extern int intel_l2vpn_packet_handler (struct sk_buff *skb, int *l2vpnRelate); +#endif /* CONFIG_INTEL_L2VPN_L2CP_FORWARD */ /* Hook for brouter */ br_should_route_hook_t __rcu *br_should_route_hook __read_mostly; EXPORT_SYMBOL(br_should_route_hook); @@ -146,13 +152,39 @@ nbp_switchdev_frame_mark(p, skb); - /* insert into forwarding database after filtering to avoid spoofing */ br = p->br; + +#ifdef CONFIG_BRIDGE_NETFILTER +#ifdef CONFIG_BRIDGE_EBT_FORWARD + /* Check for predetermined forwarding ebtables rule */ + if (skb->bridge_forward_port) { + BR_INPUT_SKB_CB(skb)->brdev = br->dev; + + local_rcv = !!(br->dev->flags & IFF_PROMISC); + br_forward(skb->bridge_forward_port, skb, local_rcv, false); + + if(local_rcv) { + if(skb) + return br_pass_frame_up(skb); + } + else { + goto out; + } + } +#endif +#endif + + /* insert into forwarding database after filtering to avoid spoofing */ if (p->flags & BR_LEARNING) br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, false); local_rcv = !!(br->dev->flags & IFF_PROMISC); if (is_multicast_ether_addr(dest)) { +#ifdef CONFIG_TI_L2_SELECTIVE_FORWARDER + if (ti_selective_packet_handler(skb) != 0) { + goto out; + } +#endif /* CONFIG_TI_L2_SELECTIVE_FORWARDER */ /* by definition the broadcast is also a multicast address */ if (is_broadcast_ether_addr(dest)) { pkt_type = BR_PKT_BROADCAST; @@ -168,6 +200,7 @@ goto drop; BR_INPUT_SKB_CB(skb)->brdev = br->dev; + BR_INPUT_SKB_CB(skb)->src_port_isolated = !!(p->flags & BR_ISOLATED); if (IS_ENABLED(CONFIG_INET) && skb->protocol == htons(ETH_P_ARP)) br_do_proxy_arp(skb, br, vid, p); @@ -201,8 +234,16 @@ dst->used = jiffies; br_forward(dst->dst, skb, local_rcv, false); } else { - if (!mcast_hit) +#ifdef CONFIG_TI_L2_SELECTIVE_FORWARDER + if (ti_selective_packet_handler(skb) != 0) + goto out; +#endif /* CONFIG_TI_L2_SELECTIVE_FORWARDER */ + if (!mcast_hit) { +#ifdef CONFIG_TI_PACKET_PROCESSOR + ti_hil_pp_event (TI_BRIDGE_PACKET_FLOODED, (void*)skb); +#endif /* CONFIG_TI_PACKET_PROCESSOR */ br_flood(br, skb, pkt_type, local_rcv, false); + } else br_multicast_flood(mdst, skb, local_rcv, false); } @@ -248,6 +289,9 @@ const unsigned char *dest = eth_hdr(skb)->h_dest; br_should_route_hook_t *rhook; +#ifdef CONFIG_INTEL_L2VPN_L2CP_FORWARD + int l2vpnRelated = 0; +#endif /* CONFIG_INTEL_L2VPN_L2CP_FORWARD */ if (unlikely(skb->pkt_type == PACKET_LOOPBACK)) return RX_HANDLER_PASS; @@ -258,11 +302,33 @@ if (!skb) return RX_HANDLER_CONSUMED; +#ifdef CONFIG_TI_DOCSIS_INPUT_DEV + if(!skb->ti_docsis_input_dev) { + skb->ti_docsis_input_dev = skb->dev; + } +#endif + p = br_port_get_rcu(skb->dev); + if (WARN(p == NULL, "%s - %d: br_port_get_rcu(skb->dev) returned NULL, dropping packet (dev == %s)", \ + __func__, __LINE__, skb->dev ? skb->dev->name : "NULL")) + { + goto drop; + } + if (unlikely(is_link_local_ether_addr(dest))) { u16 fwd_mask = p->br->group_fwd_mask_required; +#ifdef CONFIG_INTEL_L2VPN_L2CP_FORWARD + if (!intel_l2vpn_packet_handler(skb, &l2vpnRelated)) + { + if (l2vpnRelated) + { + goto forward; + } + } +#endif /* CONFIG_INTEL_L2VPN_L2CP_FORWARD */ + /* * See IEEE 802.1D Table 7-10 Reserved addresses * @@ -334,7 +400,12 @@ case BR_STATE_LEARNING: if (ether_addr_equal(p->br->dev->dev_addr, dest)) skb->pkt_type = PACKET_HOST; - +#ifdef CONFIG_BRIDGE_NETFILTER +#ifdef CONFIG_BRIDGE_EBT_FORWARD + /* Initialize bridge bridge_forward_port so prerouting rule can populate it */ + skb->bridge_forward_port = NULL; +#endif +#endif NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, dev_net(skb->dev), NULL, skb, skb->dev, NULL, br_handle_frame_finish);