Merge citrix into master.
authorBen Pfaff <blp@nicira.com>
Wed, 19 Aug 2009 23:08:18 +0000 (16:08 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 19 Aug 2009 23:08:18 +0000 (16:08 -0700)
1  2 
datapath/datapath.c
datapath/dp_dev.c
datapath/dp_sysfs_dp.c
vswitchd/ovs-brcompatd.c
xenserver/opt_xensource_libexec_interface-reconfigure
xenserver/vswitch-xen.spec

@@@ -224,8 -223,10 +224,8 @@@ static int create_dp(int dp_idx, const 
        init_waitqueue_head(&dp->waitqueue);
  
        /* Initialize kobject for bridge.  This will be added as
-        * /sys/class/net/<devname>/bridge later, if sysfs is enabled. */
+        * /sys/class/net/<devname>/brif later, if sysfs is enabled. */
 -      kobject_set_name(&dp->ifobj, SYSFS_BRIDGE_PORT_SUBDIR); /* "brif" */
        dp->ifobj.kset = NULL;
 -      dp->ifobj.parent = NULL;
        kobject_init(&dp->ifobj, &dp_ktype);
  
        /* Allocate table. */
Simple merge
@@@ -464,9 -476,10 +464,10 @@@ static struct attribute_group bridge_gr
   */
  int dp_sysfs_add_dp(struct datapath *dp)
  {
 -      struct kobject *kobj = to_kobj(dp->ports[ODPP_LOCAL]->dev);
 +      struct kobject *kobj = &dp->ports[ODPP_LOCAL]->dev->NETDEV_DEV_MEMBER.kobj;
        int err;
  
+       /* Create /sys/class/net/<devname>/bridge directory. */
        err = sysfs_create_group(kobj, &bridge_group);
        if (err) {
                pr_info("%s: can't create group %s/%s\n",
@@@ -967,7 -994,7 +970,6 @@@ rtnl_recv_update(void
              const char *port_name = nl_attr_get_string(attrs[IFLA_IFNAME]);
              char br_name[IFNAMSIZ];
              uint32_t br_idx = nl_attr_get_u32(attrs[IFLA_MASTER]);
-             struct svec ports;
 -            enum netdev_flags flags;
  
              if (!if_indextoname(br_idx, br_name)) {
                  ofpbuf_delete(buf);
                  return;
              }
  
 -            if (netdev_nodev_get_flags(port_name, &flags) == ENODEV) {
 +            if (!netdev_exists(port_name)) {
                  /* Network device is really gone. */
+                 struct svec ports;
                  VLOG_INFO("network device %s destroyed, "
                            "removing from bridge %s", port_name, br_name);
                  svec_init(&ports);
                  cfg_get_all_keys(&ports, "bridge.%s.port", br_name);
                  svec_sort(&ports);
@@@ -266,223 -265,14 +266,219 @@@ def get_netdev_tx_queue_len(device)
          return None
  
  def get_netdev_by_mac(mac):
-     maybe = None
      for device in os.listdir("/sys/class/net"):
          dev_mac = get_netdev_mac(device)
-         if dev_mac and mac.lower() == dev_mac.lower():
-             if get_netdev_tx_queue_len(device):
+         if (dev_mac and mac.lower() == dev_mac.lower() and
+             get_netdev_tx_queue_len(device)):
                  return device
-             if not maybe:
-                 # Probably a datapath internal port.
-                 maybe = device
-     return maybe
+     return None
  
 +#
 +# Helper functions for encoding/decoding database attributes to/from XML.
 +#
 +def str_to_xml(xml, parent, tag, val):
 +    e = xml.createElement(tag)
 +    parent.appendChild(e)
 +    v = xml.createTextNode(val)
 +    e.appendChild(v)
 +def str_from_xml(n):
 +    def getText(nodelist):
 +        rc = ""
 +        for node in nodelist:
 +            if node.nodeType == node.TEXT_NODE:
 +                rc = rc + node.data
 +        return rc
 +    return getText(n.childNodes).strip()
 +
 +
 +def bool_to_xml(xml, parent, tag, val):
 +    if val:
 +        str_to_xml(xml, parent, tag, "True")
 +    else:
 +        str_to_xml(xml, parent, tag, "False")
 +def bool_from_xml(n):
 +    s = str_from_xml(n)
 +    if s == "True":
 +        return True
 +    elif s == "False":
 +        return False
 +    else:
 +        raise Error("Unknown boolean value %s" % s);
 +
 +def strlist_to_xml(xml, parent, ltag, itag, val):
 +    e = xml.createElement(ltag)
 +    parent.appendChild(e)
 +    for v in val:
 +        c = xml.createElement(itag)
 +        e.appendChild(c)
 +        cv = xml.createTextNode(v)
 +        c.appendChild(cv)
 +def strlist_from_xml(n, ltag, itag):
 +    ret = []
 +    for n in n.childNodes:
 +        if n.nodeName == itag:
 +            ret.append(str_from_xml(n))
 +    return ret
 +
 +def otherconfig_to_xml(xml, parent, val, attrs):
 +    otherconfig = xml.createElement("other_config")
 +    parent.appendChild(otherconfig)
 +    for n,v in val.items():
 +        if not n in attrs:
 +            raise Error("Unknown other-config attribute: %s" % n)
 +        str_to_xml(xml, otherconfig, n, v)
 +def otherconfig_from_xml(n, attrs):
 +    ret = {}
 +    for n in n.childNodes:
 +        if n.nodeName in attrs:
 +            ret[n.nodeName] = str_from_xml(n)
 +    return ret
 +
 +#
 +# Definitions of the database objects (and their attributes) used by interface-reconfigure.
 +#
 +# Each object is defined by a dictionary mapping an attribute name in
 +# the xapi database to a tuple containing two items:
 +#  - a function which takes this attribute and encodes it as XML.
 +#  - a function which takes XML and decocdes it into a value.
 +#
 +# other-config attributes are specified as a simple array of strings
 +
 +PIF_XML_TAG = "pif"
 +VLAN_XML_TAG = "vlan"
 +BOND_XML_TAG = "bond"
 +NETWORK_XML_TAG = "network"
 +
 +ETHTOOL_OTHERCONFIG_ATTRS = ['ethtool-%s' % x for x in 'autoneg', 'speed', 'duplex', 'rx', 'tx', 'sg', 'tso', 'ufo', 'gso' ]
 +
 +PIF_ATTRS = { 'uuid': (str_to_xml,str_from_xml),
 +              'management': (bool_to_xml,bool_from_xml),
 +              'network': (str_to_xml,str_from_xml),
 +              'device': (str_to_xml,str_from_xml),
 +              'bond_master_of': (lambda x, p, t, v: strlist_to_xml(x, p, 'bond_master_of', 'slave', v),
 +                                 lambda n: strlist_from_xml(n, 'bond_master_of', 'slave')),
 +              'bond_slave_of': (str_to_xml,str_from_xml),
 +              'VLAN': (str_to_xml,str_from_xml),
 +              'VLAN_master_of': (str_to_xml,str_from_xml),
 +              'VLAN_slave_of': (lambda x, p, t, v: strlist_to_xml(x, p, 'VLAN_slave_of', 'master', v),
 +                                lambda n: strlist_from_xml(n, 'VLAN_slave_Of', 'master')),
 +              'ip_configuration_mode': (str_to_xml,str_from_xml),
 +              'IP': (str_to_xml,str_from_xml),
 +              'netmask': (str_to_xml,str_from_xml),
 +              'gateway': (str_to_xml,str_from_xml),
 +              'DNS': (str_to_xml,str_from_xml),
 +              'MAC': (str_to_xml,str_from_xml),
 +              'other_config': (lambda x, p, t, v: otherconfig_to_xml(x, p, v, PIF_OTHERCONFIG_ATTRS),
 +                               lambda n: otherconfig_from_xml(n, PIF_OTHERCONFIG_ATTRS)),
 +            }
 +
 +PIF_OTHERCONFIG_ATTRS = [ 'domain', 'peerdns', 'defaultroute', 'mtu', 'static-routes' ] + \
 +                        [ 'bond-%s' % x for x in 'mode', 'miimon', 'downdelay', 'updelay', 'use_carrier' ] + \
 +                        ETHTOOL_OTHERCONFIG_ATTRS
 +
 +VLAN_ATTRS = { 'uuid': (str_to_xml,str_from_xml),
 +               'tagged_PIF': (str_to_xml,str_from_xml),
 +               'untagged_PIF': (str_to_xml,str_from_xml),
 +             }
 +    
 +BOND_ATTRS = { 'uuid': (str_to_xml,str_from_xml),
 +               'master': (str_to_xml,str_from_xml),
 +               'slaves': (lambda x, p, t, v: strlist_to_xml(x, p, 'slaves', 'slave', v),
 +                          lambda n: strlist_from_xml(n, 'slaves', 'slave')),
 +             }
 +
 +NETWORK_ATTRS = { 'uuid': (str_to_xml,str_from_xml),
 +                  'bridge': (str_to_xml,str_from_xml),
 +                  'PIFs': (lambda x, p, t, v: strlist_to_xml(x, p, 'PIFs', 'PIF', v),
 +                           lambda n: strlist_from_xml(n, 'PIFs', 'PIF')),
 +                  'other_config': (lambda x, p, t, v: otherconfig_to_xml(x, p, v, NETWORK_OTHERCONFIG_ATTRS),
 +                                   lambda n: otherconfig_from_xml(n, NETWORK_OTHERCONFIG_ATTRS)),
 +                }
 +
 +NETWORK_OTHERCONFIG_ATTRS = [ 'mtu', 'static-routes' ] + ETHTOOL_OTHERCONFIG_ATTRS
 +
  class DatabaseCache(object):
 +    def __read_xensource_inventory(self):
 +        filename = "/etc/xensource-inventory"
 +        f = open(filename, "r")
 +        lines = [x.strip("\n") for x in f.readlines()]
 +        f.close()
 +
 +        defs = [ (l[:l.find("=")], l[(l.find("=") + 1):]) for l in lines ]
 +        defs = [ (a, b.strip("'")) for (a,b) in defs ]
 +
 +        return dict(defs)
 +    def __pif_on_host(self,pif):
 +        return self.__pifs.has_key(pif)
 +
 +    def __get_pif_records_from_xapi(self, session, host):
 +        self.__pifs = {}
 +        for (p,rec) in session.xenapi.PIF.get_all_records().items():
 +            if rec['host'] != host:
 +                continue
 +            self.__pifs[p] = {}
 +            for f in PIF_ATTRS:
 +                self.__pifs[p][f] = rec[f]
 +            self.__pifs[p]['other_config'] = {}
 +            for f in PIF_OTHERCONFIG_ATTRS:
 +                if not rec['other_config'].has_key(f): continue
 +                self.__pifs[p]['other_config'][f] = rec['other_config'][f]
 +
 +    def __get_vlan_records_from_xapi(self, session):
 +        self.__vlans = {}
 +        for v in session.xenapi.VLAN.get_all():
 +            rec = session.xenapi.VLAN.get_record(v)
 +            if not self.__pif_on_host(rec['untagged_PIF']):
 +                continue
 +            self.__vlans[v] = {}
 +            for f in VLAN_ATTRS:
 +                self.__vlans[v][f] = rec[f]
 +
 +    def __get_bond_records_from_xapi(self, session):
 +        self.__bonds = {}
 +        for b in session.xenapi.Bond.get_all():
 +            rec = session.xenapi.Bond.get_record(b)
 +            if not self.__pif_on_host(rec['master']):
 +                continue
 +            self.__bonds[b] = {}
 +            for f in BOND_ATTRS:
 +                self.__bonds[b][f] = rec[f]
 +
 +    def __get_network_records_from_xapi(self, session):
 +        self.__networks = {}
 +        for n in session.xenapi.network.get_all():
 +            rec = session.xenapi.network.get_record(n)
 +            self.__networks[n] = {}
 +            for f in NETWORK_ATTRS:
 +                self.__networks[n][f] = rec[f]
 +            self.__networks[n]['other_config'] = {}
 +            for f in NETWORK_OTHERCONFIG_ATTRS:
 +                if not rec['other_config'].has_key(f): continue
 +                self.__networks[n]['other_config'][f] = rec['other_config'][f]
 +
 +    def __to_xml(self, xml, parent, key, ref, rec, attrs):
 +        """Encode a database object as XML"""
 +        e = xml.createElement(key)
 +        parent.appendChild(e)
 +        if ref:
 +            e.setAttribute('ref', ref)
 +
 +        for n,v in rec.items():
 +            if attrs.has_key(n):
 +                h,_ = attrs[n]
 +                h(xml, e, n, v)
 +            else:
 +                raise Error("Unknown attribute %s" % n)
 +    def __from_xml(self, e, attrs):
 +        """Decode a database object from XML"""
 +        ref = e.attributes['ref'].value
 +        rec = {}
 +        for n in e.childNodes:
 +            if n.nodeName in attrs:
 +                _,h = attrs[n.nodeName]
 +                rec[n.nodeName] = h(n)
 +        return (ref,rec)
 +    
      def __init__(self, session_ref=None, cache_file=None):
          if session_ref and cache_file:
              raise Error("can't specify session reference and cache file")
Simple merge