Blame libnmstate/nm/lldp.py

Packit Service 0535c1
#
Packit Service 0535c1
# Copyright (c) 2020 Red Hat, Inc.
Packit Service 0535c1
#
Packit Service 0535c1
# This file is part of nmstate
Packit Service 0535c1
#
Packit Service 0535c1
# This program is free software: you can redistribute it and/or modify
Packit Service 0535c1
# it under the terms of the GNU Lesser General Public License as published by
Packit Service 0535c1
# the Free Software Foundation, either version 2.1 of the License, or
Packit Service 0535c1
# (at your option) any later version.
Packit Service 0535c1
#
Packit Service 0535c1
# This program is distributed in the hope that it will be useful,
Packit Service 0535c1
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 0535c1
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 0535c1
# GNU Lesser General Public License for more details.
Packit Service 0535c1
#
Packit Service 0535c1
# You should have received a copy of the GNU Lesser General Public License
Packit Service 0535c1
# along with this program. If not, see <https://www.gnu.org/licenses/>.
Packit Service 0535c1
#
Packit Service 0535c1
Packit Service 0535c1
from libnmstate.nm import connection
Packit Service 0535c1
from libnmstate.schema import LLDP
Packit Service 0535c1
Packit Service 0535c1
from .common import NM
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
NM_VLAN_ID_KEY = "vid"
Packit Service 0535c1
NM_VLAN_NAME_KEY = "name"
Packit Service 0535c1
NM_MACPHY_AUTONEG_KEY = "autoneg"
Packit Service 0535c1
NM_MACPHY_PMD_AUTONEG_KEY = "pmd-autoneg-cap"
Packit Service 0535c1
NM_MACPHY_MAU_TYPE_KEY = "operational-mau-type"
Packit Service 0535c1
NM_PPVLAN_ID_KEY = "ppvid"
Packit Service 0535c1
NM_PPVLAN_FLAGS_KEY = "flags"
Packit Service 0535c1
NM_MANAGEMENT_ADDR_KEY = "address"
Packit Service 0535c1
NM_MANAGEMENT_ADDR_TYPE_KEY = "address-subtype"
Packit Service 0535c1
NM_MANAGEMENT_ADDR_IFACE_NUMBER_KEY = "interface-number"
Packit Service 0535c1
NM_MANAGEMENT_ADDR_IFACE_NUMBER_TYPE_KEY = "interface-number-subtype"
Packit Service 0535c1
NM_MANAGEMENT_ADDR_TYPE_IPV4 = 1
Packit Service 0535c1
NM_MANAGEMENT_ADDR_TYPE_MAC = 6
Packit Service 0535c1
NM_INTERFACE_TYPE_IFINDEX = 2
Packit Service 0535c1
NM_INTERFACE_TYPE_SYSTEM_PORT = 3
Packit Service 0535c1
NM_LLDP_STATUS_DEFAULT = -1
Packit Service 0535c1
CHASSIS_TYPE_UNKNOWN = "unknown"
Packit Service 0535c1
PORT_TYPE_UNKNOWN = "unknown"
Packit Service 0535c1
Packit Service 0535c1
CHASSIS_ID_TLV = 1
Packit Service 0535c1
PORT_TLV = 2
Packit Service 0535c1
SYSTEM_NAME_TLV = 5
Packit Service 0535c1
SYSTEM_DESCRIPTION_TLV = 6
Packit Service 0535c1
SYSTEM_CAPABILITIES_TLV = 7
Packit Service 0535c1
MANAGEMENT_ADDRESSES_TLV = 8
Packit Service 0535c1
ORGANIZATION_SPECIFIC_TLV = 127
Packit Service 0535c1
Packit Service 0535c1
IEEE = "00:80:c2"
Packit Service 0535c1
PORT_VLAN_SUBTYPE_TLV = 2
Packit Service 0535c1
VLAN_SUBTYPE_TLV = 3
Packit Service 0535c1
Packit Service 0535c1
IEEE_802_3 = "00:12:0f"
Packit Service 0535c1
MAC_PHY_SUBTYPE_TLV = 1
Packit Service 0535c1
MFS_SUBTYPE_TLV = 4
Packit Service 0535c1
Packit Service 0535c1
LLDP_CAP_NAMES = {
Packit Service 0535c1
    0b1: "Other",
Packit Service 0535c1
    0b10: "Repeater",
Packit Service 0535c1
    0b100: "MAC Bridge component",
Packit Service 0535c1
    0b1000: "802.11 Access Point (AP)",
Packit Service 0535c1
    0b1_0000: "Router",
Packit Service 0535c1
    0b10_0000: "Telephone",
Packit Service 0535c1
    0b100_0000: "DOCSIS cable device",
Packit Service 0535c1
    0b1000_0000: "Station Only",
Packit Service 0535c1
    0b1_0000_0000: "C-VLAN component",
Packit Service 0535c1
    0b10_0000_0000: "S-VLAN component",
Packit Service 0535c1
    0b100_0000_0000: "Two-port MAC Relay component",
Packit Service 0535c1
}
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
LLDP_CHASSIS_TYPE_TO_NMSTATE = [
Packit Service 0535c1
    "Reserved",
Packit Service 0535c1
    "Chassis component",
Packit Service 0535c1
    "Interface alias",
Packit Service 0535c1
    "Port component",
Packit Service 0535c1
    "MAC address",
Packit Service 0535c1
    "Network address",
Packit Service 0535c1
    "Interface name",
Packit Service 0535c1
    "Locally assigned",
Packit Service 0535c1
]
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
LLDP_PORT_TYPE_TO_NMSTATE = [
Packit Service 0535c1
    "Reserved",
Packit Service 0535c1
    "Interface alias",
Packit Service 0535c1
    "Port component",
Packit Service 0535c1
    "MAC address",
Packit Service 0535c1
    "Network address",
Packit Service 0535c1
    "Interface name",
Packit Service 0535c1
    "Agent circuit ID",
Packit Service 0535c1
    "Locally assigned",
Packit Service 0535c1
]
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def apply_lldp_setting(con_setting, iface_desired_state):
Packit Service 0535c1
    lldp_status = iface_desired_state.get(LLDP.CONFIG_SUBTREE, {}).get(
Packit Service 0535c1
        LLDP.ENABLED, None
Packit Service 0535c1
    )
