|
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
|