]>
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 JV |
150 | #define LLDPD_MGMT_MAXADDRSIZE 16 /* sizeof(struct in6_addr) */ |
151 | struct lldpd_mgmt { | |
152 | TAILQ_ENTRY(lldpd_mgmt) m_entries; | |
153 | int m_family; | |
154 | union { | |
155 | struct in_addr inet; | |
156 | struct in6_addr inet6; | |
6d3c1ce0 | 157 | u_int8_t octets[LLDPD_MGMT_MAXADDRSIZE]; /* network byte order! */ |
e6b36c87 JV |
158 | } m_addr; |
159 | size_t m_addrsize; | |
160 | u_int32_t m_iface; | |
161 | }; | |
162 | MARSHAL_BEGIN(lldpd_mgmt) | |
163 | MARSHAL_TQE(lldpd_mgmt, m_entries) | |
985a4cb5 | 164 | MARSHAL_END(lldpd_mgmt); |
e6b36c87 | 165 | |
43c02e7b | 166 | struct lldpd_chassis { |
75068724 VB |
167 | TAILQ_ENTRY(lldpd_chassis) c_entries; |
168 | u_int16_t c_refcount; /* Reference count by ports */ | |
169 | u_int16_t c_index; /* Monotonic index */ | |
170 | u_int8_t c_protocol; /* Protocol used to get this chassis */ | |
43c02e7b VB |
171 | u_int8_t c_id_subtype; |
172 | char *c_id; | |
173 | int c_id_len; | |
174 | char *c_name; | |
175 | char *c_descr; | |
176 | ||
177 | u_int16_t c_cap_available; | |
178 | u_int16_t c_cap_enabled; | |
179 | ||
180 | u_int16_t c_ttl; | |
181 | ||
e6b36c87 | 182 | TAILQ_HEAD(, lldpd_mgmt) c_mgmt; |
89840df0 VB |
183 | |
184 | #ifdef ENABLE_LLDPMED | |
40ecae87 | 185 | u_int16_t c_med_cap_available; |
89840df0 VB |
186 | u_int8_t c_med_type; |
187 | char *c_med_hw; | |
188 | char *c_med_fw; | |
189 | char *c_med_sw; | |
190 | char *c_med_sn; | |
191 | char *c_med_manuf; | |
192 | char *c_med_model; | |
193 | char *c_med_asset; | |
89840df0 | 194 | #endif |
1531f7f3 VB |
195 | |
196 | }; | |
d938c51f VB |
197 | /* WARNING: any change to this structure should also be reflected into |
198 | `lldpd_copy_chassis()` which is not using marshaling. */ | |
f6d20631 | 199 | MARSHAL_BEGIN(lldpd_chassis) |
74e0080e VB |
200 | MARSHAL_IGNORE(lldpd_chassis, c_entries.tqe_next) |
201 | MARSHAL_IGNORE(lldpd_chassis, c_entries.tqe_prev) | |
f6d20631 VB |
202 | MARSHAL_FSTR(lldpd_chassis, c_id, c_id_len) |
203 | MARSHAL_STR(lldpd_chassis, c_name) | |
204 | MARSHAL_STR(lldpd_chassis, c_descr) | |
e6b36c87 | 205 | MARSHAL_SUBTQ(lldpd_chassis, lldpd_mgmt, c_mgmt) |
f6d20631 VB |
206 | #ifdef ENABLE_LLDPMED |
207 | MARSHAL_STR(lldpd_chassis, c_med_hw) | |
208 | MARSHAL_STR(lldpd_chassis, c_med_fw) | |
209 | MARSHAL_STR(lldpd_chassis, c_med_sw) | |
210 | MARSHAL_STR(lldpd_chassis, c_med_sn) | |
211 | MARSHAL_STR(lldpd_chassis, c_med_manuf) | |
212 | MARSHAL_STR(lldpd_chassis, c_med_model) | |
213 | MARSHAL_STR(lldpd_chassis, c_med_asset) | |
214 | #endif | |
985a4cb5 | 215 | MARSHAL_END(lldpd_chassis); |
f6d20631 | 216 | |
fb1b78bb | 217 | #ifdef ENABLE_CUSTOM |
7c26c8b4 | 218 | |
219 | #define CUSTOM_TLV_ADD 1 | |
220 | #define CUSTOM_TLV_REPLACE 2 | |
221 | #define CUSTOM_TLV_REMOVE 3 | |
222 | ||
cd5de7a2 AA |
223 | /* Custom TLV struct as defined on page 35 of IEEE 802.1AB-2005 */ |
224 | struct lldpd_custom { | |
225 | TAILQ_ENTRY(lldpd_custom) next; /* Pointer to next custom TLV */ | |
226 | ||
227 | /* Organizationally Unique Identifier */ | |
228 | u_int8_t oui[LLDP_TLV_ORG_OUI_LEN]; | |
229 | /* Organizationally Defined Subtype */ | |
230 | u_int8_t subtype; | |
5427983b | 231 | /* Organizationally Defined Information String */ |
8caf4341 | 232 | u_int8_t *oui_info; |
cd5de7a2 AA |
233 | /* Organizationally Defined Information String length */ |
234 | int oui_info_len; | |
235 | }; | |
236 | MARSHAL_BEGIN(lldpd_custom) | |
237 | MARSHAL_TQE(lldpd_custom, next) | |
8caf4341 | 238 | MARSHAL_FSTR(lldpd_custom, oui_info, oui_info_len) |
cd5de7a2 | 239 | MARSHAL_END(lldpd_custom); |
fb1b78bb | 240 | #endif |
43c02e7b VB |
241 | |
242 | struct lldpd_port { | |
75068724 VB |
243 | TAILQ_ENTRY(lldpd_port) p_entries; |
244 | struct lldpd_chassis *p_chassis; /* Attached chassis */ | |
245 | time_t p_lastchange; /* Time of last change of values */ | |
246 | time_t p_lastupdate; /* Time of last update received */ | |
247 | struct lldpd_frame *p_lastframe; /* Frame received during last update */ | |
248 | u_int8_t p_protocol; /* Protocol used to get this port */ | |
579bedd5 VB |
249 | u_int8_t p_hidden_in:1; /* Considered as hidden for reception */ |
250 | u_int8_t p_hidden_out:2; /* Considered as hidden for emission */ | |
e7331ce9 VB |
251 | u_int8_t p_disable_rx:3; /* Should RX be disabled for this port? */ |
252 | u_int8_t p_disable_tx:4; /* Should TX be disabled for this port? */ | |
579bedd5 | 253 | /* Important: all fields that should be ignored to check if a port has |
28414fbd | 254 | * been changed should be before this mark. */ |
aafa99bd | 255 | #define LLDPD_PORT_START_MARKER (offsetof(struct lldpd_port, _p_hardware_flags)) |
196757ce | 256 | int _p_hardware_flags; /* This is a copy of hardware flags. Do not use it! */ |
43c02e7b VB |
257 | u_int8_t p_id_subtype; |
258 | char *p_id; | |
259 | int p_id_len; | |
260 | char *p_descr; | |
548109b2 | 261 | u_int16_t p_mfs; |
43c02e7b | 262 | |
a1347cd8 | 263 | #ifdef ENABLE_DOT3 |
43c02e7b VB |
264 | /* Dot3 stuff */ |
265 | u_int32_t p_aggregid; | |
3fd015c0 | 266 | struct lldpd_dot3_macphy p_macphy; |
befbdf89 | 267 | struct lldpd_dot3_power p_power; |
a1347cd8 | 268 | #endif |
1531f7f3 | 269 | |
740593ff | 270 | #ifdef ENABLE_LLDPMED |
740593ff | 271 | u_int16_t p_med_cap_enabled; |
4b292b55 VB |
272 | struct lldpd_med_policy p_med_policy[LLDP_MED_APPTYPE_LAST]; |
273 | struct lldpd_med_loc p_med_location[LLDP_MED_LOCFORMAT_LAST]; | |
6d08df0e | 274 | struct lldpd_med_power p_med_power; |
740593ff VB |
275 | #endif |
276 | ||
a1347cd8 | 277 | #ifdef ENABLE_DOT1 |
75b3469d | 278 | u_int16_t p_pvid; |
1531f7f3 | 279 | TAILQ_HEAD(, lldpd_vlan) p_vlans; |
9757bfbc SK |
280 | TAILQ_HEAD(, lldpd_ppvid) p_ppvids; |
281 | TAILQ_HEAD(, lldpd_pi) p_pids; | |
a1347cd8 | 282 | #endif |
fb1b78bb | 283 | #ifdef ENABLE_CUSTOM |
cd5de7a2 | 284 | TAILQ_HEAD(, lldpd_custom) p_custom_list; |
fb1b78bb | 285 | #endif |
1531f7f3 | 286 | }; |
f6d20631 VB |
287 | MARSHAL_BEGIN(lldpd_port) |
288 | MARSHAL_TQE(lldpd_port, p_entries) | |
289 | MARSHAL_POINTER(lldpd_port, lldpd_chassis, p_chassis) | |
290 | MARSHAL_IGNORE(lldpd_port, p_lastframe) | |
291 | MARSHAL_FSTR(lldpd_port, p_id, p_id_len) | |
292 | MARSHAL_STR(lldpd_port, p_descr) | |
293 | #ifdef ENABLE_LLDPMED | |
294 | MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[0]) | |
295 | MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[1]) | |
296 | MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[2]) | |
297 | #endif | |
298 | #ifdef ENABLE_DOT1 | |
299 | MARSHAL_SUBTQ(lldpd_port, lldpd_vlan, p_vlans) | |
300 | MARSHAL_SUBTQ(lldpd_port, lldpd_ppvid, p_ppvids) | |
301 | MARSHAL_SUBTQ(lldpd_port, lldpd_pi, p_pids) | |
302 | #endif | |
fb1b78bb | 303 | #ifdef ENABLE_CUSTOM |
cd5de7a2 | 304 | MARSHAL_SUBTQ(lldpd_port, lldpd_custom, p_custom_list) |
fb1b78bb | 305 | #endif |
985a4cb5 | 306 | MARSHAL_END(lldpd_port); |
1531f7f3 | 307 | |
f6d20631 | 308 | /* Used to modify some port related settings */ |
e7331ce9 VB |
309 | #define LLDPD_RXTX_UNCHANGED 0 |
310 | #define LLDPD_RXTX_TXONLY 1 | |
311 | #define LLDPD_RXTX_RXONLY 2 | |
312 | #define LLDPD_RXTX_DISABLED 3 | |
313 | #define LLDPD_RXTX_BOTH 4 | |
314 | #define LLDPD_RXTX_FROM_PORT(p) (((p)->p_disable_rx && (p)->p_disable_tx)?LLDPD_RXTX_DISABLED: \ | |
315 | ((p)->p_disable_rx && !(p)->p_disable_tx)?LLDPD_RXTX_TXONLY: \ | |
316 | (!(p)->p_disable_rx && (p)->p_disable_tx)?LLDPD_RXTX_RXONLY: \ | |
317 | LLDPD_RXTX_BOTH) | |
318 | #define LLDPD_RXTX_RXENABLED(v) ((v) == LLDPD_RXTX_RXONLY || (v) == LLDPD_RXTX_BOTH) | |
319 | #define LLDPD_RXTX_TXENABLED(v) ((v) == LLDPD_RXTX_TXONLY || (v) == LLDPD_RXTX_BOTH) | |
f6d20631 VB |
320 | struct lldpd_port_set { |
321 | char *ifname; | |
8e46010c | 322 | char *local_id; |
c267d0f2 | 323 | char *local_descr; |
e7331ce9 | 324 | int rxtx; |
f6d20631 VB |
325 | #ifdef ENABLE_LLDPMED |
326 | struct lldpd_med_policy *med_policy; | |
327 | struct lldpd_med_loc *med_location; | |
328 | struct lldpd_med_power *med_power; | |
329 | #endif | |
330 | #ifdef ENABLE_DOT3 | |
331 | struct lldpd_dot3_power *dot3_power; | |
332 | #endif | |
fb1b78bb | 333 | #ifdef ENABLE_CUSTOM |
41cb7781 AA |
334 | struct lldpd_custom *custom; |
335 | int custom_list_clear; | |
7c26c8b4 | 336 | int custom_tlv_op; |
fb1b78bb | 337 | #endif |
f6d20631 VB |
338 | }; |
339 | MARSHAL_BEGIN(lldpd_port_set) | |
340 | MARSHAL_STR(lldpd_port_set, ifname) | |
8e46010c | 341 | MARSHAL_STR(lldpd_port_set, local_id) |
c267d0f2 | 342 | MARSHAL_STR(lldpd_port_set, local_descr) |
f6d20631 VB |
343 | #ifdef ENABLE_LLDPMED |
344 | MARSHAL_POINTER(lldpd_port_set, lldpd_med_policy, med_policy) | |
345 | MARSHAL_POINTER(lldpd_port_set, lldpd_med_loc, med_location) | |
346 | MARSHAL_POINTER(lldpd_port_set, lldpd_med_power, med_power) | |
347 | #endif | |
348 | #ifdef ENABLE_DOT3 | |
349 | MARSHAL_POINTER(lldpd_port_set, lldpd_dot3_power, dot3_power) | |
350 | #endif | |
fb1b78bb | 351 | #ifdef ENABLE_CUSTOM |
41cb7781 | 352 | MARSHAL_POINTER(lldpd_port_set, lldpd_custom, custom) |
fb1b78bb | 353 | #endif |
985a4cb5 | 354 | MARSHAL_END(lldpd_port_set); |
43c02e7b | 355 | |
8ec333bd VB |
356 | /* Smart mode / Hide mode */ |
357 | #define SMART_INCOMING_FILTER (1<<0) /* Incoming filtering enabled */ | |
358 | #define SMART_INCOMING_ONE_PROTO (1<<1) /* On reception, keep only one proto */ | |
359 | #define SMART_INCOMING_ONE_NEIGH (1<<2) /* On reception, keep only one neighbor */ | |
360 | #define SMART_OUTGOING_FILTER (1<<3) /* Outgoing filtering enabled */ | |
361 | #define SMART_OUTGOING_ONE_PROTO (1<<4) /* On emission, keep only one proto */ | |
362 | #define SMART_OUTGOING_ONE_NEIGH (1<<5) /* On emission, consider only one neighbor */ | |
363 | #define SMART_INCOMING (SMART_INCOMING_FILTER | \ | |
364 | SMART_INCOMING_ONE_PROTO | \ | |
365 | SMART_INCOMING_ONE_NEIGH) | |
366 | #define SMART_OUTGOING (SMART_OUTGOING_FILTER | \ | |
367 | SMART_OUTGOING_ONE_PROTO | \ | |
368 | SMART_OUTGOING_ONE_NEIGH) | |
369 | ||
370 | struct lldpd_config { | |
e4ff3ed5 | 371 | int c_paused; /* lldpd is paused */ |
8843f168 | 372 | int c_tx_interval; /* Transmit interval */ |
8ec333bd VB |
373 | int c_smart; /* Bitmask for smart configuration (see SMART_*) */ |
374 | int c_receiveonly; /* Receive only mode */ | |
42589660 | 375 | int c_max_neighbors; /* Maximum number of neighbors (per protocol) */ |
8ec333bd VB |
376 | |
377 | char *c_mgmt_pattern; /* Pattern to match a management address */ | |
378 | char *c_cid_pattern; /* Pattern to match interfaces to use for chassis ID */ | |
379 | char *c_iface_pattern; /* Pattern to match interfaces to use */ | |
380 | ||
381 | char *c_platform; /* Override platform description (for CDP) */ | |
382 | char *c_description; /* Override chassis description */ | |
ce347d29 | 383 | char *c_hostname; /* Override system name */ |
8ec333bd | 384 | int c_advertise_version; /* Should the precise version be advertised? */ |
bb37268d | 385 | int c_set_ifdescr; /* Set interface description */ |
f84199dd | 386 | int c_promisc; /* Interfaces should be in promiscuous mode */ |
ca838758 | 387 | int c_cap_advertise; /* Chassis capabilities advertisement */ |
1c2217aa | 388 | int c_mgmt_advertise; /* Management addresses advertisement */ |
8ec333bd VB |
389 | |
390 | #ifdef ENABLE_LLDPMED | |
391 | int c_noinventory; /* Don't send inventory with LLDP-MED */ | |
b9de0ca6 | 392 | int c_enable_fast_start; /* enable fast start */ |
393 | int c_tx_fast_init; /* Num of lldpd lldppdu's for fast start */ | |
394 | int c_tx_fast_interval; /* Time intr between sends during fast start */ | |
be511d00 | 395 | #endif |
c10302a3 | 396 | int c_tx_hold; /* Transmit hold */ |
dfbd7185 RP |
397 | int c_bond_slave_src_mac_type; /* Src mac type in lldp frames over bond |
398 | slaves */ | |
8fbd3195 | 399 | int c_lldp_portid_type; /* The PortID type */ |
8ec333bd VB |
400 | }; |
401 | MARSHAL_BEGIN(lldpd_config) | |
402 | MARSHAL_STR(lldpd_config, c_mgmt_pattern) | |
403 | MARSHAL_STR(lldpd_config, c_cid_pattern) | |
404 | MARSHAL_STR(lldpd_config, c_iface_pattern) | |
ce347d29 | 405 | MARSHAL_STR(lldpd_config, c_hostname) |
8ec333bd VB |
406 | MARSHAL_STR(lldpd_config, c_platform) |
407 | MARSHAL_STR(lldpd_config, c_description) | |
985a4cb5 | 408 | MARSHAL_END(lldpd_config); |
8ec333bd | 409 | |
43c02e7b VB |
410 | struct lldpd_frame { |
411 | int size; | |
b5c7ce8d | 412 | unsigned char frame[1]; |
43c02e7b VB |
413 | }; |
414 | ||
6e75df87 VB |
415 | struct lldpd_hardware; |
416 | struct lldpd; | |
417 | struct lldpd_ops { | |
418 | int(*send)(struct lldpd *, | |
419 | struct lldpd_hardware*, | |
420 | char *, size_t); /* Function to send a frame */ | |
421 | int(*recv)(struct lldpd *, | |
422 | struct lldpd_hardware*, | |
423 | int, char *, size_t); /* Function to receive a frame */ | |
424 | int(*cleanup)(struct lldpd *, struct lldpd_hardware *); /* Cleanup function. */ | |
425 | }; | |
426 | ||
44002d66 VB |
427 | /* An interface is uniquely identified by h_ifindex, h_ifname and h_ops. This |
428 | * means if an interface becomes enslaved, it will be considered as a new | |
429 | * interface. The same applies for renaming and we include the index in case of | |
430 | * renaming to an existing interface. */ | |
43c02e7b VB |
431 | struct lldpd_hardware { |
432 | TAILQ_ENTRY(lldpd_hardware) h_entries; | |
433 | ||
d6e889b6 VB |
434 | struct lldpd *h_cfg; /* Pointer to main configuration */ |
435 | void *h_recv; /* FD for reception */ | |
6e75df87 | 436 | int h_sendfd; /* FD for sending, only used by h_ops */ |
5347914e | 437 | int h_mangle; /* 1 if we have to mangle the MAC address */ |
6e75df87 VB |
438 | struct lldpd_ops *h_ops; /* Hardware-dependent functions */ |
439 | void *h_data; /* Hardware-dependent data */ | |
579bedd5 | 440 | void *h_timer; /* Timer for this port */ |
43c02e7b | 441 | |
43c02e7b | 442 | int h_mtu; |
6e75df87 VB |
443 | int h_flags; /* Packets will be sent only |
444 | if IFF_RUNNING. Will be | |
445 | removed if this is left | |
446 | to 0. */ | |
447 | int h_ifindex; /* Interface index, used by SNMP */ | |
448 | char h_ifname[IFNAMSIZ]; /* Should be unique */ | |
43c02e7b VB |
449 | u_int8_t h_lladdr[ETHER_ADDR_LEN]; |
450 | ||
451 | u_int64_t h_tx_cnt; | |
452 | u_int64_t h_rx_cnt; | |
453 | u_int64_t h_rx_discarded_cnt; | |
37387046 | 454 | u_int64_t h_rx_unrecognized_cnt; |
14052b61 VB |
455 | u_int64_t h_ageout_cnt; |
456 | u_int64_t h_insert_cnt; | |
457 | u_int64_t h_delete_cnt; | |
42589660 | 458 | u_int64_t h_drop_cnt; |
43c02e7b | 459 | |
acb5f65b VB |
460 | /* Previous values of different stuff. */ |
461 | /* Backup of the previous local port. Used to check if there was a | |
462 | * change to send an immediate update. All those are not marshalled to | |
463 | * the client. */ | |
464 | void *h_lport_previous; | |
17d34115 | 465 | ssize_t h_lport_previous_len; |
acb5f65b VB |
466 | /* Backup of the previous chassis ID. Used to check if there was a |
467 | * change and send an LLDP shutdown. */ | |
468 | u_int8_t h_lchassis_previous_id_subtype; | |
469 | char *h_lchassis_previous_id; | |
470 | int h_lchassis_previous_id_len; | |
471 | /* Backup of the previous port ID. Used to check if there was a change | |
472 | * and send an LLDP shutdown. */ | |
473 | u_int8_t h_lport_previous_id_subtype; | |
474 | char *h_lport_previous_id; | |
475 | int h_lport_previous_id_len; | |
476 | ||
75068724 VB |
477 | struct lldpd_port h_lport; /* Port attached to this hardware port */ |
478 | TAILQ_HEAD(, lldpd_port) h_rports; /* Remote ports */ | |
b9de0ca6 | 479 | |
be511d00 | 480 | #ifdef ENABLE_LLDPMED |
b9de0ca6 | 481 | int h_tx_fast; /* current tx fast start count */ |
be511d00 | 482 | #endif |
43c02e7b | 483 | }; |
f6d20631 VB |
484 | MARSHAL_BEGIN(lldpd_hardware) |
485 | MARSHAL_IGNORE(lldpd_hardware, h_entries.tqe_next) | |
486 | MARSHAL_IGNORE(lldpd_hardware, h_entries.tqe_prev) | |
487 | MARSHAL_IGNORE(lldpd_hardware, h_ops) | |
488 | MARSHAL_IGNORE(lldpd_hardware, h_data) | |
d6e889b6 | 489 | MARSHAL_IGNORE(lldpd_hardware, h_cfg) |
b1785ed5 VB |
490 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous) |
491 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_len) | |
acb5f65b VB |
492 | MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id_subtype) |
493 | MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id) | |
494 | MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id_len) | |
495 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id_subtype) | |
496 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id) | |
497 | MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id_len) | |
f6d20631 VB |
498 | MARSHAL_SUBSTRUCT(lldpd_hardware, lldpd_port, h_lport) |
499 | MARSHAL_SUBTQ(lldpd_hardware, lldpd_port, h_rports) | |
985a4cb5 | 500 | MARSHAL_END(lldpd_hardware); |
43c02e7b VB |
501 | |
502 | struct lldpd_interface { | |
503 | TAILQ_ENTRY(lldpd_interface) next; | |
504 | char *name; | |
505 | }; | |
f6d20631 VB |
506 | MARSHAL_BEGIN(lldpd_interface) |
507 | MARSHAL_TQE(lldpd_interface, next) | |
508 | MARSHAL_STR(lldpd_interface, name) | |
985a4cb5 | 509 | MARSHAL_END(lldpd_interface); |
f6d20631 VB |
510 | TAILQ_HEAD(lldpd_interface_list, lldpd_interface); |
511 | MARSHAL_TQ(lldpd_interface_list, lldpd_interface); | |
43c02e7b | 512 | |
4e90a9e0 VB |
513 | struct lldpd_neighbor_change { |
514 | char *ifname; | |
515 | #define NEIGHBOR_CHANGE_DELETED -1 | |
516 | #define NEIGHBOR_CHANGE_ADDED 1 | |
517 | #define NEIGHBOR_CHANGE_UPDATED 0 | |
518 | int state; | |
519 | struct lldpd_port *neighbor; | |
520 | }; | |
521 | MARSHAL_BEGIN(lldpd_neighbor_change) | |
522 | MARSHAL_STR(lldpd_neighbor_change, ifname) | |
523 | MARSHAL_POINTER(lldpd_neighbor_change, lldpd_port, neighbor) | |
985a4cb5 | 524 | MARSHAL_END(lldpd_neighbor_change); |
4e90a9e0 | 525 | |
4b292b55 VB |
526 | /* Cleanup functions */ |
527 | void lldpd_chassis_mgmt_cleanup(struct lldpd_chassis *); | |
528 | void lldpd_chassis_cleanup(struct lldpd_chassis *, int); | |
4e90a9e0 | 529 | void lldpd_remote_cleanup(struct lldpd_hardware *, |
ef3707da VB |
530 | void(*expire)(struct lldpd_hardware *, struct lldpd_port *), |
531 | int); | |
4b292b55 | 532 | void lldpd_port_cleanup(struct lldpd_port *, int); |
8ec333bd | 533 | void lldpd_config_cleanup(struct lldpd_config *); |
a1347cd8 | 534 | #ifdef ENABLE_DOT1 |
9757bfbc | 535 | void lldpd_ppvid_cleanup(struct lldpd_port *); |
43c02e7b | 536 | void lldpd_vlan_cleanup(struct lldpd_port *); |
9757bfbc | 537 | void lldpd_pi_cleanup(struct lldpd_port *); |
a1347cd8 | 538 | #endif |
fb1b78bb | 539 | #ifdef ENABLE_CUSTOM |
7c26c8b4 | 540 | void lldpd_custom_tlv_cleanup(struct lldpd_port *, struct lldpd_custom *); |
541 | void lldpd_custom_tlv_add(struct lldpd_port *, struct lldpd_custom *); | |
cd5de7a2 | 542 | void lldpd_custom_list_cleanup(struct lldpd_port *); |
fb1b78bb | 543 | #endif |
6e75df87 | 544 | |
0265b1e5 | 545 | #endif |