Packit Service 0535c1
    if lldp_status is not None:
Packit Service 0535c1
        lldp_status = int(lldp_status)
Packit Service 0535c1
        con_setting.setting.props.lldp = lldp_status
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def get_info(nm_client, nmdev):
Packit Service 0535c1
    """
Packit Service 0535c1
    Provides the current LLDP neighbors information
Packit Service 0535c1
    """
Packit Service 0535c1
    lldp_status = _get_lldp_status(nm_client, nmdev)
Packit Service 0535c1
    info = {}
Packit Service 0535c1
    if lldp_status == NM_LLDP_STATUS_DEFAULT or not lldp_status:
Packit Service 0535c1
        info[LLDP.ENABLED] = False
Packit Service 0535c1
    else:
Packit Service 0535c1
        info[LLDP.ENABLED] = True
Packit Service 0535c1
        _get_neighbors_info(info, nmdev)
Packit Service 0535c1
Packit Service 0535c1
    return {LLDP.CONFIG_SUBTREE: info}
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _get_lldp_status(nm_client, nmdev):
Packit Service 0535c1
    """
Packit Service 0535c1
    Default means NM global config file value which is by default disabled.
Packit Service 0535c1
    According to NM folks, there is no way from libnm to know if lldp is
Packit Service 0535c1
    enable or not with libnm if the value in the profile is default.
Packit Service 0535c1
    Therefore, the best option is to force the users to enable it explicitly.
Packit Service 0535c1
    This is going to be solved by a property in the NM.Device object to know if
Packit Service 0535c1
    the device is listening on LLDP.
Packit Service 0535c1
Packit Service 0535c1
    Ref: https://bugzilla.redhat.com/1832273
Packit Service 0535c1
    """
Packit Service 0535c1
    lldp_status = None
Packit Service 0535c1
    con_profile = connection.ConnectionProfile(nm_client)
Packit Service 0535c1
    con_profile.import_by_device(nmdev)
Packit Service 0535c1
    if con_profile.profile:
Packit Service 0535c1
        con_setting = con_profile.profile.get_setting_connection()
Packit Service 0535c1
        if con_setting:
Packit Service 0535c1
            lldp_status = con_setting.get_lldp()
Packit Service 0535c1
Packit Service 0535c1
    return lldp_status
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _get_neighbors_info(info, nmdev):
Packit Service 0535c1
    neighbors = nmdev.get_lldp_neighbors()
Packit Service 0535c1
    info_neighbors = []
Packit Service 0535c1
    for neighbor in neighbors:
Packit Service 0535c1
        n_info = []
Packit Service 0535c1
        _add_neighbor_system_info(neighbor, n_info)
Packit Service 0535c1
        _add_neighbor_chassis_info(neighbor, n_info)
Packit Service 0535c1
        _add_neighbor_port_info(neighbor, n_info)
Packit Service 0535c1
        _add_neighbor_vlans_info(neighbor, n_info)
Packit Service 0535c1
        _add_neighbor_macphy_info(neighbor, n_info)
Packit Service 0535c1
        _add_neighbor_port_vlans_info(neighbor, n_info)
Packit Service 0535c1
        _add_neighbor_management_addresses(neighbor, n_info)
Packit Service 0535c1
        _add_max_frame_size(neighbor, n_info)
Packit Service 0535c1
        info_neighbors.append(n_info)
Packit Service 0535c1
Packit Service 0535c1
    if info_neighbors:
Packit Service 0535c1
        info[LLDP.NEIGHBORS_SUBTREE] = info_neighbors
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _add_neighbor_system_info(neighbor, info):
Packit Service 0535c1
    sys_name = neighbor.get_attr_value(NM.LLDP_ATTR_SYSTEM_NAME)
Packit Service 0535c1
    if sys_name:
Packit Service 0535c1
        sys_name_object = {
Packit Service 0535c1
            LLDP.Neighbors.TLV_TYPE: SYSTEM_NAME_TLV,
Packit Service 0535c1
            NM.LLDP_ATTR_SYSTEM_NAME: sys_name.get_string(),
Packit Service 0535c1
        }
Packit Service 0535c1
        info.append(sys_name_object)
Packit Service 0535c1
Packit Service 0535c1
    sys_desc = neighbor.get_attr_value(NM.LLDP_ATTR_SYSTEM_DESCRIPTION)
Packit Service 0535c1
    if sys_desc:
Packit Service 0535c1
        sys_desc_object = {
Packit Service 0535c1
            LLDP.Neighbors.TLV_TYPE: SYSTEM_DESCRIPTION_TLV,
Packit Service 0535c1
            NM.LLDP_ATTR_SYSTEM_DESCRIPTION: sys_desc.get_string().rstrip(),
Packit Service 0535c1
        }
Packit Service 0535c1
        info.append(sys_desc_object)
Packit Service 0535c1
Packit Service 0535c1
    sys_caps = neighbor.get_attr_value(NM.LLDP_ATTR_SYSTEM_CAPABILITIES)
Packit Service 0535c1
    if sys_caps:
Packit Service 0535c1
        sys_caps_object = {
Packit Service 0535c1
            LLDP.Neighbors.TLV_TYPE: SYSTEM_CAPABILITIES_TLV,
Packit Service 0535c1
            NM.LLDP_ATTR_SYSTEM_CAPABILITIES: _decode_sys_caps(
Packit Service 0535c1
                sys_caps.get_uint32()
Packit Service 0535c1
            ),
Packit Service 0535c1
        }
Packit Service 0535c1
        info.append(sys_caps_object)
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _decode_sys_caps(code):
Packit Service 0535c1
    capabilities = []
Packit Service 0535c1
    for mask, capability in LLDP_CAP_NAMES.items():
Packit Service 0535c1
        if code & mask:
Packit Service 0535c1
            capabilities.append(capability)
Packit Service 0535c1
    return capabilities
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _add_neighbor_chassis_info(neighbor, info):
Packit Service 0535c1
    chassis_info = {}
