From: Philip Craig <philipc@snapgear.com>
To: Stephen Hemminger <shemminger@osdl.org>
Cc: netdev@vger.kernel.org
Subject: Re: [RFC] gre: transparent ethernet bridging
Date: Tue, 01 Aug 2006 19:29:28 +1000 [thread overview]
Message-ID: <44CF1EF8.2090800@snapgear.com> (raw)
In-Reply-To: <20060731220822.444f04e4@localhost.localdomain>
Stephen Hemminger wrote:
> I am not against making the bridge code smarter to handle other
> encapsulation.
Do you mean something like this patch?
The only drawback I see for this approach is that it means you
can only encapsulate the ethernet header if the gre interface is
bridged. That's not too bad a restriction though.
This patch only works for local packets so far, and doesn't
handle the LLC_SAP_BSPAN packets.
Also, if the gre interface is the only port on the bridge, then
we have no mac address.
--- linux-2.6.x/net/bridge/br_device.c 18 Jun 2006 23:30:55 -0000 1.1.1.14
+++ linux-2.6.x/net/bridge/br_device.c 1 Aug 2006 09:12:42 -0000
@@ -17,6 +17,7 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
+#include <linux/if_arp.h>
#include <asm/uaccess.h>
#include "br_private.h"
@@ -95,7 +96,9 @@ static int br_set_mac_address(struct net
spin_lock_bh(&br->lock);
list_for_each_entry(port, &br->port_list, list) {
- if (!compare_ether_addr(port->dev->dev_addr, addr->sa_data)) {
+ if (port->dev->type == ARPHRD_ETHER &&
+ !compare_ether_addr(port->dev->dev_addr,
+ addr->sa_data)) {
br_stp_change_bridge_id(br, addr->sa_data);
err = 0;
break;
--- linux-2.6.x/net/bridge/br_fdb.c 18 Jun 2006 23:30:55 -0000 1.1.1.13
+++ linux-2.6.x/net/bridge/br_fdb.c 1 Aug 2006 09:12:42 -0000
@@ -20,6 +20,7 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/jhash.h>
+#include <linux/if_arp.h>
#include <asm/atomic.h>
#include "br_private.h"
@@ -86,6 +87,7 @@ void br_fdb_changeaddr(struct net_bridge
struct net_bridge_port *op;
list_for_each_entry(op, &br->port_list, list) {
if (op != p &&
+ op->dev->type == ARPHRD_ETHER &&
!compare_ether_addr(op->dev->dev_addr,
f->addr.addr)) {
f->dst = op;
@@ -151,6 +153,7 @@ void br_fdb_delete_by_port(struct net_br
struct net_bridge_port *op;
list_for_each_entry(op, &br->port_list, list) {
if (op != p &&
+ op->dev->type == ARPHRD_ETHER &&
!compare_ether_addr(op->dev->dev_addr,
f->addr.addr)) {
f->dst = op;
--- linux-2.6.x/net/bridge/br_forward.c 18 Jun 2006 23:30:55 -0000 1.1.1.15
+++ linux-2.6.x/net/bridge/br_forward.c 1 Aug 2006 09:12:42 -0000
@@ -18,6 +18,7 @@
#include <linux/skbuff.h>
#include <linux/if_vlan.h>
#include <linux/netfilter_bridge.h>
+#include <linux/if_arp.h>
#include "br_private.h"
static inline int should_deliver(const struct net_bridge_port *p,
@@ -46,6 +47,8 @@ int br_dev_queue_push_xmit(struct sk_buf
nf_bridge_maybe_copy_header(skb);
#endif
skb_push(skb, ETH_HLEN);
+ if (skb->dev->type == ARPHRD_IPGRE)
+ skb->protocol = htons(ETH_P_BRIDGE);
dev_queue_xmit(skb);
}
--- linux-2.6.x/net/bridge/br_if.c 18 Jun 2006 23:30:55 -0000 1.1.1.23
+++ linux-2.6.x/net/bridge/br_if.c 1 Aug 2006 09:12:42 -0000
@@ -391,7 +391,10 @@ int br_add_if(struct net_bridge *br, str
struct net_bridge_port *p;
int err = 0;
- if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER)
+ if (dev->flags & IFF_LOOPBACK)
+ return -EINVAL;
+
+ if (dev->type != ARPHRD_ETHER && dev->type != ARPHRD_IPGRE)
return -EINVAL;
if (dev->hard_start_xmit == br_dev_xmit)
@@ -408,9 +411,11 @@ int br_add_if(struct net_bridge *br, str
if (err)
goto err0;
- err = br_fdb_insert(br, p, dev->dev_addr);
- if (err)
- goto err1;
+ if (dev->type == ARPHRD_ETHER) {
+ err = br_fdb_insert(br, p, dev->dev_addr);
+ if (err)
+ goto err1;
+ }
err = br_sysfs_addif(p);
if (err)
--- linux-2.6.x/net/bridge/br_input.c 18 Jun 2006 23:30:55 -0000 1.1.1.18
+++ linux-2.6.x/net/bridge/br_input.c 1 Aug 2006 09:12:42 -0000
@@ -17,6 +17,7 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/netfilter_bridge.h>
+#include <linux/if_arp.h>
#include "br_private.h"
/* Bridge group multicast address 802.1d (pg 51). */
@@ -124,11 +125,22 @@ static inline int is_link_local(const un
int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb)
{
struct sk_buff *skb = *pskb;
- const unsigned char *dest = eth_hdr(skb)->h_dest;
+ const unsigned char *dest;
+
+ if (skb->dev->type == ARPHRD_IPGRE) {
+ if (skb->protocol != htons(ETH_P_BRIDGE))
+ return 0;
+ if (!pskb_may_pull(skb, ETH_HLEN))
+ goto err;
+ skb->protocol = eth_type_trans(skb, p->br->dev);
+ skb_postpull_rcsum(skb, skb->mac.raw, ETH_HLEN);
+ skb->nh.raw += ETH_HLEN;
+ }
if (!is_valid_ether_addr(eth_hdr(skb)->h_source))
goto err;
+ dest = eth_hdr(skb)->h_dest;
if (unlikely(is_link_local(dest))) {
skb->pkt_type = PACKET_HOST;
return NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev,
--- linux-2.6.x/net/bridge/br_notify.c 21 Mar 2006 01:35:39 -0000 1.1.1.12
+++ linux-2.6.x/net/bridge/br_notify.c 1 Aug 2006 09:12:42 -0000
@@ -14,6 +14,7 @@
*/
#include <linux/kernel.h>
+#include <linux/if_arp.h>
#include "br_private.h"
@@ -48,8 +49,10 @@ static int br_device_event(struct notifi
break;
case NETDEV_CHANGEADDR:
- br_fdb_changeaddr(p, dev->dev_addr);
- br_stp_recalculate_bridge_id(br);
+ if (dev->type == ARPHRD_ETHER) {
+ br_fdb_changeaddr(p, dev->dev_addr);
+ br_stp_recalculate_bridge_id(br);
+ }
break;
case NETDEV_CHANGE:
--- linux-2.6.x/include/linux/if_ether.h 18 Jun 2006 23:30:44 -0000 1.1.1.11
+++ linux-2.6.x/include/linux/if_ether.h 1 Aug 2006 09:12:42 -0000
@@ -55,6 +55,7 @@
#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */
#define ETH_P_CUST 0x6006 /* DEC Customer use */
#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */
+#define ETH_P_BRIDGE 0x6558 /* Transparent Ethernet Bridging */
#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */
#define ETH_P_ATALK 0x809B /* Appletalk DDP */
#define ETH_P_AARP 0x80F3 /* Appletalk AARP */
next prev parent reply other threads:[~2006-08-01 9:29 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-31 10:06 [RFC] gre: transparent ethernet bridging Philip Craig
2006-07-31 16:14 ` Stephen Hemminger
2006-08-01 1:15 ` Philip Craig
2006-08-01 5:08 ` Stephen Hemminger
2006-08-01 9:29 ` Philip Craig [this message]
2006-08-02 6:17 ` Philip Craig
2006-08-02 17:23 ` Stephen Hemminger
2006-08-03 1:08 ` Philip Craig
2006-08-02 7:42 ` Lennert Buytenhek
2006-08-03 1:33 ` Philip Craig
2006-08-03 7:33 ` Lennert Buytenhek
2006-08-03 9:14 ` Philip Craig
2006-08-03 19:40 ` Lennert Buytenhek
2006-08-04 1:00 ` Philip Craig
2006-08-04 8:02 ` Lennert Buytenhek
2006-08-07 1:55 ` Philip Craig
2006-08-10 13:09 ` Lennert Buytenhek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=44CF1EF8.2090800@snapgear.com \
--to=philipc@snapgear.com \
--cc=netdev@vger.kernel.org \
--cc=shemminger@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).