]> git.proxmox.com Git - mirror_frr.git/blob - nhrpd/nhrpd.h
Merge pull request #5805 from donaldsharp/babel_int_return
[mirror_frr.git] / nhrpd / nhrpd.h
1 /* NHRP daemon internal structures and function prototypes
2 * Copyright (c) 2014-2015 Timo Teräs
3 *
4 * This file is free software: you may copy, redistribute and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
8 */
9
10 #ifndef NHRPD_H
11 #define NHRPD_H
12
13 #include "list.h"
14
15 #include "zbuf.h"
16 #include "zclient.h"
17 #include "debug.h"
18 #include "memory.h"
19 #include "resolver.h"
20
21 DECLARE_MGROUP(NHRPD)
22
23 #define NHRPD_DEFAULT_HOLDTIME 7200
24
25 #define NHRP_VTY_PORT 2610
26 #define NHRP_DEFAULT_CONFIG "nhrpd.conf"
27
28 extern struct thread_master *master;
29
30 enum { NHRP_OK = 0,
31 NHRP_ERR_FAIL,
32 NHRP_ERR_NO_MEMORY,
33 NHRP_ERR_UNSUPPORTED_INTERFACE,
34 NHRP_ERR_NHRP_NOT_ENABLED,
35 NHRP_ERR_ENTRY_EXISTS,
36 NHRP_ERR_ENTRY_NOT_FOUND,
37 NHRP_ERR_PROTOCOL_ADDRESS_MISMATCH,
38 __NHRP_ERR_MAX };
39 #define NHRP_ERR_MAX (__NHRP_ERR_MAX - 1)
40
41 struct notifier_block;
42
43 typedef void (*notifier_fn_t)(struct notifier_block *, unsigned long);
44
45 struct notifier_block {
46 struct list_head notifier_entry;
47 notifier_fn_t action;
48 };
49
50 struct notifier_list {
51 struct list_head notifier_head;
52 };
53
54 #define NOTIFIER_LIST_INITIALIZER(l) \
55 { \
56 .notifier_head = LIST_INITIALIZER((l)->notifier_head) \
57 }
58
59 static inline void notifier_init(struct notifier_list *l)
60 {
61 list_init(&l->notifier_head);
62 }
63
64 static inline void notifier_add(struct notifier_block *n,
65 struct notifier_list *l, notifier_fn_t action)
66 {
67 n->action = action;
68 list_add_tail(&n->notifier_entry, &l->notifier_head);
69 }
70
71 static inline void notifier_del(struct notifier_block *n)
72 {
73 list_del(&n->notifier_entry);
74 }
75
76 static inline void notifier_call(struct notifier_list *l, int cmd)
77 {
78 struct notifier_block *n, *nn;
79 list_for_each_entry_safe(n, nn, &l->notifier_head, notifier_entry) {
80 n->action(n, cmd);
81 }
82 }
83
84 static inline int notifier_active(struct notifier_list *l)
85 {
86 return !list_empty(&l->notifier_head);
87 }
88
89 void nhrp_zebra_init(void);
90 void nhrp_zebra_terminate(void);
91
92 struct zbuf;
93 struct nhrp_vc;
94 struct nhrp_cache;
95 struct nhrp_nhs;
96 struct nhrp_interface;
97
98 #define MAX_ID_LENGTH 64
99 #define MAX_CERT_LENGTH 2048
100
101 enum nhrp_notify_type {
102 NOTIFY_INTERFACE_UP,
103 NOTIFY_INTERFACE_DOWN,
104 NOTIFY_INTERFACE_CHANGED,
105 NOTIFY_INTERFACE_ADDRESS_CHANGED,
106 NOTIFY_INTERFACE_NBMA_CHANGED,
107 NOTIFY_INTERFACE_MTU_CHANGED,
108
109 NOTIFY_VC_IPSEC_CHANGED,
110 NOTIFY_VC_IPSEC_UPDATE_NBMA,
111
112 NOTIFY_PEER_UP,
113 NOTIFY_PEER_DOWN,
114 NOTIFY_PEER_IFCONFIG_CHANGED,
115 NOTIFY_PEER_MTU_CHANGED,
116 NOTIFY_PEER_NBMA_CHANGING,
117
118 NOTIFY_CACHE_UP,
119 NOTIFY_CACHE_DOWN,
120 NOTIFY_CACHE_DELETE,
121 NOTIFY_CACHE_USED,
122 NOTIFY_CACHE_BINDING_CHANGE,
123 };
124
125 struct nhrp_vc {
126 struct notifier_list notifier_list;
127 uint8_t ipsec;
128 uint8_t updating;
129 uint8_t abort_migration;
130
131 struct nhrp_vc_peer {
132 union sockunion nbma;
133 char id[MAX_ID_LENGTH];
134 uint16_t certlen;
135 uint8_t cert[MAX_CERT_LENGTH];
136 } local, remote;
137 };
138
139 enum nhrp_route_type {
140 NHRP_ROUTE_BLACKHOLE,
141 NHRP_ROUTE_LOCAL,
142 NHRP_ROUTE_NBMA_NEXTHOP,
143 NHRP_ROUTE_OFF_NBMA,
144 };
145
146 struct nhrp_peer {
147 unsigned int ref;
148 unsigned online : 1;
149 unsigned requested : 1;
150 unsigned fallback_requested : 1;
151 unsigned prio : 1;
152 struct notifier_list notifier_list;
153 struct interface *ifp;
154 struct nhrp_vc *vc;
155 struct thread *t_fallback;
156 struct notifier_block vc_notifier, ifp_notifier;
157 };
158
159 struct nhrp_packet_parser {
160 struct interface *ifp;
161 struct nhrp_afi_data *if_ad;
162 struct nhrp_peer *peer;
163 struct zbuf *pkt;
164 struct zbuf payload;
165 struct zbuf extensions;
166 struct nhrp_packet_header *hdr;
167 enum nhrp_route_type route_type;
168 struct prefix route_prefix;
169 union sockunion src_nbma, src_proto, dst_proto;
170 };
171
172 struct nhrp_reqid_pool {
173 struct hash *reqid_hash;
174 uint32_t next_request_id;
175 };
176
177 struct nhrp_reqid {
178 uint32_t request_id;
179 void (*cb)(struct nhrp_reqid *, void *);
180 };
181
182 extern struct nhrp_reqid_pool nhrp_packet_reqid;
183 extern struct nhrp_reqid_pool nhrp_event_reqid;
184
185 enum nhrp_cache_type {
186 NHRP_CACHE_INVALID = 0,
187 NHRP_CACHE_INCOMPLETE,
188 NHRP_CACHE_NEGATIVE,
189 NHRP_CACHE_CACHED,
190 NHRP_CACHE_DYNAMIC,
191 NHRP_CACHE_NHS,
192 NHRP_CACHE_STATIC,
193 NHRP_CACHE_LOCAL,
194 NHRP_CACHE_NUM_TYPES
195 };
196
197 extern const char *const nhrp_cache_type_str[];
198 extern unsigned long nhrp_cache_counts[NHRP_CACHE_NUM_TYPES];
199
200 struct nhrp_cache {
201 struct interface *ifp;
202 union sockunion remote_addr;
203
204 unsigned map : 1;
205 unsigned used : 1;
206 unsigned route_installed : 1;
207 unsigned nhrp_route_installed : 1;
208
209 struct notifier_block peer_notifier;
210 struct notifier_block newpeer_notifier;
211 struct notifier_list notifier_list;
212 struct nhrp_reqid eventid;
213 struct thread *t_timeout;
214 struct thread *t_auth;
215
216 struct {
217 enum nhrp_cache_type type;
218 union sockunion remote_nbma_natoa;
219 struct nhrp_peer *peer;
220 time_t expires;
221 uint32_t mtu;
222 } cur, new;
223 };
224
225 struct nhrp_shortcut {
226 struct prefix *p;
227 union sockunion addr;
228
229 struct nhrp_reqid reqid;
230 struct thread *t_timer;
231
232 enum nhrp_cache_type type;
233 unsigned int holding_time;
234 unsigned route_installed : 1;
235 unsigned expiring : 1;
236
237 struct nhrp_cache *cache;
238 struct notifier_block cache_notifier;
239 };
240
241 struct nhrp_nhs {
242 struct interface *ifp;
243 struct list_head nhslist_entry;
244
245 unsigned hub : 1;
246 afi_t afi;
247 union sockunion proto_addr;
248 const char *nbma_fqdn; /* IP-address or FQDN */
249
250 struct thread *t_resolve;
251 struct resolver_query dns_resolve;
252 struct list_head reglist_head;
253 };
254
255 struct nhrp_registration {
256 struct list_head reglist_entry;
257 struct thread *t_register;
258 struct nhrp_nhs *nhs;
259 struct nhrp_reqid reqid;
260 unsigned int timeout;
261 unsigned mark : 1;
262 union sockunion proto_addr;
263 struct nhrp_peer *peer;
264 struct notifier_block peer_notifier;
265 };
266
267 #define NHRP_IFF_SHORTCUT 0x0001
268 #define NHRP_IFF_REDIRECT 0x0002
269 #define NHRP_IFF_REG_NO_UNIQUE 0x0100
270
271 struct nhrp_interface {
272 struct interface *ifp;
273
274 unsigned enabled : 1;
275
276 char *ipsec_profile, *ipsec_fallback_profile, *source;
277 union sockunion nbma;
278 union sockunion nat_nbma;
279 unsigned int linkidx;
280 uint32_t grekey;
281
282 struct hash *peer_hash;
283 struct hash *cache_hash;
284
285 struct notifier_list notifier_list;
286
287 struct interface *nbmaifp;
288 struct notifier_block nbmanifp_notifier;
289
290 struct nhrp_afi_data {
291 unsigned flags;
292 unsigned short configured : 1;
293 union sockunion addr;
294 uint32_t network_id;
295 short configured_mtu;
296 unsigned short mtu;
297 unsigned int holdtime;
298 struct list_head nhslist_head;
299 } afi[AFI_MAX];
300 };
301
302 extern struct zebra_privs_t nhrpd_privs;
303
304 int sock_open_unix(const char *path);
305
306 void nhrp_interface_init(void);
307 void nhrp_interface_update(struct interface *ifp);
308 void nhrp_interface_update_mtu(struct interface *ifp, afi_t afi);
309
310 int nhrp_interface_add(ZAPI_CALLBACK_ARGS);
311 int nhrp_interface_delete(ZAPI_CALLBACK_ARGS);
312 int nhrp_interface_up(ZAPI_CALLBACK_ARGS);
313 int nhrp_interface_down(ZAPI_CALLBACK_ARGS);
314 int nhrp_interface_address_add(ZAPI_CALLBACK_ARGS);
315 int nhrp_interface_address_delete(ZAPI_CALLBACK_ARGS);
316
317 void nhrp_interface_notify_add(struct interface *ifp, struct notifier_block *n,
318 notifier_fn_t fn);
319 void nhrp_interface_notify_del(struct interface *ifp, struct notifier_block *n);
320 void nhrp_interface_set_protection(struct interface *ifp, const char *profile,
321 const char *fallback_profile);
322 void nhrp_interface_set_source(struct interface *ifp, const char *ifname);
323 extern int nhrp_ifp_create(struct interface *ifp);
324 extern int nhrp_ifp_up(struct interface *ifp);
325 extern int nhrp_ifp_down(struct interface *ifp);
326 extern int nhrp_ifp_destroy(struct interface *ifp);
327
328 int nhrp_nhs_add(struct interface *ifp, afi_t afi, union sockunion *proto_addr,
329 const char *nbma_fqdn);
330 int nhrp_nhs_del(struct interface *ifp, afi_t afi, union sockunion *proto_addr,
331 const char *nbma_fqdn);
332 int nhrp_nhs_free(struct nhrp_nhs *nhs);
333 void nhrp_nhs_terminate(void);
334 void nhrp_nhs_foreach(struct interface *ifp, afi_t afi,
335 void (*cb)(struct nhrp_nhs *, struct nhrp_registration *,
336 void *),
337 void *ctx);
338
339 void nhrp_route_update_nhrp(const struct prefix *p, struct interface *ifp);
340 void nhrp_route_announce(int add, enum nhrp_cache_type type,
341 const struct prefix *p, struct interface *ifp,
342 const union sockunion *nexthop, uint32_t mtu);
343 int nhrp_route_read(ZAPI_CALLBACK_ARGS);
344 int nhrp_route_get_nexthop(const union sockunion *addr, struct prefix *p,
345 union sockunion *via, struct interface **ifp);
346 enum nhrp_route_type nhrp_route_address(struct interface *in_ifp,
347 union sockunion *addr, struct prefix *p,
348 struct nhrp_peer **peer);
349
350 void nhrp_config_init(void);
351
352 void nhrp_shortcut_init(void);
353 void nhrp_shortcut_terminate(void);
354 void nhrp_shortcut_initiate(union sockunion *addr);
355 void nhrp_shortcut_foreach(afi_t afi,
356 void (*cb)(struct nhrp_shortcut *, void *),
357 void *ctx);
358 void nhrp_shortcut_purge(struct nhrp_shortcut *s, int force);
359 void nhrp_shortcut_prefix_change(const struct prefix *p, int deleted);
360
361 struct nhrp_cache *nhrp_cache_get(struct interface *ifp,
362 union sockunion *remote_addr, int create);
363 void nhrp_cache_foreach(struct interface *ifp,
364 void (*cb)(struct nhrp_cache *, void *), void *ctx);
365 void nhrp_cache_set_used(struct nhrp_cache *, int);
366 int nhrp_cache_update_binding(struct nhrp_cache *, enum nhrp_cache_type type,
367 int holding_time, struct nhrp_peer *p,
368 uint32_t mtu, union sockunion *nbma_natoa);
369 void nhrp_cache_notify_add(struct nhrp_cache *c, struct notifier_block *,
370 notifier_fn_t);
371 void nhrp_cache_notify_del(struct nhrp_cache *c, struct notifier_block *);
372
373 void nhrp_vc_init(void);
374 void nhrp_vc_terminate(void);
375 struct nhrp_vc *nhrp_vc_get(const union sockunion *src,
376 const union sockunion *dst, int create);
377 int nhrp_vc_ipsec_updown(uint32_t child_id, struct nhrp_vc *vc);
378 void nhrp_vc_notify_add(struct nhrp_vc *, struct notifier_block *,
379 notifier_fn_t);
380 void nhrp_vc_notify_del(struct nhrp_vc *, struct notifier_block *);
381 void nhrp_vc_foreach(void (*cb)(struct nhrp_vc *, void *), void *ctx);
382 void nhrp_vc_reset(void);
383
384 void vici_init(void);
385 void vici_terminate(void);
386 void vici_request_vc(const char *profile, union sockunion *src,
387 union sockunion *dst, int prio);
388
389 extern const char *nhrp_event_socket_path;
390
391 void evmgr_init(void);
392 void evmgr_terminate(void);
393 void evmgr_set_socket(const char *socket);
394 void evmgr_notify(const char *name, struct nhrp_cache *c,
395 void (*cb)(struct nhrp_reqid *, void *));
396
397 struct nhrp_packet_header *nhrp_packet_push(struct zbuf *zb, uint8_t type,
398 const union sockunion *src_nbma,
399 const union sockunion *src_proto,
400 const union sockunion *dst_proto);
401 void nhrp_packet_complete(struct zbuf *zb, struct nhrp_packet_header *hdr);
402 uint16_t nhrp_packet_calculate_checksum(const uint8_t *pdu, uint16_t len);
403
404 struct nhrp_packet_header *nhrp_packet_pull(struct zbuf *zb,
405 union sockunion *src_nbma,
406 union sockunion *src_proto,
407 union sockunion *dst_proto);
408
409 struct nhrp_cie_header *nhrp_cie_push(struct zbuf *zb, uint8_t code,
410 const union sockunion *nbma,
411 const union sockunion *proto);
412 struct nhrp_cie_header *nhrp_cie_pull(struct zbuf *zb,
413 struct nhrp_packet_header *hdr,
414 union sockunion *nbma,
415 union sockunion *proto);
416
417 struct nhrp_extension_header *
418 nhrp_ext_push(struct zbuf *zb, struct nhrp_packet_header *hdr, uint16_t type);
419 void nhrp_ext_complete(struct zbuf *zb, struct nhrp_extension_header *ext);
420 struct nhrp_extension_header *nhrp_ext_pull(struct zbuf *zb,
421 struct zbuf *payload);
422 void nhrp_ext_request(struct zbuf *zb, struct nhrp_packet_header *hdr,
423 struct interface *);
424 int nhrp_ext_reply(struct zbuf *zb, struct nhrp_packet_header *hdr,
425 struct interface *ifp, struct nhrp_extension_header *ext,
426 struct zbuf *extpayload);
427
428 uint32_t nhrp_reqid_alloc(struct nhrp_reqid_pool *, struct nhrp_reqid *r,
429 void (*cb)(struct nhrp_reqid *, void *));
430 void nhrp_reqid_free(struct nhrp_reqid_pool *, struct nhrp_reqid *r);
431 struct nhrp_reqid *nhrp_reqid_lookup(struct nhrp_reqid_pool *, uint32_t reqid);
432
433 int nhrp_packet_init(void);
434
435 struct nhrp_peer *nhrp_peer_get(struct interface *ifp,
436 const union sockunion *remote_nbma);
437 struct nhrp_peer *nhrp_peer_ref(struct nhrp_peer *p);
438 void nhrp_peer_unref(struct nhrp_peer *p);
439 int nhrp_peer_check(struct nhrp_peer *p, int establish);
440 void nhrp_peer_notify_add(struct nhrp_peer *p, struct notifier_block *,
441 notifier_fn_t);
442 void nhrp_peer_notify_del(struct nhrp_peer *p, struct notifier_block *);
443 void nhrp_peer_recv(struct nhrp_peer *p, struct zbuf *zb);
444 void nhrp_peer_send(struct nhrp_peer *p, struct zbuf *zb);
445 void nhrp_peer_send_indication(struct interface *ifp, uint16_t, struct zbuf *);
446
447 #endif