Packit Service 0535c1
    chassis_object = {}
Packit Service 0535c1
    chassis_id = neighbor.get_attr_value(NM.LLDP_ATTR_CHASSIS_ID)
Packit Service 0535c1
    if chassis_id:
Packit Service 0535c1
        chassis_object[NM.LLDP_ATTR_CHASSIS_ID] = chassis_id.get_string()
Packit Service 0535c1
Packit Service 0535c1
    chassis_id_type = neighbor.get_attr_value(NM.LLDP_ATTR_CHASSIS_ID_TYPE)
Packit Service 0535c1
    if chassis_id_type:
Packit Service 0535c1
        chassis_object[
Packit Service 0535c1
            NM.LLDP_ATTR_CHASSIS_ID_TYPE
Packit Service 0535c1
        ] = chassis_id_type.get_uint32()
Packit Service 0535c1
        chassis_object[LLDP.Neighbors.DESCRIPTION] = _decode_chassis_type(
Packit Service 0535c1
            chassis_id_type.get_uint32()
Packit Service 0535c1
        )
Packit Service 0535c1
Packit Service 0535c1
    if chassis_object:
Packit Service 0535c1
        chassis_info[LLDP.Neighbors.TLV_TYPE] = CHASSIS_ID_TLV
Packit Service 0535c1
        chassis_info.update(chassis_object)
Packit Service 0535c1
        info.append(chassis_info)
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _decode_chassis_type(code):
Packit Service 0535c1
    try:
Packit Service 0535c1
        return LLDP_CHASSIS_TYPE_TO_NMSTATE[code]
Packit Service 0535c1
    except IndexError:
Packit Service 0535c1
        return CHASSIS_TYPE_UNKNOWN
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _add_neighbor_port_info(neighbor, info):
Packit Service 0535c1
    port_info = {}
Packit Service 0535c1
    port_object = {}
Packit Service 0535c1
    port_id = neighbor.get_attr_value(NM.LLDP_ATTR_PORT_ID)
Packit Service 0535c1
    if port_id:
Packit Service 0535c1
        port_object[NM.LLDP_ATTR_PORT_ID] = port_id.get_string()
Packit Service 0535c1
Packit Service 0535c1
    port_type = neighbor.get_attr_value(NM.LLDP_ATTR_PORT_ID_TYPE)
Packit Service 0535c1
    if port_type:
Packit Service 0535c1
        port_object[NM.LLDP_ATTR_PORT_ID_TYPE] = port_type.get_uint32()
Packit Service 0535c1
        port_object[LLDP.Neighbors.DESCRIPTION] = _decode_port_type(
Packit Service 0535c1
            port_type.get_uint32()
Packit Service 0535c1
        )
Packit Service 0535c1
Packit Service 0535c1
    if port_object:
Packit Service 0535c1
        port_info[LLDP.Neighbors.TLV_TYPE] = PORT_TLV
Packit Service 0535c1
        port_info.update(port_object)
Packit Service 0535c1
        info.append(port_info)
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _decode_port_type(code):
Packit Service 0535c1
    try:
Packit Service 0535c1
        return LLDP_PORT_TYPE_TO_NMSTATE[code]
Packit Service 0535c1
    except IndexError:
Packit Service 0535c1
        return PORT_TYPE_UNKNOWN
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _add_neighbor_vlans_info(neighbor, info):
Packit Service 0535c1
    vlans_info = {}
Packit Service 0535c1
    vlan_objects = []
Packit Service 0535c1
    vlans = neighbor.get_attr_value(NM.LLDP_ATTR_IEEE_802_1_VLANS)
Packit Service 0535c1
    if vlans:
Packit Service 0535c1
        vlans = vlans.unpack()
Packit Service 0535c1
        for vlan in vlans:
Packit Service 0535c1
            vlan_object = vlan.copy()
Packit Service 0535c1
            vlan_object[NM_VLAN_NAME_KEY] = vlan_object[
Packit Service 0535c1
                NM_VLAN_NAME_KEY
Packit Service 0535c1
            ].replace("\\000", "")
Packit Service 0535c1
            if vlan_object:
Packit Service 0535c1
                vlan_objects.append(vlan_object)
Packit Service 0535c1
Packit Service 0535c1
    if vlan_objects:
Packit Service 0535c1
        vlans_info[LLDP.Neighbors.TLV_TYPE] = ORGANIZATION_SPECIFIC_TLV
Packit Service 0535c1
        vlans_info[LLDP.Neighbors.ORGANIZATION_CODE] = IEEE
Packit Service 0535c1
        vlans_info[LLDP.Neighbors.TLV_SUBTYPE] = VLAN_SUBTYPE_TLV
Packit Service 0535c1
        vlans_info[NM.LLDP_ATTR_IEEE_802_1_VLANS] = vlan_objects
Packit Service 0535c1
        info.append(vlans_info)
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _add_neighbor_macphy_info(neighbor, info):
Packit Service 0535c1
    macphy_info = {}
Packit Service 0535c1
    macphy_object = {}
Packit Service 0535c1
    macphy_conf = neighbor.get_attr_value(NM.LLDP_ATTR_IEEE_802_3_MAC_PHY_CONF)
Packit Service 0535c1
    if macphy_conf:
Packit Service 0535c1
        macphy_object[NM_MACPHY_AUTONEG_KEY] = bool(
Packit Service 0535c1
            macphy_conf[NM_MACPHY_AUTONEG_KEY]
Packit Service 0535c1
        )
Packit Service 0535c1
        macphy_object[NM_MACPHY_PMD_AUTONEG_KEY] = macphy_conf[
Packit Service 0535c1
            NM_MACPHY_PMD_AUTONEG_KEY
Packit Service 0535c1
        ]
Packit Service 0535c1
        macphy_object[NM_MACPHY_MAU_TYPE_KEY] = macphy_conf[
Packit Service 0535c1
            NM_MACPHY_MAU_TYPE_KEY
Packit Service 0535c1
        ]
Packit Service 0535c1
Packit Service 0535c1
        macphy_info[LLDP.Neighbors.TLV_TYPE] = ORGANIZATION_SPECIFIC_TLV
Packit Service 0535c1
        macphy_info[LLDP.Neighbors.ORGANIZATION_CODE] = IEEE_802_3
Packit Service 0535c1
        macphy_info[LLDP.Neighbors.TLV_SUBTYPE] = MAC_PHY_SUBTYPE_TLV
Packit Service 0535c1
        macphy_info[NM.LLDP_ATTR_IEEE_802_3_MAC_PHY_CONF] = macphy_object
Packit Service 0535c1
        info.append(macphy_info)
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _add_neighbor_port_vlans_info(neighbor, info):
Packit Service 0535c1
    port_vlan_objects = []
Packit Service 0535c1
    port_vlans_info = {}
Packit Service 0535c1
    port_vlans = neighbor.get_attr_value(NM.LLDP_ATTR_IEEE_802_1_PPVIDS)
Packit Service 0535c1
    if port_vlans:
Packit Service 0535c1
        port_vlans = port_vlans.unpack()
Packit Service 0535c1
        for p_vlan in port_vlans:
Packit Service 0535c1
            port_vlan_objects.append(p_vlan[NM_PPVLAN_ID_KEY])
Packit Service 0535c1
        if port_vlan_objects:
Packit Service 0535c1
            port_vlans_info[
Packit Service 0535c1
                LLDP.Neighbors.TLV_TYPE
Packit Service 0535c1
            ] = ORGANIZATION_SPECIFIC_TLV
Packit Service 0535c1
            port_vlans_info[LLDP.Neighbors.ORGANIZATION_CODE] = IEEE
Packit Service 0535c1
            port_vlans_info[LLDP.Neighbors.TLV_SUBTYPE] = PORT_VLAN_SUBTYPE_TLV
Packit Service 0535c1
            port_vlans_info[NM.LLDP_ATTR_IEEE_802_1_PPVIDS] = port_vlan_objects
Packit Service 0535c1
            info.append(port_vlans_info)
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _add_neighbor_management_addresses(neighbor, info):
Packit Service 0535c1
    addresses_objects = []
