1 /* $OpenBSD: ldpd.h,v 1.80 2016/07/01 23:36:38 renato Exp $ */ 2 3 /* 4 * Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org> 5 * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org> 6 * Copyright (c) 2004 Esben Norby <norby@openbsd.org> 7 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 8 * 9 * Permission to use, copy, modify, and distribute this software for any 10 * purpose with or without fee is hereby granted, provided that the above 11 * copyright notice and this permission notice appear in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 */ 21 22 #ifndef _LDPD_H_ 23 #define _LDPD_H_ 24 25 #include <sys/types.h> 26 #include <sys/socket.h> 27 #include <sys/queue.h> 28 #include <sys/tree.h> 29 #include <net/if.h> 30 #include <netinet/in.h> 31 #include <event.h> 32 #include <imsg.h> 33 34 #include "ldp.h" 35 36 #define CONF_FILE "/etc/ldpd.conf" 37 #define LDPD_SOCKET "/var/run/ldpd.sock" 38 #define LDPD_USER "_ldpd" 39 40 #define LDPD_OPT_VERBOSE 0x00000001 41 #define LDPD_OPT_VERBOSE2 0x00000002 42 #define LDPD_OPT_NOACTION 0x00000004 43 44 #define TCP_MD5_KEY_LEN 80 45 #define L2VPN_NAME_LEN 32 46 47 #define RT_BUF_SIZE 16384 48 #define MAX_RTSOCK_BUF 128 * 1024 49 #define LDP_BACKLOG 128 50 51 #define F_LDPD_INSERTED 0x0001 52 #define F_CONNECTED 0x0002 53 #define F_STATIC 0x0004 54 #define F_DYNAMIC 0x0008 55 #define F_REJECT 0x0010 56 #define F_BLACKHOLE 0x0020 57 #define F_REDISTRIBUTED 0x0040 58 59 struct evbuf { 60 struct msgbuf wbuf; 61 struct event ev; 62 }; 63 64 struct imsgev { 65 struct imsgbuf ibuf; 66 void (*handler)(int, short, void *); 67 struct event ev; 68 short events; 69 }; 70 71 enum imsg_type { 72 IMSG_NONE, 73 IMSG_CTL_RELOAD, 74 IMSG_CTL_SHOW_INTERFACE, 75 IMSG_CTL_SHOW_DISCOVERY, 76 IMSG_CTL_SHOW_NBR, 77 IMSG_CTL_SHOW_LIB, 78 IMSG_CTL_SHOW_L2VPN_PW, 79 IMSG_CTL_SHOW_L2VPN_BINDING, 80 IMSG_CTL_CLEAR_NBR, 81 IMSG_CTL_FIB_COUPLE, 82 IMSG_CTL_FIB_DECOUPLE, 83 IMSG_CTL_KROUTE, 84 IMSG_CTL_KROUTE_ADDR, 85 IMSG_CTL_IFINFO, 86 IMSG_CTL_END, 87 IMSG_CTL_LOG_VERBOSE, 88 IMSG_KLABEL_CHANGE, 89 IMSG_KLABEL_DELETE, 90 IMSG_KPWLABEL_CHANGE, 91 IMSG_KPWLABEL_DELETE, 92 IMSG_IFSTATUS, 93 IMSG_NEWADDR, 94 IMSG_DELADDR, 95 IMSG_LABEL_MAPPING, 96 IMSG_LABEL_MAPPING_FULL, 97 IMSG_LABEL_REQUEST, 98 IMSG_LABEL_RELEASE, 99 IMSG_LABEL_WITHDRAW, 100 IMSG_LABEL_ABORT, 101 IMSG_REQUEST_ADD, 102 IMSG_REQUEST_ADD_END, 103 IMSG_MAPPING_ADD, 104 IMSG_MAPPING_ADD_END, 105 IMSG_RELEASE_ADD, 106 IMSG_RELEASE_ADD_END, 107 IMSG_WITHDRAW_ADD, 108 IMSG_WITHDRAW_ADD_END, 109 IMSG_ADDRESS_ADD, 110 IMSG_ADDRESS_DEL, 111 IMSG_NOTIFICATION, 112 IMSG_NOTIFICATION_SEND, 113 IMSG_NEIGHBOR_UP, 114 IMSG_NEIGHBOR_DOWN, 115 IMSG_NETWORK_ADD, 116 IMSG_NETWORK_DEL, 117 IMSG_SOCKET_IPC, 118 IMSG_SOCKET_NET, 119 IMSG_CLOSE_SOCKETS, 120 IMSG_REQUEST_SOCKETS, 121 IMSG_SETUP_SOCKETS, 122 IMSG_RECONF_CONF, 123 IMSG_RECONF_IFACE, 124 IMSG_RECONF_TNBR, 125 IMSG_RECONF_NBRP, 126 IMSG_RECONF_L2VPN, 127 IMSG_RECONF_L2VPN_IF, 128 IMSG_RECONF_L2VPN_PW, 129 IMSG_RECONF_END 130 }; 131 132 union ldpd_addr { 133 struct in_addr v4; 134 struct in6_addr v6; 135 }; 136 137 #define IN6_IS_SCOPE_EMBED(a) \ 138 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 139 (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \ 140 (IN6_IS_ADDR_MC_INTFACELOCAL(a))) 141 142 /* interface states */ 143 #define IF_STA_DOWN 0x01 144 #define IF_STA_ACTIVE 0x02 145 146 /* targeted neighbor states */ 147 #define TNBR_STA_DOWN 0x01 148 #define TNBR_STA_ACTIVE 0x02 149 150 /* interface types */ 151 enum iface_type { 152 IF_TYPE_POINTOPOINT, 153 IF_TYPE_BROADCAST 154 }; 155 156 /* neighbor states */ 157 #define NBR_STA_PRESENT 0x0001 158 #define NBR_STA_INITIAL 0x0002 159 #define NBR_STA_OPENREC 0x0004 160 #define NBR_STA_OPENSENT 0x0008 161 #define NBR_STA_OPER 0x0010 162 #define NBR_STA_SESSION (NBR_STA_INITIAL | NBR_STA_OPENREC | \ 163 NBR_STA_OPENSENT | NBR_STA_OPER) 164 165 /* neighbor events */ 166 enum nbr_event { 167 NBR_EVT_NOTHING, 168 NBR_EVT_MATCH_ADJ, 169 NBR_EVT_CONNECT_UP, 170 NBR_EVT_CLOSE_SESSION, 171 NBR_EVT_INIT_RCVD, 172 NBR_EVT_KEEPALIVE_RCVD, 173 NBR_EVT_PDU_RCVD, 174 NBR_EVT_PDU_SENT, 175 NBR_EVT_INIT_SENT 176 }; 177 178 /* neighbor actions */ 179 enum nbr_action { 180 NBR_ACT_NOTHING, 181 NBR_ACT_RST_KTIMEOUT, 182 NBR_ACT_SESSION_EST, 183 NBR_ACT_RST_KTIMER, 184 NBR_ACT_CONNECT_SETUP, 185 NBR_ACT_PASSIVE_INIT, 186 NBR_ACT_KEEPALIVE_SEND, 187 NBR_ACT_CLOSE_SESSION 188 }; 189 190 TAILQ_HEAD(mapping_head, mapping_entry); 191 192 struct map { 193 uint8_t type; 194 uint32_t msg_id; 195 union { 196 struct { 197 uint16_t af; 198 union ldpd_addr prefix; 199 uint8_t prefixlen; 200 } prefix; 201 struct { 202 uint16_t type; 203 uint32_t pwid; 204 uint32_t group_id; 205 uint16_t ifmtu; 206 } pwid; 207 } fec; 208 struct { 209 uint32_t status_code; 210 uint32_t msg_id; 211 uint16_t msg_type; 212 } st; 213 uint32_t label; 214 uint32_t requestid; 215 uint32_t pw_status; 216 uint8_t flags; 217 }; 218 #define F_MAP_REQ_ID 0x01 /* optional request message id present */ 219 #define F_MAP_STATUS 0x02 /* status */ 220 #define F_MAP_PW_CWORD 0x04 /* pseudowire control word */ 221 #define F_MAP_PW_ID 0x08 /* pseudowire connection id */ 222 #define F_MAP_PW_IFMTU 0x10 /* pseudowire interface parameter */ 223 #define F_MAP_PW_STATUS 0x20 /* pseudowire status */ 224 225 struct notify_msg { 226 uint32_t status_code; 227 uint32_t msg_id; /* network byte order */ 228 uint16_t msg_type; /* network byte order */ 229 uint32_t pw_status; 230 struct map fec; 231 uint8_t flags; 232 }; 233 #define F_NOTIF_PW_STATUS 0x01 /* pseudowire status tlv present */ 234 #define F_NOTIF_FEC 0x02 /* fec tlv present */ 235 236 struct if_addr { 237 LIST_ENTRY(if_addr) entry; 238 int af; 239 union ldpd_addr addr; 240 uint8_t prefixlen; 241 union ldpd_addr dstbrd; 242 }; 243 LIST_HEAD(if_addr_head, if_addr); 244 245 struct iface_af { 246 struct iface *iface; 247 int af; 248 int enabled; 249 int state; 250 LIST_HEAD(, adj) adj_list; 251 time_t uptime; 252 struct event hello_timer; 253 uint16_t hello_holdtime; 254 uint16_t hello_interval; 255 }; 256 257 struct iface { 258 LIST_ENTRY(iface) entry; 259 char name[IF_NAMESIZE]; 260 unsigned int ifindex; 261 struct if_addr_head addr_list; 262 struct in6_addr linklocal; 263 enum iface_type type; 264 uint8_t if_type; 265 uint16_t flags; 266 uint8_t linkstate; 267 struct iface_af ipv4; 268 struct iface_af ipv6; 269 }; 270 271 /* source of targeted hellos */ 272 struct tnbr { 273 LIST_ENTRY(tnbr) entry; 274 struct event hello_timer; 275 struct adj *adj; 276 int af; 277 union ldpd_addr addr; 278 int state; 279 uint16_t hello_holdtime; 280 uint16_t hello_interval; 281 uint16_t pw_count; 282 uint8_t flags; 283 }; 284 #define F_TNBR_CONFIGURED 0x01 285 #define F_TNBR_DYNAMIC 0x02 286 287 enum auth_method { 288 AUTH_NONE, 289 AUTH_MD5SIG 290 }; 291 292 /* neighbor specific parameters */ 293 struct nbr_params { 294 LIST_ENTRY(nbr_params) entry; 295 struct in_addr lsr_id; 296 uint16_t keepalive; 297 int gtsm_enabled; 298 uint8_t gtsm_hops; 299 struct { 300 enum auth_method method; 301 char md5key[TCP_MD5_KEY_LEN]; 302 uint8_t md5key_len; 303 } auth; 304 uint8_t flags; 305 }; 306 #define F_NBRP_KEEPALIVE 0x01 307 #define F_NBRP_GTSM 0x02 308 #define F_NBRP_GTSM_HOPS 0x04 309 310 struct l2vpn_if { 311 LIST_ENTRY(l2vpn_if) entry; 312 struct l2vpn *l2vpn; 313 char ifname[IF_NAMESIZE]; 314 unsigned int ifindex; 315 uint16_t flags; 316 uint8_t link_state; 317 }; 318 319 struct l2vpn_pw { 320 LIST_ENTRY(l2vpn_pw) entry; 321 struct l2vpn *l2vpn; 322 struct in_addr lsr_id; 323 int af; 324 union ldpd_addr addr; 325 uint32_t pwid; 326 char ifname[IF_NAMESIZE]; 327 unsigned int ifindex; 328 uint32_t remote_group; 329 uint16_t remote_mtu; 330 uint32_t remote_status; 331 uint8_t flags; 332 }; 333 #define F_PW_STATUSTLV_CONF 0x01 /* status tlv configured */ 334 #define F_PW_STATUSTLV 0x02 /* status tlv negotiated */ 335 #define F_PW_CWORD_CONF 0x04 /* control word configured */ 336 #define F_PW_CWORD 0x08 /* control word negotiated */ 337 #define F_PW_STATUS_UP 0x10 /* pseudowire is operational */ 338 339 struct l2vpn { 340 LIST_ENTRY(l2vpn) entry; 341 char name[L2VPN_NAME_LEN]; 342 int type; 343 int pw_type; 344 int mtu; 345 char br_ifname[IF_NAMESIZE]; 346 unsigned int br_ifindex; 347 LIST_HEAD(, l2vpn_if) if_list; 348 LIST_HEAD(, l2vpn_pw) pw_list; 349 }; 350 #define L2VPN_TYPE_VPWS 1 351 #define L2VPN_TYPE_VPLS 2 352 353 /* ldp_conf */ 354 enum ldpd_process { 355 PROC_MAIN, 356 PROC_LDP_ENGINE, 357 PROC_LDE_ENGINE 358 } ldpd_process; 359 360 enum socket_type { 361 LDP_SOCKET_DISC, 362 LDP_SOCKET_EDISC, 363 LDP_SOCKET_SESSION 364 }; 365 366 enum hello_type { 367 HELLO_LINK, 368 HELLO_TARGETED 369 }; 370 371 struct ldpd_af_conf { 372 uint16_t keepalive; 373 uint16_t thello_holdtime; 374 uint16_t thello_interval; 375 union ldpd_addr trans_addr; 376 int flags; 377 }; 378 #define F_LDPD_AF_ENABLED 0x0001 379 #define F_LDPD_AF_THELLO_ACCEPT 0x0002 380 #define F_LDPD_AF_EXPNULL 0x0004 381 #define F_LDPD_AF_NO_GTSM 0x0008 382 383 struct ldpd_conf { 384 struct in_addr rtr_id; 385 struct ldpd_af_conf ipv4; 386 struct ldpd_af_conf ipv6; 387 LIST_HEAD(, iface) iface_list; 388 LIST_HEAD(, tnbr) tnbr_list; 389 LIST_HEAD(, nbr_params) nbrp_list; 390 LIST_HEAD(, l2vpn) l2vpn_list; 391 uint16_t trans_pref; 392 int flags; 393 }; 394 #define F_LDPD_NO_FIB_UPDATE 0x0001 395 #define F_LDPD_DS_CISCO_INTEROP 0x0002 396 397 struct ldpd_af_global { 398 struct event disc_ev; 399 struct event edisc_ev; 400 int ldp_disc_socket; 401 int ldp_edisc_socket; 402 int ldp_session_socket; 403 }; 404 405 struct ldpd_global { 406 int cmd_opts; 407 time_t uptime; 408 struct ldpd_af_global ipv4; 409 struct ldpd_af_global ipv6; 410 uint32_t conf_seqnum; 411 int pfkeysock; 412 struct if_addr_head addr_list; 413 LIST_HEAD(, adj) adj_list; 414 struct in_addr mcast_addr_v4; 415 struct in6_addr mcast_addr_v6; 416 TAILQ_HEAD(, pending_conn) pending_conns; 417 }; 418 419 /* kroute */ 420 struct kroute { 421 int af; 422 union ldpd_addr prefix; 423 uint8_t prefixlen; 424 union ldpd_addr nexthop; 425 uint32_t local_label; 426 uint32_t remote_label; 427 unsigned short ifindex; 428 uint8_t priority; 429 uint16_t flags; 430 }; 431 432 struct kpw { 433 unsigned short ifindex; 434 int pw_type; 435 int af; 436 union ldpd_addr nexthop; 437 uint32_t local_label; 438 uint32_t remote_label; 439 uint8_t flags; 440 }; 441 442 struct kaddr { 443 unsigned short ifindex; 444 int af; 445 union ldpd_addr addr; 446 uint8_t prefixlen; 447 union ldpd_addr dstbrd; 448 }; 449 450 struct kif { 451 char ifname[IF_NAMESIZE]; 452 unsigned short ifindex; 453 int flags; 454 uint8_t link_state; 455 int mtu; 456 uint8_t if_type; 457 uint64_t baudrate; 458 }; 459 460 /* control data structures */ 461 struct ctl_iface { 462 int af; 463 char name[IF_NAMESIZE]; 464 unsigned int ifindex; 465 int state; 466 uint16_t flags; 467 uint8_t linkstate; 468 enum iface_type type; 469 uint8_t if_type; 470 uint16_t hello_holdtime; 471 uint16_t hello_interval; 472 time_t uptime; 473 uint16_t adj_cnt; 474 }; 475 476 struct ctl_adj { 477 int af; 478 struct in_addr id; 479 enum hello_type type; 480 char ifname[IF_NAMESIZE]; 481 union ldpd_addr src_addr; 482 uint16_t holdtime; 483 union ldpd_addr trans_addr; 484 }; 485 486 struct ctl_nbr { 487 int af; 488 struct in_addr id; 489 union ldpd_addr laddr; 490 union ldpd_addr raddr; 491 time_t uptime; 492 int nbr_state; 493 }; 494 495 struct ctl_rt { 496 int af; 497 union ldpd_addr prefix; 498 uint8_t prefixlen; 499 struct in_addr nexthop; /* lsr-id */ 500 uint32_t local_label; 501 uint32_t remote_label; 502 uint8_t flags; 503 uint8_t in_use; 504 }; 505 506 struct ctl_pw { 507 uint16_t type; 508 char ifname[IF_NAMESIZE]; 509 uint32_t pwid; 510 struct in_addr lsr_id; 511 uint32_t local_label; 512 uint32_t local_gid; 513 uint16_t local_ifmtu; 514 uint32_t remote_label; 515 uint32_t remote_gid; 516 uint16_t remote_ifmtu; 517 uint32_t status; 518 }; 519 520 extern struct ldpd_conf *ldpd_conf; 521 extern struct ldpd_global global; 522 523 /* parse.y */ 524 struct ldpd_conf *parse_config(char *); 525 int cmdline_symset(char *); 526 527 /* kroute.c */ 528 int kif_init(void); 529 int kr_init(int); 530 void kif_redistribute(const char *); 531 int kr_change(struct kroute *); 532 int kr_delete(struct kroute *); 533 void kr_shutdown(void); 534 void kr_fib_couple(void); 535 void kr_fib_decouple(void); 536 void kr_change_egress_label(int, int); 537 void kr_show_route(struct imsg *); 538 void kr_ifinfo(char *, pid_t); 539 struct kif *kif_findname(char *); 540 void kif_clear(void); 541 int kmpw_set(struct kpw *); 542 int kmpw_unset(struct kpw *); 543 544 /* util.c */ 545 uint8_t mask2prefixlen(in_addr_t); 546 uint8_t mask2prefixlen6(struct sockaddr_in6 *); 547 in_addr_t prefixlen2mask(uint8_t); 548 struct in6_addr *prefixlen2mask6(uint8_t); 549 void ldp_applymask(int, union ldpd_addr *, 550 const union ldpd_addr *, int); 551 int ldp_addrcmp(int, const union ldpd_addr *, 552 const union ldpd_addr *); 553 int ldp_addrisset(int, const union ldpd_addr *); 554 int ldp_prefixcmp(int, const union ldpd_addr *, 555 const union ldpd_addr *, uint8_t); 556 int bad_addr_v4(struct in_addr); 557 int bad_addr_v6(struct in6_addr *); 558 int bad_addr(int, union ldpd_addr *); 559 void embedscope(struct sockaddr_in6 *); 560 void recoverscope(struct sockaddr_in6 *); 561 void addscope(struct sockaddr_in6 *, uint32_t); 562 void clearscope(struct in6_addr *); 563 struct sockaddr *addr2sa(int af, union ldpd_addr *, uint16_t); 564 void sa2addr(struct sockaddr *, int *, union ldpd_addr *); 565 566 /* ldpd.c */ 567 void main_imsg_compose_ldpe(int, pid_t, void *, uint16_t); 568 void main_imsg_compose_lde(int, pid_t, void *, uint16_t); 569 void imsg_event_add(struct imsgev *); 570 int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, pid_t, 571 int, void *, uint16_t); 572 void evbuf_enqueue(struct evbuf *, struct ibuf *); 573 void evbuf_event_add(struct evbuf *); 574 void evbuf_init(struct evbuf *, int, void (*)(int, short, void *), void *); 575 void evbuf_clear(struct evbuf *); 576 struct ldpd_af_conf *ldp_af_conf_get(struct ldpd_conf *, int); 577 struct ldpd_af_global *ldp_af_global_get(struct ldpd_global *, int); 578 int ldp_is_dual_stack(struct ldpd_conf *); 579 void merge_config(struct ldpd_conf *, struct ldpd_conf *); 580 struct ldpd_conf *config_new_empty(void); 581 void config_clear(struct ldpd_conf *); 582 583 /* socket.c */ 584 int ldp_create_socket(int, enum socket_type); 585 void sock_set_recvbuf(int); 586 int sock_set_reuse(int, int); 587 int sock_set_bindany(int, int); 588 int sock_set_ipv4_tos(int, int); 589 int sock_set_ipv4_recvif(int, int); 590 int sock_set_ipv4_minttl(int, int); 591 int sock_set_ipv4_ucast_ttl(int fd, int); 592 int sock_set_ipv4_mcast_ttl(int, uint8_t); 593 int sock_set_ipv4_mcast(struct iface *); 594 int sock_set_ipv4_mcast_loop(int); 595 int sock_set_ipv6_dscp(int, int); 596 int sock_set_ipv6_pktinfo(int, int); 597 int sock_set_ipv6_minhopcount(int, int); 598 int sock_set_ipv6_ucast_hops(int, int); 599 int sock_set_ipv6_mcast_hops(int, int); 600 int sock_set_ipv6_mcast(struct iface *); 601 int sock_set_ipv6_mcast_loop(int); 602 603 /* printconf.c */ 604 void print_config(struct ldpd_conf *); 605 606 #endif /* _LDPD_H_ */ 607