]>
Commit | Line | Data |
---|---|---|
4b292b55 | 1 | /* -*- mode: c; c-file-style: "openbsd" -*- */ |
43c02e7b VB |
2 | /* |
3 | * Copyright (c) 2008 Vincent Bernat <bernat@luffy.cx> | |
4 | * | |
51434125 | 5 | * Permission to use, copy, modify, and/or distribute this software for any |
43c02e7b VB |
6 | * purpose with or without fee is hereby granted, provided that the above |
7 | * copyright notice and this permission notice appear in all copies. | |
8 | * | |
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
16 | */ | |
17 | ||
4b292b55 VB |
18 | #ifndef _LLDPD_STRUCTS_H |
19 | #define _LLDPD_STRUCTS_H | |
43c02e7b VB |
20 | |
21 | #if HAVE_CONFIG_H | |
d38eae28 | 22 | # include <config.h> |
43c02e7b VB |
23 | #endif |
24 | ||
4b292b55 VB |
25 | #include <sys/types.h> |
26 | #include <sys/socket.h> | |
e12c2365 VB |
27 | |
28 | /* This is not very convenient, but we need net/if.h for IFNAMSIZ and others but | |
29 | * we may also need linux/if.h in some modules. And they conflict each others. | |
30 | */ | |
31 | #ifdef HOST_OS_LINUX | |
32 | # include <linux/if.h> | |
43c02e7b | 33 | #else |
e12c2365 | 34 | # include <net/if.h> |
43c02e7b | 35 | #endif |
e12c2365 | 36 | |
43c02e7b | 37 | #include <netinet/in.h> |
21a48c64 | 38 | #include <netinet/if_ether.h> |
4b292b55 | 39 | #include <sys/queue.h> |
43c02e7b | 40 | |
4b292b55 | 41 | #include "compat/compat.h" |
db323555 | 42 | #include "marshal.h" |
4b292b55 | 43 | #include "lldp-const.h" |
43c02e7b | 44 | |
a1347cd8 | 45 | #ifdef ENABLE_DOT1 |
9757bfbc SK |
46 | struct lldpd_ppvid { |
47 | TAILQ_ENTRY(lldpd_ppvid) p_entries; | |
48 | u_int8_t p_cap_status; | |
49 | u_int16_t p_ppvid; | |
50 | }; | |
f6d20631 VB |
51 | MARSHAL_BEGIN(lldpd_ppvid) |
52 | MARSHAL_TQE(lldpd_ppvid, p_entries) | |
985a4cb5 | 53 | MARSHAL_END(lldpd_ppvid); |
9757bfbc | 54 | |
43c02e7b VB |
55 | struct lldpd_vlan { |
56 | TAILQ_ENTRY(lldpd_vlan) v_entries; | |
57 | char *v_name; | |
58 | u_int16_t v_vid; | |
59 | }; | |
f6d20631 VB |
60 | MARSHAL_BEGIN(lldpd_vlan) |
61 | MARSHAL_TQE(lldpd_vlan, v_entries) | |
62 | MARSHAL_STR(lldpd_vlan, v_name) | |
985a4cb5 | 63 | MARSHAL_END(lldpd_vlan); |
9757bfbc SK |
64 | |
65 | struct lldpd_pi { | |
66 | TAILQ_ENTRY(lldpd_pi) p_entries; | |
67 | char *p_pi; | |
48acfcaf | 68 | int p_pi_len; |
9757bfbc | 69 | }; |
f6d20631 VB |
70 | MARSHAL_BEGIN(lldpd_pi) |
71 | MARSHAL_TQE(lldpd_pi, p_entries) | |
72 | MARSHAL_FSTR(lldpd_pi, p_pi, p_pi_len) | |
985a4cb5 | 73 | MARSHAL_END(lldpd_pi); |
a1347cd8 | 74 | #endif |
43c02e7b | 75 | |
e3a44efb | 76 | #ifdef ENABLE_LLDPMED |
e3a44efb | 77 | struct lldpd_med_policy { |
4b292b55 | 78 | u_int8_t index; /* Not used. */ |
e3a44efb VB |
79 | u_int8_t type; |
80 | u_int8_t unknown; | |
81 | u_int8_t tagged; | |
82 | u_int16_t vid; | |
83 | u_int8_t priority; | |
84 | u_int8_t dscp; | |
e3a44efb | 85 | }; |
f6d20631 | 86 | MARSHAL(lldpd_med_policy); |
e3a44efb | 87 | |
e3a44efb | 88 | struct lldpd_med_loc { |
4b292b55 | 89 | u_int8_t index; /* Not used. */ |
e3a44efb VB |
90 | u_int8_t format; |
91 | char *data; | |
92 | int data_len; | |
e3a44efb | 93 | }; |
f6d20631 VB |
94 | MARSHAL_BEGIN(lldpd_med_loc) |
95 | MARSHAL_FSTR(lldpd_med_loc, data, data_len) | |
985a4cb5 | 96 | MARSHAL_END(lldpd_med_loc); |
6d08df0e | 97 | |
6d08df0e VB |
98 | struct lldpd_med_power { |
99 | u_int8_t devicetype; /* PD or PSE */ | |
100 | u_int8_t source; | |
101 | u_int8_t priority; | |
102 | u_int16_t val; | |
103 | }; | |
f6d20631 | 104 | MARSHAL(lldpd_med_power); |
e3a44efb VB |
105 | #endif |
106 | ||
3fd015c0 | 107 | #ifdef ENABLE_DOT3 |
3fd015c0 VB |
108 | struct lldpd_dot3_macphy { |
109 | u_int8_t autoneg_support; | |
110 | u_int8_t autoneg_enabled; | |
111 | u_int16_t autoneg_advertised; | |
112 | u_int16_t mau_type; | |
113 | }; | |
befbdf89 | 114 | |
befbdf89 VB |
115 | struct lldpd_dot3_power { |
116 | u_int8_t devicetype; | |
117 | u_int8_t supported; | |
118 | u_int8_t enabled; | |
119 | u_int8_t paircontrol; | |
120 | u_int8_t pairs; | |
121 | u_int8_t class; | |
608cb51c VB |
122 | u_int8_t powertype; /* If set to LLDP_DOT3_POWER_8023AT_OFF, |
123 | following fields have no meaning */ | |
124 | u_int8_t source; | |
125 | u_int8_t priority; | |
126 | u_int16_t requested; | |
127 | u_int16_t allocated; | |
befbdf89 | 128 | }; |
f6d20631 | 129 | MARSHAL(lldpd_dot3_power); |
3fd015c0 VB |
130 | #endif |
131 | ||
f15d3950 VB |
132 | enum { |
133 | LLDPD_AF_UNSPEC = 0, | |
134 | LLDPD_AF_IPV4, | |
135 | LLDPD_AF_IPV6, | |
136 | LLDPD_AF_LAST | |
137 | }; | |
138 | ||
139 | inline static int | |
140 | lldpd_af(int af) | |
141 | { | |
142 | switch (af) { | |
4b292b55 VB |
143 | case LLDPD_AF_IPV4: return AF_INET; |
144 | case LLDPD_AF_IPV6: return AF_INET6; | |
145 | case LLDPD_AF_LAST: return AF_MAX; | |
146 | default: return AF_UNSPEC; | |
f15d3950 VB |
147 | } |
148 | } | |
149 | ||
e6b36c87 | 150 | #define LLDPD_MGMT_MAXADDRSIZE 16 /* sizeof(struct in6_addr) */ |
b562f01f VB |
151 | union lldpd_address { |
152 | struct in_addr inet; | |
153 | struct in6_addr inet6; | |
154 | u_int8_t octets[LLDPD_MGMT_MAXADDRSIZE]; /* network byte order! */ | |
155 | }; | |
e6b36c87 JV |
156 | struct lldpd_mgmt { |
157 | TAILQ_ENTRY(lldpd_mgmt) m_entries; | |
b562f01f VB |
158 | int m_family; |
159 | union lldpd_address m_addr; | |
e6b36c87 JV |
160 | size_t m_addrsize; |
161 | u_int32_t m_iface; | |
162 | }; | |
163 | MARSHAL_BEGIN(lldpd_mgmt) | |
164 | MARSHAL_TQE(lldpd_mgmt, m_entries) | |
985a4cb5 | 165 | MARSHAL_END(lldpd_mgmt); |
e6b36c87 | 166 | |
43c02e7b | 167 | struct lldpd_chassis { |
75068724 VB |
168 | TAILQ_ENTRY(lldpd_chassis) c_entries; |
169 | u_int16_t c_refcount; /* Reference count by ports */ | |
170 | u_int16_t c_index; /* Monotonic index */ | |
171 | u_int8_t c_protocol; /* Protocol used to get this chassis */ | |
43c02e7b VB |
172 | u_int8_t c_id_subtype; |
173 | char *c_id; | |
174 | int c_id_len; | |
175 | char *c_name; | |
176 | char *c_descr; | |
177 | ||
178 | u_int16_t c_cap_available; | |
179 | u_int16_t c_cap_enabled; | |
180 | ||
e6b36c87 | 181 | TAILQ_HEAD(, lldpd_mgmt) c_mgmt; |
89840df0 VB |
182 | |
183 | #ifdef ENABLE_LLDPMED | |
40ecae87 | 184 | u_int16_t c_med_cap_available; |
89840df0 VB |
185 | u_int8_t c_med_type; |
186 | char *c_med_hw; | |
187 | char *c_med_fw; | |
188 | char *c_med_sw; | |
189 | char *c_med_sn; | |
190 | char *c_med_manuf; | |
191 | char *c_med_model; | |
192 | char *c_med_asset; | |
89840df0 | 193 | #endif |
1531f7f3 VB |
194 | |
195 | }; | |
d938c51f VB |
196 | /* WARNING: any change to this structure should also be reflected into |
197 | `lldpd_copy_chassis()` which is not using marshaling. */ | |
f6d20631 | 198 | MARSHAL_BEGIN(lldpd_chassis) |
74e0080e VB |
199 | MARSHAL_IGNORE(lldpd_chassis, c_entries.tqe_next) |
200 | MARSHAL_IGNORE(lldpd_chassis, c_entries.tqe_prev) | |
f6d20631 VB |
201 | MARSHAL_FSTR(lldpd_chassis, c_id, c_id_len) |
202 | MARSHAL_STR(lldpd_chassis, c_name) | |
203 | MARSHAL_STR(lldpd_chassis, c_descr) | |
e6b36c87 | 204 | MARSHAL_SUBTQ(lldpd_chassis, lldpd_mgmt, c_mgmt) |
f6d20631 VB |
205 | #ifdef ENABLE_LLDPMED |
206 | MARSHAL_STR(lldpd_chassis, c_med_hw) | |
207 | MARSHAL_STR(lldpd_chassis, c_med_fw) | |
208 | MARSHAL_STR(lldpd_chassis, c_med_sw) | |
209 | MARSHAL_STR(lldpd_chassis, c_med_sn) | |
210 | MARSHAL_STR(lldpd_chassis, c_med_manuf) | |
211 | MARSHAL_STR(lldpd_chassis, c_med_model) | |
212 | MARSHAL_STR(lldpd_chassis, c_med_asset) | |
213 | #endif | |
985a4cb5 | 214 | MARSHAL_END(lldpd_chassis); |
f6d20631 | 215 | |
fb1b78bb | 216 | #ifdef ENABLE_CUSTOM |
7c26c8b4 | 217 | |
218 | #define CUSTOM_TLV_ADD 1 | |
219 | #define CUSTOM_TLV_REPLACE 2 | |
220 | #define CUSTOM_TLV_REMOVE 3 | |
221 | ||
cd5de7a2 AA |
222 | /* Custom TLV struct as defined on page 35 of IEEE 802.1AB-2005 */ |
223 | struct lldpd_custom { | |
224 | TAILQ_ENTRY(lldpd_custom) next; /* Pointer to next custom TLV */ | |
225 | ||
226 | /* Organizationally Unique Identifier */ | |
227 | u_int8_t oui[LLDP_TLV_ORG_OUI_LEN]; | |
228 | /* Organizationally Defined Subtype */ | |
229 | u_int8_t subtype; | |
5427983b | 230 | /* Organizationally Defined Information String */ |
8caf4341 | 231 | u_int8_t *oui_info; |
cd5de7a2 AA |
232 | /* Organizationally Defined Information String length */ |
233 | int oui_info_len; | |
234 | }; | |
235 | MARSHAL_BEGIN(lldpd_custom) | |
236 | MARSHAL_TQE(lldpd_custom, next) | |
8caf4341 | 237 | MARSHAL_FSTR(lldpd_custom, oui_info, oui_info_len) |
cd5de7a2 | 238 | MARSHAL_END(lldpd_custom); |
fb1b78bb | 239 | #endif |
43c02e7b VB |
240 | |
241 | struct lldpd_port { | |
75068724 VB |
242 | TAILQ_ENTRY(lldpd_port) p_entries; |
243 | struct lldpd_chassis *p_chassis; /* Attached chassis */ | |
244 | time_t p_lastchange; /* Time of last change of values */ | |
245 | time_t p_lastupdate; /* Time of last update received */ | |
246 | struct lldpd_frame *p_lastframe; /* Frame received during last update */ | |
247 | u_int8_t p_protocol; /* Protocol used to get this port */ | |
579bedd5 VB |
248 | u_int8_t p_hidden_in:1; /* Considered as hidden for reception */ |
249 | u_int8_t p_hidden_out:2; /* Considered as hidden for emission */ | |
e7331ce9 VB |
250 | u_int8_t p_disable_rx:3; /* Should RX be disabled for this port? */ |
251 | u_int8_t p_disable_tx:4; /* Should TX be disabled for this port? */ | |
579bedd5 | 252 | /* Important: all fields that should be ignored to check if a port has |
28414fbd | 253 | * been changed should be before this mark. */ |
aafa99bd | 254 | #define LLDPD_PORT_START_MARKER (offsetof(struct lldpd_port, _p_hardware_flags)) |
196757ce | 255 | int _p_hardware_flags; /* This is a copy of hardware flags. Do not use it! */ |
43c02e7b VB |
256 | u_int8_t p_id_subtype; |
257 | char *p_id; | |
258 | int p_id_len; | |
259 | char *p_descr; | |
e1717397 | 260 | int p_descr_force; /* Description has been forced by user */ |
548109b2 | 261 | u_int16_t p_mfs; |
78346c89 | 262 | u_int16_t p_ttl; /* TTL for remote port */ |
43c02e7b | 263 | |
a1347cd8 | 264 | #ifdef ENABLE_DOT3 |
43c02e7b VB |
265 | /* Dot3 stuff */ |
266 | u_int32_t p_aggregid; | |
3fd015c0 | 267 | struct lldpd_dot3_macphy p_macphy; |
befbdf89 | 268 | struct lldpd_dot3_power p_power; |
a1347cd8 | 269 | #endif |
1531f7f3 | 270 | |
740593ff | 271 | #ifdef ENABLE_LLDPMED |
740593ff | 272 | u_int16_t p_med_cap_enabled; |
4b292b55 VB |
273 | struct lldpd_med_policy p_med_policy[LLDP_MED_APPTYPE_LAST]; |
274 | struct lldpd_med_loc p_med_location[LLDP_MED_LOCFORMAT_LAST]; | |
6d08df0e | 275 | struct lldpd_med_power p_med_power; |
740593ff VB |
276 | #endif |
277 | ||
a1347cd8 | 278 | #ifdef ENABLE_DOT1 |
75b3469d | 279 | u_int16_t p_pvid; |
1531f7f3 | 280 | TAILQ_HEAD(, lldpd_vlan) p_vlans; |
9757bfbc SK |
281 | TAILQ_HEAD(, lldpd_ppvid) p_ppvids; |
282 | TAILQ_HEAD(, lldpd_pi) p_pids; | |
a1347cd8 | 283 | #endif |
fb1b78bb | 284 | #ifdef ENABLE_CUSTOM |
cd5de7a2 | 285 | TAILQ_HEAD(, lldpd_custom) p_custom_list; |
fb1b78bb | 286 | #endif |
1531f7f3 | 287 | }; |
f6d20631 VB |
288 | MARSHAL_BEGIN(lldpd_port) |
289 | MARSHAL_TQE(lldpd_port, p_entries) | |
290 | MARSHAL_POINTER(lldpd_port, lldpd_chassis, p_chassis) | |
291 | MARSHAL_IGNORE(lldpd_port, p_lastframe) | |
292 | MARSHAL_FSTR(lldpd_port, p_id, p_id_len) | |
293 | MARSHAL_STR(lldpd_port, p_descr) | |
294 | #ifdef ENABLE_LLDPMED | |
295 | MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[0]) | |
296 | MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[1]) | |
297 | MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[2]) | |
298 | #endif | |
299 | #ifdef ENABLE_DOT1 | |
300 | MARSHAL_SUBTQ(lldpd_port, lldpd_vlan, p_vlans) | |
301 | MARSHAL_SUBTQ(lldpd_port, lldpd_ppvid, p_ppvids) | |
302 | MARSHAL_SUBTQ(lldpd_port, lldpd_pi, p_pids) | |
303 | #endif | |
fb1b78bb | 304 | #ifdef ENABLE_CUSTOM |
cd5de7a2 | 305 | MARSHAL_SUBTQ(lldpd_port, lldpd_custom, p_custom_list) |
fb1b78bb | 306 | #endif |
985a4cb5 | 307 | MARSHAL_END(lldpd_port); |
1531f7f3 | 308 | |
f6d20631 | 309 | /* Used to modify some port related settings */ |
e7331ce9 VB |
310 | #define LLDPD_RXTX_UNCHANGED 0 |
311 | #define LLDPD_RXTX_TXONLY 1 | |
312 | #define LLDPD_RXTX_RXONLY 2 | |
313 | #define LLDPD_RXTX_DISABLED 3 | |
314 | #define LLDPD_RXTX_BOTH 4 | |
315 | #define LLDPD_RXTX_FROM_PORT(p) (((p)->p_disable_rx && (p)->p_disable_tx)?LLDPD_RXTX_DISABLED: \ | |
316 | ((p)->p_disable_rx && !(p)->p_disable_tx)?LLDPD_RXTX_TXONLY: \ | |
317 | (!(p)->p_disable_rx && (p)->p_disable_tx)?LLDPD_RXTX_RXONLY: \ | |
318 | LLDPD_RXTX_BOTH) | |
319 | #define LLDPD_RXTX_RXENABLED(v) ((v) == LLDPD_RXTX_RXONLY || (v) == LLDPD_RXTX_BOTH) | |
320 | #define LLDPD_RXTX_TXENABLED(v) ((v) == LLDPD_RXTX_TXONLY || (v) == LLDPD_RXTX_BOTH) | |
f6d20631 VB |
321 | struct lldpd_port_set { |
322 | char *ifname; | |
8e46010c | 323 | char *local_id; |
c267d0f2 | 324 | char *local_descr; |
e7331ce9 | 325 | int rxtx; |
f6d20631 VB |
326 | #ifdef ENABLE_LLDPMED |
327 | struct lldpd_med_policy *med_policy; | |
328 | struct lldpd_med_loc *med_location; | |
329 | struct lldpd_med_power *med_power; | |
330 | #endif | |
331 | #ifdef ENABLE_DOT3 | |
332 | struct lldpd_dot3_power *dot3_power; | |
333 | #endif | |
fb1b78bb | 334 | #ifdef ENABLE_CUSTOM |
41cb7781 AA |
335 | struct lldpd_custom *custom; |
336 | int custom_list_clear; | |
7c26c8b4 | 337 | int custom_tlv_op; |
fb1b78bb | 338 | #endif |
f6d20631 VB |
339 | }; |
340 | MARSHAL_BEGIN(lldpd_port_set) | |
341 | MARSHAL_STR(lldpd_port_set, ifname) | |
8e46010c | 342 | MARSHAL_STR(lldpd_port_set, local_id) |
c267d0f2 | 343 | MARSHAL_STR(lldpd_port_set, local_descr) |
f6d20631 VB |
344 | #ifdef ENABLE_LLDPMED |
345 | MARSHAL_POINTER(lldpd_port_set, lldpd_med_policy, med_policy) | |
346 | MARSHAL_POINTER(lldpd_port_set, lldpd_med_loc, med_location) | |
347 | MARSHAL_POINTER(lldpd_port_set, lldpd_med_power, med_power) | |
348 | #endif | |
349 | #ifdef ENABLE_DOT3 | |
350 | MARSHAL_POINTER(lldpd_port_set, lldpd_dot3_power, dot3_power) | |
351 | #endif | |
fb1b78bb | 352 | #ifdef ENABLE_CUSTOM |
41cb7781 | 353 | MARSHAL_POINTER(lldpd_port_set, lldpd_custom, custom) |
fb1b78bb | 354 | #endif |
985a4cb5 | 355 | MARSHAL_END(lldpd_port_set); |
43c02e7b | 356 | |
8ec333bd VB |
357 | /* Smart mode / Hide mode */ |
358 | #define SMART_INCOMING_FILTER (1<<0) /* Incoming filtering enabled */ | |
359 | #define SMART_INCOMING_ONE_PROTO (1<<1) /* On reception, keep only one proto */ | |
360 | #define SMART_INCOMING_ONE_NEIGH (1<<2) /* On reception, keep only one neighbor */ | |
361 | #define SMART_OUTGOING_FILTER (1<<3) /* Outgoing filtering enabled */ | |
362 | #define SMART_OUTGOING_ONE_PROTO (1<<4) /* On emission, keep only one proto */ | |
363 | #define SMART_OUTGOING_ONE_NEIGH (1<<5) /* On emission, consider only one neighbor */ | |
364 | #define SMART_INCOMING (SMART_INCOMING_FILTER | \ | |
365 | SMART_INCOMING_ONE_PROTO | \ | |
366 | SMART_INCOMING_ONE_NEIGH) | |
367 | #define SMART_OUTGOING (SMART_OUTGOING_FILTER | \ | |
368 | SMART_OUTGOING_ONE_PROTO | \ | |
369 | SMART_OUTGOING_ONE_NEIGH) | |
370 | ||
371 | struct lldpd_config { | |
e4ff3ed5 | 372 | int c_paused; /* lldpd is paused */ |
8843f168 | 373 | int c_tx_interval; /* Transmit interval */ |
71b0f981 | 374 | int c_ttl; /* TTL */ |
8ec333bd VB |
375 | int c_smart; /* Bitmask for smart configuration (see SMART_*) */ |
376 | int c_receiveonly; /* Receive only mode */ | |
42589660 | 377 | int c_max_neighbors; /* Maximum number of neighbors (per protocol) */ |
8ec333bd VB |
378 | |
379 | char *c_mgmt_pattern; /* Pattern to match a management address */ | |
380 | char *c_cid_pattern; /* Pattern to match interfaces to use for chassis ID */ | |
5660759b | 381 | char *c_cid_string; /* User defined string for chassis ID */ |
8ec333bd | 382 | char *c_iface_pattern; /* Pattern to match interfaces to use */ |
0a78e14f | 383 | char *c_perm_ifaces; /* Pattern to match interfaces to keep */ |
8ec333bd VB |
384 | |
385 | char *c_platform; /* Override platform description (for CDP) */ | |
386 | char *c_description; /* Override chassis description */ | |
ce347d29 | 387 | char *c_hostname; /* Override system name */ |
8ec333bd | 388 | int c_advertise_version; /* Should the precise version be advertised? */ |
bb37268d | 389 | int c_set_ifdescr; /* Set interface description */ |
f84199dd | 390 | int c_promisc; /* Interfaces should be in promiscuous mode */ |
ca838758 | 391 | int c_cap_advertise; /* Chassis capabilities advertisement */ |
1c2217aa | 392 | int c_mgmt_advertise; /* Management addresses advertisement */ |
8ec333bd VB |
393 | |
394 | #ifdef ENABLE_LLDPMED | |
395 | int c_noinventory; /* Don't send inventory with LLDP-MED */ | |
b9de0ca6 | 396 | int c_enable_fast_start; /* enable fast start */ |
397 | int c_tx_fast_init; /* Num of lldpd lldppdu's for fast start */ | |
398 | int c_tx_fast_interval; /* Time intr between sends during fast start */ | |
be511d00 | 399 | #endif |
c10302a3 | 400 | int c_tx_hold; /* Transmit hold */ |
dfbd7185 RP |
401 | int c_bond_slave_src_mac_type; /* Src mac type in lldp frames over bond |
402 | slaves */ | |
8fbd3195 | 403 | int c_lldp_portid_type; /* The PortID type */ |
1eadc9a1 | 404 | int c_lldp_agent_type; /* The agent type */ |
8ec333bd VB |
405 | }; |
406 | MARSHAL_BEGIN(lldpd_config) | |
407 | MARSHAL_STR(lldpd_config, c_mgmt_pattern) | |
408 | MARSHAL_STR(lldpd_config, c_cid_pattern) | |
5660759b | 409 | MARSHAL_STR(lldpd_config, c_cid_string) |
8ec333bd | 410 | MARSHAL_STR(lldpd_config, c_iface_pattern) |
0a78e14f | 411 | MARSHAL_STR(lldpd_config, c_perm_ifaces) |
ce347d29 | 412 | MARSHAL_STR(lldpd_config, c_hostname) |
8ec333bd VB |
413 | MARSHAL_STR(lldpd_config, c_platform) |
414 | MARSHAL_STR(lldpd_config, c_description) | |
985a4cb5 | 415 | MARSHAL_END(lldpd_config); |
8ec333bd | 416 | |
43c02e7b VB |
417 | struct lldpd_frame { |
418 | int size; | |
b5c7ce8d | 419 | unsigned char frame[1]; |
43c02e7b VB |
420 | }; |
421 | ||
6e75df87 VB |
422 | struct lldpd_hardware; |
423 | struct lldpd; | |
424 | struct lldpd_ops { | |
425 | int(*send)(struct lldpd *, | |
426 | struct lldpd_hardware*, | |
427 | char *, size_t); /* Function to send a frame */ | |
428 | int(*recv)(struct lldpd *, | |
429 | struct lldpd_hardware*, | |
430 | int, char *, size_t); /* Function to receive a frame */ | |
431 | int(*cleanup)(struct lldpd *, struct lldpd_hardware *); /* Cleanup function. */ | |
432 | }; | |
433 | ||
44002d66 VB |
434 | /* An interface is uniquely identified by h_ifindex, h_ifname and h_ops. This |
435 | * means if an interface becomes enslaved, it will be considered as a new | |
436 | * interface. The same applies for renaming and we include the index in case of | |
437 | * renaming to an existing interface. */ | |
43c02e7b VB |
438 | struct lldpd_hardware { |
439 | TAILQ_ENTRY(lldpd_hardware) h_entries; | |
440 | ||
d6e889b6 VB |
441 | struct lldpd *h_cfg; /* Pointer to main configuration */ |
442 | void *h_recv; /* FD for reception */ | |
6e75df87 | 443 | int h_sendfd; /* FD for sending, only used by h_ops */ |
5347914e | 444 | int h_mangle; /* 1 if we have to mangle the MAC address */ |
6e75df87 VB |
445 | struct lldpd_ops *h_ops; /* Hardware-dependent functions */ |
446 | void *h_data; /* Hardware-dependent data */ | |
579bedd5 | 447 | void *h_timer; /* Timer for this port */ |
43c02e7b | 448 | |
43c02e7b | 449 | int h_mtu; |
6e75df87 VB |
450 | int h_flags; /* Packets will be sent only |
451 | if IFF_RUNNING. Will be | |
452 | removed if this is left | |
453 | to 0. */ | |
454 | int h_ifindex; /* Interface index, used by SNMP */ | |
455 | char h_ifname[IFNAMSIZ]; /* Should be unique */ | |
43c02e7b VB |
456 | u_int8_t h_lladdr[ETHER_ADDR_LEN]; |
457 | ||
458 | u_int64_t h_tx_cnt; | |
459 | u_int64_t h_rx_cnt; | |
460 | u_int64_t h_rx_discarded_cnt; | |
37387046 | 461 | u_int64_t h_rx_unrecognized_cnt; |
14052b61 VB |
462 | u_int64_t h_ageout_cnt; |
463 | u_int64_t h_insert_cnt; | |
464 | u_int64_t h_delete_cnt; | |
42589660 | 465 | u_int64_t h_drop_cnt; |
43c02e7b | 466 | |
acb5f65b VB |
467 | /* Previous values of different stuff. */ |
468 | /* Backup of the previous local port. Used to check if there was a | |
469 | * change to send an immediate update. All those are not marshalled to | |
470 | * the client. */ | |
471 | void *h_lport_previous; | |
17d34115 | 472 | ssize_t h_lport_previous_len; |
acb5f65b VB |
473 | /* Backup of the previous chassis ID. Used to check if there was a |
474 | * change and send an LLDP shutdown. */ | |
475 | u_int8_t h_lchassis_previous_id_subtype; | |
476 | char *h_lchassis_previous_id; | |
477 | int h_lchassis_previous_id_len; | |
478 | /* Backup of the previous port ID. Used to check if there was a change | |
479 | * and send an LLDP shutdown. */ | |
480 | u_int8_t h_lport_previous_id_subtype; | |
481 | char *h_lport_previous_id; | |
482 | int h_lport_previous_id_len; | |
483 | ||
75068724 VB |
484 | struct lldpd_port h_lport; /* Port attached to this hardware port */ |
485 | TAILQ_HEAD(, lldpd_port) h_rports; /* Remote ports */ | |
b9de0ca6 | 486 | |
be511d00 | 487 | #ifdef ENABLE_LLDPMED |
b9de0ca6 | 488 | int h_tx_fast; /* current tx fast start count */ |
be511d00 | 489 | #endif |
43c02e7b | 490 | }; |
f6d20631 VB |
491 | MARSHAL_BEGIN(lldpd_hardware) |
492 | MARSHAL_IGNORE(lldpd_hardware, h_entries.tqe_next) | |
493 | MARSHAL_IGNORE(lldpd_hardware, h_entries.tqe_prev) | |
494 | MARSHAL_IGNORE(lldpd_hardware, h_ops) | |
495 | MARSHAL_IGNORE(lldpd_hardware, h_data) | |
d6e889b6 | 496 | MARSHAL_IGNORE(lldpd_hardware, h_cfg) |
b1785ed5 VB |
497 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous) |
498 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_len) | |
acb5f65b VB |
499 | MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id_subtype) |
500 | MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id) | |
501 | MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id_len) | |
502 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id_subtype) | |
503 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id) | |
504 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id_len) | |
f6d20631 VB |
505 | MARSHAL_SUBSTRUCT(lldpd_hardware, lldpd_port, h_lport) |
506 | MARSHAL_SUBTQ(lldpd_hardware, lldpd_port, h_rports) | |
985a4cb5 | 507 | MARSHAL_END(lldpd_hardware); |
43c02e7b VB |
508 | |
509 | struct lldpd_interface { | |
510 | TAILQ_ENTRY(lldpd_interface) next; | |
511 | char *name; | |
512 | }; | |
f6d20631 VB |
513 | MARSHAL_BEGIN(lldpd_interface) |
514 | MARSHAL_TQE(lldpd_interface, next) | |
515 | MARSHAL_STR(lldpd_interface, name) | |
985a4cb5 | 516 | MARSHAL_END(lldpd_interface); |
f6d20631 VB |
517 | TAILQ_HEAD(lldpd_interface_list, lldpd_interface); |
518 | MARSHAL_TQ(lldpd_interface_list, lldpd_interface); | |
43c02e7b | 519 | |
4e90a9e0 VB |
520 | struct lldpd_neighbor_change { |
521 | char *ifname; | |
522 | #define NEIGHBOR_CHANGE_DELETED -1 | |
523 | #define NEIGHBOR_CHANGE_ADDED 1 | |
524 | #define NEIGHBOR_CHANGE_UPDATED 0 | |
525 | int state; | |
526 | struct lldpd_port *neighbor; | |
527 | }; | |
528 | MARSHAL_BEGIN(lldpd_neighbor_change) | |
529 | MARSHAL_STR(lldpd_neighbor_change, ifname) | |
530 | MARSHAL_POINTER(lldpd_neighbor_change, lldpd_port, neighbor) | |
985a4cb5 | 531 | MARSHAL_END(lldpd_neighbor_change); |
4e90a9e0 | 532 | |
4b292b55 VB |
533 | /* Cleanup functions */ |
534 | void lldpd_chassis_mgmt_cleanup(struct lldpd_chassis *); | |
535 | void lldpd_chassis_cleanup(struct lldpd_chassis *, int); | |
4e90a9e0 | 536 | void lldpd_remote_cleanup(struct lldpd_hardware *, |
ef3707da VB |
537 | void(*expire)(struct lldpd_hardware *, struct lldpd_port *), |
538 | int); | |
4b292b55 | 539 | void lldpd_port_cleanup(struct lldpd_port *, int); |
8ec333bd | 540 | void lldpd_config_cleanup(struct lldpd_config *); |
a1347cd8 | 541 | #ifdef ENABLE_DOT1 |
9757bfbc | 542 | void lldpd_ppvid_cleanup(struct lldpd_port *); |
43c02e7b | 543 | void lldpd_vlan_cleanup(struct lldpd_port *); |
9757bfbc | 544 | void lldpd_pi_cleanup(struct lldpd_port *); |
a1347cd8 | 545 | #endif |
fb1b78bb | 546 | #ifdef ENABLE_CUSTOM |
7c26c8b4 | 547 | void lldpd_custom_tlv_cleanup(struct lldpd_port *, struct lldpd_custom *); |
548 | void lldpd_custom_tlv_add(struct lldpd_port *, struct lldpd_custom *); | |
cd5de7a2 | 549 | void lldpd_custom_list_cleanup(struct lldpd_port *); |
fb1b78bb | 550 | #endif |
6e75df87 | 551 | |
0265b1e5 | 552 | #endif |