This commit adds support for the new IPSec Interface XFRM.
'sit': self._link_dump_info_data_iptun_tunnel,
'ip6tnl': self._link_dump_info_data_iptun_tunnel,
'vti': self._link_dump_info_data_vti_tunnel,
- 'vti6': self._link_dump_info_data_vti_tunnel
+ 'vti6': self._link_dump_info_data_vti_tunnel,
+ 'xfrm': self._link_dump_info_data_xfrm
}
except Exception as e:
except Exception as e:
raise Exception('netlink: %s: cannot create macvlan %s: %s'
% (ifacename, macvlan_ifacename, str(e)))
+
+ def link_add_xfrm(self, ifacename, xfrm_ifacename, xfrm_id):
+ self.logger.info('%s: netlink: ip link add %s type xfrm dev %s if_id %s'
+ % (xfrm_ifacename, xfrm_ifacename, ifacename, xfrm_id))
+ if ifupdownflags.flags.DRYRUN: return
+ ifindex = self.get_iface_index(ifacename)
+ try:
+ return self._nlmanager_api.link_add_xfrm(ifindex, xfrm_ifacename, xfrm_id)
+ except Exception as e:
+ raise Exception('netlink: %s: cannot create xfrm %s id %s: %s'
+ % (ifacename, xfrm_ifacename, xfrm_id, str(e)))
def link_set_updown(self, ifacename, state):
self.logger.info('%s: netlink: ip link set dev %s %s'
raise Exception('netlink: cannot set link %s protodown %s: %s'
% (ifacename, state, str(e)))
- def link_add_bridge(self, ifname):
+ def link_add_bridge(self, ifname, mtu=None):
self.logger.info('%s: netlink: ip link add %s type bridge' % (ifname, ifname))
if ifupdownflags.flags.DRYRUN: return
try:
- return self._nlmanager_api.link_add_bridge(ifname)
+ return self._nlmanager_api.link_add_bridge(ifname, mtu=mtu)
except Exception as e:
raise Exception('netlink: cannot create bridge %s: %s' % (ifname, str(e)))
"tunnel-physdev": self.get_iface_name(tunnel_link_ifindex) if tunnel_link_ifindex else ""
}
+ def _link_dump_info_data_xfrm(self, ifname, linkdata):
+ xfrm_physdev_link_ifindex = linkdata.get(Link.IFLA_XFRM_LINK)
+
+ return {
+ 'xfrm-id': str(linkdata.get(Link.IFLA_XFRM_IF_ID, '')),
+ 'xfrm-physdev': self.get_iface_name(xfrm_physdev_link_ifindex) if xfrm_physdev_link_ifindex else ""
+ }
+
def _link_dump_linkinfo(self, link, dump):
linkinfo = link.attributes[Link.IFLA_LINKINFO].get_pretty_value(dict)
break
elif citems[i] == 'macvlan' and citems[i + 1] == 'mode':
linkattrs['kind'] = 'macvlan'
+ elif citems[i] == 'xfrm':
+ linkattrs['kind'] = 'xfrm'
except Exception as e:
if warn:
self.logger.debug('%s: parsing error: id, mtu, state, '
return
cmd = 'addr del %s' % address
if broadcast:
- cmd += 'broadcast %s' % broadcast
+ cmd += ' broadcast %s' % broadcast
if peer:
- cmd += 'peer %s' % peer
+ cmd += ' peer %s' % peer
if scope:
- cmd += 'scope %s' % scope
+ cmd += ' scope %s' % scope
cmd += ' dev %s' % ifacename
utils.exec_command('%s %s' % (utils.ip_cmd, cmd))
self._cache_delete([ifacename, 'addrs', address])
(utils.ip_cmd, vrf, gateway))
# Add metric
if metric:
- cmd += 'metric %s' % metric
+ cmd += ' metric %s' % metric
cmd += ' dev %s' % ifacename
if onlink:
cmd = ''
if '6' in mode:
- cmd = ' -6 '
+ cmd = ' -6'
if mode in ['gretap']:
- cmd += 'link add %s type %s' % (tunnelname, mode)
+ cmd += ' link add %s type %s' % (tunnelname, mode)
else:
- cmd += 'tunnel add %s mode %s' % (tunnelname, mode)
+ cmd += ' tunnel add %s mode %s' % (tunnelname, mode)
if attrs:
for k, v in attrs.iteritems():
def link_add_macvlan(ifname, macvlan_ifacename, mode):
utils.exec_commandl(['ip', 'link', 'add', 'link', ifname, 'name', macvlan_ifacename, 'type', 'macvlan', 'mode', mode])
+ @staticmethod
+ def link_add_xfrm(ifname, xfrm_name, xfrm_id):
+ utils.exec_commandl(['ip', 'link', 'add', xfrm_name, 'type', 'xfrm', 'dev', ifname, 'if_id', xfrm_id])
+
@staticmethod
def route_add(route):
utils.exec_command('%s route add %s' % (utils.ip_cmd,
link.build_message(self.sequence.next(), self.pid)
return self.tx_nlpacket_get_response(link)
- def _link_add(self, ifindex, ifname, kind, ifla_info_data):
+ def _link_add(self, ifindex, ifname, kind, ifla_info_data, mtu=None):
"""
Build and TX a RTM_NEWLINK message to add the desired interface
"""
if ifindex:
link.add_attribute(Link.IFLA_LINK, ifindex)
+ if mtu:
+ link.add_attribute(Link.IFLA_MTU, mtu)
+
link.add_attribute(Link.IFLA_LINKINFO, {
Link.IFLA_INFO_KIND: kind,
Link.IFLA_INFO_DATA: ifla_info_data
link.build_message(self.sequence.next(), self.pid)
return self.tx_nlpacket_get_response(link)
- def link_add_bridge(self, ifname, ifla_info_data={}):
- return self._link_add(ifindex=None, ifname=ifname, kind='bridge', ifla_info_data=ifla_info_data)
+ def link_add_bridge(self, ifname, ifla_info_data={}, mtu=None):
+ return self._link_add(ifindex=None, ifname=ifname, kind='bridge', ifla_info_data=ifla_info_data, mtu=mtu)
def link_add_vlan(self, ifindex, ifname, vlanid, vlan_protocol=None):
"""
"""
return self._link_add(ifindex, ifname, 'macvlan', {Link.IFLA_MACVLAN_MODE: Link.MACVLAN_MODE_PRIVATE})
+ def link_add_xfrm(self, physdev, xfrm_ifname, xfrm_id):
+ """
+ ifindex is the index of the parent interface that this sub-interface
+ is being added to
+ """
+ ifla_info_data = {
+ Link.IFLA_XFRM_IF_ID: int(xfrm_id),
+ Link.IFLA_XFRM_LINK: int(physdev)
+ }
+
+ return self._link_add(ifindex=None, ifname=xfrm_ifname, kind='xfrm', ifla_info_data=ifla_info_data)
+
def vlan_get(self, filter_ifindex=None, filter_vlanid=None, compress_vlans=True):
"""
filter_ifindex should be a tuple if interface indexes, this is a whitelist filter