+
+ addr_virtual_macs = self.create_macvlan_and_apply_config(
+ ifaceobj,
+ self.translate_addrvirtual_user_config_to_list(
+ ifaceobj,
+ address_virtual_list
+ )
+ )
+
+ vrr_macs = self.create_macvlan_and_apply_config(
+ ifaceobj,
+ self.translate_vrr_user_config_to_list(
+ ifaceobj,
+ vrr_config_list
+ )
+ )
+
+ hw_address_list = addr_virtual_macs + vrr_macs
+
+ # check the statemanager for old configs.
+ # We need to remove only the previously configured FDB entries
+ oldmacs = self._get_macs_from_old_config(ifaceobj)
+ # get a list of fdbs in old that are not in new config meaning they should
+ # be removed since they are gone from the config
+ removed_macs = [mac for mac in oldmacs if mac.lower() not in hw_address_list]
+ self._remove_addresses_from_bridge(ifaceobj, removed_macs)
+ # if ifaceobj is a bridge and bridge is a vlan aware bridge
+ # add the vid to the bridge
+ self._add_addresses_to_bridge(ifaceobj, hw_address_list)
+
+ def get_vrr_prefix(self, ifname, family):
+ return '%s-%sv' % (ifname[0:10].replace('.', '-'), family)
+
+ def translate_vrr_user_config_to_list(self, ifaceobj, vrr_config_list, ifquery=False):
+ """
+ If (IPv4 addresses provided):
+ 00:00:5e:00:01:<V>
+ else if (IPv6 addresses provided):
+ 00:00:5e:00:02:<V>
+
+ vrrp 1 10.0.0.15/24
+ vrrp 1 2001:0db8::0370:7334/64
+
+ # Translate:
+ # vrrp 255 10.0.0.15/24 10.0.0.2/1
+ # To:
+ # [
+ # {
+ # "ifname": "macvlan_ifname",
+ # "hwaddress": "macvlan_hwaddress",
+ # "ips": [str(IPNetwork), ]
+ # },
+ # ]
+ """
+ ifname = ifaceobj.name
+ user_config_list = []
+
+ for config in vrr_config_list or []:
+ vrrp_id, ip_addrs = config.split(" ", 1)
+ hex_id = '%02x' % int(vrrp_id)
+ ip4 = []
+ ip6 = []
+
+ for ip_addr in ip_addrs.split():
+ ip_network_obj = IPNetwork(ip_addr)
+ is_ip6 = isinstance(ip_network_obj, IPv6Network)
+
+ if is_ip6:
+ ip6.append(ip_addr)
+ else:
+ ip4.append(ip_addr)
+
+ macvlan_ip4_ifname = "%s%s" % (self.get_vrr_prefix(ifname, "4"), vrrp_id)
+ macvlan_ip6_ifname = "%s%s" % (self.get_vrr_prefix(ifname, "6"), vrrp_id)
+
+ merged_with_existing_obj = False
+ # if the vrr config is defined in different lines for the same ID
+ # we need to save the ip4 and ip6 in the objects we previously
+ # created, example:
+ # vrrp 255 10.0.0.15/24 10.0.0.2/15
+ # vrrp 255 fe80::a00:27ff:fe04:42/64
+ for obj in user_config_list:
+ if obj.get("ifname") == macvlan_ip4_ifname:
+ obj["ips"] += ip4
+ merged_with_existing_obj = True
+ elif obj.get("ifname") == macvlan_ip6_ifname:
+ obj["ips"] += ip6
+ merged_with_existing_obj = True
+
+ if merged_with_existing_obj:
+ continue
+
+ if ip4 or ifquery:
+ # config_ip4
+ macvlan_ip4_mac = "00:00:5e:00:01:%s" % hex_id
+ user_config_list.append({
+ "ifname": macvlan_ip4_ifname,
+ "hwaddress": macvlan_ip4_mac,
+ "hwaddress_int": self.mac_str_to_int(macvlan_ip4_mac),
+ "ips": ip4,
+ "id": vrrp_id
+ })
+
+ if ip6 or ifquery:
+ # config_ip6
+ macvlan_ip6_mac = "00:00:5e:00:02:%s" % hex_id
+ user_config_list.append({
+ "ifname": macvlan_ip6_ifname,
+ "hwaddress": macvlan_ip6_mac,
+ "hwaddress_int": self.mac_str_to_int(macvlan_ip6_mac),
+ "ips": ip6,
+ "id": vrrp_id
+ })
+
+ return user_config_list
+
+ def translate_addrvirtual_user_config_to_list(self, ifaceobj, address_virtual_list):
+ """
+ # Translate:
+ # address-virtual 00:11:22:33:44:01 2001:0db8::0370:7334/64 11.0.1.1/24 11.0.1.2/24
+ # To:
+ # [
+ # {
+ # "ifname": "macvlan_ifname",
+ # "hwaddress": "macvlan_hwaddress",
+ # "ips": [str(IPNetwork), ]
+ # },
+ # ]
+ """
+ user_config_list = []
+
+ if not address_virtual_list:
+ return user_config_list
+
+ macvlan_prefix = self._get_macvlan_prefix(ifaceobj)
+
+ for index, addr_virtual in enumerate(address_virtual_list):
+ av_attrs = addr_virtual.split()
+
+ if len(av_attrs) < 2:
+ self.log_error("%s: incorrect address-virtual attrs '%s'"
+ % (ifaceobj.name, addr_virtual), ifaceobj,
+ raise_error=False)
+ continue
+
+ mac = av_attrs[0]
+ if mac:
+ mac = mac.lower()
+
+ if not self.check_mac_address(ifaceobj, mac):
+ continue
+
+ config = {"ifname": "%s%d" % (macvlan_prefix, index)}
+
+ if mac != "none":
+ config["hwaddress"] = mac
+ config["hwaddress_int"] = self.mac_str_to_int(mac)
+
+ ip_network_obj_list = []
+ for ip in av_attrs[1:]:
+ ip_network_obj_list.append(str(IPNetwork(ip)))
+
+ config["ips"] = ip_network_obj_list
+ user_config_list.append(config)
+
+ return user_config_list
+
+ def process_macvlans_config(self, ifaceobj, attr_name, virtual_addr_list_raw, macvlan_config_list):
+ return self.create_macvlan_and_apply_config(ifaceobj, macvlan_config_list)