diff --git a/doc/lxc.container.conf.sgml.in b/doc/lxc.container.conf.sgml.in index 994932eaf..03ce89ab8 100644 --- a/doc/lxc.container.conf.sgml.in +++ b/doc/lxc.container.conf.sgml.in @@ -325,16 +325,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA specifies the mode the macvlan will use to communicate between different macvlan on the same upper device. The accepted - modes are , the device never - communicates with any other device on the same upper_dev (default), - , the new Virtual Ethernet Port + modes are , , + and . + In mode, the device never + communicates with any other device on the same upper_dev (default). + In mode, the new Virtual Ethernet Port Aggregator (VEPA) mode, it assumes that the adjacent bridge returns all frames where both source and destination are local to the macvlan port, i.e. the bridge is set up as a reflective relay. Broadcast frames coming in from the upper_dev get flooded to all macvlan interfaces in VEPA mode, local frames are not - delivered locally, or , it + delivered locally. In mode, it provides the behavior of a simple bridge between different macvlan interfaces on the same port. Frames from one interface to another one get delivered directly @@ -343,7 +345,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA interface, but when they come back from a reflective relay, we don't deliver them again. Since we know all the MAC addresses, the macvlan bridge mode does not - require learning or STP like the bridge module does. + require learning or STP like the bridge module does. In + mode, all frames received by + the physical interface are forwarded to the macvlan + interface. Only one macvlan interface in + mode is possible for one physical interface. diff --git a/src/lxc/conf.h b/src/lxc/conf.h index d8b418e21..2d67f0da6 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -100,7 +100,7 @@ struct ifla_vlan { }; struct ifla_macvlan { - int mode; /* private, vepa, bridge */ + int mode; /* private, vepa, bridge, passthru */ }; union netdev_p { diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 663b79142..af5c2712e 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -518,6 +518,10 @@ static int network_ifname(char **valuep, const char *value) # define MACVLAN_MODE_BRIDGE 4 #endif +#ifndef MACVLAN_MODE_PASSTHRU +# define MACVLAN_MODE_PASSTHRU 8 +#endif + static int macvlan_mode(int *valuep, const char *value) { struct mc_mode { @@ -527,6 +531,7 @@ static int macvlan_mode(int *valuep, const char *value) { "private", MACVLAN_MODE_PRIVATE }, { "vepa", MACVLAN_MODE_VEPA }, { "bridge", MACVLAN_MODE_BRIDGE }, + { "passthru", MACVLAN_MODE_PASSTHRU }, }; int i; @@ -2289,6 +2294,7 @@ static int lxc_get_item_nic(struct lxc_conf *c, char *retv, int inlen, case MACVLAN_MODE_PRIVATE: mode = "private"; break; case MACVLAN_MODE_VEPA: mode = "vepa"; break; case MACVLAN_MODE_BRIDGE: mode = "bridge"; break; + case MACVLAN_MODE_PASSTHRU: mode = "passthru"; break; default: mode = "(invalid)"; break; } strprint(retv, inlen, "%s", mode);