[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [patch 4/5] xen: netback mac selection
Allow specification of backend vif MAC addresses. If a backend MAC is not provided, generate one as before Signed-off-by: Jody Belka <knew-xen@xxxxxxxx> diffstat: linux-2.6.10-xen-sparse/drivers/xen/netback/common.h | 2 + linux-2.6.10-xen-sparse/drivers/xen/netback/interface.c | 25 +++++++++++----- tools/python/xen/lowlevel/xu/xu.c | 6 +++ tools/python/xen/xend/server/messages.py | 4 +- tools/python/xen/xend/server/netif.py | 22 +++++++++++++- tools/python/xen/xm/create.py | 10 +++++- xen/include/public/io/domain_controller.h | 6 ++- 7 files changed, 61 insertions(+), 14 deletions(-) diff -drNU2 xen.orig/linux-2.6.10-xen-sparse/drivers/xen/netback/common.h xen/linux-2.6.10-xen-sparse/drivers/xen/netback/common.h --- xen.orig/linux-2.6.10-xen-sparse/drivers/xen/netback/common.h 2005-01-30 00:46:28.000000000 +0100 +++ xen/linux-2.6.10-xen-sparse/drivers/xen/netback/common.h 2005-01-31 18:40:52.936589384 +0100 @@ -36,4 +36,6 @@ unsigned int handle; + u8 fe_dev_addr[6]; + /* Physical parameters of the comms window. */ unsigned long tx_shmem_frame; diff -drNU2 xen.orig/linux-2.6.10-xen-sparse/drivers/xen/netback/interface.c xen/linux-2.6.10-xen-sparse/drivers/xen/netback/interface.c --- xen.orig/linux-2.6.10-xen-sparse/drivers/xen/netback/interface.c 2005-01-30 00:46:28.000000000 +0100 +++ xen/linux-2.6.10-xen-sparse/drivers/xen/netback/interface.c 2005-01-31 18:40:52.947587712 +0100 @@ -164,11 +164,22 @@ dev->tx_queue_len = 0; - /* - * Initialise a dummy MAC address. We choose the numerically largest - * non-broadcast address to prevent the address getting stolen by an - * Ethernet bridge for STP purposes. (FE:FF:FF:FF:FF:FF) - */ - memset(dev->dev_addr, 0xFF, ETH_ALEN); - dev->dev_addr[0] &= ~0x01; + if ( (create->be_mac[0] == 0) && (create->be_mac[1] == 0) && + (create->be_mac[2] == 0) && (create->be_mac[3] == 0) && + (create->be_mac[4] == 0) && (create->be_mac[5] == 0) ) + { + /* + * Initialise a dummy MAC address. We choose the numerically largest + * non-broadcast address to prevent the address getting stolen by an + * Ethernet bridge for STP purposes. (FE:FF:FF:FF:FF:FF) + */ + memset(dev->dev_addr, 0xFF, ETH_ALEN); + dev->dev_addr[0] &= ~0x01; + } + else + { + memcpy(dev->dev_addr, create->be_mac, ETH_ALEN); + } + + memcpy(netif->fe_dev_addr, create->mac, ETH_ALEN); rtnl_lock(); diff -drNU2 xen.orig/tools/python/xen/lowlevel/xu/xu.c xen/tools/python/xen/lowlevel/xu/xu.c --- xen.orig/tools/python/xen/lowlevel/xu/xu.c 2005-01-30 00:46:29.000000000 +0100 +++ xen/tools/python/xen/lowlevel/xu/xu.c 2005-01-31 18:40:52.957586192 +0100 @@ -624,4 +624,10 @@ P2C(netif_be_create_t, mac[4], u8); P2C(netif_be_create_t, mac[5], u8); + P2C(netif_be_create_t, be_mac[0], u8); + P2C(netif_be_create_t, be_mac[1], u8); + P2C(netif_be_create_t, be_mac[2], u8); + P2C(netif_be_create_t, be_mac[3], u8); + P2C(netif_be_create_t, be_mac[4], u8); + P2C(netif_be_create_t, be_mac[5], u8); break; case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY): diff -drNU2 xen.orig/tools/python/xen/xend/server/messages.py xen/tools/python/xen/xend/server/messages.py --- xen.orig/tools/python/xen/xend/server/messages.py 2005-01-30 00:46:29.000000000 +0100 +++ xen/tools/python/xen/xend/server/messages.py 2005-01-31 18:40:52.969584368 +0100 @@ -267,7 +267,7 @@ args = {} for (k, v) in params.items(): - if k == 'mac': + if k in ['mac', 'be_mac']: for i in range(0, 6): - args['mac[%d]' % i] = v[i] + args['%s[%d]' % (k, i)] = v[i] else: args[k] = v diff -drNU2 xen.orig/tools/python/xen/xend/server/netif.py xen/tools/python/xen/xend/server/netif.py --- xen.orig/tools/python/xen/xend/server/netif.py 2005-01-30 00:46:29.000000000 +0100 +++ xen/tools/python/xen/xend/server/netif.py 2005-01-31 18:40:52.980582696 +0100 @@ -110,5 +110,12 @@ if not vmac: return None mac = [ int(x, 16) for x in vmac.split(':') ] - if len(mac) != 6: raise XendError("invalid mac") + if len(mac) != 6: raise XendError("invalid mac: %s" % vmac) + return mac + + def _get_config_be_mac(self, config): + vmac = sxp.child_value(config, 'be_mac') + if not vmac: return None + mac = [ int(x, 16) for x in vmac.split(':') ] + if len(mac) != 6: raise XendError("invalid backend mac: %s" % vmac) return mac @@ -128,4 +135,5 @@ self.config = config self.mac = None + self.be_mac = None self.bridge = None self.script = None @@ -136,4 +144,5 @@ raise XendError("invalid mac") self.mac = mac + self.be_mac = self._get_config_be_mac(config) self.bridge = sxp.child_value(config, 'bridge') self.script = sxp.child_value(config, 'script') @@ -160,4 +169,5 @@ changes = {} mac = self._get_config_mac(config) + be_mac = self._get_config_be_mac(config) bridge = sxp.child_value(config, 'bridge') script = sxp.child_value(config, 'script') @@ -167,4 +177,6 @@ if (mac is not None) and (mac != self.mac): raise XendError("cannot change mac") + if (be_mac is not None) and (be_mac != self.be_mac): + raise XendError("cannot change backend mac") if (backendDomain is not None) and (backendDomain != str(self.backendDomain)): raise XendError("cannot change backend") @@ -191,4 +203,6 @@ ['vif', vif], ['mac', mac]] + if self.be_mac: + val.append(['be_mac', self.get_be_mac()]) if self.bridge: val.append(['bridge', self.bridge]) @@ -215,4 +229,9 @@ return ':'.join(map(lambda x: "%02x" % x, self.mac)) + def get_be_mac(self): + """Get the backend MAC address as a string. + """ + return ':'.join(map(lambda x: "%02x" % x, self.be_mac)) + def vifctl_params(self, vmname=None): """Get the parameters to pass to vifctl. @@ -268,4 +287,5 @@ { 'domid' : self.controller.dom, 'netif_handle' : self.vif, + 'be_mac' : self.be_mac or [0, 0, 0, 0, 0, 0], 'mac' : self.mac }) self.getBackendInterface().writeRequest(msg, response=d) diff -drNU2 xen.orig/tools/python/xen/xm/create.py xen/tools/python/xen/xm/create.py --- xen.orig/tools/python/xen/xm/create.py 2005-01-30 00:46:29.000000000 +0100 +++ xen/tools/python/xen/xm/create.py 2005-01-31 18:40:52.990581176 +0100 @@ -152,9 +152,11 @@ use="Add an IP address to the domain.") -gopts.var('vif', val="mac=MAC,bridge=BRIDGE,script=SCRIPT,backend=DOM", +gopts.var('vif', val="mac=MAC,be_mac=MAC,bridge=BRIDGE,script=SCRIPT,backend=DOM", fn=append_value, default=[], use="""Add a network interface with the given MAC address and bridge. The vif is configured by calling the given configuration script. If mac is not specified a random MAC address is used. + The MAC address of the backend interface can be selected with be_mac. + If not specified then the network backend chooses it's own MAC address. If bridge is not specified the default bridge is used. If script is not specified the default script is used. @@ -286,4 +288,5 @@ if not mac: mac = randomMAC() + be_mac = d.get('be_mac') bridge = d.get('bridge') script = d.get('script') @@ -292,4 +295,5 @@ else: mac = randomMAC() + be_mac = None bridge = None script = None @@ -298,4 +302,6 @@ config_vif = ['vif'] config_vif.append(['mac', mac]) + if be_mac: + config_vif.append(['be_mac', be_mac]) if bridge: config_vif.append(['bridge', bridge]) @@ -384,5 +390,5 @@ k = k.strip() v = v.strip() - if k not in ['mac', 'bridge', 'script', 'backend', 'ip']: + if k not in ['mac', 'be_mac', 'bridge', 'script', 'backend', 'ip']: opts.err('Invalid vif specifier: ' + vif) d[k] = v diff -drNU2 xen.orig/xen/include/public/io/domain_controller.h xen/xen/include/public/io/domain_controller.h --- xen.orig/xen/include/public/io/domain_controller.h 2005-01-30 00:46:29.000000000 +0100 +++ xen/xen/include/public/io/domain_controller.h 2005-01-31 18:40:53.000579656 +0100 @@ -479,7 +479,9 @@ u8 mac[6]; /* 8 */ u16 __pad1; /* 14 */ + u8 be_mac[6]; /* 16 */ + u16 __pad2; /* 22 */ /* OUT */ - u32 status; /* 16 */ -} PACKED netif_be_create_t; /* 20 bytes */ + u32 status; /* 24 */ +} PACKED netif_be_create_t; /* 28 bytes */ /* ------------------------------------------------------- This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting Tool for open source databases. Create drag-&-drop reports. Save time by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. Download a FREE copy at http://www.intelliview.com/go/osdn_nl _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.sourceforge.net/lists/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |