From 35c979bff42010f54842d00bec8836f1d3f30545 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 7 Aug 2009 10:33:41 -0700 Subject: [PATCH] vswitchd: Support creating fake bond device interfaces. Citrix QA scripts expect that "brctl show" shows a bond interface for each bond that is added to a bridge. The only way to do that without modifying brctl itself is to create an actual network device by that name, so this commit adds a new bonding configuration key that causes an internal device by the name of the bond to be created. This feature is also necessary, but not sufficient, to allow XenCenter to accurately show the link status and statistics of bridges (bug #1363). This new configuration key is intentionally undocumented, because I don't want anyone to use it. Bug NIC-19. --- vswitchd/bridge.c | 27 +++++++++++++++---- ...pt_xensource_libexec_interface-reconfigure | 1 + 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index ec8a1997e..7ec774aca 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -461,9 +461,23 @@ bridge_reconfigure(void) for (i = 0; i < add_ifaces.n; i++) { const char *if_name = add_ifaces.names[i]; for (;;) { - int internal = cfg_get_bool(0, "iface.%s.internal", if_name); - int error = dpif_port_add(&br->dpif, if_name, next_port_no++, - internal ? ODP_PORT_INTERNAL : 0); + bool internal; + int error; + + /* It's an internal interface if it's marked that way, or if + * it's a bonded interface for which we're faking up a network + * device. */ + internal = cfg_get_bool(0, "iface.%s.internal", if_name); + if (cfg_get_bool(0, "bonding.%s.fake-iface", if_name)) { + struct port *port = port_lookup(br, if_name); + if (port && port->n_ifaces > 1) { + internal = true; + } + } + + /* Add to datapath. */ + error = dpif_port_add(&br->dpif, if_name, next_port_no++, + internal ? ODP_PORT_INTERNAL : 0); if (error != EEXIST) { if (next_port_no >= 256) { VLOG_ERR("ran out of valid port numbers on dp%u", @@ -1321,9 +1335,12 @@ bridge_get_all_ifaces(const struct bridge *br, struct svec *ifaces) struct iface *iface = port->ifaces[j]; svec_add(ifaces, iface->name); } + if (port->n_ifaces > 1 + && cfg_get_bool(0, "bonding.%s.fake-iface", port->name)) { + svec_add(ifaces, port->name); + } } - svec_sort(ifaces); - assert(svec_is_unique(ifaces)); + svec_sort_unique(ifaces); } /* For robustness, in case the administrator moves around datapath ports behind diff --git a/xenserver/opt_xensource_libexec_interface-reconfigure b/xenserver/opt_xensource_libexec_interface-reconfigure index 05d6a8b0e..67911f762 100755 --- a/xenserver/opt_xensource_libexec_interface-reconfigure +++ b/xenserver/opt_xensource_libexec_interface-reconfigure @@ -829,6 +829,7 @@ def configure_bond(pif): argv = ['--del-match=bonding.%s.[!0-9]*' % interface] argv += ["--add=bonding.%s.slave=%s" % (interface, slave) for slave in physdevs] + argv += ['--add=bonding.%s.fake-iface=true'] if pifrec['MAC'] != "": argv += ['--add=port.%s.mac=%s' % (interface, pifrec['MAC'])] -- 2.43.0