1 /* $OpenBSD: bgpd.h,v 1.258 2010/05/03 13:09:38 claudio Exp $ */ 2 3 /* 4 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 #ifndef __BGPD_H__ 19 #define __BGPD_H__ 20 21 #include <sys/types.h> 22 #include <sys/socket.h> 23 #include <sys/queue.h> 24 #include <net/route.h> 25 #include <netinet/in.h> 26 #include <arpa/inet.h> 27 #include <net/if.h> 28 #include <net/pfkeyv2.h> 29 30 #include <poll.h> 31 #include <stdarg.h> 32 33 #include <imsg.h> 34 35 #define BGP_VERSION 4 36 #define BGP_PORT 179 37 #define CONFFILE "/etc/bgpd.conf" 38 #define BGPD_USER "_bgpd" 39 #define PEER_DESCR_LEN 32 40 #define PFTABLE_LEN 16 41 #define TCP_MD5_KEY_LEN 80 42 #define IPSEC_ENC_KEY_LEN 32 43 #define IPSEC_AUTH_KEY_LEN 20 44 45 #define MAX_PKTSIZE 4096 46 #define MIN_HOLDTIME 3 47 #define READ_BUF_SIZE 65535 48 #define RT_BUF_SIZE 16384 49 #define MAX_RTSOCK_BUF 128 * 1024 50 51 #define BGPD_OPT_VERBOSE 0x0001 52 #define BGPD_OPT_VERBOSE2 0x0002 53 #define BGPD_OPT_NOACTION 0x0004 54 #define BGPD_OPT_FORCE_DEMOTE 0x0008 55 56 #define BGPD_FLAG_NO_EVALUATE 0x0002 57 #define BGPD_FLAG_REFLECTOR 0x0004 58 #define BGPD_FLAG_REDIST_STATIC 0x0008 59 #define BGPD_FLAG_REDIST_CONNECTED 0x0010 60 #define BGPD_FLAG_REDIST6_STATIC 0x0020 61 #define BGPD_FLAG_REDIST6_CONNECTED 0x0040 62 #define BGPD_FLAG_NEXTHOP_BGP 0x0080 63 #define BGPD_FLAG_NEXTHOP_DEFAULT 0x1000 64 #define BGPD_FLAG_DECISION_MASK 0x0f00 65 #define BGPD_FLAG_DECISION_ROUTEAGE 0x0100 66 #define BGPD_FLAG_DECISION_TRANS_AS 0x0200 67 #define BGPD_FLAG_DECISION_MED_ALWAYS 0x0400 68 69 #define BGPD_LOG_UPDATES 0x0001 70 71 #define SOCKET_NAME "/var/run/bgpd.sock" 72 73 #define F_BGPD_INSERTED 0x0001 74 #define F_KERNEL 0x0002 75 #define F_CONNECTED 0x0004 76 #define F_NEXTHOP 0x0008 77 #define F_DOWN 0x0010 78 #define F_STATIC 0x0020 79 #define F_DYNAMIC 0x0040 80 #define F_REJECT 0x0080 81 #define F_BLACKHOLE 0x0100 82 #define F_LONGER 0x0200 83 #define F_CTL_DETAIL 0x1000 /* only used by bgpctl */ 84 #define F_CTL_ADJ_IN 0x2000 85 #define F_CTL_ADJ_OUT 0x4000 86 87 /* 88 * Limit the number of control messages generated by the RDE and queued in 89 * session engine. The RDE limit defines how many imsg are generated in 90 * one poll round. Then if the SE limit is hit the RDE control socket will no 91 * longer be polled. 92 */ 93 #define RDE_RUNNER_ROUNDS 100 94 #define SESSION_CTL_QUEUE_MAX 10000 95 96 enum { 97 PROC_MAIN, 98 PROC_SE, 99 PROC_RDE 100 } bgpd_process; 101 102 enum reconf_action { 103 RECONF_NONE, 104 RECONF_KEEP, 105 RECONF_REINIT, 106 RECONF_DELETE 107 }; 108 109 /* Address Family Numbers as per RFC 1700 */ 110 #define AFI_UNSPEC 0 111 #define AFI_IPv4 1 112 #define AFI_IPv6 2 113 114 /* Subsequent Address Family Identifier as per RFC 4760 */ 115 #define SAFI_NONE 0 116 #define SAFI_UNICAST 1 117 #define SAFI_MULTICAST 2 118 #define SAFI_MPLS 4 119 #define SAFI_MPLSVPN 128 120 121 struct aid { 122 u_int16_t afi; 123 sa_family_t af; 124 u_int8_t safi; 125 char *name; 126 }; 127 128 extern const struct aid aid_vals[]; 129 130 #define AID_UNSPEC 0 131 #define AID_INET 1 132 #define AID_INET6 2 133 #define AID_VPN_IPv4 3 134 #define AID_MAX 4 135 136 #define AID_VALS { \ 137 /* afi, af, safii, name */ \ 138 { AFI_UNSPEC, AF_UNSPEC, SAFI_NONE, "unspec"}, \ 139 { AFI_IPv4, AF_INET, SAFI_UNICAST, "IPv4 unicast" }, \ 140 { AFI_IPv6, AF_INET6, SAFI_UNICAST, "IPv6 unicast" }, \ 141 { AFI_IPv4, AF_INET, SAFI_MPLSVPN, "IPv4 vpn" } \ 142 } 143 144 #define AID_PTSIZE { \ 145 0, \ 146 sizeof(struct pt_entry4), \ 147 sizeof(struct pt_entry6), \ 148 sizeof(struct pt_entry_vpn4) \ 149 } 150 151 struct vpn4_addr { 152 u_int64_t rd; 153 struct in_addr addr; 154 u_int8_t labelstack[21]; /* max that makes sense */ 155 u_int8_t labellen; 156 u_int8_t pad1; 157 u_int8_t pad2; 158 }; 159 160 #define BGP_MPLS_BOS 0x01 161 162 struct bgpd_addr { 163 union { 164 struct in_addr v4; 165 struct in6_addr v6; 166 struct vpn4_addr vpn4; 167 /* maximum size for a prefix is 256 bits */ 168 u_int8_t addr8[32]; 169 u_int16_t addr16[16]; 170 u_int32_t addr32[8]; 171 } ba; /* 128-bit address */ 172 u_int32_t scope_id; /* iface scope id for v6 */ 173 u_int8_t aid; 174 #define v4 ba.v4 175 #define v6 ba.v6 176 #define vpn4 ba.vpn4 177 #define addr8 ba.addr8 178 #define addr16 ba.addr16 179 #define addr32 ba.addr32 180 }; 181 182 #define DEFAULT_LISTENER 0x01 183 #define LISTENER_LISTENING 0x02 184 185 struct listen_addr { 186 TAILQ_ENTRY(listen_addr) entry; 187 struct sockaddr_storage sa; 188 int fd; 189 enum reconf_action reconf; 190 u_int8_t flags; 191 }; 192 193 TAILQ_HEAD(listen_addrs, listen_addr); 194 TAILQ_HEAD(filter_set_head, filter_set); 195 196 struct bgpd_config { 197 struct filter_set_head connectset; 198 struct filter_set_head connectset6; 199 struct filter_set_head staticset; 200 struct filter_set_head staticset6; 201 struct listen_addrs *listen_addrs; 202 char *csock; 203 char *rcsock; 204 int opts; 205 int flags; 206 int log; 207 u_int rtableid; 208 u_int32_t bgpid; 209 u_int32_t clusterid; 210 u_int32_t as; 211 u_int16_t short_as; 212 u_int16_t holdtime; 213 u_int16_t min_holdtime; 214 u_int16_t connectretry; 215 }; 216 217 enum announce_type { 218 ANNOUNCE_UNDEF, 219 ANNOUNCE_SELF, 220 ANNOUNCE_NONE, 221 ANNOUNCE_DEFAULT_ROUTE, 222 ANNOUNCE_ALL 223 }; 224 225 enum enforce_as { 226 ENFORCE_AS_UNDEF, 227 ENFORCE_AS_OFF, 228 ENFORCE_AS_ON 229 }; 230 231 enum auth_method { 232 AUTH_NONE, 233 AUTH_MD5SIG, 234 AUTH_IPSEC_MANUAL_ESP, 235 AUTH_IPSEC_MANUAL_AH, 236 AUTH_IPSEC_IKE_ESP, 237 AUTH_IPSEC_IKE_AH 238 }; 239 240 struct peer_auth { 241 char md5key[TCP_MD5_KEY_LEN]; 242 char auth_key_in[IPSEC_AUTH_KEY_LEN]; 243 char auth_key_out[IPSEC_AUTH_KEY_LEN]; 244 char enc_key_in[IPSEC_ENC_KEY_LEN]; 245 char enc_key_out[IPSEC_ENC_KEY_LEN]; 246 u_int32_t spi_in; 247 u_int32_t spi_out; 248 enum auth_method method; 249 u_int8_t md5key_len; 250 u_int8_t auth_alg_in; 251 u_int8_t auth_alg_out; 252 u_int8_t auth_keylen_in; 253 u_int8_t auth_keylen_out; 254 u_int8_t enc_alg_in; 255 u_int8_t enc_alg_out; 256 u_int8_t enc_keylen_in; 257 u_int8_t enc_keylen_out; 258 }; 259 260 struct capabilities { 261 int8_t mp[AID_MAX]; /* multiprotocol extensions, RFC 4760 */ 262 int8_t refresh; /* route refresh, RFC 2918 */ 263 int8_t restart; /* graceful restart, RFC 4724 */ 264 int8_t as4byte; /* draft-ietf-idr-as4bytes-13 */ 265 }; 266 267 struct peer_config { 268 struct bgpd_addr remote_addr; 269 struct bgpd_addr local_addr; 270 struct peer_auth auth; 271 struct capabilities capabilities; 272 char group[PEER_DESCR_LEN]; 273 char descr[PEER_DESCR_LEN]; 274 char rib[PEER_DESCR_LEN]; 275 char if_depend[IFNAMSIZ]; 276 char demote_group[IFNAMSIZ]; 277 u_int32_t id; 278 u_int32_t groupid; 279 u_int32_t remote_as; 280 u_int32_t local_as; 281 u_int32_t max_prefix; 282 enum announce_type announce_type; 283 enum enforce_as enforce_as; 284 enum reconf_action reconf_action; 285 u_int16_t max_prefix_restart; 286 u_int16_t holdtime; 287 u_int16_t min_holdtime; 288 u_int16_t local_short_as; 289 u_int8_t template; 290 u_int8_t remote_masklen; 291 u_int8_t cloned; 292 u_int8_t ebgp; /* 1 = ebgp, 0 = ibgp */ 293 u_int8_t distance; /* 1 = direct, >1 = multihop */ 294 u_int8_t passive; 295 u_int8_t down; 296 u_int8_t announce_capa; 297 u_int8_t reflector_client; 298 u_int8_t softreconfig_in; 299 u_int8_t softreconfig_out; 300 u_int8_t ttlsec; /* TTL security hack */ 301 u_int8_t flags; 302 u_int8_t pad[3]; 303 }; 304 305 #define PEERFLAG_TRANS_AS 0x01 306 307 struct network_config { 308 struct bgpd_addr prefix; 309 struct filter_set_head attrset; 310 u_int8_t prefixlen; 311 }; 312 313 TAILQ_HEAD(network_head, network); 314 315 struct network { 316 struct network_config net; 317 TAILQ_ENTRY(network) entry; 318 }; 319 320 enum imsg_type { 321 IMSG_NONE, 322 IMSG_CTL_END, 323 IMSG_CTL_RELOAD, 324 IMSG_CTL_FIB_COUPLE, 325 IMSG_CTL_FIB_DECOUPLE, 326 IMSG_CTL_NEIGHBOR_UP, 327 IMSG_CTL_NEIGHBOR_DOWN, 328 IMSG_CTL_NEIGHBOR_CLEAR, 329 IMSG_CTL_NEIGHBOR_RREFRESH, 330 IMSG_CTL_KROUTE, 331 IMSG_CTL_KROUTE_ADDR, 332 IMSG_CTL_RESULT, 333 IMSG_CTL_SHOW_NEIGHBOR, 334 IMSG_CTL_SHOW_NEXTHOP, 335 IMSG_CTL_SHOW_INTERFACE, 336 IMSG_CTL_SHOW_RIB, 337 IMSG_CTL_SHOW_RIB_AS, 338 IMSG_CTL_SHOW_RIB_PREFIX, 339 IMSG_CTL_SHOW_RIB_ATTR, 340 IMSG_CTL_SHOW_RIB_COMMUNITY, 341 IMSG_CTL_SHOW_NETWORK, 342 IMSG_CTL_SHOW_RIB_MEM, 343 IMSG_CTL_SHOW_TERSE, 344 IMSG_CTL_SHOW_TIMER, 345 IMSG_CTL_LOG_VERBOSE, 346 IMSG_CTL_SHOW_FIB_TABLES, 347 IMSG_NETWORK_ADD, 348 IMSG_NETWORK_REMOVE, 349 IMSG_NETWORK_FLUSH, 350 IMSG_NETWORK_DONE, 351 IMSG_FILTER_SET, 352 IMSG_RECONF_CONF, 353 IMSG_RECONF_RIB, 354 IMSG_RECONF_PEER, 355 IMSG_RECONF_FILTER, 356 IMSG_RECONF_LISTENER, 357 IMSG_RECONF_DONE, 358 IMSG_UPDATE, 359 IMSG_UPDATE_ERR, 360 IMSG_SESSION_ADD, 361 IMSG_SESSION_UP, 362 IMSG_SESSION_DOWN, 363 IMSG_MRT_OPEN, 364 IMSG_MRT_REOPEN, 365 IMSG_MRT_CLOSE, 366 IMSG_KROUTE_CHANGE, 367 IMSG_KROUTE_DELETE, 368 IMSG_NEXTHOP_ADD, 369 IMSG_NEXTHOP_REMOVE, 370 IMSG_NEXTHOP_UPDATE, 371 IMSG_PFTABLE_ADD, 372 IMSG_PFTABLE_REMOVE, 373 IMSG_PFTABLE_COMMIT, 374 IMSG_REFRESH, 375 IMSG_IFINFO, 376 IMSG_DEMOTE 377 }; 378 379 struct demote_msg { 380 char demote_group[IFNAMSIZ]; 381 int level; 382 }; 383 384 enum ctl_results { 385 CTL_RES_OK, 386 CTL_RES_NOSUCHPEER, 387 CTL_RES_DENIED, 388 CTL_RES_NOCAP, 389 CTL_RES_PARSE_ERROR, 390 CTL_RES_NOMEM 391 }; 392 393 /* needed for session.h parse prototype */ 394 LIST_HEAD(mrt_head, mrt); 395 396 /* error codes and subcodes needed in SE and RDE */ 397 enum err_codes { 398 ERR_HEADER = 1, 399 ERR_OPEN, 400 ERR_UPDATE, 401 ERR_HOLDTIMEREXPIRED, 402 ERR_FSM, 403 ERR_CEASE 404 }; 405 406 enum suberr_update { 407 ERR_UPD_UNSPECIFIC, 408 ERR_UPD_ATTRLIST, 409 ERR_UPD_UNKNWN_WK_ATTR, 410 ERR_UPD_MISSNG_WK_ATTR, 411 ERR_UPD_ATTRFLAGS, 412 ERR_UPD_ATTRLEN, 413 ERR_UPD_ORIGIN, 414 ERR_UPD_LOOP, 415 ERR_UPD_NEXTHOP, 416 ERR_UPD_OPTATTR, 417 ERR_UPD_NETWORK, 418 ERR_UPD_ASPATH 419 }; 420 421 enum suberr_cease { 422 ERR_CEASE_MAX_PREFIX = 1, 423 ERR_CEASE_ADMIN_DOWN, 424 ERR_CEASE_PEER_UNCONF, 425 ERR_CEASE_ADMIN_RESET, 426 ERR_CEASE_CONN_REJECT, 427 ERR_CEASE_OTHER_CHANGE, 428 ERR_CEASE_COLLISION, 429 ERR_CEASE_RSRC_EXHAUST 430 }; 431 432 struct kroute_node; 433 struct kroute6_node; 434 struct knexthop_node; 435 struct redist_node; 436 RB_HEAD(kroute_tree, kroute_node); 437 RB_HEAD(kroute6_tree, kroute6_node); 438 RB_HEAD(knexthop_tree, knexthop_node); 439 440 struct ktable { 441 char descr[PEER_DESCR_LEN]; 442 char ifmpe[IFNAMSIZ]; 443 struct kroute_tree krt; 444 struct kroute6_tree krt6; 445 struct knexthop_tree knt; 446 struct network_head krn; 447 LIST_HEAD(, redist_node) redistlist; 448 u_int rtableid; 449 u_int nhtableid; /* rdomain id for nexthop lookup */ 450 u_int ifindex; /* ifindex of ifmpe */ 451 int nhrefcnt; /* refcnt for nexthop table */ 452 enum reconf_action state; 453 u_int8_t fib_conf; /* configured FIB sync flag */ 454 u_int8_t fib_sync; /* is FIB synced with kernel? */ 455 }; 456 457 struct kroute_full { 458 struct bgpd_addr prefix; 459 struct bgpd_addr nexthop; 460 char label[RTLABEL_LEN]; 461 u_int16_t flags; 462 u_short ifindex; 463 u_int8_t prefixlen; 464 u_int8_t priority; 465 }; 466 467 struct kroute { 468 struct in_addr prefix; 469 struct in_addr nexthop; 470 u_int16_t flags; 471 u_int16_t labelid; 472 u_short ifindex; 473 u_int8_t prefixlen; 474 u_int8_t priority; 475 }; 476 477 struct kroute6 { 478 struct in6_addr prefix; 479 struct in6_addr nexthop; 480 u_int16_t flags; 481 u_int16_t labelid; 482 u_short ifindex; 483 u_int8_t prefixlen; 484 u_int8_t priority; 485 }; 486 487 struct kroute_nexthop { 488 struct bgpd_addr nexthop; 489 struct bgpd_addr gateway; 490 struct bgpd_addr net; 491 u_int8_t valid; 492 u_int8_t connected; 493 u_int8_t netlen; 494 }; 495 496 struct kif { 497 char ifname[IFNAMSIZ]; 498 u_int64_t baudrate; 499 int flags; 500 u_short ifindex; 501 u_int8_t media_type; 502 u_int8_t link_state; 503 u_int8_t nh_reachable; /* for nexthop verification */ 504 }; 505 506 struct session_up { 507 struct bgpd_addr local_addr; 508 struct bgpd_addr remote_addr; 509 struct capabilities capa; 510 u_int32_t remote_bgpid; 511 u_int16_t short_as; 512 }; 513 514 struct pftable_msg { 515 struct bgpd_addr addr; 516 char pftable[PFTABLE_LEN]; 517 u_int8_t len; 518 }; 519 520 struct ctl_show_nexthop { 521 struct bgpd_addr addr; 522 struct kif kif; 523 union { 524 struct kroute kr4; 525 struct kroute6 kr6; 526 } kr; 527 u_int8_t valid; 528 u_int8_t krvalid;; 529 }; 530 531 struct ctl_neighbor { 532 struct bgpd_addr addr; 533 char descr[PEER_DESCR_LEN]; 534 int show_timers; 535 }; 536 537 #define F_PREF_ELIGIBLE 0x01 538 #define F_PREF_ACTIVE 0x02 539 #define F_PREF_INTERNAL 0x04 540 #define F_PREF_ANNOUNCE 0x08 541 542 struct ctl_show_rib { 543 struct bgpd_addr true_nexthop; 544 struct bgpd_addr exit_nexthop; 545 struct bgpd_addr prefix; 546 struct bgpd_addr remote_addr; 547 char descr[PEER_DESCR_LEN]; 548 time_t lastchange; 549 u_int32_t remote_id; 550 u_int32_t local_pref; 551 u_int32_t med; 552 u_int32_t prefix_cnt; 553 u_int32_t active_cnt; 554 u_int32_t rib_cnt; 555 u_int16_t aspath_len; 556 u_int16_t flags; 557 u_int8_t prefixlen; 558 u_int8_t origin; 559 /* plus a aspath_len bytes long aspath */ 560 }; 561 562 struct ctl_show_rib_prefix { 563 struct bgpd_addr prefix; 564 time_t lastchange; 565 u_int16_t flags; 566 u_int8_t prefixlen; 567 }; 568 569 enum as_spec { 570 AS_NONE, 571 AS_ALL, 572 AS_SOURCE, 573 AS_TRANSIT, 574 AS_PEER, 575 AS_EMPTY 576 }; 577 578 struct filter_as { 579 u_int32_t as; 580 u_int16_t flags; 581 enum as_spec type; 582 }; 583 584 #define AS_FLAG_NEIGHBORAS 0x01 585 586 struct filter_community { 587 int as; 588 int type; 589 }; 590 591 struct filter_extcommunity { 592 u_int16_t flags; 593 u_int8_t type; 594 u_int8_t subtype; /* if extended type */ 595 union { 596 struct ext_as { 597 u_int16_t as; 598 u_int32_t val; 599 } ext_as; 600 struct ext_as4 { 601 u_int32_t as4; 602 u_int16_t val; 603 } ext_as4; 604 struct ext_ip { 605 struct in_addr addr; 606 u_int16_t val; 607 } ext_ip; 608 u_int64_t ext_opaq; /* only 48 bits */ 609 } data; 610 }; 611 612 613 struct ctl_show_rib_request { 614 char rib[PEER_DESCR_LEN]; 615 struct ctl_neighbor neighbor; 616 struct bgpd_addr prefix; 617 struct filter_as as; 618 struct filter_community community; 619 u_int32_t peerid; 620 pid_t pid; 621 u_int16_t flags; 622 enum imsg_type type; 623 u_int8_t prefixlen; 624 u_int8_t aid; 625 }; 626 627 enum filter_actions { 628 ACTION_NONE, 629 ACTION_ALLOW, 630 ACTION_DENY 631 }; 632 633 enum directions { 634 DIR_IN = 1, 635 DIR_OUT 636 }; 637 638 enum from_spec { 639 FROM_ALL, 640 FROM_ADDRESS, 641 FROM_DESCR, 642 FROM_GROUP 643 }; 644 645 enum comp_ops { 646 OP_NONE, 647 OP_RANGE, 648 OP_XRANGE, 649 OP_EQ, 650 OP_NE, 651 OP_LE, 652 OP_LT, 653 OP_GE, 654 OP_GT 655 }; 656 657 struct filter_peers { 658 u_int32_t peerid; 659 u_int32_t groupid; 660 u_int16_t ribid; 661 }; 662 663 /* special community type */ 664 #define COMMUNITY_ERROR -1 665 #define COMMUNITY_ANY -2 666 #define COMMUNITY_NEIGHBOR_AS -3 667 #define COMMUNITY_UNSET -4 668 #define COMMUNITY_WELLKNOWN 0xffff 669 #define COMMUNITY_NO_EXPORT 0xff01 670 #define COMMUNITY_NO_ADVERTISE 0xff02 671 #define COMMUNITY_NO_EXPSUBCONFED 0xff03 672 #define COMMUNITY_NO_PEER 0xff04 /* RFC 3765 */ 673 674 /* extended community definitions */ 675 #define EXT_COMMUNITY_IANA 0x80 676 #define EXT_COMMUNITY_TRANSITIVE 0x40 677 #define EXT_COMMUNITY_VALUE 0x3f 678 /* extended types */ 679 #define EXT_COMMUNITY_TWO_AS 0 /* 2 octet AS specific */ 680 #define EXT_COMMUNITY_IPV4 1 /* IPv4 specific */ 681 #define EXT_COMMUNITY_FOUR_AS 2 /* 4 octet AS specific */ 682 #define EXT_COMMUNITY_OPAQUE 3 /* opaque ext community */ 683 /* sub types */ 684 #define EXT_COMMUNITY_ROUTE_TGT 2 /* RFC 4360 & RFC4364 */ 685 #define EXT_CUMMUNITY_ROUTE_ORIG 3 /* RFC 4360 & RFC4364 */ 686 #define EXT_COMMUNITY_OSPF_DOM_ID 5 /* RFC 4577 */ 687 #define EXT_COMMUNITY_OSPF_RTR_TYPE 6 /* RFC 4577 */ 688 #define EXT_COMMUNITY_OSPF_RTR_ID 7 /* RFC 4577 */ 689 #define EXT_COMMUNITY_BGP_COLLECT 8 /* RFC 4384 */ 690 /* other handy defines */ 691 #define EXT_COMMUNITY_OPAQUE_MAX 0xffffffffffffULL 692 #define EXT_COMMUNITY_FLAG_VALID 0x01 693 694 struct ext_comm_pairs { 695 u_int8_t type; 696 u_int8_t subtype; 697 u_int8_t transitive; /* transitive bit needs to be set */ 698 }; 699 700 #define IANA_EXT_COMMUNITIES { \ 701 { EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_ROUTE_TGT, 0 }, \ 702 { EXT_COMMUNITY_TWO_AS, EXT_CUMMUNITY_ROUTE_ORIG, 0 }, \ 703 { EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_OSPF_DOM_ID, 0 }, \ 704 { EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_BGP_COLLECT, 0 }, \ 705 { EXT_COMMUNITY_FOUR_AS, EXT_COMMUNITY_ROUTE_TGT, 0 }, \ 706 { EXT_COMMUNITY_FOUR_AS, EXT_CUMMUNITY_ROUTE_ORIG, 0 }, \ 707 { EXT_COMMUNITY_IPV4, EXT_COMMUNITY_ROUTE_TGT, 0 }, \ 708 { EXT_COMMUNITY_IPV4, EXT_CUMMUNITY_ROUTE_ORIG, 0 }, \ 709 { EXT_COMMUNITY_IPV4, EXT_COMMUNITY_OSPF_RTR_ID, 0 }, \ 710 { EXT_COMMUNITY_OPAQUE, EXT_COMMUNITY_OSPF_RTR_TYPE, 0 } \ 711 } 712 713 714 struct filter_prefix { 715 struct bgpd_addr addr; 716 u_int8_t len; 717 }; 718 719 struct filter_prefixlen { 720 enum comp_ops op; 721 u_int8_t aid; 722 u_int8_t len_min; 723 u_int8_t len_max; 724 }; 725 726 struct filter_match { 727 struct filter_prefix prefix; 728 struct filter_prefixlen prefixlen; 729 struct filter_as as; 730 struct filter_community community; 731 struct filter_extcommunity ext_community; 732 }; 733 734 TAILQ_HEAD(filter_head, filter_rule); 735 736 struct filter_rule { 737 TAILQ_ENTRY(filter_rule) entry; 738 char rib[PEER_DESCR_LEN]; 739 struct filter_peers peer; 740 struct filter_match match; 741 struct filter_set_head set; 742 enum filter_actions action; 743 enum directions dir; 744 u_int8_t quick; 745 }; 746 747 enum action_types { 748 ACTION_SET_LOCALPREF, 749 ACTION_SET_RELATIVE_LOCALPREF, 750 ACTION_SET_MED, 751 ACTION_SET_RELATIVE_MED, 752 ACTION_SET_WEIGHT, 753 ACTION_SET_RELATIVE_WEIGHT, 754 ACTION_SET_PREPEND_SELF, 755 ACTION_SET_PREPEND_PEER, 756 ACTION_SET_NEXTHOP, 757 ACTION_SET_NEXTHOP_REJECT, 758 ACTION_SET_NEXTHOP_BLACKHOLE, 759 ACTION_SET_NEXTHOP_NOMODIFY, 760 ACTION_SET_NEXTHOP_SELF, 761 ACTION_SET_COMMUNITY, 762 ACTION_DEL_COMMUNITY, 763 ACTION_SET_EXT_COMMUNITY, 764 ACTION_DEL_EXT_COMMUNITY, 765 ACTION_PFTABLE, 766 ACTION_PFTABLE_ID, 767 ACTION_RTLABEL, 768 ACTION_RTLABEL_ID, 769 ACTION_SET_ORIGIN 770 }; 771 772 struct filter_set { 773 TAILQ_ENTRY(filter_set) entry; 774 union { 775 u_int8_t prepend; 776 u_int16_t id; 777 u_int32_t metric; 778 int32_t relative; 779 struct bgpd_addr nexthop; 780 struct filter_community community; 781 struct filter_extcommunity ext_community; 782 char pftable[PFTABLE_LEN]; 783 char rtlabel[RTLABEL_LEN]; 784 u_int8_t origin; 785 } action; 786 enum action_types type; 787 }; 788 789 struct rde_rib { 790 SIMPLEQ_ENTRY(rde_rib) entry; 791 char name[PEER_DESCR_LEN]; 792 u_int rtableid; 793 u_int16_t id; 794 u_int16_t flags; 795 }; 796 SIMPLEQ_HEAD(rib_names, rde_rib); 797 extern struct rib_names ribnames; 798 799 /* rde_rib flags */ 800 #define F_RIB_ENTRYLOCK 0x0001 801 #define F_RIB_NOEVALUATE 0x0002 802 #define F_RIB_NOFIB 0x0004 803 #define F_RIB_NOFIBSYNC 0x0008 804 #define F_RIB_HASNOFIB (F_RIB_NOFIB | F_RIB_NOEVALUATE) 805 806 /* 4-byte magic AS number */ 807 #define AS_TRANS 23456 808 809 struct rde_memstats { 810 int64_t path_cnt; 811 int64_t prefix_cnt; 812 int64_t rib_cnt; 813 int64_t pt_cnt[AID_MAX]; 814 int64_t nexthop_cnt; 815 int64_t aspath_cnt; 816 int64_t aspath_size; 817 int64_t aspath_refs; 818 int64_t attr_cnt; 819 int64_t attr_refs; 820 int64_t attr_data; 821 int64_t attr_dcnt; 822 }; 823 824 /* prototypes */ 825 /* bgpd.c */ 826 void send_nexthop_update(struct kroute_nexthop *); 827 void send_imsg_session(int, pid_t, void *, u_int16_t); 828 int bgpd_redistribute(int, struct kroute *, struct kroute6 *); 829 int bgpd_filternexthop(struct kroute *, struct kroute6 *); 830 831 /* log.c */ 832 void log_init(int); 833 void log_verbose(int); 834 void vlog(int, const char *, va_list); 835 void log_peer_warn(const struct peer_config *, const char *, ...); 836 void log_peer_warnx(const struct peer_config *, const char *, ...); 837 void log_warn(const char *, ...); 838 void log_warnx(const char *, ...); 839 void log_info(const char *, ...); 840 void log_debug(const char *, ...); 841 void fatal(const char *) __dead; 842 void fatalx(const char *) __dead; 843 844 /* parse.y */ 845 int cmdline_symset(char *); 846 847 /* config.c */ 848 int host(const char *, struct bgpd_addr *, u_int8_t *); 849 850 /* kroute.c */ 851 int kr_init(void); 852 int ktable_update(struct rde_rib *); 853 void ktable_preload(void); 854 void ktable_postload(void); 855 int ktable_exists(u_int, u_int *); 856 int kr_change(u_int, struct kroute_full *); 857 int kr_delete(u_int, struct kroute_full *); 858 void kr_shutdown(void); 859 void kr_fib_couple(u_int); 860 void kr_fib_decouple(u_int); 861 int kr_dispatch_msg(void); 862 int kr_nexthop_add(u_int32_t, struct bgpd_addr *); 863 void kr_nexthop_delete(u_int32_t, struct bgpd_addr *); 864 void kr_show_route(struct imsg *); 865 void kr_ifinfo(char *); 866 int kr_net_reload(u_int, struct network_head *); 867 int kr_reload(void); 868 struct in6_addr *prefixlen2mask6(u_int8_t prefixlen); 869 870 /* control.c */ 871 void control_cleanup(const char *); 872 int control_imsg_relay(struct imsg *); 873 874 /* pftable.c */ 875 int pftable_exists(const char *); 876 int pftable_add(const char *); 877 int pftable_clear_all(void); 878 int pftable_addr_add(struct pftable_msg *); 879 int pftable_addr_remove(struct pftable_msg *); 880 int pftable_commit(void); 881 882 /* name2id.c */ 883 u_int16_t rib_name2id(const char *); 884 const char *rib_id2name(u_int16_t); 885 void rib_unref(u_int16_t); 886 void rib_ref(u_int16_t); 887 u_int16_t rtlabel_name2id(const char *); 888 const char *rtlabel_id2name(u_int16_t); 889 void rtlabel_unref(u_int16_t); 890 void rtlabel_ref(u_int16_t); 891 u_int16_t pftable_name2id(const char *); 892 const char *pftable_id2name(u_int16_t); 893 void pftable_unref(u_int16_t); 894 void pftable_ref(u_int16_t); 895 896 897 /* rde_filter.c */ 898 void filterset_free(struct filter_set_head *); 899 int filterset_cmp(struct filter_set *, struct filter_set *); 900 const char *filterset_name(enum action_types); 901 902 /* util.c */ 903 const char *log_addr(const struct bgpd_addr *); 904 const char *log_in6addr(const struct in6_addr *); 905 const char *log_sockaddr(struct sockaddr *); 906 const char *log_as(u_int32_t); 907 const char *log_rd(u_int64_t); 908 const char *log_ext_subtype(u_int8_t); 909 int aspath_snprint(char *, size_t, void *, u_int16_t); 910 int aspath_asprint(char **, void *, u_int16_t); 911 size_t aspath_strlen(void *, u_int16_t); 912 in_addr_t prefixlen2mask(u_int8_t); 913 void inet6applymask(struct in6_addr *, const struct in6_addr *, 914 int); 915 const char *aid2str(u_int8_t); 916 int aid2afi(u_int8_t, u_int16_t *, u_int8_t *); 917 int afi2aid(u_int16_t, u_int8_t, u_int8_t *); 918 sa_family_t aid2af(u_int8_t); 919 int af2aid(sa_family_t, u_int8_t, u_int8_t *); 920 struct sockaddr *addr2sa(struct bgpd_addr *, u_int16_t); 921 void sa2addr(struct sockaddr *, struct bgpd_addr *); 922 923 #endif /* __BGPD_H__ */ 924