Commit b863ceb7 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

[NET]: Add macvlan driver

Add macvlan driver, which allows to create virtual ethernet devices
based on MAC address.
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 56addd6e
...@@ -2330,6 +2330,12 @@ W: http://linuxwireless.org/ ...@@ -2330,6 +2330,12 @@ W: http://linuxwireless.org/
T: git kernel.org:/pub/scm/linux/kernel/git/jbenc/mac80211.git T: git kernel.org:/pub/scm/linux/kernel/git/jbenc/mac80211.git
S: Maintained S: Maintained
MACVLAN DRIVER
P: Patrick McHardy
M: kaber@trash.net
L: netdev@vger.kernel.org
S: Maintained
MARVELL YUKON / SYSKONNECT DRIVER MARVELL YUKON / SYSKONNECT DRIVER
P: Mirko Lindner P: Mirko Lindner
M: mlindner@syskonnect.de M: mlindner@syskonnect.de
......
...@@ -82,6 +82,16 @@ config BONDING ...@@ -82,6 +82,16 @@ config BONDING
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called bonding. will be called bonding.
config MACVLAN
tristate "MAC-VLAN support (EXPERIMENTAL)"
depends on EXPERIMENTAL
---help---
This allows one to create virtual interfaces that map packets to
or from specific MAC addresses to a particular interface.
To compile this driver as a module, choose M here: the module
will be called macvlan.
config EQUALIZER config EQUALIZER
tristate "EQL (serial line load balancing) support" tristate "EQL (serial line load balancing) support"
---help--- ---help---
......
...@@ -128,6 +128,7 @@ obj-$(CONFIG_SLHC) += slhc.o ...@@ -128,6 +128,7 @@ obj-$(CONFIG_SLHC) += slhc.o
obj-$(CONFIG_DUMMY) += dummy.o obj-$(CONFIG_DUMMY) += dummy.o
obj-$(CONFIG_IFB) += ifb.o obj-$(CONFIG_IFB) += ifb.o
obj-$(CONFIG_MACVLAN) += macvlan.o
obj-$(CONFIG_DE600) += de600.o obj-$(CONFIG_DE600) += de600.o
obj-$(CONFIG_DE620) += de620.o obj-$(CONFIG_DE620) += de620.o
obj-$(CONFIG_LANCE) += lance.o obj-$(CONFIG_LANCE) += lance.o
......
This diff is collapsed.
#ifndef _LINUX_IF_MACVLAN_H
#define _LINUX_IF_MACVLAN_H
#ifdef __KERNEL__
extern struct sk_buff *(*macvlan_handle_frame_hook)(struct sk_buff *);
#endif /* __KERNEL__ */
#endif /* _LINUX_IF_MACVLAN_H */
...@@ -564,6 +564,8 @@ struct net_device ...@@ -564,6 +564,8 @@ struct net_device
/* bridge stuff */ /* bridge stuff */
struct net_bridge_port *br_port; struct net_bridge_port *br_port;
/* macvlan */
struct macvlan_port *macvlan_port;
/* class/net/name entry */ /* class/net/name entry */
struct device dev; struct device dev;
......
...@@ -98,6 +98,7 @@ ...@@ -98,6 +98,7 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/stat.h> #include <linux/stat.h>
#include <linux/if_bridge.h> #include <linux/if_bridge.h>
#include <linux/if_macvlan.h>
#include <net/dst.h> #include <net/dst.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <net/checksum.h> #include <net/checksum.h>
...@@ -1813,6 +1814,28 @@ static inline struct sk_buff *handle_bridge(struct sk_buff *skb, ...@@ -1813,6 +1814,28 @@ static inline struct sk_buff *handle_bridge(struct sk_buff *skb,
#define handle_bridge(skb, pt_prev, ret, orig_dev) (skb) #define handle_bridge(skb, pt_prev, ret, orig_dev) (skb)
#endif #endif
#if defined(CONFIG_MACVLAN) || defined(CONFIG_MACVLAN_MODULE)
struct sk_buff *(*macvlan_handle_frame_hook)(struct sk_buff *skb) __read_mostly;
EXPORT_SYMBOL_GPL(macvlan_handle_frame_hook);
static inline struct sk_buff *handle_macvlan(struct sk_buff *skb,
struct packet_type **pt_prev,
int *ret,
struct net_device *orig_dev)
{
if (skb->dev->macvlan_port == NULL)
return skb;
if (*pt_prev) {
*ret = deliver_skb(skb, *pt_prev, orig_dev);
*pt_prev = NULL;
}
return macvlan_handle_frame_hook(skb);
}
#else
#define handle_macvlan(skb, pt_prev, ret, orig_dev) (skb)
#endif
#ifdef CONFIG_NET_CLS_ACT #ifdef CONFIG_NET_CLS_ACT
/* TODO: Maybe we should just force sch_ingress to be compiled in /* TODO: Maybe we should just force sch_ingress to be compiled in
* when CONFIG_NET_CLS_ACT is? otherwise some useless instructions * when CONFIG_NET_CLS_ACT is? otherwise some useless instructions
...@@ -1918,6 +1941,9 @@ int netif_receive_skb(struct sk_buff *skb) ...@@ -1918,6 +1941,9 @@ int netif_receive_skb(struct sk_buff *skb)
#endif #endif
skb = handle_bridge(skb, &pt_prev, &ret, orig_dev); skb = handle_bridge(skb, &pt_prev, &ret, orig_dev);
if (!skb)
goto out;
skb = handle_macvlan(skb, &pt_prev, &ret, orig_dev);
if (!skb) if (!skb)
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment