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