--- zzzz-none-000/linux-2.6.28.10/net/bridge/br_input.c 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/net/bridge/br_input.c 2010-05-03 10:15:55.000000000 +0000 @@ -10,6 +10,24 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ +/*---------------------------------------------------------------------------- +// Copyright 2007, Texas Instruments Incorporated +// +// This program has been modified from its original operation by Texas Instruments +// to do the following: +// +// 1. TI Layer 2 Selective Forwarder +// +// THIS MODIFIED SOFTWARE AND DOCUMENTATION ARE PROVIDED +// "AS IS," AND TEXAS INSTRUMENTS MAKES NO REPRESENTATIONS +// OR WARRENTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY +// PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR +// DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, +// COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +// +// These changes are covered as per original license +//-----------------------------------------------------------------------------*/ #include #include @@ -20,6 +38,10 @@ /* Bridge group multicast address 802.1d (pg 51). */ const u8 br_group_address[ETH_ALEN] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; +#ifdef CONFIG_TI_L2_SELECTIVE_FORWARDER +extern int ti_selective_packet_handler (struct sk_buff *skb); +#endif /* CONFIG_TI_L2_SELECTIVE_FORWARDER */ + static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb) { struct net_device *indev, *brdev = br->dev; @@ -63,6 +85,12 @@ if (is_multicast_ether_addr(dest)) { br->dev->stats.multicast++; +#ifdef CONFIG_TI_L2_SELECTIVE_FORWARDER + /* If return value is zero indicates fall back + * to default behavior */ + if (ti_selective_packet_handler(skb) != 0) + return 0; +#endif /* CONFIG_TI_L2_SELECTIVE_FORWARDER */ skb2 = skb; } else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) { skb2 = skb; @@ -80,7 +108,14 @@ if (dst) br_forward(dst->dst, skb); else + { +#ifdef CONFIG_TI_L2_SELECTIVE_FORWARDER + /* If return value is zero indicates fall back to default behavior */ + if (ti_selective_packet_handler(skb) != 0) + return 0; +#endif /* CONFIG_TI_L2_SELECTIVE_FORWARDER */ br_flood_forward(br, skb); + } } out: @@ -153,7 +188,9 @@ case BR_STATE_LEARNING: if (!compare_ether_addr(p->br->dev->dev_addr, dest)) skb->pkt_type = PACKET_HOST; - +#if defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY) || defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY_MODULE) + strcpy(p->br->in_dev_name, skb->dev->name); +#endif NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL, br_handle_frame_finish); break; @@ -163,3 +200,8 @@ } return NULL; } + +#if defined(CONFIG_FUSIV_KERNEL_IGMP_SNOOP) || defined(CONFIG_FUSIV_KERNEL_IGMP_SNOOP_MODULE) || defined(CONFIG_MCAST_AP_SUPPORT) +EXPORT_SYMBOL(br_pass_frame_up); +#endif +