CP-1592: interface-reconfigure: Configure network device MTU from Network.MTU field
authorIan Campbell <ian.campbell@citrix.com>
Wed, 24 Feb 2010 10:48:58 +0000 (10:48 +0000)
committerBen Pfaff <blp@nicira.com>
Wed, 24 Feb 2010 18:54:41 +0000 (10:54 -0800)
With override via other-config:mtu field on specific objects in the datamodel.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1267008538 0
# Node ID a91df72fd4bf6329831d3efcae45a5ff55e3ba2e
# Parent  219104a041786d7274b15800de5c3efccf0c4f42

xenserver/etc_xensource_scripts_vif
xenserver/opt_xensource_libexec_InterfaceReconfigure.py
xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py
xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py
xenserver/opt_xensource_libexec_interface-reconfigure

index 1fbf155b628593d7c8b656d4c5e3d9d10780e5a4..4df1ac968d719352feedaaa62c17017930173719 100755 (executable)
@@ -61,7 +61,8 @@ handle_mtu()
 {
     local mtu=$(xenstore-read "${PRIVATE}/MTU" 2>/dev/null)
     if [ $? -eq 0 -a -n "${mtu}" ]; then
-       echo "${mtu}" > /sys/class/net/${dev}/mtu
+       logger -t scripts-vif "Setting ${dev} MTU ${mtu}"
+       ${IP} link set "${dev}" mtu ${mtu} || logger -t scripts-vif "Failed to ip link set ${dev} mtu ${mtu}. Error code $?"
     fi
 }
 
index c7a231a8b5c19559d81e59795658a533176caa49..3c3a0195a6687fe8977f0094451fcb019a5489f7 100644 (file)
@@ -318,6 +318,7 @@ _NETWORK_OTHERCONFIG_ATTRS = [ 'mtu', 'static-routes' ] + _ETHTOOL_OTHERCONFIG_A
 
 _NETWORK_ATTRS = { 'uuid': (_str_to_xml,_str_from_xml),
                    'bridge': (_str_to_xml,_str_from_xml),
+                   'MTU': (_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),
@@ -619,13 +620,33 @@ def ethtool_settings(oc):
                 log("Invalid value for ethtool-%s = %s. Must be on|true|off|false." % (opt, val))
     return settings,offload
 
-def mtu_setting(oc):
+# By default the MTU is taken from the Network.MTU setting for VIF,
+# PIF and Bridge. However it is possible to override this by using
+# {VIF,PIF,Network}.other-config:mtu.
+#
+# type parameter is a string describing the object that the oc parameter
+# is from. e.g. "PIF", "Network" 
+def mtu_setting(nw, type, oc):
+    mtu = None
+
+    nwrec = db().get_network_record(nw)
+    if nwrec.has_key('MTU'):
+        mtu = nwrec['MTU']
+    else:
+        mtu = "1500"
+        
     if oc.has_key('mtu'):
+        log("Override Network.MTU setting on bridge %s from %s.MTU is %s" % \
+            (nwrec['bridge'], type, mtu))
+        mtu = oc['mtu']
+
+    if mtu is not None:
         try:
-            int(oc['mtu'])      # Check that the value is an integer
-            return oc['mtu']
+            int(mtu)      # Check that the value is an integer
+            return mtu
         except ValueError, x:
-            log("Invalid value for mtu = %s" % oc['mtu'])
+            log("Invalid value for mtu = %s" % mtu)
+
     return None
 
 #
index 2a3aa8cead499f37f6ec3aacaad94ac8db49aa7e..0438f5c706ccdfb4275f06885fbaf91973f29dc2 100644 (file)
@@ -267,6 +267,8 @@ def _configure_physical_interface(pif):
 
     pifrec = db().get_pif_record(pif)
 
+    log("Configuring physical interface %s" % pifrec['device'])
+
     f = open_pif_ifcfg(pif)
 
     f.write("TYPE=Ethernet\n")
@@ -278,7 +280,7 @@ def _configure_physical_interface(pif):
     if len(offload):
         f.write("ETHTOOL_OFFLOAD_OPTS=\"%s\"\n" % str.join(" ", offload))
 
-    mtu = mtu_setting(pifrec['other_config'])
+    mtu = mtu_setting(pifrec['network'], "PIF", pifrec['other_config'])
     if mtu:
         f.write("MTU=%s\n" % mtu)
 
@@ -336,7 +338,7 @@ def _configure_bond_interface(pif):
     if len(offload):
         f.write("ETHTOOL_OFFLOAD_OPTS=\"%s\"\n" % str.join(" ", offload))
 
-    mtu = mtu_setting(pifrec['other_config'])
+    mtu = mtu_setting(pifrec['network'], "VLAN-PIF", pifrec['other_config'])
     if mtu:
         f.write("MTU=%s\n" % mtu)
 
@@ -386,7 +388,7 @@ def _configure_vlan_interface(pif):
     if len(offload):
         f.write("ETHTOOL_OFFLOAD_OPTS=\"%s\"\n" % str.join(" ", offload))
 
-    mtu = mtu_setting(pifrec['other_config'])
+    mtu = mtu_setting(pifrec['network'], "Bond-PIF", pifrec['other_config'])
     if mtu:
         f.write("MTU=%s\n" % mtu)
 
index 831846a2ad910bc687eca9aa7a9a6fc87179cd3f..0d14251bff2b7f615cd9986d4d479de09b42154e 100644 (file)
@@ -366,11 +366,12 @@ class DatapathVswitch(Datapath):
         physical_devices = datapath_get_physical_pifs(self._dp)
         
         for p in physical_devices:
-            oc = db().get_pif_record(p)['other_config']
+            prec = db().get_pif_record(p)
+            oc = prec['other_config']
 
             dev = pif_netdev_name(p)
 
-            mtu = mtu_setting(oc)
+            mtu = mtu_setting(prec['network'], "PIF", oc)
 
             netdev_up(dev, mtu)
 
index f16f681af97f0dee182494ca1edacf8a39a2be56..f756bab7bc30350a26912766b071ca1eb667a5af 100755 (executable)
@@ -286,7 +286,8 @@ def ipdev_configure_network(pif, dp):
     """
 
     pifrec = db().get_pif_record(pif)
-    nwrec = db().get_network_record(pifrec['network'])
+    nw = pifrec['network']
+    nwrec = db().get_network_record(nw)
 
     ipdev = pif_ipdev_name(pif)
 
@@ -321,12 +322,13 @@ def ipdev_configure_network(pif, dp):
         if len(offload):
             f.write("ETHTOOL_OFFLOAD_OPTS=\"%s\"\n" % str.join(" ", offload))
 
-        mtu = mtu_setting(nwrec['other_config'])
-        if mtu:
-            f.write("MTU=%s\n" % mtu)
-
         ipdev_configure_static_routes(ipdev, nwrec['other_config'], f)
 
+    mtu = mtu_setting(nw, "Network", nwrec['other_config'])
+    if mtu:
+        f.write("MTU=%s\n" % mtu)
+
+
     if pifrec.has_key('DNS') and pifrec['DNS'] != "":
         ServerList = pifrec['DNS'].split(",")
         for i in range(len(ServerList)): f.write("DNS%d=%s\n" % (i+1, ServerList[i]))