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

Add rtnetlink api's for 'bridge vlan' and modify 'bridge vlan' commands

in vlan module to use rtnetlink api

Ticket: CM-4173
Reviewed By:
Testing Done: Tested new bridge driver svi up/down

This does not move all 'bridge vlan' commands to rtnetlink yet.
This commit is contained in:
Roopa Prabhu
2014-12-26 09:09:47 -08:00
parent a9ab1b4f10
commit d52f59043c
3 changed files with 191 additions and 65 deletions

View File

@ -8,6 +8,7 @@
from os import getpid
from socket import AF_UNSPEC
from socket import AF_BRIDGE
from iff import IFF_UP
from rtnetlink import *
import os
@ -104,4 +105,133 @@ class rtnetlinkApi(RtNetlink):
token = self.request(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_ACK, ifm, rtas)
self.process_wait([token])
def link_set_hwaddress(self, ifname, hwaddress):
flags = 0
self.logger.info('rtnetlink: setting link hwaddress %s %s' %(ifname, hwaddress))
if ifupdownmain.ifupdownFlags.DRYRUN:
return
flags &= ~IFF_UP
ifm = Ifinfomsg(AF_UNSPEC, ifi_change=IFF_UP)
rtas = {IFLA_IFNAME: ifname,
IFLA_ADDRESS : str(bytearray([int(a,16) for a in hwaddress.split(':')]))}
self.logger.info(rtas)
token = self.request(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_ACK, ifm, rtas)
self.process_wait([token])
def addr_add(self, ifname, address, broadcast=None, peer=None, scope=None,
preferred_lifetime=None):
self.logger.info('rtnetlink: setting address')
if ifupdownmain.ifupdownFlags.DRYRUN:
return
try:
ifindex = self.get_ifindex(link)
except Exception, e:
raise Exception('cannot determine ifindex for link %s (%s)'
%(link, str(e)))
ifa_scope = RT_SCOPE_
if scope:
if scope == "universe":
ifa_scope = RT_SCOPE_UNIVERSE
elif scope == "site":
ifa_scope = RT_SCOPE_SITE
elif scope == "link":
ifa_scope = RT_SCOPE_LINK
elif scope == "host":
ifa_scope = RT_SCOPE_HOST
elif scope == "nowhere":
ifa_scope = RT_SCOPE_NOWHERE
rtas = {IFLA_ADDRESS: ifname}
ifa = Ifaddrmsg(AF_UNSPEC, ifa_scope=ifa_scope, ifa_index=ifindex)
token = self.request(RTM_NEWADDR, NLM_F_REQUEST | NLM_F_ACK, ifa, rtas)
self.process_wait([token])
def link_set_many(self, ifname, ifattrs):
_ifattr_to_rta_map = {'dev' : IFLA_NAME,
'address' : IFLA_ADDRESS,
'broadcast' : IFLA_BROADCAST,
'mtu' : IFLA_MTU,
'master' : IFLA_MASTER}
flags = 0
ifi_change = IFF_UP
rtas = {}
self.logger.info('rtnetlink: setting link %s %s' %(ifname, state))
if ifupdownmain.ifupdownFlags.DRYRUN:
return
if not ifattrs:
return
state = ifattrs.get('state')
if state == 'up':
flags |= IFF_UP
elif state == 'down':
flags &= ~IFF_UP
else:
ifi_change = 0
if ifi_change:
ifm = Ifinfomsg(AF_UNSPEC, ifi_change=IFF_UP, ifi_flags=flags)
else:
ifm = Ifinfomsg(AF_UNSPEC)
for attr, attrval in ifattrs.items():
rta_attr = _ifattr_to_rta_map.get(attr)
if rta_attr:
if attr == 'hwaddress':
rtas[rta_attr] = str(bytearray([int(a,16) for a in attrval.split(':')]))
else:
rtas[rta_attr] = attrval
token = self.request(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_ACK, ifm, rtas)
self.process_wait([token])
def bridge_vlan(self, add=True, vid=None, dev=None, pvid=False,
untagged=False, master=True):
flags = 0
vflags = 0
if not vid or not dev:
return
self.logger.info('rtnetlink: bridge vlan add vid %s %s %s dev %s %s'
%(vid, 'untagged' if untagged else '',
'pvid' if pvid else '', dev,
'self' if self else ''))
if ifupdownmain.ifupdownFlags.DRYRUN:
return
try:
ifindex = self.get_ifindex(dev)
except Exception, e:
raise Exception('cannot determine ifindex for dev %s (%s)'
%(dev, str(e)))
if not master:
flags = BRIDGE_FLAGS_SELF
if pvid:
vflags = BRIDGE_VLAN_INFO_PVID
vflags |= BRIDGE_VLAN_INFO_UNTAGGED
elif untagged:
vflags |= BRIDGE_VLAN_INFO_UNTAGGED
ifm = Ifinfomsg(AF_BRIDGE, ifi_index=ifindex)
rtas = {IFLA_AF_SPEC: {
IFLA_BRIDGE_FLAGS: flags,
IFLA_BRIDGE_VLAN_INFO : BridgeVlanInfo(vflags, int(vid), int(vid))
}
}
if add:
token = self.request(RTM_SETLINK,
NLM_F_REQUEST | NLM_F_ACK, ifm, rtas)
else:
token = self.request(RTM_DELLINK,
NLM_F_REQUEST | NLM_F_ACK, ifm, rtas)
self.process_wait([token])
def bridge_vlan_many(self, add=True, vids=[], dev=None, pvid=False,
untagged=False, master=True):
for v in vids:
self.bridge_vlan_add(add, v, dev, ispvid, isuntagged, master)
rtnl_api = rtnetlinkApi(os.getpid())