|
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
|