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