Packit Service 0535c1
    addresses_info = {}
Packit Service 0535c1
    mngt_addresses = neighbor.get_attr_value(NM.LLDP_ATTR_MANAGEMENT_ADDRESSES)
Packit Service 0535c1
    if mngt_addresses:
Packit Service 0535c1
        mngt_addresses = mngt_addresses.unpack()
Packit Service 0535c1
        for mngt_address in mngt_addresses:
Packit Service 0535c1
            mngt_address_info = {}
Packit Service 0535c1
            addr, addr_type = _decode_management_address_type(
Packit Service 0535c1
                mngt_address[NM_MANAGEMENT_ADDR_TYPE_KEY],
Packit Service 0535c1
                mngt_address[NM_MANAGEMENT_ADDR_KEY],
Packit Service 0535c1
            )
Packit Service 0535c1
            mngt_address_info[NM_MANAGEMENT_ADDR_KEY] = addr
Packit Service 0535c1
            mngt_address_info[NM_MANAGEMENT_ADDR_TYPE_KEY] = addr_type
Packit Service 0535c1
            mngt_address_info[
Packit Service 0535c1
                NM_MANAGEMENT_ADDR_IFACE_NUMBER_KEY
Packit Service 0535c1
            ] = mngt_address[NM_MANAGEMENT_ADDR_IFACE_NUMBER_KEY]
Packit Service 0535c1
            mngt_address_info[
Packit Service 0535c1
                NM_MANAGEMENT_ADDR_IFACE_NUMBER_TYPE_KEY
Packit Service 0535c1
            ] = mngt_address[NM_MANAGEMENT_ADDR_IFACE_NUMBER_TYPE_KEY]
Packit Service 0535c1
            addresses_objects.append(mngt_address_info)
Packit Service 0535c1
        if addresses_objects:
Packit Service 0535c1
            addresses_info[LLDP.Neighbors.TLV_TYPE] = MANAGEMENT_ADDRESSES_TLV
Packit Service 0535c1
            addresses_info[
Packit Service 0535c1
                NM.LLDP_ATTR_MANAGEMENT_ADDRESSES
Packit Service 0535c1
            ] = addresses_objects
Packit Service 0535c1
            info.append(addresses_info)
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _add_max_frame_size(neighbor, info):
Packit Service 0535c1
    mfs = neighbor.get_attr_value(NM.LLDP_ATTR_IEEE_802_3_MAX_FRAME_SIZE)
Packit Service 0535c1
    if mfs:
Packit Service 0535c1
        mfs_object = {
Packit Service 0535c1
            LLDP.Neighbors.TLV_TYPE: ORGANIZATION_SPECIFIC_TLV,
Packit Service 0535c1
            LLDP.Neighbors.ORGANIZATION_CODE: IEEE_802_3,
Packit Service 0535c1
            LLDP.Neighbors.TLV_SUBTYPE: MFS_SUBTYPE_TLV,
Packit Service 0535c1
            NM.LLDP_ATTR_IEEE_802_3_MAX_FRAME_SIZE: mfs.get_uint32(),
Packit Service 0535c1
        }
Packit Service 0535c1
        info.append(mfs_object)
Packit Service 0535c1
Packit Service 0535c1
Packit Service 0535c1
def _decode_management_address_type(code, address):
Packit Service 0535c1
    if code == NM_MANAGEMENT_ADDR_TYPE_IPV4:
Packit Service 0535c1
        addr = ".".join(map(str, address))
Packit Service 0535c1
        addr_type = "ipv4"
Packit Service 0535c1
    elif code == NM_MANAGEMENT_ADDR_TYPE_MAC:
Packit Service 0535c1
        addr = ":".join(["{:02X}".format(octet) for octet in address])
Packit Service 0535c1
        addr_type = "MAC"
Packit Service 0535c1
    else:
Packit Service 0535c1
        addr = ":".join(["{:04X}".format(octet) for octet in address])
Packit Service 0535c1
        addr_type = "ipv6"
Packit Service 0535c1
Packit Service 0535c1
    return addr, addr_type