1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00

lib: nlcache: merge existing MTU into new netlink object before caching

Signed-off-by: Julien Fortin <jfortin@nvidia.com>
This commit is contained in:
Julien Fortin
2022-08-12 15:58:02 +02:00
parent e5e64b25fe
commit aa656ad315

View File

@ -2278,7 +2278,7 @@ class NetlinkListenerWithCache(nllistener.NetlinkManagerWithListener, BaseObject
raise Exception(error_str)
def tx_nlpacket_get_response_with_error_and_cache_on_ack(self, packet):
def tx_nlpacket_get_response_with_error_and_cache_on_ack(self, packet, ifname=None):
"""
TX packet and manually cache the object
"""
@ -2302,6 +2302,33 @@ class NetlinkListenerWithCache(nllistener.NetlinkManagerWithListener, BaseObject
# we can ignore all errors
pass
try:
# We might be pre-caching an updated object that is "incomplete".
# i.e. say you have an existing bond in the cache, on ifreload only
# one attribute is updated. Our object 'packet' here will only have
# a couple attributes (but overriding a 'full' object in the cache).
# We need to somehow 'merge' some of the attributes that are not
# updated, otherwise later calls to the cache might return None for
# the missing attributes. MTU is a prime example.
if ifname:
# To minimize the changes each parent function can decide to
# trigger this 'merge' code by provided the optional 'ifname' arg
# MERGING MTU:
# First check if we are not already setting MTU in this packet
try:
packet_mtu = packet.attributes[Link.IFLA_MTU].value
except Exception:
packet_mtu = None
# Then update 'packet' before caching
if not packet_mtu:
old_packet_mtu = self.cache.get_link_attribute(ifname, Link.IFLA_MTU)
if old_packet_mtu:
packet.add_attribute(Link.IFLA_MTU, old_packet_mtu)
except Exception:
# we can ignore all errors
pass
# Then we can use our normal "add_link" API call to cache the packet
# and fill up our additional internal data structures.
self.cache.add_link(packet)
@ -3060,7 +3087,7 @@ class NetlinkListenerWithCache(nllistener.NetlinkManagerWithListener, BaseObject
Link.IFLA_INFO_DATA: ifla_info_data
})
link.build_message(next(self.sequence), self.pid)
return self.tx_nlpacket_get_response_with_error_and_cache_on_ack(link)
return self.tx_nlpacket_get_response_with_error_and_cache_on_ack(link, ifname=ifname)
except Exception as e:
raise Exception("%s: netlink: cannot create bond with attributes: %s" % (ifname, str(e)))