Joakim Tjernlund
2010-Mar-30 07:18 UTC
[Bridge] [RFC patch] allow IP address on enslaved interfaces
This quick hack lets me use an IP address on an enslaved interface:
#eth1 has IP 192.168.1.16
brctl addbr br0
brctl setfd br0 0
ifconfig br0 up
brctl addif br0 eth1
After this I can use eth1 as if it was the br0 interface.
This obviously needs cleanup(skb->cb[42] = 99 needs to be fixed)
I probably broke something else too :(
Is this useful for someone else too?
Jocke
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index 1a99c4e..60d04eb 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -32,6 +32,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device
*dev)
skb_reset_mac_header(skb);
skb_pull(skb, ETH_HLEN);
+ skb->cb[42] = 99;
if (dest[0] & 1)
br_flood_deliver(br, skb);
else if ((dst = __br_fdb_get(br, dest)) != NULL)
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index 5ee1a36..83806fd 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -28,8 +28,8 @@ static void br_pass_frame_up(struct net_bridge *br, struct
sk_buff *skb)
brdev->stats.rx_bytes += skb->len;
indev = skb->dev;
- skb->dev = brdev;
-
+ //skb->dev = brdev;
+ skb->cb[42] = 98;
NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
netif_receive_skb);
}
@@ -124,6 +124,8 @@ struct sk_buff *br_handle_frame(struct net_bridge_port *p,
struct sk_buff *skb)
if (!is_valid_ether_addr(eth_hdr(skb)->h_source))
goto drop;
+ if (skb->cb[42] == 98)
+ return skb;
skb = skb_share_check(skb, GFP_ATOMIC);
if (!skb)
diff --git a/net/core/dev.c b/net/core/dev.c
index ec87421..0ee9637 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -101,6 +101,7 @@
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/if_bridge.h>
+#include "../bridge/br_private.h"
#include <linux/if_macvlan.h>
#include <net/dst.h>
#include <net/pkt_sched.h>
@@ -1808,7 +1809,13 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct
net_device *dev,
{
const struct net_device_ops *ops = dev->netdev_ops;
int rc = NETDEV_TX_OK;
+ struct net_bridge_port *port;
+ if (skb->cb[42] != 99 && (port = rcu_dereference(dev->br_port)))
{
+ dev = port->br->dev;
+ skb->dev = port->br->dev;
+ ops = port->br->dev->netdev_ops;
+ }
if (likely(!skb->next)) {
if (!list_empty(&ptype_all))
dev_queue_xmit_nit(skb, dev);
Stephen Hemminger
2010-Mar-30 15:22 UTC
[Bridge] [RFC patch] allow IP address on enslaved interfaces
On Tue, 30 Mar 2010 09:18:13 +0200 Joakim Tjernlund <joakim.tjernlund at transmode.se> wrote:> > This quick hack lets me use an IP address on an enslaved interface: > #eth1 has IP 192.168.1.16 > brctl addbr br0 > brctl setfd br0 0 > ifconfig br0 up > brctl addif br0 eth1 > > After this I can use eth1 as if it was the br0 interface. > This obviously needs cleanup(skb->cb[42] = 99 needs to be fixed) > I probably broke something else too :( > Is this useful for someone else too? > > Jocke > > diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c > index 1a99c4e..60d04eb 100644 > --- a/net/bridge/br_device.c > +++ b/net/bridge/br_device.c > @@ -32,6 +32,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) > skb_reset_mac_header(skb); > skb_pull(skb, ETH_HLEN); > > + skb->cb[42] = 99; >Using skb->cb is an ugly hack and won't work if qdisc modifies. So sorry no.