From: Andy P. <at...@us...> - 2002-04-09 16:22:08
|
Update of /cvsroot/linux-vax/kernel-2.4/net/bridge In directory usw-pr-cvs1:/tmp/cvs-serv30993/bridge Modified Files: br.c br_device.c br_fdb.c br_forward.c br_if.c br_input.c br_ioctl.c br_notify.c br_private.h br_private_stp.h br_private_timer.h br_stp.c br_stp_bpdu.c br_stp_if.c br_stp_timer.c Log Message: synch 2.4.15 commit 19 Index: br.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- br.c 14 Jan 2001 17:13:04 -0000 1.1.1.1 +++ br.c 9 Apr 2002 16:22:03 -0000 1.2 @@ -82,3 +82,4 @@ module_init(br_init) module_exit(br_deinit) +MODULE_LICENSE("GPL"); Index: br_device.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_device.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- br_device.c 14 Jan 2001 17:13:06 -0000 1.1.1.1 +++ br_device.c 9 Apr 2002 16:22:03 -0000 1.2 @@ -53,20 +53,21 @@ br->statistics.tx_packets++; br->statistics.tx_bytes += skb->len; - dest = skb->data; + dest = skb->mac.raw = skb->data; + skb_pull(skb, ETH_HLEN); if (dest[0] & 1) { - br_flood(br, skb, 0); + br_flood_deliver(br, skb, 0); return 0; } if ((dst = br_fdb_get(br, dest)) != NULL) { - br_forward(dst->dst, skb); + br_deliver(dst->dst, skb); br_fdb_put(dst); return 0; } - br_flood(br, skb, 0); + br_flood_deliver(br, skb, 0); return 0; } Index: br_fdb.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_fdb.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 Index: br_forward.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_forward.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- br_forward.c 14 Jan 2001 17:13:05 -0000 1.1.1.1 +++ br_forward.c 9 Apr 2002 16:22:03 -0000 1.2 @@ -18,9 +18,10 @@ #include <linux/inetdevice.h> #include <linux/skbuff.h> #include <linux/if_bridge.h> +#include <linux/netfilter_bridge.h> #include "br_private.h" -static inline int should_forward(struct net_bridge_port *p, struct sk_buff *skb) +static inline int should_deliver(struct net_bridge_port *p, struct sk_buff *skb) { if (skb->dev == p->dev || p->state != BR_STATE_FORWARDING) @@ -29,16 +30,59 @@ return 1; } +static int __dev_queue_push_xmit(struct sk_buff *skb) +{ + skb_push(skb, ETH_HLEN); + dev_queue_xmit(skb); + + return 0; +} + +static int __br_forward_finish(struct sk_buff *skb) +{ + NF_HOOK(PF_BRIDGE, NF_BR_POST_ROUTING, skb, NULL, skb->dev, + __dev_queue_push_xmit); + + return 0; +} + +static void __br_deliver(struct net_bridge_port *to, struct sk_buff *skb) +{ + struct net_device *indev; + + indev = skb->dev; + skb->dev = to->dev; + + NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, indev, skb->dev, + __br_forward_finish); +} + static void __br_forward(struct net_bridge_port *to, struct sk_buff *skb) { + struct net_device *indev; + + indev = skb->dev; skb->dev = to->dev; - dev_queue_xmit(skb); + + NF_HOOK(PF_BRIDGE, NF_BR_FORWARD, skb, indev, skb->dev, + __br_forward_finish); +} + +/* called under bridge lock */ +void br_deliver(struct net_bridge_port *to, struct sk_buff *skb) +{ + if (should_deliver(to, skb)) { + __br_deliver(to, skb); + return; + } + + kfree_skb(skb); } /* called under bridge lock */ void br_forward(struct net_bridge_port *to, struct sk_buff *skb) { - if (should_forward(to, skb)) { + if (should_deliver(to, skb)) { __br_forward(to, skb); return; } @@ -47,7 +91,8 @@ } /* called under bridge lock */ -void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone) +static void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone, + void (*__packet_hook)(struct net_bridge_port *p, struct sk_buff *skb)) { struct net_bridge_port *p; struct net_bridge_port *prev; @@ -67,7 +112,7 @@ p = br->port_list; while (p != NULL) { - if (should_forward(p, skb)) { + if (should_deliver(p, skb)) { if (prev != NULL) { struct sk_buff *skb2; @@ -77,7 +122,7 @@ return; } - __br_forward(prev, skb2); + __packet_hook(prev, skb2); } prev = p; @@ -87,9 +132,21 @@ } if (prev != NULL) { - __br_forward(prev, skb); + __packet_hook(prev, skb); return; } kfree_skb(skb); +} + +/* called under bridge lock */ +void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb, int clone) +{ + br_flood(br, skb, clone, __br_deliver); +} + +/* called under bridge lock */ +void br_flood_forward(struct net_bridge *br, struct sk_buff *skb, int clone) +{ + br_flood(br, skb, clone, __br_forward); } Index: br_if.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_if.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 Index: br_input.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_input.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- br_input.c 14 Jan 2001 17:13:06 -0000 1.1.1.1 +++ br_input.c 9 Apr 2002 16:22:03 -0000 1.2 @@ -17,20 +17,33 @@ #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/if_bridge.h> +#include <linux/netfilter_bridge.h> #include "br_private.h" unsigned char bridge_ula[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; +static int br_pass_frame_up_finish(struct sk_buff *skb) +{ + netif_rx(skb); + + return 0; +} + static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb) { + struct net_device *indev; + br->statistics.rx_packets++; br->statistics.rx_bytes += skb->len; + indev = skb->dev; skb->dev = &br->dev; skb->pkt_type = PACKET_HOST; - skb_pull(skb, skb->mac.raw - skb->data); + skb_push(skb, ETH_HLEN); skb->protocol = eth_type_trans(skb, &br->dev); - netif_rx(skb); + + NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL, + br_pass_frame_up_finish); } static void __br_handle_frame(struct sk_buff *skb) @@ -51,8 +64,6 @@ p->state == BR_STATE_DISABLED) goto freeandout; - skb_push(skb, skb->data - skb->mac.raw); - if (br->dev.flags & IFF_PROMISC) { struct sk_buff *skb2; @@ -91,7 +102,7 @@ goto freeandout; if (dest[0] & 1) { - br_flood(br, skb, 1); + br_flood_forward(br, skb, 1); if (!passedup) br_pass_frame_up(br, skb); else @@ -116,7 +127,7 @@ return; } - br_flood(br, skb, 0); + br_flood_forward(br, skb, 0); return; handle_special_frame: @@ -129,7 +140,7 @@ kfree_skb(skb); } -void br_handle_frame(struct sk_buff *skb) +static int br_handle_frame_finish(struct sk_buff *skb) { struct net_bridge *br; @@ -137,4 +148,12 @@ read_lock(&br->lock); __br_handle_frame(skb); read_unlock(&br->lock); + + return 0; +} + +void br_handle_frame(struct sk_buff *skb) +{ + NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL, + br_handle_frame_finish); } Index: br_ioctl.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_ioctl.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 Index: br_notify.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_notify.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 Index: br_private.h =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_private.h,v retrieving revision 1.1.1.2 retrieving revision 1.2 diff -u -r1.1.1.2 -r1.2 --- br_private.h 25 Feb 2001 23:14:56 -0000 1.1.1.2 +++ br_private.h 9 Apr 2002 16:22:03 -0000 1.2 @@ -141,11 +141,16 @@ int is_local); /* br_forward.c */ +extern void br_deliver(struct net_bridge_port *to, + struct sk_buff *skb); extern void br_forward(struct net_bridge_port *to, struct sk_buff *skb); -extern void br_flood(struct net_bridge *br, - struct sk_buff *skb, - int clone); +extern void br_flood_deliver(struct net_bridge *br, + struct sk_buff *skb, + int clone); +extern void br_flood_forward(struct net_bridge *br, + struct sk_buff *skb, + int clone); /* br_if.c */ extern int br_add_bridge(char *name); Index: br_private_stp.h =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_private_stp.h,v retrieving revision 1.1.1.2 retrieving revision 1.2 diff -u -r1.1.1.2 -r1.2 Index: br_private_timer.h =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_private_timer.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 Index: br_stp.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_stp.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 Index: br_stp_bpdu.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_stp_bpdu.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- br_stp_bpdu.c 14 Jan 2001 17:13:10 -0000 1.1.1.1 +++ br_stp_bpdu.c 9 Apr 2002 16:22:03 -0000 1.2 @@ -14,6 +14,7 @@ */ #include <linux/kernel.h> +#include <linux/if_ether.h> #include <linux/if_bridge.h> #include "br_private.h" #include "br_private_stp.h" @@ -42,6 +43,7 @@ } skb->dev = dev; + skb->protocol = htons(ETH_P_802_2); skb->mac.raw = skb_put(skb, size); memcpy(skb->mac.raw, bridge_ula, ETH_ALEN); memcpy(skb->mac.raw+ETH_ALEN, dev->dev_addr, ETH_ALEN); Index: br_stp_if.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_stp_if.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- br_stp_if.c 14 Jan 2001 17:13:11 -0000 1.1.1.1 +++ br_stp_if.c 9 Apr 2002 16:22:03 -0000 1.2 @@ -203,7 +203,10 @@ /* called under bridge lock */ void br_stp_set_port_priority(struct net_bridge_port *p, int newprio) { - int new_port_id = ((newprio & 0xFF) << 8) | p->port_no; + __u16 new_port_id; + + p->priority = newprio & 0xFF; + new_port_id = br_make_port_id(p); if (br_is_designated_port(p)) p->designated_port = new_port_id; Index: br_stp_timer.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/net/bridge/br_stp_timer.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 |