]> git.proxmox.com Git - mirror_ifupdown2.git/commitdiff
Merge pull request #111 from svenauhagen/feature/xfrm
authorJulien Fortin <julien@cumulusnetworks.com>
Thu, 6 Jun 2019 16:22:39 +0000 (00:22 +0800)
committerGitHub <noreply@github.com>
Thu, 6 Jun 2019 16:22:39 +0000 (00:22 +0800)
This commit adds support for the new IPSec Interface XFRM.

1  2 
ifupdown2/ifupdown/netlink.py
ifupdown2/ifupdownaddons/LinkUtils.py
ifupdown2/nlmanager/nlmanager.py

index f5aef0f7ce5dadf685095d40833fdb1e041dc3f2,0d15d71bc367c7b2a090f838fc5f6de4c4baba6c..099208b1fe48cf4c5ecebedc404a9e9929070f1b
@@@ -64,7 -64,8 +64,8 @@@ class Netlink(utilsBase)
                  '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)
  
index d902e686073b86df974838367ff3df7ca231ccd1,7326cd2cd2feb337cff1c186cd650dde2dd0f433..d973cbc2ba8219740bbb67abb2eb6982aeefee70
@@@ -586,6 -586,8 +586,8 @@@ class LinkUtils(utilsBase)
                          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,
index c6279969eaa4c47d149a22006d758dbb8933a864,be149ea941dd1de860ee66935f580388fc52e4b5..ba9453d4488a5e288bc4aa0fae21ccaafcf02750
@@@ -637,7 -637,7 +637,7 @@@ class NetlinkManager(object)
          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