mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
Merge pull request #2898 from bengal/lldp-api
lldp: move public macros to sd-lldp.h and namespace them
This commit is contained in:
commit
ab19c9e457
@ -3423,7 +3423,6 @@ libsystemd_network_la_SOURCES = \
|
||||
src/libsystemd-network/sd-dhcp6-lease.c \
|
||||
src/libsystemd-network/dhcp-identifier.h \
|
||||
src/libsystemd-network/dhcp-identifier.c \
|
||||
src/libsystemd-network/lldp.h \
|
||||
src/libsystemd-network/lldp-internal.h \
|
||||
src/libsystemd-network/lldp-network.h \
|
||||
src/libsystemd-network/lldp-network.c \
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include "in-addr-util.h"
|
||||
#include "lldp-internal.h"
|
||||
#include "lldp-neighbor.h"
|
||||
#include "lldp.h"
|
||||
#include "unaligned.h"
|
||||
|
||||
static void lldp_neighbor_id_hash_func(const void *p, struct siphash *state) {
|
||||
@ -245,7 +244,7 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
|
||||
|
||||
switch (type) {
|
||||
|
||||
case LLDP_TYPE_END:
|
||||
case SD_LLDP_TYPE_END:
|
||||
if (length != 0) {
|
||||
log_lldp("End marker TLV not zero-sized, ignoring datagram.");
|
||||
return -EBADMSG;
|
||||
@ -257,7 +256,7 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
|
||||
|
||||
goto end_marker;
|
||||
|
||||
case LLDP_TYPE_CHASSIS_ID:
|
||||
case SD_LLDP_TYPE_CHASSIS_ID:
|
||||
if (length < 2 || length > 256) { /* includes the chassis subtype, hence one extra byte */
|
||||
log_lldp("Chassis ID field size out of range, ignoring datagram.");
|
||||
return -EBADMSG;
|
||||
@ -274,7 +273,7 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
|
||||
n->id.chassis_id_size = length;
|
||||
break;
|
||||
|
||||
case LLDP_TYPE_PORT_ID:
|
||||
case SD_LLDP_TYPE_PORT_ID:
|
||||
if (length < 2 || length > 256) { /* includes the port subtype, hence one extra byte */
|
||||
log_lldp("Port ID field size out of range, ignoring datagram.");
|
||||
return -EBADMSG;
|
||||
@ -291,7 +290,7 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
|
||||
n->id.port_id_size = length;
|
||||
break;
|
||||
|
||||
case LLDP_TYPE_TTL:
|
||||
case SD_LLDP_TYPE_TTL:
|
||||
if (length != 2) {
|
||||
log_lldp("TTL field has wrong size, ignoring datagram.");
|
||||
return -EBADMSG;
|
||||
@ -306,25 +305,25 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
|
||||
n->has_ttl = true;
|
||||
break;
|
||||
|
||||
case LLDP_TYPE_PORT_DESCRIPTION:
|
||||
case SD_LLDP_TYPE_PORT_DESCRIPTION:
|
||||
r = parse_string(&n->port_description, p, length);
|
||||
if (r < 0)
|
||||
return r;
|
||||
break;
|
||||
|
||||
case LLDP_TYPE_SYSTEM_NAME:
|
||||
case SD_LLDP_TYPE_SYSTEM_NAME:
|
||||
r = parse_string(&n->system_name, p, length);
|
||||
if (r < 0)
|
||||
return r;
|
||||
break;
|
||||
|
||||
case LLDP_TYPE_SYSTEM_DESCRIPTION:
|
||||
case SD_LLDP_TYPE_SYSTEM_DESCRIPTION:
|
||||
r = parse_string(&n->system_description, p, length);
|
||||
if (r < 0)
|
||||
return r;
|
||||
break;
|
||||
|
||||
case LLDP_TYPE_SYSTEM_CAPABILITIES:
|
||||
case SD_LLDP_TYPE_SYSTEM_CAPABILITIES:
|
||||
if (length != 4)
|
||||
log_lldp("System capabilities field has wrong size, ignoring.");
|
||||
else {
|
||||
@ -335,7 +334,7 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
|
||||
|
||||
break;
|
||||
|
||||
case LLDP_TYPE_PRIVATE:
|
||||
case SD_LLDP_TYPE_PRIVATE:
|
||||
if (length < 4)
|
||||
log_lldp("Found private TLV that is too short, ignoring.");
|
||||
|
||||
@ -479,18 +478,18 @@ _public_ int sd_lldp_neighbor_get_chassis_id_as_string(sd_lldp_neighbor *n, cons
|
||||
|
||||
switch (*(uint8_t*) n->id.chassis_id) {
|
||||
|
||||
case LLDP_CHASSIS_SUBTYPE_CHASSIS_COMPONENT:
|
||||
case LLDP_CHASSIS_SUBTYPE_INTERFACE_ALIAS:
|
||||
case LLDP_CHASSIS_SUBTYPE_PORT_COMPONENT:
|
||||
case LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME:
|
||||
case LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED:
|
||||
case SD_LLDP_CHASSIS_SUBTYPE_CHASSIS_COMPONENT:
|
||||
case SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_ALIAS:
|
||||
case SD_LLDP_CHASSIS_SUBTYPE_PORT_COMPONENT:
|
||||
case SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME:
|
||||
case SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED:
|
||||
k = cescape_length((char*) n->id.chassis_id + 1, n->id.chassis_id_size - 1);
|
||||
if (!k)
|
||||
return -ENOMEM;
|
||||
|
||||
goto done;
|
||||
|
||||
case LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS:
|
||||
case SD_LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS:
|
||||
r = format_mac_address(n->id.chassis_id, n->id.chassis_id_size, &k);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -499,7 +498,7 @@ _public_ int sd_lldp_neighbor_get_chassis_id_as_string(sd_lldp_neighbor *n, cons
|
||||
|
||||
break;
|
||||
|
||||
case LLDP_CHASSIS_SUBTYPE_NETWORK_ADDRESS:
|
||||
case SD_LLDP_CHASSIS_SUBTYPE_NETWORK_ADDRESS:
|
||||
r = format_network_address(n->id.chassis_id, n->id.chassis_id_size, &k);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -550,17 +549,17 @@ _public_ int sd_lldp_neighbor_get_port_id_as_string(sd_lldp_neighbor *n, const c
|
||||
|
||||
switch (*(uint8_t*) n->id.port_id) {
|
||||
|
||||
case LLDP_PORT_SUBTYPE_INTERFACE_ALIAS:
|
||||
case LLDP_PORT_SUBTYPE_PORT_COMPONENT:
|
||||
case LLDP_PORT_SUBTYPE_INTERFACE_NAME:
|
||||
case LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED:
|
||||
case SD_LLDP_PORT_SUBTYPE_INTERFACE_ALIAS:
|
||||
case SD_LLDP_PORT_SUBTYPE_PORT_COMPONENT:
|
||||
case SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME:
|
||||
case SD_LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED:
|
||||
k = cescape_length((char*) n->id.port_id + 1, n->id.port_id_size - 1);
|
||||
if (!k)
|
||||
return -ENOMEM;
|
||||
|
||||
goto done;
|
||||
|
||||
case LLDP_PORT_SUBTYPE_MAC_ADDRESS:
|
||||
case SD_LLDP_PORT_SUBTYPE_MAC_ADDRESS:
|
||||
r = format_mac_address(n->id.port_id, n->id.port_id_size, &k);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -569,7 +568,7 @@ _public_ int sd_lldp_neighbor_get_port_id_as_string(sd_lldp_neighbor *n, const c
|
||||
|
||||
break;
|
||||
|
||||
case LLDP_PORT_SUBTYPE_NETWORK_ADDRESS:
|
||||
case SD_LLDP_PORT_SUBTYPE_NETWORK_ADDRESS:
|
||||
r = format_network_address(n->id.port_id, n->id.port_id_size, &k);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -738,7 +737,7 @@ _public_ int sd_lldp_neighbor_tlv_get_oui(sd_lldp_neighbor *n, uint8_t oui[3], u
|
||||
assert_return(oui, -EINVAL);
|
||||
assert_return(subtype, -EINVAL);
|
||||
|
||||
r = sd_lldp_neighbor_tlv_is_type(n, LLDP_TYPE_PRIVATE);
|
||||
r = sd_lldp_neighbor_tlv_is_type(n, SD_LLDP_TYPE_PRIVATE);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0)
|
||||
|
@ -1,102 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
/***
|
||||
This file is part of systemd.
|
||||
|
||||
Copyright (C) 2014 Tom Gundersen
|
||||
Copyright (C) 2014 Susant Sahani
|
||||
|
||||
systemd is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
systemd is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#define LLDP_MULTICAST_ADDR { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e }
|
||||
|
||||
/* IEEE 802.3AB Clause 9: TLV Types */
|
||||
enum {
|
||||
LLDP_TYPE_END = 0,
|
||||
LLDP_TYPE_CHASSIS_ID = 1,
|
||||
LLDP_TYPE_PORT_ID = 2,
|
||||
LLDP_TYPE_TTL = 3,
|
||||
LLDP_TYPE_PORT_DESCRIPTION = 4,
|
||||
LLDP_TYPE_SYSTEM_NAME = 5,
|
||||
LLDP_TYPE_SYSTEM_DESCRIPTION = 6,
|
||||
LLDP_TYPE_SYSTEM_CAPABILITIES = 7,
|
||||
LLDP_TYPE_MGMT_ADDRESS = 8,
|
||||
LLDP_TYPE_PRIVATE = 127,
|
||||
};
|
||||
|
||||
/* IEEE 802.3AB Clause 9.5.2: Chassis subtypes */
|
||||
enum {
|
||||
LLDP_CHASSIS_SUBTYPE_RESERVED = 0,
|
||||
LLDP_CHASSIS_SUBTYPE_CHASSIS_COMPONENT = 1,
|
||||
LLDP_CHASSIS_SUBTYPE_INTERFACE_ALIAS = 2,
|
||||
LLDP_CHASSIS_SUBTYPE_PORT_COMPONENT = 3,
|
||||
LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS = 4,
|
||||
LLDP_CHASSIS_SUBTYPE_NETWORK_ADDRESS = 5,
|
||||
LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME = 6,
|
||||
LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED = 7,
|
||||
};
|
||||
|
||||
/* IEEE 802.3AB Clause 9.5.3: Port subtype */
|
||||
enum {
|
||||
LLDP_PORT_SUBTYPE_RESERVED = 0,
|
||||
LLDP_PORT_SUBTYPE_INTERFACE_ALIAS = 1,
|
||||
LLDP_PORT_SUBTYPE_PORT_COMPONENT = 2,
|
||||
LLDP_PORT_SUBTYPE_MAC_ADDRESS = 3,
|
||||
LLDP_PORT_SUBTYPE_NETWORK_ADDRESS = 4,
|
||||
LLDP_PORT_SUBTYPE_INTERFACE_NAME = 5,
|
||||
LLDP_PORT_SUBTYPE_AGENT_CIRCUIT_ID = 6,
|
||||
LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED = 7,
|
||||
};
|
||||
|
||||
enum {
|
||||
LLDP_SYSTEM_CAPABILITIES_OTHER = 1 << 0,
|
||||
LLDP_SYSTEM_CAPABILITIES_REPEATER = 1 << 1,
|
||||
LLDP_SYSTEM_CAPABILITIES_BRIDGE = 1 << 2,
|
||||
LLDP_SYSTEM_CAPABILITIES_WLAN_AP = 1 << 3,
|
||||
LLDP_SYSTEM_CAPABILITIES_ROUTER = 1 << 4,
|
||||
LLDP_SYSTEM_CAPABILITIES_PHONE = 1 << 5,
|
||||
LLDP_SYSTEM_CAPABILITIES_DOCSIS = 1 << 6,
|
||||
LLDP_SYSTEM_CAPABILITIES_STATION = 1 << 7,
|
||||
LLDP_SYSTEM_CAPABILITIES_CVLAN = 1 << 8,
|
||||
LLDP_SYSTEM_CAPABILITIES_SVLAN = 1 << 9,
|
||||
LLDP_SYSTEM_CAPABILITIES_TPMR = 1 << 10,
|
||||
};
|
||||
|
||||
#define _LLDP_SYSTEM_CAPABILITIES_ALL ((uint16_t) -1)
|
||||
|
||||
#define _LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS \
|
||||
((uint16_t) \
|
||||
(LLDP_SYSTEM_CAPABILITIES_REPEATER| \
|
||||
LLDP_SYSTEM_CAPABILITIES_BRIDGE| \
|
||||
LLDP_SYSTEM_CAPABILITIES_WLAN_AP| \
|
||||
LLDP_SYSTEM_CAPABILITIES_ROUTER| \
|
||||
LLDP_SYSTEM_CAPABILITIES_DOCSIS| \
|
||||
LLDP_SYSTEM_CAPABILITIES_CVLAN| \
|
||||
LLDP_SYSTEM_CAPABILITIES_SVLAN| \
|
||||
LLDP_SYSTEM_CAPABILITIES_TPMR))
|
||||
|
||||
|
||||
#define LLDP_OUI_802_1 (uint8_t[]) { 0x00, 0x80, 0xc2 }
|
||||
#define LLDP_OUI_802_3 (uint8_t[]) { 0x00, 0x12, 0x0f }
|
||||
|
||||
enum {
|
||||
LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID = 1,
|
||||
LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID = 2,
|
||||
LLDP_OUI_802_1_SUBTYPE_VLAN_NAME = 3,
|
||||
LLDP_OUI_802_1_SUBTYPE_PROTOCOL_IDENTITY = 4,
|
||||
LLDP_OUI_802_1_SUBTYPE_VID_USAGE_DIGEST = 5,
|
||||
LLDP_OUI_802_1_SUBTYPE_MANAGEMENT_VID = 6,
|
||||
LLDP_OUI_802_1_SUBTYPE_LINK_AGGREGATION = 7,
|
||||
};
|
@ -30,7 +30,6 @@
|
||||
#include "alloc-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "lldp-network.h"
|
||||
#include "lldp.h"
|
||||
#include "macro.h"
|
||||
#include "string-util.h"
|
||||
|
||||
@ -127,12 +126,12 @@ static void test_receive_basic_packet(sd_event *e) {
|
||||
assert_se(sd_lldp_get_neighbors(lldp, &neighbors) == 1);
|
||||
|
||||
assert_se(sd_lldp_neighbor_get_chassis_id(neighbors[0], &type, &data, &length) == 0);
|
||||
assert_se(type == LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS);
|
||||
assert_se(type == SD_LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS);
|
||||
assert_se(length == ETH_ALEN);
|
||||
assert_se(!memcmp(data, "\x00\x01\x02\x03\x04\x05", ETH_ALEN));
|
||||
|
||||
assert_se(sd_lldp_neighbor_get_port_id(neighbors[0], &type, &data, &length) == 0);
|
||||
assert_se(type == LLDP_PORT_SUBTYPE_INTERFACE_NAME);
|
||||
assert_se(type == SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME);
|
||||
assert_se(length == 3);
|
||||
assert_se(strneq((char *) data, "1/3", 3));
|
||||
|
||||
@ -218,23 +217,23 @@ static void test_receive_oui_packet(sd_event *e) {
|
||||
assert_se(sd_lldp_get_neighbors(lldp, &neighbors) == 1);
|
||||
|
||||
assert_se(sd_lldp_neighbor_tlv_rewind(neighbors[0]) >= 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_type(neighbors[0], LLDP_TYPE_CHASSIS_ID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_type(neighbors[0], SD_LLDP_TYPE_CHASSIS_ID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_type(neighbors[0], LLDP_TYPE_PORT_ID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_type(neighbors[0], SD_LLDP_TYPE_PORT_ID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_type(neighbors[0], LLDP_TYPE_TTL) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_type(neighbors[0], SD_LLDP_TYPE_TTL) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], LLDP_OUI_802_1, LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], SD_LLDP_OUI_802_1, SD_LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], LLDP_OUI_802_1, LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], SD_LLDP_OUI_802_1, SD_LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], LLDP_OUI_802_1, LLDP_OUI_802_1_SUBTYPE_VLAN_NAME) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], SD_LLDP_OUI_802_1, SD_LLDP_OUI_802_1_SUBTYPE_VLAN_NAME) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], LLDP_OUI_802_1, LLDP_OUI_802_1_SUBTYPE_MANAGEMENT_VID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], SD_LLDP_OUI_802_1, SD_LLDP_OUI_802_1_SUBTYPE_MANAGEMENT_VID) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], LLDP_OUI_802_1, LLDP_OUI_802_1_SUBTYPE_LINK_AGGREGATION) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_oui(neighbors[0], SD_LLDP_OUI_802_1, SD_LLDP_OUI_802_1_SUBTYPE_LINK_AGGREGATION) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_type(neighbors[0], LLDP_TYPE_END) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_is_type(neighbors[0], SD_LLDP_TYPE_END) > 0);
|
||||
assert_se(sd_lldp_neighbor_tlv_next(neighbors[0]) == 0);
|
||||
|
||||
sd_lldp_neighbor_unref(neighbors[0]);
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include "ether-addr-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "hwdb-util.h"
|
||||
#include "lldp.h"
|
||||
#include "local-addresses.h"
|
||||
#include "locale-util.h"
|
||||
#include "netlink-util.h"
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include "dhcp-lease-internal.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "lldp.h"
|
||||
#include "netlink-util.h"
|
||||
#include "network-internal.h"
|
||||
#include "networkd-link.h"
|
||||
@ -2234,8 +2233,8 @@ static int link_configure(Link *link) {
|
||||
|
||||
r = sd_lldp_match_capabilities(link->lldp,
|
||||
link->network->lldp_mode == LLDP_MODE_ROUTERS_ONLY ?
|
||||
_LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS :
|
||||
_LLDP_SYSTEM_CAPABILITIES_ALL);
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS :
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_ALL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "hostname-util.h"
|
||||
#include "lldp.h"
|
||||
#include "networkd-lldp-tx.h"
|
||||
#include "random-util.h"
|
||||
#include "socket-util.h"
|
||||
@ -128,51 +127,51 @@ static int lldp_make_packet(
|
||||
|
||||
h = (struct ether_header*) packet;
|
||||
h->ether_type = htobe16(ETHERTYPE_LLDP);
|
||||
memcpy(h->ether_dhost, &(struct ether_addr) { LLDP_MULTICAST_ADDR }, ETH_ALEN);
|
||||
memcpy(h->ether_dhost, &(struct ether_addr) { SD_LLDP_MULTICAST_ADDR }, ETH_ALEN);
|
||||
memcpy(h->ether_shost, hwaddr, ETH_ALEN);
|
||||
|
||||
p = (uint8_t*) packet + sizeof(struct ether_header);
|
||||
|
||||
r = lldp_write_tlv_header(&p, LLDP_TYPE_CHASSIS_ID, 1 + machine_id_length);
|
||||
r = lldp_write_tlv_header(&p, SD_LLDP_TYPE_CHASSIS_ID, 1 + machine_id_length);
|
||||
if (r < 0)
|
||||
return r;
|
||||
*(p++) = LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED;
|
||||
*(p++) = SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED;
|
||||
p = mempcpy(p, machine_id, machine_id_length);
|
||||
|
||||
r = lldp_write_tlv_header(&p, LLDP_TYPE_PORT_ID, 1 + ifname_length);
|
||||
r = lldp_write_tlv_header(&p, SD_LLDP_TYPE_PORT_ID, 1 + ifname_length);
|
||||
if (r < 0)
|
||||
return r;
|
||||
*(p++) = LLDP_PORT_SUBTYPE_INTERFACE_NAME;
|
||||
*(p++) = SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME;
|
||||
p = mempcpy(p, ifname, ifname_length);
|
||||
|
||||
r = lldp_write_tlv_header(&p, LLDP_TYPE_TTL, 2);
|
||||
r = lldp_write_tlv_header(&p, SD_LLDP_TYPE_TTL, 2);
|
||||
if (r < 0)
|
||||
return r;
|
||||
unaligned_write_be16(p, ttl);
|
||||
p += 2;
|
||||
|
||||
if (port_description) {
|
||||
r = lldp_write_tlv_header(&p, LLDP_TYPE_PORT_DESCRIPTION, port_description_length);
|
||||
r = lldp_write_tlv_header(&p, SD_LLDP_TYPE_PORT_DESCRIPTION, port_description_length);
|
||||
if (r < 0)
|
||||
return r;
|
||||
p = mempcpy(p, port_description, port_description_length);
|
||||
}
|
||||
|
||||
if (hostname) {
|
||||
r = lldp_write_tlv_header(&p, LLDP_TYPE_SYSTEM_NAME, hostname_length);
|
||||
r = lldp_write_tlv_header(&p, SD_LLDP_TYPE_SYSTEM_NAME, hostname_length);
|
||||
if (r < 0)
|
||||
return r;
|
||||
p = mempcpy(p, hostname, hostname_length);
|
||||
}
|
||||
|
||||
if (pretty_hostname) {
|
||||
r = lldp_write_tlv_header(&p, LLDP_TYPE_SYSTEM_DESCRIPTION, pretty_hostname_length);
|
||||
r = lldp_write_tlv_header(&p, SD_LLDP_TYPE_SYSTEM_DESCRIPTION, pretty_hostname_length);
|
||||
if (r < 0)
|
||||
return r;
|
||||
p = mempcpy(p, pretty_hostname, pretty_hostname_length);
|
||||
}
|
||||
|
||||
r = lldp_write_tlv_header(&p, LLDP_TYPE_SYSTEM_CAPABILITIES, 4);
|
||||
r = lldp_write_tlv_header(&p, SD_LLDP_TYPE_SYSTEM_CAPABILITIES, 4);
|
||||
if (r < 0)
|
||||
return r;
|
||||
unaligned_write_be16(p, system_capabilities);
|
||||
@ -180,7 +179,7 @@ static int lldp_make_packet(
|
||||
unaligned_write_be16(p, enabled_capabilities);
|
||||
p += 2;
|
||||
|
||||
r = lldp_write_tlv_header(&p, LLDP_TYPE_END, 0);
|
||||
r = lldp_write_tlv_header(&p, SD_LLDP_TYPE_END, 0);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -200,7 +199,7 @@ static int lldp_send_packet(int ifindex, const void *packet, size_t packet_size)
|
||||
.ll.sll_protocol = htobe16(ETHERTYPE_LLDP),
|
||||
.ll.sll_ifindex = ifindex,
|
||||
.ll.sll_halen = ETH_ALEN,
|
||||
.ll.sll_addr = LLDP_MULTICAST_ADDR,
|
||||
.ll.sll_addr = SD_LLDP_MULTICAST_ADDR,
|
||||
};
|
||||
|
||||
_cleanup_close_ int fd = -1;
|
||||
@ -245,8 +244,8 @@ static int link_send_lldp(Link *link) {
|
||||
ttl = (usec_t) UINT16_MAX;
|
||||
|
||||
caps = (link->network && link->network->ip_forward != ADDRESS_FAMILY_NO) ?
|
||||
LLDP_SYSTEM_CAPABILITIES_ROUTER :
|
||||
LLDP_SYSTEM_CAPABILITIES_STATION;
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_ROUTER :
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_STATION;
|
||||
|
||||
r = lldp_make_packet(&link->mac,
|
||||
sd_id128_to_string(machine_id, machine_id_string),
|
||||
@ -255,7 +254,7 @@ static int link_send_lldp(Link *link) {
|
||||
link->network ? link->network->description : NULL,
|
||||
hostname,
|
||||
pretty_hostname,
|
||||
LLDP_SYSTEM_CAPABILITIES_STATION|LLDP_SYSTEM_CAPABILITIES_BRIDGE|LLDP_SYSTEM_CAPABILITIES_ROUTER,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_STATION|SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE|SD_LLDP_SYSTEM_CAPABILITIES_ROUTER,
|
||||
caps,
|
||||
&packet, &packet_size);
|
||||
if (r < 0)
|
||||
|
@ -33,6 +33,87 @@ _SD_BEGIN_DECLARATIONS;
|
||||
typedef struct sd_lldp sd_lldp;
|
||||
typedef struct sd_lldp_neighbor sd_lldp_neighbor;
|
||||
|
||||
#define SD_LLDP_MULTICAST_ADDR { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e }
|
||||
|
||||
/* IEEE 802.3AB Clause 9: TLV Types */
|
||||
enum {
|
||||
SD_LLDP_TYPE_END = 0,
|
||||
SD_LLDP_TYPE_CHASSIS_ID = 1,
|
||||
SD_LLDP_TYPE_PORT_ID = 2,
|
||||
SD_LLDP_TYPE_TTL = 3,
|
||||
SD_LLDP_TYPE_PORT_DESCRIPTION = 4,
|
||||
SD_LLDP_TYPE_SYSTEM_NAME = 5,
|
||||
SD_LLDP_TYPE_SYSTEM_DESCRIPTION = 6,
|
||||
SD_LLDP_TYPE_SYSTEM_CAPABILITIES = 7,
|
||||
SD_LLDP_TYPE_MGMT_ADDRESS = 8,
|
||||
SD_LLDP_TYPE_PRIVATE = 127,
|
||||
};
|
||||
|
||||
/* IEEE 802.3AB Clause 9.5.2: Chassis subtypes */
|
||||
enum {
|
||||
SD_LLDP_CHASSIS_SUBTYPE_RESERVED = 0,
|
||||
SD_LLDP_CHASSIS_SUBTYPE_CHASSIS_COMPONENT = 1,
|
||||
SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_ALIAS = 2,
|
||||
SD_LLDP_CHASSIS_SUBTYPE_PORT_COMPONENT = 3,
|
||||
SD_LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS = 4,
|
||||
SD_LLDP_CHASSIS_SUBTYPE_NETWORK_ADDRESS = 5,
|
||||
SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME = 6,
|
||||
SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED = 7,
|
||||
};
|
||||
|
||||
/* IEEE 802.3AB Clause 9.5.3: Port subtype */
|
||||
enum {
|
||||
SD_LLDP_PORT_SUBTYPE_RESERVED = 0,
|
||||
SD_LLDP_PORT_SUBTYPE_INTERFACE_ALIAS = 1,
|
||||
SD_LLDP_PORT_SUBTYPE_PORT_COMPONENT = 2,
|
||||
SD_LLDP_PORT_SUBTYPE_MAC_ADDRESS = 3,
|
||||
SD_LLDP_PORT_SUBTYPE_NETWORK_ADDRESS = 4,
|
||||
SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME = 5,
|
||||
SD_LLDP_PORT_SUBTYPE_AGENT_CIRCUIT_ID = 6,
|
||||
SD_LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED = 7,
|
||||
};
|
||||
|
||||
enum {
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_OTHER = 1 << 0,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_REPEATER = 1 << 1,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE = 1 << 2,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_WLAN_AP = 1 << 3,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_ROUTER = 1 << 4,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_PHONE = 1 << 5,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_DOCSIS = 1 << 6,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_STATION = 1 << 7,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_CVLAN = 1 << 8,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_SVLAN = 1 << 9,
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_TPMR = 1 << 10,
|
||||
};
|
||||
|
||||
#define SD_LLDP_SYSTEM_CAPABILITIES_ALL ((uint16_t) -1)
|
||||
|
||||
#define SD_LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS \
|
||||
((uint16_t) \
|
||||
(SD_LLDP_SYSTEM_CAPABILITIES_REPEATER| \
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE| \
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_WLAN_AP| \
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_ROUTER| \
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_DOCSIS| \
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_CVLAN| \
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_SVLAN| \
|
||||
SD_LLDP_SYSTEM_CAPABILITIES_TPMR))
|
||||
|
||||
|
||||
#define SD_LLDP_OUI_802_1 (uint8_t[]) { 0x00, 0x80, 0xc2 }
|
||||
#define SD_LLDP_OUI_802_3 (uint8_t[]) { 0x00, 0x12, 0x0f }
|
||||
|
||||
enum {
|
||||
SD_LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID = 1,
|
||||
SD_LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID = 2,
|
||||
SD_LLDP_OUI_802_1_SUBTYPE_VLAN_NAME = 3,
|
||||
SD_LLDP_OUI_802_1_SUBTYPE_PROTOCOL_IDENTITY = 4,
|
||||
SD_LLDP_OUI_802_1_SUBTYPE_VID_USAGE_DIGEST = 5,
|
||||
SD_LLDP_OUI_802_1_SUBTYPE_MANAGEMENT_VID = 6,
|
||||
SD_LLDP_OUI_802_1_SUBTYPE_LINK_AGGREGATION = 7,
|
||||
};
|
||||
|
||||
typedef enum sd_lldp_event {
|
||||
SD_LLDP_EVENT_ADDED = 'a',
|
||||
SD_LLDP_EVENT_REMOVED = 'r',
|
||||
|
Loading…
Reference in New Issue
Block a user