]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/systemd/sd-lldp.h
Add SPDX license identifiers to source files under the LGPL
[thirdparty/systemd.git] / src / systemd / sd-lldp.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
04c01369
LP
2#ifndef foosdlldphfoo
3#define foosdlldphfoo
4
ad1ad5c8
SS
5/***
6 This file is part of systemd.
7
8 Copyright (C) 2014 Tom Gundersen
9 Copyright (C) 2014 Susant Sahani
10
11 systemd is free software; you can redistribute it and/or modify it
12 under the terms of the GNU Lesser General Public License as published by
13 the Free Software Foundation; either version 2.1 of the License, or
14 (at your option) any later version.
15
16 systemd is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 Lesser General Public License for more details.
20
21 You should have received a copy of the GNU Lesser General Public License
22 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23***/
24
04c01369 25#include <inttypes.h>
71d35b6b 26#include <net/ethernet.h>
f8489763 27#include <sys/types.h>
07630cea 28
ad1ad5c8 29#include "sd-event.h"
71d35b6b 30
04c01369
LP
31#include "_sd-common.h"
32
33_SD_BEGIN_DECLARATIONS;
ad1ad5c8 34
6afa6767
BG
35/* IEEE 802.3AB Clause 9: TLV Types */
36enum {
60ca5641
LP
37 SD_LLDP_TYPE_END = 0,
38 SD_LLDP_TYPE_CHASSIS_ID = 1,
39 SD_LLDP_TYPE_PORT_ID = 2,
40 SD_LLDP_TYPE_TTL = 3,
41 SD_LLDP_TYPE_PORT_DESCRIPTION = 4,
42 SD_LLDP_TYPE_SYSTEM_NAME = 5,
43 SD_LLDP_TYPE_SYSTEM_DESCRIPTION = 6,
44 SD_LLDP_TYPE_SYSTEM_CAPABILITIES = 7,
45 SD_LLDP_TYPE_MGMT_ADDRESS = 8,
46 SD_LLDP_TYPE_PRIVATE = 127,
6afa6767
BG
47};
48
49/* IEEE 802.3AB Clause 9.5.2: Chassis subtypes */
50enum {
51 SD_LLDP_CHASSIS_SUBTYPE_RESERVED = 0,
52 SD_LLDP_CHASSIS_SUBTYPE_CHASSIS_COMPONENT = 1,
53 SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_ALIAS = 2,
54 SD_LLDP_CHASSIS_SUBTYPE_PORT_COMPONENT = 3,
55 SD_LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS = 4,
56 SD_LLDP_CHASSIS_SUBTYPE_NETWORK_ADDRESS = 5,
57 SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME = 6,
58 SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED = 7,
59};
60
61/* IEEE 802.3AB Clause 9.5.3: Port subtype */
62enum {
60ca5641
LP
63 SD_LLDP_PORT_SUBTYPE_RESERVED = 0,
64 SD_LLDP_PORT_SUBTYPE_INTERFACE_ALIAS = 1,
65 SD_LLDP_PORT_SUBTYPE_PORT_COMPONENT = 2,
66 SD_LLDP_PORT_SUBTYPE_MAC_ADDRESS = 3,
67 SD_LLDP_PORT_SUBTYPE_NETWORK_ADDRESS = 4,
68 SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME = 5,
69 SD_LLDP_PORT_SUBTYPE_AGENT_CIRCUIT_ID = 6,
70 SD_LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED = 7,
6afa6767
BG
71};
72
73enum {
60ca5641
LP
74 SD_LLDP_SYSTEM_CAPABILITIES_OTHER = 1 << 0,
75 SD_LLDP_SYSTEM_CAPABILITIES_REPEATER = 1 << 1,
76 SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE = 1 << 2,
77 SD_LLDP_SYSTEM_CAPABILITIES_WLAN_AP = 1 << 3,
78 SD_LLDP_SYSTEM_CAPABILITIES_ROUTER = 1 << 4,
79 SD_LLDP_SYSTEM_CAPABILITIES_PHONE = 1 << 5,
80 SD_LLDP_SYSTEM_CAPABILITIES_DOCSIS = 1 << 6,
81 SD_LLDP_SYSTEM_CAPABILITIES_STATION = 1 << 7,
82 SD_LLDP_SYSTEM_CAPABILITIES_CVLAN = 1 << 8,
83 SD_LLDP_SYSTEM_CAPABILITIES_SVLAN = 1 << 9,
84 SD_LLDP_SYSTEM_CAPABILITIES_TPMR = 1 << 10,
6afa6767
BG
85};
86
87#define SD_LLDP_SYSTEM_CAPABILITIES_ALL ((uint16_t) -1)
88
89#define SD_LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS \
90 ((uint16_t) \
91 (SD_LLDP_SYSTEM_CAPABILITIES_REPEATER| \
92 SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE| \
93 SD_LLDP_SYSTEM_CAPABILITIES_WLAN_AP| \
94 SD_LLDP_SYSTEM_CAPABILITIES_ROUTER| \
95 SD_LLDP_SYSTEM_CAPABILITIES_DOCSIS| \
96 SD_LLDP_SYSTEM_CAPABILITIES_CVLAN| \
97 SD_LLDP_SYSTEM_CAPABILITIES_SVLAN| \
98 SD_LLDP_SYSTEM_CAPABILITIES_TPMR))
99
6afa6767
BG
100#define SD_LLDP_OUI_802_1 (uint8_t[]) { 0x00, 0x80, 0xc2 }
101#define SD_LLDP_OUI_802_3 (uint8_t[]) { 0x00, 0x12, 0x0f }
102
103enum {
60ca5641
LP
104 SD_LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID = 1,
105 SD_LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID = 2,
106 SD_LLDP_OUI_802_1_SUBTYPE_VLAN_NAME = 3,
107 SD_LLDP_OUI_802_1_SUBTYPE_PROTOCOL_IDENTITY = 4,
108 SD_LLDP_OUI_802_1_SUBTYPE_VID_USAGE_DIGEST = 5,
109 SD_LLDP_OUI_802_1_SUBTYPE_MANAGEMENT_VID = 6,
110 SD_LLDP_OUI_802_1_SUBTYPE_LINK_AGGREGATION = 7,
6afa6767
BG
111};
112
fc6a313b
LP
113typedef struct sd_lldp sd_lldp;
114typedef struct sd_lldp_neighbor sd_lldp_neighbor;
115
90dffb22
LP
116typedef enum sd_lldp_event {
117 SD_LLDP_EVENT_ADDED = 'a',
118 SD_LLDP_EVENT_REMOVED = 'r',
119 SD_LLDP_EVENT_UPDATED = 'u',
120 SD_LLDP_EVENT_REFRESHED = 'f',
121} sd_lldp_event;
122
123typedef void (*sd_lldp_callback_t)(sd_lldp *lldp, sd_lldp_event event, sd_lldp_neighbor *n, void *userdata);
49699bac 124
fc6a313b
LP
125int sd_lldp_new(sd_lldp **ret);
126sd_lldp* sd_lldp_ref(sd_lldp *lldp);
4afd3348 127sd_lldp* sd_lldp_unref(sd_lldp *lldp);
ad1ad5c8 128
ad1ad5c8
SS
129int sd_lldp_start(sd_lldp *lldp);
130int sd_lldp_stop(sd_lldp *lldp);
131
032b27f5 132int sd_lldp_attach_event(sd_lldp *lldp, sd_event *event, int64_t priority);
ad1ad5c8 133int sd_lldp_detach_event(sd_lldp *lldp);
3db2ec56 134sd_event *sd_lldp_get_event(sd_lldp *lldp);
ad1ad5c8 135
ccf86354 136int sd_lldp_set_callback(sd_lldp *lldp, sd_lldp_callback_t cb, void *userdata);
fc6a313b 137int sd_lldp_set_ifindex(sd_lldp *lldp, int ifindex);
4fc6de5d 138
34437b4f
LP
139/* Controls how much and what to store in the neighbors database */
140int sd_lldp_set_neighbors_max(sd_lldp *lldp, uint64_t n);
141int sd_lldp_match_capabilities(sd_lldp *lldp, uint16_t mask);
b553a6b1 142int sd_lldp_set_filter_address(sd_lldp *lldp, const struct ether_addr *address);
34437b4f
LP
143
144int sd_lldp_get_neighbors(sd_lldp *lldp, sd_lldp_neighbor ***neighbors);
145
146int sd_lldp_neighbor_from_raw(sd_lldp_neighbor **ret, const void *raw, size_t raw_size);
147sd_lldp_neighbor *sd_lldp_neighbor_ref(sd_lldp_neighbor *n);
148sd_lldp_neighbor *sd_lldp_neighbor_unref(sd_lldp_neighbor *n);
149
150/* Access to LLDP frame metadata */
151int sd_lldp_neighbor_get_source_address(sd_lldp_neighbor *n, struct ether_addr* address);
152int sd_lldp_neighbor_get_destination_address(sd_lldp_neighbor *n, struct ether_addr* address);
16fed825 153int sd_lldp_neighbor_get_timestamp(sd_lldp_neighbor *n, clockid_t clock, uint64_t *ret);
34437b4f
LP
154int sd_lldp_neighbor_get_raw(sd_lldp_neighbor *n, const void **ret, size_t *size);
155
156/* High-level, direct, parsed out field access. These fields exist at most once, hence may be queried directly. */
157int sd_lldp_neighbor_get_chassis_id(sd_lldp_neighbor *n, uint8_t *type, const void **ret, size_t *size);
158int sd_lldp_neighbor_get_chassis_id_as_string(sd_lldp_neighbor *n, const char **ret);
159int sd_lldp_neighbor_get_port_id(sd_lldp_neighbor *n, uint8_t *type, const void **ret, size_t *size);
160int sd_lldp_neighbor_get_port_id_as_string(sd_lldp_neighbor *n, const char **ret);
8a19206d 161int sd_lldp_neighbor_get_ttl(sd_lldp_neighbor *n, uint16_t *ret_sec);
34437b4f
LP
162int sd_lldp_neighbor_get_system_name(sd_lldp_neighbor *n, const char **ret);
163int sd_lldp_neighbor_get_system_description(sd_lldp_neighbor *n, const char **ret);
164int sd_lldp_neighbor_get_port_description(sd_lldp_neighbor *n, const char **ret);
165int sd_lldp_neighbor_get_system_capabilities(sd_lldp_neighbor *n, uint16_t *ret);
166int sd_lldp_neighbor_get_enabled_capabilities(sd_lldp_neighbor *n, uint16_t *ret);
167
168/* Low-level, iterative TLV access. This is for evertyhing else, it iteratively goes through all available TLVs
169 * (including the ones covered with the calls above), and allows multiple TLVs for the same fields. */
170int sd_lldp_neighbor_tlv_rewind(sd_lldp_neighbor *n);
171int sd_lldp_neighbor_tlv_next(sd_lldp_neighbor *n);
172int sd_lldp_neighbor_tlv_get_type(sd_lldp_neighbor *n, uint8_t *type);
173int sd_lldp_neighbor_tlv_is_type(sd_lldp_neighbor *n, uint8_t type);
174int sd_lldp_neighbor_tlv_get_oui(sd_lldp_neighbor *n, uint8_t oui[3], uint8_t *subtype);
175int sd_lldp_neighbor_tlv_is_oui(sd_lldp_neighbor *n, const uint8_t oui[3], uint8_t subtype);
176int sd_lldp_neighbor_tlv_get_raw(sd_lldp_neighbor *n, const void **ret, size_t *size);
04c01369 177
4afd3348 178_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_lldp, sd_lldp_unref);
34437b4f 179_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_lldp_neighbor, sd_lldp_neighbor_unref);
4afd3348 180
04c01369
LP
181_SD_END_DECLARATIONS;
182
183#endif