1 /* $OpenBSD$ */ 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 "queue.h" 26 #include "openbsd-tree.h" 27 #include "imsg.h" 28 #include "thread.h" 29 #include "qobj.h" 30 #include "prefix.h" 31 #include "filter.h" 32 #include "vty.h" 33 #include "pw.h" 34 #include "zclient.h" 35 36 #include "ldp.h" 37 38 #define CONF_FILE "/etc/ldpd.conf" 39 #define LDPD_USER "_ldpd" 40 41 #define LDPD_FD_ASYNC 3 42 #define LDPD_FD_SYNC 4 43 44 #define LDPD_OPT_VERBOSE 0x00000001 45 #define LDPD_OPT_VERBOSE2 0x00000002 46 #define LDPD_OPT_NOACTION 0x00000004 47 48 #define TCP_MD5_KEY_LEN 80 49 50 #define RT_BUF_SIZE 16384 51 #define MAX_RTSOCK_BUF 128 * 1024 52 #define LDP_BACKLOG 128 53 54 #define F_LDPD_INSERTED 0x0001 55 #define F_CONNECTED 0x0002 56 #define F_STATIC 0x0004 57 #define F_DYNAMIC 0x0008 58 #define F_REJECT 0x0010 59 #define F_BLACKHOLE 0x0020 60 #define F_REDISTRIBUTED 0x0040 61 62 struct evbuf { 63 struct msgbuf wbuf; 64 struct thread *ev; 65 int (*handler)(struct thread *); 66 void *arg; 67 }; 68 69 struct imsgev { 70 struct imsgbuf ibuf; 71 int (*handler_write)(struct thread *); 72 struct thread *ev_write; 73 int (*handler_read)(struct thread *); 74 struct thread *ev_read; 75 }; 76 77 enum imsg_type { 78 IMSG_NONE, 79 IMSG_CTL_RELOAD, 80 IMSG_CTL_SHOW_INTERFACE, 81 IMSG_CTL_SHOW_DISCOVERY, 82 IMSG_CTL_SHOW_DISCOVERY_DTL, 83 IMSG_CTL_SHOW_DISC_IFACE, 84 IMSG_CTL_SHOW_DISC_TNBR, 85 IMSG_CTL_SHOW_DISC_ADJ, 86 IMSG_CTL_SHOW_NBR, 87 IMSG_CTL_SHOW_NBR_DISC, 88 IMSG_CTL_SHOW_NBR_END, 89 IMSG_CTL_SHOW_LIB, 90 IMSG_CTL_SHOW_LIB_BEGIN, 91 IMSG_CTL_SHOW_LIB_SENT, 92 IMSG_CTL_SHOW_LIB_RCVD, 93 IMSG_CTL_SHOW_LIB_END, 94 IMSG_CTL_SHOW_L2VPN_PW, 95 IMSG_CTL_SHOW_L2VPN_BINDING, 96 IMSG_CTL_CLEAR_NBR, 97 IMSG_CTL_FIB_COUPLE, 98 IMSG_CTL_FIB_DECOUPLE, 99 IMSG_CTL_KROUTE, 100 IMSG_CTL_KROUTE_ADDR, 101 IMSG_CTL_IFINFO, 102 IMSG_CTL_END, 103 IMSG_CTL_LOG_VERBOSE, 104 IMSG_KLABEL_CHANGE, 105 IMSG_KLABEL_DELETE, 106 IMSG_KPW_ADD, 107 IMSG_KPW_DELETE, 108 IMSG_KPW_SET, 109 IMSG_KPW_UNSET, 110 IMSG_IFSTATUS, 111 IMSG_NEWADDR, 112 IMSG_DELADDR, 113 IMSG_RTRID_UPDATE, 114 IMSG_LABEL_MAPPING, 115 IMSG_LABEL_MAPPING_FULL, 116 IMSG_LABEL_REQUEST, 117 IMSG_LABEL_RELEASE, 118 IMSG_LABEL_WITHDRAW, 119 IMSG_LABEL_ABORT, 120 IMSG_REQUEST_ADD, 121 IMSG_REQUEST_ADD_END, 122 IMSG_MAPPING_ADD, 123 IMSG_MAPPING_ADD_END, 124 IMSG_RELEASE_ADD, 125 IMSG_RELEASE_ADD_END, 126 IMSG_WITHDRAW_ADD, 127 IMSG_WITHDRAW_ADD_END, 128 IMSG_ADDRESS_ADD, 129 IMSG_ADDRESS_DEL, 130 IMSG_NOTIFICATION, 131 IMSG_NOTIFICATION_SEND, 132 IMSG_NEIGHBOR_UP, 133 IMSG_NEIGHBOR_DOWN, 134 IMSG_NETWORK_ADD, 135 IMSG_NETWORK_UPDATE, 136 IMSG_SOCKET_IPC, 137 IMSG_SOCKET_NET, 138 IMSG_CLOSE_SOCKETS, 139 IMSG_REQUEST_SOCKETS, 140 IMSG_SETUP_SOCKETS, 141 IMSG_RECONF_CONF, 142 IMSG_RECONF_IFACE, 143 IMSG_RECONF_TNBR, 144 IMSG_RECONF_NBRP, 145 IMSG_RECONF_L2VPN, 146 IMSG_RECONF_L2VPN_IF, 147 IMSG_RECONF_L2VPN_PW, 148 IMSG_RECONF_L2VPN_IPW, 149 IMSG_RECONF_END, 150 IMSG_DEBUG_UPDATE, 151 IMSG_LOG, 152 IMSG_ACL_CHECK, 153 IMSG_INIT, 154 IMSG_PW_UPDATE, 155 IMSG_FILTER_UPDATE, 156 IMSG_NBR_SHUTDOWN 157 }; 158 159 struct ldpd_init { 160 char user[256]; 161 char group[256]; 162 char ctl_sock_path[MAXPATHLEN]; 163 char zclient_serv_path[MAXPATHLEN]; 164 unsigned short instance; 165 }; 166 167 struct ldp_access { 168 char name[ACL_NAMSIZ]; 169 enum access_type type; 170 }; 171 172 union ldpd_addr { 173 struct in_addr v4; 174 struct in6_addr v6; 175 }; 176 177 #define IN6_IS_SCOPE_EMBED(a) \ 178 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 179 (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \ 180 (IN6_IS_ADDR_MC_INTFACELOCAL(a))) 181 182 /* interface states */ 183 #define IF_STA_DOWN 0x01 184 #define IF_STA_ACTIVE 0x02 185 186 /* targeted neighbor states */ 187 #define TNBR_STA_DOWN 0x01 188 #define TNBR_STA_ACTIVE 0x02 189 190 /* interface types */ 191 enum iface_type { 192 IF_TYPE_POINTOPOINT, 193 IF_TYPE_BROADCAST 194 }; 195 196 /* neighbor states */ 197 #define NBR_STA_PRESENT 0x0001 198 #define NBR_STA_INITIAL 0x0002 199 #define NBR_STA_OPENREC 0x0004 200 #define NBR_STA_OPENSENT 0x0008 201 #define NBR_STA_OPER 0x0010 202 #define NBR_STA_SESSION (NBR_STA_INITIAL | NBR_STA_OPENREC | \ 203 NBR_STA_OPENSENT | NBR_STA_OPER) 204 205 /* neighbor events */ 206 enum nbr_event { 207 NBR_EVT_NOTHING, 208 NBR_EVT_MATCH_ADJ, 209 NBR_EVT_CONNECT_UP, 210 NBR_EVT_CLOSE_SESSION, 211 NBR_EVT_INIT_RCVD, 212 NBR_EVT_KEEPALIVE_RCVD, 213 NBR_EVT_PDU_RCVD, 214 NBR_EVT_PDU_SENT, 215 NBR_EVT_INIT_SENT 216 }; 217 218 /* neighbor actions */ 219 enum nbr_action { 220 NBR_ACT_NOTHING, 221 NBR_ACT_RST_KTIMEOUT, 222 NBR_ACT_SESSION_EST, 223 NBR_ACT_RST_KTIMER, 224 NBR_ACT_CONNECT_SETUP, 225 NBR_ACT_PASSIVE_INIT, 226 NBR_ACT_KEEPALIVE_SEND, 227 NBR_ACT_CLOSE_SESSION 228 }; 229 230 /* forward declarations */ 231 RB_HEAD(global_adj_head, adj); 232 RB_HEAD(nbr_adj_head, adj); 233 RB_HEAD(ia_adj_head, adj); 234 235 struct map { 236 uint8_t type; 237 uint32_t msg_id; 238 union { 239 struct { 240 uint16_t af; 241 union ldpd_addr prefix; 242 uint8_t prefixlen; 243 } prefix; 244 struct { 245 uint16_t type; 246 uint32_t pwid; 247 uint32_t group_id; 248 uint16_t ifmtu; 249 } pwid; 250 struct { 251 uint8_t type; 252 union { 253 uint16_t prefix_af; 254 uint16_t pw_type; 255 } u; 256 } twcard; 257 } fec; 258 struct { 259 uint32_t status_code; 260 uint32_t msg_id; 261 uint16_t msg_type; 262 } st; 263 uint32_t label; 264 uint32_t requestid; 265 uint32_t pw_status; 266 uint8_t flags; 267 }; 268 #define F_MAP_REQ_ID 0x01 /* optional request message id present */ 269 #define F_MAP_STATUS 0x02 /* status */ 270 #define F_MAP_PW_CWORD 0x04 /* pseudowire control word */ 271 #define F_MAP_PW_ID 0x08 /* pseudowire connection id */ 272 #define F_MAP_PW_IFMTU 0x10 /* pseudowire interface parameter */ 273 #define F_MAP_PW_STATUS 0x20 /* pseudowire status */ 274 275 struct notify_msg { 276 uint32_t status_code; 277 uint32_t msg_id; /* network byte order */ 278 uint16_t msg_type; /* network byte order */ 279 uint32_t pw_status; 280 struct map fec; 281 struct { 282 uint16_t type; 283 uint16_t length; 284 char *data; 285 } rtlvs; 286 uint8_t flags; 287 }; 288 #define F_NOTIF_PW_STATUS 0x01 /* pseudowire status tlv present */ 289 #define F_NOTIF_FEC 0x02 /* fec tlv present */ 290 #define F_NOTIF_RETURNED_TLVS 0x04 /* returned tlvs present */ 291 292 struct if_addr { 293 LIST_ENTRY(if_addr) entry; 294 int af; 295 union ldpd_addr addr; 296 uint8_t prefixlen; 297 union ldpd_addr dstbrd; 298 }; 299 LIST_HEAD(if_addr_head, if_addr); 300 301 struct iface_af { 302 struct iface *iface; 303 int af; 304 int enabled; 305 int state; 306 struct ia_adj_head adj_tree; 307 time_t uptime; 308 struct thread *hello_timer; 309 uint16_t hello_holdtime; 310 uint16_t hello_interval; 311 }; 312 313 struct iface { 314 RB_ENTRY(iface) entry; 315 char name[IF_NAMESIZE]; 316 ifindex_t ifindex; 317 struct if_addr_head addr_list; 318 struct in6_addr linklocal; 319 enum iface_type type; 320 int operative; 321 struct iface_af ipv4; 322 struct iface_af ipv6; 323 QOBJ_FIELDS 324 }; 325 RB_HEAD(iface_head, iface); 326 RB_PROTOTYPE(iface_head, iface, entry, iface_compare); 327 DECLARE_QOBJ_TYPE(iface) 328 329 /* source of targeted hellos */ 330 struct tnbr { 331 RB_ENTRY(tnbr) entry; 332 struct thread *hello_timer; 333 struct adj *adj; 334 int af; 335 union ldpd_addr addr; 336 int state; 337 uint16_t pw_count; 338 uint8_t flags; 339 QOBJ_FIELDS 340 }; 341 RB_HEAD(tnbr_head, tnbr); 342 RB_PROTOTYPE(tnbr_head, tnbr, entry, tnbr_compare); 343 DECLARE_QOBJ_TYPE(tnbr) 344 #define F_TNBR_CONFIGURED 0x01 345 #define F_TNBR_DYNAMIC 0x02 346 347 enum auth_method { 348 AUTH_NONE, 349 AUTH_MD5SIG 350 }; 351 352 /* neighbor specific parameters */ 353 struct nbr_params { 354 RB_ENTRY(nbr_params) entry; 355 struct in_addr lsr_id; 356 uint16_t keepalive; 357 int gtsm_enabled; 358 uint8_t gtsm_hops; 359 struct { 360 enum auth_method method; 361 char md5key[TCP_MD5_KEY_LEN]; 362 uint8_t md5key_len; 363 } auth; 364 uint8_t flags; 365 QOBJ_FIELDS 366 }; 367 RB_HEAD(nbrp_head, nbr_params); 368 RB_PROTOTYPE(nbrp_head, nbr_params, entry, nbr_params_compare); 369 DECLARE_QOBJ_TYPE(nbr_params) 370 #define F_NBRP_KEEPALIVE 0x01 371 #define F_NBRP_GTSM 0x02 372 #define F_NBRP_GTSM_HOPS 0x04 373 374 struct ldp_stats { 375 uint32_t kalive_sent; 376 uint32_t kalive_rcvd; 377 uint32_t addr_sent; 378 uint32_t addr_rcvd; 379 uint32_t addrwdraw_sent; 380 uint32_t addrwdraw_rcvd; 381 uint32_t notif_sent; 382 uint32_t notif_rcvd; 383 uint32_t capability_sent; 384 uint32_t capability_rcvd; 385 uint32_t labelmap_sent; 386 uint32_t labelmap_rcvd; 387 uint32_t labelreq_sent; 388 uint32_t labelreq_rcvd; 389 uint32_t labelwdraw_sent; 390 uint32_t labelwdraw_rcvd; 391 uint32_t labelrel_sent; 392 uint32_t labelrel_rcvd; 393 uint32_t labelabreq_sent; 394 uint32_t labelabreq_rcvd; 395 }; 396 397 struct l2vpn_if { 398 RB_ENTRY(l2vpn_if) entry; 399 struct l2vpn *l2vpn; 400 char ifname[IF_NAMESIZE]; 401 ifindex_t ifindex; 402 int operative; 403 uint8_t mac[ETH_ALEN]; 404 QOBJ_FIELDS 405 }; 406 RB_HEAD(l2vpn_if_head, l2vpn_if); 407 RB_PROTOTYPE(l2vpn_if_head, l2vpn_if, entry, l2vpn_if_compare); 408 DECLARE_QOBJ_TYPE(l2vpn_if) 409 410 struct l2vpn_pw { 411 RB_ENTRY(l2vpn_pw) entry; 412 struct l2vpn *l2vpn; 413 struct in_addr lsr_id; 414 int af; 415 union ldpd_addr addr; 416 uint32_t pwid; 417 char ifname[IF_NAMESIZE]; 418 ifindex_t ifindex; 419 bool enabled; 420 uint32_t remote_group; 421 uint16_t remote_mtu; 422 uint32_t local_status; 423 uint32_t remote_status; 424 uint8_t flags; 425 uint8_t reason; 426 QOBJ_FIELDS 427 }; 428 RB_HEAD(l2vpn_pw_head, l2vpn_pw); 429 RB_PROTOTYPE(l2vpn_pw_head, l2vpn_pw, entry, l2vpn_pw_compare); 430 DECLARE_QOBJ_TYPE(l2vpn_pw) 431 #define F_PW_STATUSTLV_CONF 0x01 /* status tlv configured */ 432 #define F_PW_STATUSTLV 0x02 /* status tlv negotiated */ 433 #define F_PW_CWORD_CONF 0x04 /* control word configured */ 434 #define F_PW_CWORD 0x08 /* control word negotiated */ 435 #define F_PW_STATIC_NBR_ADDR 0x10 /* static neighbor address configured */ 436 437 #define F_PW_NO_ERR 0x00 /* no error reported */ 438 #define F_PW_LOCAL_NOT_FWD 0x01 /* locally can't forward over PW */ 439 #define F_PW_REMOTE_NOT_FWD 0x02 /* remote end of PW reported fwd error*/ 440 #define F_PW_NO_REMOTE_LABEL 0x03 /* have not recvd label from peer */ 441 #define F_PW_MTU_MISMATCH 0x04 /* mtu mismatch between peers */ 442 443 struct l2vpn { 444 RB_ENTRY(l2vpn) entry; 445 char name[L2VPN_NAME_LEN]; 446 int type; 447 int pw_type; 448 int mtu; 449 char br_ifname[IF_NAMESIZE]; 450 ifindex_t br_ifindex; 451 struct l2vpn_if_head if_tree; 452 struct l2vpn_pw_head pw_tree; 453 struct l2vpn_pw_head pw_inactive_tree; 454 QOBJ_FIELDS 455 }; 456 RB_HEAD(l2vpn_head, l2vpn); 457 RB_PROTOTYPE(l2vpn_head, l2vpn, entry, l2vpn_compare); 458 DECLARE_QOBJ_TYPE(l2vpn) 459 #define L2VPN_TYPE_VPWS 1 460 #define L2VPN_TYPE_VPLS 2 461 462 /* ldp_conf */ 463 extern enum ldpd_process { 464 PROC_MAIN, 465 PROC_LDP_ENGINE, 466 PROC_LDE_ENGINE 467 } ldpd_process; 468 469 static const char * const log_procnames[] = { 470 "parent", 471 "ldpe", 472 "lde" 473 }; 474 475 enum socket_type { 476 LDP_SOCKET_DISC, 477 LDP_SOCKET_EDISC, 478 LDP_SOCKET_SESSION 479 }; 480 481 enum hello_type { 482 HELLO_LINK, 483 HELLO_TARGETED 484 }; 485 486 struct ldpd_af_conf { 487 uint16_t keepalive; 488 uint16_t lhello_holdtime; 489 uint16_t lhello_interval; 490 uint16_t thello_holdtime; 491 uint16_t thello_interval; 492 union ldpd_addr trans_addr; 493 char acl_thello_accept_from[ACL_NAMSIZ]; 494 char acl_label_allocate_for[ACL_NAMSIZ]; 495 char acl_label_advertise_to[ACL_NAMSIZ]; 496 char acl_label_advertise_for[ACL_NAMSIZ]; 497 char acl_label_expnull_for[ACL_NAMSIZ]; 498 char acl_label_accept_from[ACL_NAMSIZ]; 499 char acl_label_accept_for[ACL_NAMSIZ]; 500 int flags; 501 }; 502 #define F_LDPD_AF_ENABLED 0x0001 503 #define F_LDPD_AF_THELLO_ACCEPT 0x0002 504 #define F_LDPD_AF_EXPNULL 0x0004 505 #define F_LDPD_AF_NO_GTSM 0x0008 506 #define F_LDPD_AF_ALLOCHOSTONLY 0x0010 507 508 struct ldpd_conf { 509 struct in_addr rtr_id; 510 struct ldpd_af_conf ipv4; 511 struct ldpd_af_conf ipv6; 512 struct iface_head iface_tree; 513 struct tnbr_head tnbr_tree; 514 struct nbrp_head nbrp_tree; 515 struct l2vpn_head l2vpn_tree; 516 uint16_t lhello_holdtime; 517 uint16_t lhello_interval; 518 uint16_t thello_holdtime; 519 uint16_t thello_interval; 520 uint16_t trans_pref; 521 int flags; 522 QOBJ_FIELDS 523 }; 524 DECLARE_QOBJ_TYPE(ldpd_conf) 525 #define F_LDPD_NO_FIB_UPDATE 0x0001 526 #define F_LDPD_DS_CISCO_INTEROP 0x0002 527 #define F_LDPD_ENABLED 0x0004 528 #define F_LDPD_ORDERED_CONTROL 0x0008 529 530 531 struct ldpd_af_global { 532 struct thread *disc_ev; 533 struct thread *edisc_ev; 534 int ldp_disc_socket; 535 int ldp_edisc_socket; 536 int ldp_session_socket; 537 }; 538 539 struct ldpd_global { 540 int cmd_opts; 541 struct in_addr rtr_id; 542 struct ldpd_af_global ipv4; 543 struct ldpd_af_global ipv6; 544 uint32_t conf_seqnum; 545 int pfkeysock; 546 struct if_addr_head addr_list; 547 struct global_adj_head adj_tree; 548 struct in_addr mcast_addr_v4; 549 struct in6_addr mcast_addr_v6; 550 TAILQ_HEAD(, pending_conn) pending_conns; 551 }; 552 553 /* kroute */ 554 struct kroute { 555 int af; 556 union ldpd_addr prefix; 557 uint8_t prefixlen; 558 union ldpd_addr nexthop; 559 uint32_t local_label; 560 uint32_t remote_label; 561 ifindex_t ifindex; 562 uint8_t route_type; 563 uint8_t route_instance; 564 uint16_t flags; 565 }; 566 567 struct kaddr { 568 char ifname[IF_NAMESIZE]; 569 ifindex_t ifindex; 570 int af; 571 union ldpd_addr addr; 572 uint8_t prefixlen; 573 union ldpd_addr dstbrd; 574 }; 575 576 struct kif { 577 char ifname[IF_NAMESIZE]; 578 ifindex_t ifindex; 579 int flags; 580 int operative; 581 uint8_t mac[ETH_ALEN]; 582 int mtu; 583 }; 584 585 struct acl_check { 586 char acl[ACL_NAMSIZ]; 587 int af; 588 union ldpd_addr addr; 589 uint8_t prefixlen; 590 }; 591 592 /* control data structures */ 593 struct ctl_iface { 594 int af; 595 char name[IF_NAMESIZE]; 596 ifindex_t ifindex; 597 int state; 598 enum iface_type type; 599 uint16_t hello_holdtime; 600 uint16_t hello_interval; 601 time_t uptime; 602 uint16_t adj_cnt; 603 }; 604 605 struct ctl_disc_if { 606 char name[IF_NAMESIZE]; 607 int active_v4; 608 int active_v6; 609 int no_adj; 610 }; 611 612 struct ctl_disc_tnbr { 613 int af; 614 union ldpd_addr addr; 615 int no_adj; 616 }; 617 618 struct ctl_adj { 619 int af; 620 struct in_addr id; 621 enum hello_type type; 622 char ifname[IF_NAMESIZE]; 623 union ldpd_addr src_addr; 624 uint16_t holdtime; 625 uint16_t holdtime_remaining; 626 union ldpd_addr trans_addr; 627 int ds_tlv; 628 }; 629 630 struct ctl_nbr { 631 int af; 632 struct in_addr id; 633 union ldpd_addr laddr; 634 in_port_t lport; 635 union ldpd_addr raddr; 636 in_port_t rport; 637 enum auth_method auth_method; 638 uint16_t holdtime; 639 time_t uptime; 640 int nbr_state; 641 struct ldp_stats stats; 642 int flags; 643 }; 644 645 struct ctl_rt { 646 int af; 647 union ldpd_addr prefix; 648 uint8_t prefixlen; 649 struct in_addr nexthop; /* lsr-id */ 650 uint32_t local_label; 651 uint32_t remote_label; 652 uint8_t flags; 653 uint8_t in_use; 654 int no_downstream; 655 }; 656 657 struct ctl_pw { 658 uint16_t type; 659 char l2vpn_name[L2VPN_NAME_LEN]; 660 char ifname[IF_NAMESIZE]; 661 uint32_t pwid; 662 struct in_addr lsr_id; 663 uint32_t local_label; 664 uint32_t local_gid; 665 uint16_t local_ifmtu; 666 uint8_t local_cword; 667 uint32_t remote_label; 668 uint32_t remote_gid; 669 uint16_t remote_ifmtu; 670 uint8_t remote_cword; 671 uint32_t status; 672 uint8_t reason; 673 }; 674 675 extern struct ldpd_conf *ldpd_conf, *vty_conf; 676 extern struct ldpd_global global; 677 extern struct ldpd_init init; 678 679 /* parse.y */ 680 struct ldpd_conf *parse_config(char *); 681 int cmdline_symset(char *); 682 683 /* kroute.c */ 684 void pw2zpw(struct l2vpn_pw *, struct zapi_pw *); 685 void kif_redistribute(const char *); 686 int kr_change(struct kroute *); 687 int kr_delete(struct kroute *); 688 int kmpw_add(struct zapi_pw *); 689 int kmpw_del(struct zapi_pw *); 690 int kmpw_set(struct zapi_pw *); 691 int kmpw_unset(struct zapi_pw *); 692 693 /* util.c */ 694 uint8_t mask2prefixlen(in_addr_t); 695 uint8_t mask2prefixlen6(struct sockaddr_in6 *); 696 in_addr_t prefixlen2mask(uint8_t); 697 struct in6_addr *prefixlen2mask6(uint8_t); 698 void ldp_applymask(int, union ldpd_addr *, 699 const union ldpd_addr *, int); 700 int ldp_addrcmp(int, const union ldpd_addr *, 701 const union ldpd_addr *); 702 int ldp_addrisset(int, const union ldpd_addr *); 703 int ldp_prefixcmp(int, const union ldpd_addr *, 704 const union ldpd_addr *, uint8_t); 705 int bad_addr_v4(struct in_addr); 706 int bad_addr_v6(struct in6_addr *); 707 int bad_addr(int, union ldpd_addr *); 708 void embedscope(struct sockaddr_in6 *); 709 void recoverscope(struct sockaddr_in6 *); 710 void addscope(struct sockaddr_in6 *, uint32_t); 711 void clearscope(struct in6_addr *); 712 void addr2sa(int af, const union ldpd_addr *, uint16_t, 713 union sockunion *su); 714 void sa2addr(struct sockaddr *, int *, union ldpd_addr *, 715 in_port_t *); 716 socklen_t sockaddr_len(struct sockaddr *); 717 718 /* ldpd.c */ 719 int ldp_write_handler(struct thread *); 720 void main_imsg_compose_ldpe(int, pid_t, void *, uint16_t); 721 void main_imsg_compose_lde(int, pid_t, void *, uint16_t); 722 int main_imsg_compose_both(enum imsg_type, void *, 723 uint16_t); 724 void imsg_event_add(struct imsgev *); 725 int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, 726 pid_t, int, void *, uint16_t); 727 void evbuf_enqueue(struct evbuf *, struct ibuf *); 728 void evbuf_event_add(struct evbuf *); 729 void evbuf_init(struct evbuf *, int, 730 int (*)(struct thread *), void *); 731 void evbuf_clear(struct evbuf *); 732 int ldp_acl_request(struct imsgev *, char *, int, 733 union ldpd_addr *, uint8_t); 734 void ldp_acl_reply(struct imsgev *, struct acl_check *); 735 struct ldpd_af_conf *ldp_af_conf_get(struct ldpd_conf *, int); 736 struct ldpd_af_global *ldp_af_global_get(struct ldpd_global *, int); 737 int ldp_is_dual_stack(struct ldpd_conf *); 738 in_addr_t ldp_rtr_id_get(struct ldpd_conf *); 739 int ldp_config_apply(struct vty *, struct ldpd_conf *); 740 void ldp_clear_config(struct ldpd_conf *); 741 void merge_config(struct ldpd_conf *, struct ldpd_conf *); 742 struct ldpd_conf *config_new_empty(void); 743 void config_clear(struct ldpd_conf *); 744 745 /* ldp_vty_conf.c */ 746 /* NOTE: the parameters' names should be preserved because of codegen */ 747 struct iface *iface_new_api(struct ldpd_conf *conf, 748 const char *name); 749 void iface_del_api(struct ldpd_conf *conf, 750 struct iface *iface); 751 struct tnbr *tnbr_new_api(struct ldpd_conf *conf, int af, 752 union ldpd_addr *addr); 753 void tnbr_del_api(struct ldpd_conf *conf, struct tnbr *tnbr); 754 struct nbr_params *nbrp_new_api(struct ldpd_conf *conf, 755 struct in_addr lsr_id); 756 void nbrp_del_api(struct ldpd_conf *conf, 757 struct nbr_params *nbrp); 758 struct l2vpn *l2vpn_new_api(struct ldpd_conf *conf, const char *name); 759 void l2vpn_del_api(struct ldpd_conf *conf, 760 struct l2vpn *l2vpn); 761 struct l2vpn_if *l2vpn_if_new_api(struct ldpd_conf *conf, 762 struct l2vpn *l2vpn, const char *ifname); 763 void l2vpn_if_del_api(struct l2vpn *l2vpn, 764 struct l2vpn_if *lif); 765 struct l2vpn_pw *l2vpn_pw_new_api(struct ldpd_conf *conf, 766 struct l2vpn *l2vpn, const char *ifname); 767 void l2vpn_pw_del_api(struct l2vpn *l2vpn, 768 struct l2vpn_pw *pw); 769 770 /* socket.c */ 771 int ldp_create_socket(int, enum socket_type); 772 void sock_set_nonblock(int); 773 void sock_set_cloexec(int); 774 void sock_set_recvbuf(int); 775 int sock_set_reuse(int, int); 776 int sock_set_bindany(int, int); 777 int sock_set_md5sig(int, int, union ldpd_addr *, const char *); 778 int sock_set_ipv4_tos(int, int); 779 int sock_set_ipv4_pktinfo(int, int); 780 int sock_set_ipv4_recvdstaddr(int fd, ifindex_t ifindex); 781 int sock_set_ipv4_recvif(int, int); 782 int sock_set_ipv4_minttl(int, int); 783 int sock_set_ipv4_ucast_ttl(int fd, int); 784 int sock_set_ipv4_mcast_ttl(int, uint8_t); 785 int sock_set_ipv4_mcast(struct iface *); 786 int sock_set_ipv4_mcast_loop(int); 787 int sock_set_ipv6_dscp(int, int); 788 int sock_set_ipv6_pktinfo(int, int); 789 int sock_set_ipv6_minhopcount(int, int); 790 int sock_set_ipv6_ucast_hops(int, int); 791 int sock_set_ipv6_mcast_hops(int, int); 792 int sock_set_ipv6_mcast(struct iface *); 793 int sock_set_ipv6_mcast_loop(int); 794 795 /* logmsg.h */ 796 struct in6_addr; 797 union ldpd_addr; 798 struct hello_source; 799 struct fec; 800 801 const char *log_sockaddr(void *); 802 const char *log_in6addr(const struct in6_addr *); 803 const char *log_in6addr_scope(const struct in6_addr *addr, 804 ifindex_t ifidx); 805 const char *log_addr(int, const union ldpd_addr *); 806 char *log_label(uint32_t); 807 const char *log_time(time_t); 808 char *log_hello_src(const struct hello_source *); 809 const char *log_map(const struct map *); 810 const char *log_fec(const struct fec *); 811 const char *af_name(int); 812 const char *socket_name(int); 813 const char *nbr_state_name(int); 814 const char *if_state_name(int); 815 const char *if_type_name(enum iface_type); 816 const char *msg_name(uint16_t); 817 const char *status_code_name(uint32_t); 818 const char *pw_type_name(uint16_t); 819 const char *pw_error_code(uint8_t); 820 821 /* quagga */ 822 extern struct thread_master *master; 823 extern char ctl_sock_path[MAXPATHLEN]; 824 825 /* ldp_zebra.c */ 826 void ldp_zebra_init(struct thread_master *); 827 void ldp_zebra_destroy(void); 828 829 /* compatibility */ 830 #ifndef __OpenBSD__ 831 #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 832 #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 833 #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \ 834 (IN6_IS_ADDR_MULTICAST(a) && \ 835 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_INTFACELOCAL)) 836 #endif 837 838 #endif /* _LDPD_H_ */ 839