diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c @@ -65,6 +65,10 @@ static int br_pass_frame_up(struct sk_buff *skb, bool promisc) br_multicast_count(br, NULL, skb, br_multicast_igmp_type(skb), BR_MCAST_DIR_TX); +#if defined(CONFIG_CPE_FAST_PATH) + skb->underlying_iif = indev->ifindex; +#endif + BR_INPUT_SKB_CB(skb)->promisc = promisc; return NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, @@ -166,6 +170,10 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb BR_INPUT_SKB_CB(skb)->brdev = br->dev; BR_INPUT_SKB_CB(skb)->src_port_isolated = !!(p->flags & BR_ISOLATED); +#if defined(CONFIG_CPE_FAST_PATH) + skb->abm_ff = 0; +#endif + if (IS_ENABLED(CONFIG_INET) && (skb->protocol == htons(ETH_P_ARP) || skb->protocol == htons(ETH_P_RARP))) { @@ -223,6 +231,10 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb if (now != READ_ONCE(dst->used)) WRITE_ONCE(dst->used, now); +#if defined(CONFIG_CPE_FAST_PATH) + /* Used by ABM module */ + skb->abm_ff = 1; +#endif br_forward(dst->dst, skb, local_rcv, false); } else { if (!mcast_hit)