Skip to content

Commit

Permalink
CP-1592: interface-reconfigure: Configure network device MTU from Net…
Browse files Browse the repository at this point in the history
…work.MTU field

With override via other-config:mtu field on specific objects in the datamodel.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
  • Loading branch information
Ian Campbell committed Mar 8, 2010
1 parent 13c7740 commit eb66e1b
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 15 deletions.
29 changes: 25 additions & 4 deletions scripts/InterfaceReconfigure.py
Expand Up @@ -295,6 +295,7 @@ def _otherconfig_from_xml(n, attrs):

_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),
Expand Down Expand Up @@ -595,13 +596,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

#
Expand Down
8 changes: 5 additions & 3 deletions scripts/InterfaceReconfigureBridge.py
Expand Up @@ -295,6 +295,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")
Expand All @@ -306,7 +308,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)

Expand Down Expand Up @@ -364,7 +366,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'], "Bond-PIF", pifrec['other_config'])
if mtu:
f.write("MTU=%s\n" % mtu)

Expand Down Expand Up @@ -414,7 +416,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'], "VLAN-PIF", pifrec['other_config'])
if mtu:
f.write("MTU=%s\n" % mtu)

Expand Down
5 changes: 3 additions & 2 deletions scripts/InterfaceReconfigureVswitch.py
Expand Up @@ -393,11 +393,12 @@ def configure(self):
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)

Expand Down
12 changes: 7 additions & 5 deletions scripts/interface-reconfigure
Expand Up @@ -284,7 +284,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)

Expand Down Expand Up @@ -319,12 +320,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]))
Expand Down
3 changes: 2 additions & 1 deletion scripts/vif
Expand Up @@ -62,7 +62,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
}

Expand Down

0 comments on commit eb66e1b

Please sign in to comment.