1 /* $OpenBSD: eigrpd.h,v 1.22 2016/09/02 17:59:58 benno Exp $ */ 2 3 /* 4 * Copyright (c) 2015 Renato Westphal <renato@openbsd.org> 5 * Copyright (c) 2004 Esben Norby <norby@openbsd.org> 6 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 #ifndef _EIGRPD_H_ 22 #define _EIGRPD_H_ 23 24 #include <sys/queue.h> 25 #include <sys/tree.h> 26 #include <sys/socket.h> 27 #include <net/if.h> 28 #include <netinet/in.h> 29 30 #include <event.h> 31 #include <imsg.h> 32 33 #include "eigrp.h" 34 35 #define CONF_FILE "/etc/eigrpd.conf" 36 #define EIGRPD_SOCKET "/var/run/eigrpd.sock" 37 #define EIGRPD_USER "_eigrpd" 38 39 #define EIGRPD_OPT_VERBOSE 0x00000001 40 #define EIGRPD_OPT_VERBOSE2 0x00000002 41 #define EIGRPD_OPT_NOACTION 0x00000004 42 43 #define NBR_IDSELF 1 44 #define NBR_CNTSTART (NBR_IDSELF + 1) 45 46 #define READ_BUF_SIZE 65535 47 #define PKG_DEF_SIZE 512 /* compromise */ 48 #define RT_BUF_SIZE 16384 49 #define MAX_RTSOCK_BUF 128 * 1024 50 51 #define F_EIGRPD_INSERTED 0x0001 52 #define F_KERNEL 0x0002 53 #define F_CONNECTED 0x0004 54 #define F_STATIC 0x0008 55 #define F_DYNAMIC 0x0010 56 #define F_DOWN 0x0020 57 #define F_REJECT 0x0040 58 #define F_BLACKHOLE 0x0080 59 #define F_REDISTRIBUTED 0x0100 60 #define F_CTL_EXTERNAL 0x0200 /* only used by eigrpctl */ 61 #define F_CTL_ACTIVE 0x0400 62 #define F_CTL_ALLLINKS 0x0800 63 64 static const char * const log_procnames[] = { 65 "parent", 66 "eigrpe", 67 "rde" 68 }; 69 70 struct imsgev { 71 struct imsgbuf ibuf; 72 void (*handler)(int, short, void *); 73 struct event ev; 74 short events; 75 }; 76 77 enum imsg_type { 78 IMSG_CTL_RELOAD, 79 IMSG_CTL_SHOW_INTERFACE, 80 IMSG_CTL_SHOW_NBR, 81 IMSG_CTL_SHOW_TOPOLOGY, 82 IMSG_CTL_SHOW_STATS, 83 IMSG_CTL_CLEAR_NBR, 84 IMSG_CTL_FIB_COUPLE, 85 IMSG_CTL_FIB_DECOUPLE, 86 IMSG_CTL_IFACE, 87 IMSG_CTL_KROUTE, 88 IMSG_CTL_IFINFO, 89 IMSG_CTL_END, 90 IMSG_CTL_LOG_VERBOSE, 91 IMSG_KROUTE_CHANGE, 92 IMSG_KROUTE_DELETE, 93 IMSG_NONE, 94 IMSG_IFINFO, 95 IMSG_IFDOWN, 96 IMSG_NEWADDR, 97 IMSG_DELADDR, 98 IMSG_NETWORK_ADD, 99 IMSG_NETWORK_DEL, 100 IMSG_NEIGHBOR_UP, 101 IMSG_NEIGHBOR_DOWN, 102 IMSG_RECV_UPDATE_INIT, 103 IMSG_RECV_UPDATE, 104 IMSG_RECV_QUERY, 105 IMSG_RECV_REPLY, 106 IMSG_RECV_SIAQUERY, 107 IMSG_RECV_SIAREPLY, 108 IMSG_SEND_UPDATE, 109 IMSG_SEND_QUERY, 110 IMSG_SEND_REPLY, 111 IMSG_SEND_MUPDATE, 112 IMSG_SEND_MQUERY, 113 IMSG_SEND_UPDATE_END, 114 IMSG_SEND_REPLY_END, 115 IMSG_SEND_SIAQUERY_END, 116 IMSG_SEND_SIAREPLY_END, 117 IMSG_SEND_MUPDATE_END, 118 IMSG_SEND_MQUERY_END, 119 IMSG_SOCKET_IPC, 120 IMSG_RECONF_CONF, 121 IMSG_RECONF_IFACE, 122 IMSG_RECONF_INSTANCE, 123 IMSG_RECONF_EIGRP_IFACE, 124 IMSG_RECONF_END 125 }; 126 127 /* forward declarations */ 128 struct eigrp_iface; 129 RB_HEAD(iface_id_head, eigrp_iface); 130 struct nbr; 131 RB_HEAD(nbr_addr_head, nbr); 132 RB_HEAD(nbr_pid_head, nbr); 133 struct rde_nbr; 134 RB_HEAD(rde_nbr_head, rde_nbr); 135 struct rt_node; 136 RB_HEAD(rt_tree, rt_node); 137 138 union eigrpd_addr { 139 struct in_addr v4; 140 struct in6_addr v6; 141 }; 142 143 #define IN6_IS_SCOPE_EMBED(a) \ 144 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 145 (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \ 146 (IN6_IS_ADDR_MC_INTFACELOCAL(a))) 147 148 /* interface types */ 149 enum iface_type { 150 IF_TYPE_POINTOPOINT, 151 IF_TYPE_BROADCAST 152 }; 153 154 struct if_addr { 155 TAILQ_ENTRY(if_addr) entry; 156 int af; 157 union eigrpd_addr addr; 158 uint8_t prefixlen; 159 union eigrpd_addr dstbrd; 160 }; 161 TAILQ_HEAD(if_addr_head, if_addr); 162 163 struct iface { 164 TAILQ_ENTRY(iface) entry; 165 TAILQ_HEAD(, eigrp_iface) ei_list; 166 unsigned int ifindex; 167 char name[IF_NAMESIZE]; 168 struct if_addr_head addr_list; 169 struct in6_addr linklocal; 170 int mtu; 171 enum iface_type type; 172 uint8_t if_type; 173 uint64_t baudrate; 174 uint16_t flags; 175 uint8_t linkstate; 176 uint8_t group_count_v4; 177 uint8_t group_count_v6; 178 }; 179 180 enum route_type { 181 EIGRP_ROUTE_INTERNAL, 182 EIGRP_ROUTE_EXTERNAL 183 }; 184 185 /* routing information advertised by update/query/reply messages */ 186 struct rinfo { 187 int af; 188 enum route_type type; 189 union eigrpd_addr prefix; 190 uint8_t prefixlen; 191 union eigrpd_addr nexthop; 192 struct classic_metric metric; 193 struct classic_emetric emetric; 194 }; 195 196 struct rinfo_entry { 197 TAILQ_ENTRY(rinfo_entry) entry; 198 struct rinfo rinfo; 199 }; 200 TAILQ_HEAD(rinfo_head, rinfo_entry); 201 202 /* interface states */ 203 #define IF_STA_DOWN 0x01 204 #define IF_STA_ACTIVE 0x02 205 206 struct summary_addr { 207 TAILQ_ENTRY(summary_addr) entry; 208 union eigrpd_addr prefix; 209 uint8_t prefixlen; 210 }; 211 212 struct eigrp_iface { 213 RB_ENTRY(eigrp_iface) id_tree; 214 TAILQ_ENTRY(eigrp_iface) e_entry; 215 TAILQ_ENTRY(eigrp_iface) i_entry; 216 struct eigrp *eigrp; 217 struct iface *iface; 218 int state; 219 uint32_t ifaceid; 220 struct event hello_timer; 221 uint32_t delay; 222 uint32_t bandwidth; 223 uint16_t hello_holdtime; 224 uint16_t hello_interval; 225 uint8_t splithorizon; 226 uint8_t passive; 227 time_t uptime; 228 TAILQ_HEAD(, nbr) nbr_list; 229 struct nbr *self; 230 struct rinfo_head update_list; /* multicast updates */ 231 struct rinfo_head query_list; /* multicast queries */ 232 TAILQ_HEAD(, summary_addr) summary_list; 233 }; 234 RB_PROTOTYPE(iface_id_head, eigrp_iface, id_tree, iface_id_compare) 235 236 #define INADDRSZ 4 237 #define IN6ADDRSZ 16 238 239 struct seq_addr_entry { 240 TAILQ_ENTRY(seq_addr_entry) entry; 241 int af; 242 union eigrpd_addr addr; 243 }; 244 TAILQ_HEAD(seq_addr_head, seq_addr_entry); 245 246 #define REDIST_STATIC 0x01 247 #define REDIST_RIP 0x02 248 #define REDIST_OSPF 0x04 249 #define REDIST_CONNECTED 0x08 250 #define REDIST_DEFAULT 0x10 251 #define REDIST_ADDR 0x20 252 #define REDIST_NO 0x40 253 254 struct redist_metric { 255 uint32_t bandwidth; 256 uint32_t delay; 257 uint8_t reliability; 258 uint8_t load; 259 uint16_t mtu; 260 }; 261 262 struct redistribute { 263 SIMPLEQ_ENTRY(redistribute) entry; 264 uint8_t type; 265 int af; 266 union eigrpd_addr addr; 267 uint8_t prefixlen; 268 struct redist_metric *metric; 269 struct { 270 uint32_t as; 271 uint32_t metric; 272 uint32_t tag; 273 } emetric; 274 }; 275 SIMPLEQ_HEAD(redist_list, redistribute); 276 277 struct eigrp_stats { 278 uint32_t hellos_sent; 279 uint32_t hellos_recv; 280 uint32_t updates_sent; 281 uint32_t updates_recv; 282 uint32_t queries_sent; 283 uint32_t queries_recv; 284 uint32_t replies_sent; 285 uint32_t replies_recv; 286 uint32_t acks_sent; 287 uint32_t acks_recv; 288 uint32_t squeries_sent; 289 uint32_t squeries_recv; 290 uint32_t sreplies_sent; 291 uint32_t sreplies_recv; 292 }; 293 294 /* eigrp instance */ 295 struct eigrp { 296 TAILQ_ENTRY(eigrp) entry; 297 int af; 298 uint16_t as; 299 uint8_t kvalues[6]; 300 uint16_t active_timeout; 301 uint8_t maximum_hops; 302 uint8_t maximum_paths; 303 uint8_t variance; 304 struct redist_metric *dflt_metric; 305 struct redist_list redist_list; 306 TAILQ_HEAD(, eigrp_iface) ei_list; 307 struct nbr_addr_head nbrs; 308 struct rde_nbr *rnbr_redist; 309 struct rde_nbr *rnbr_summary; 310 struct rt_tree topology; 311 uint32_t seq_num; 312 struct eigrp_stats stats; 313 }; 314 315 /* eigrp_conf */ 316 enum eigrpd_process { 317 PROC_MAIN, 318 PROC_EIGRP_ENGINE, 319 PROC_RDE_ENGINE 320 } eigrpd_process; 321 322 struct eigrpd_conf { 323 struct in_addr rtr_id; 324 unsigned int rdomain; 325 uint8_t fib_priority_internal; 326 uint8_t fib_priority_external; 327 uint8_t fib_priority_summary; 328 TAILQ_HEAD(, iface) iface_list; 329 TAILQ_HEAD(, eigrp) instances; 330 int flags; 331 #define EIGRPD_FLAG_NO_FIB_UPDATE 0x0001 332 }; 333 334 struct eigrpd_global { 335 int cmd_opts; 336 time_t uptime; 337 int eigrp_socket_v4; 338 int eigrp_socket_v6; 339 struct in_addr mcast_addr_v4; 340 struct in6_addr mcast_addr_v6; 341 char *csock; 342 }; 343 344 extern struct eigrpd_global global; 345 346 /* kroute */ 347 struct kroute { 348 int af; 349 union eigrpd_addr prefix; 350 uint8_t prefixlen; 351 union eigrpd_addr nexthop; 352 unsigned short ifindex; 353 uint8_t priority; 354 uint16_t flags; 355 }; 356 357 struct kaddr { 358 unsigned short ifindex; 359 int af; 360 union eigrpd_addr addr; 361 uint8_t prefixlen; 362 union eigrpd_addr dstbrd; 363 }; 364 365 struct kif { 366 char ifname[IF_NAMESIZE]; 367 unsigned short ifindex; 368 int flags; 369 uint8_t link_state; 370 int mtu; 371 uint8_t if_type; 372 uint64_t baudrate; 373 uint8_t nh_reachable; /* for nexthop verification */ 374 }; 375 376 /* control data structures */ 377 struct ctl_iface { 378 int af; 379 uint16_t as; 380 char name[IF_NAMESIZE]; 381 unsigned int ifindex; 382 union eigrpd_addr addr; 383 uint8_t prefixlen; 384 uint16_t flags; 385 uint8_t linkstate; 386 int mtu; 387 enum iface_type type; 388 uint8_t if_type; 389 uint64_t baudrate; 390 uint32_t delay; 391 uint32_t bandwidth; 392 uint16_t hello_holdtime; 393 uint16_t hello_interval; 394 uint8_t splithorizon; 395 uint8_t passive; 396 time_t uptime; 397 int nbr_cnt; 398 }; 399 400 struct ctl_nbr { 401 int af; 402 uint16_t as; 403 char ifname[IF_NAMESIZE]; 404 union eigrpd_addr addr; 405 uint16_t hello_holdtime; 406 time_t uptime; 407 }; 408 409 struct ctl_rt { 410 int af; 411 uint16_t as; 412 union eigrpd_addr prefix; 413 uint8_t prefixlen; 414 enum route_type type; 415 union eigrpd_addr nexthop; 416 char ifname[IF_NAMESIZE]; 417 uint32_t distance; 418 uint32_t rdistance; 419 uint32_t fdistance; 420 int state; 421 uint8_t flags; 422 struct { 423 uint32_t delay; 424 uint32_t bandwidth; 425 uint32_t mtu; 426 uint8_t hop_count; 427 uint8_t reliability; 428 uint8_t load; 429 } metric; 430 struct classic_emetric emetric; 431 }; 432 #define F_CTL_RT_FIRST 0x01 433 #define F_CTL_RT_SUCCESSOR 0x02 434 #define F_CTL_RT_FSUCCESSOR 0x04 435 436 struct ctl_show_topology_req { 437 int af; 438 union eigrpd_addr prefix; 439 uint8_t prefixlen; 440 uint16_t flags; 441 }; 442 443 struct ctl_stats { 444 int af; 445 uint16_t as; 446 struct eigrp_stats stats; 447 }; 448 449 #define min(x,y) ((x) <= (y) ? (x) : (y)) 450 #define max(x,y) ((x) > (y) ? (x) : (y)) 451 452 extern struct eigrpd_conf *eigrpd_conf; 453 extern struct iface_id_head ifaces_by_id; 454 455 /* parse.y */ 456 struct eigrpd_conf *parse_config(char *); 457 int cmdline_symset(char *); 458 459 /* in_cksum.c */ 460 uint16_t in_cksum(void *, size_t); 461 462 /* kroute.c */ 463 int kif_init(void); 464 int kr_init(int, unsigned int); 465 void kif_redistribute(void); 466 int kr_change(struct kroute *); 467 int kr_delete(struct kroute *); 468 void kr_shutdown(void); 469 void kr_fib_couple(void); 470 void kr_fib_decouple(void); 471 void kr_show_route(struct imsg *); 472 void kr_ifinfo(char *, pid_t); 473 struct kif *kif_findname(char *); 474 void kif_clear(void); 475 476 /* util.c */ 477 uint8_t mask2prefixlen(in_addr_t); 478 uint8_t mask2prefixlen6(struct sockaddr_in6 *); 479 in_addr_t prefixlen2mask(uint8_t); 480 struct in6_addr *prefixlen2mask6(uint8_t); 481 void eigrp_applymask(int, union eigrpd_addr *, 482 const union eigrpd_addr *, int); 483 int eigrp_addrcmp(int, const union eigrpd_addr *, 484 const union eigrpd_addr *); 485 int eigrp_addrisset(int, const union eigrpd_addr *); 486 int eigrp_prefixcmp(int, const union eigrpd_addr *, 487 const union eigrpd_addr *, uint8_t); 488 int bad_addr_v4(struct in_addr); 489 int bad_addr_v6(struct in6_addr *); 490 int bad_addr(int, union eigrpd_addr *); 491 void embedscope(struct sockaddr_in6 *); 492 void recoverscope(struct sockaddr_in6 *); 493 void addscope(struct sockaddr_in6 *, uint32_t); 494 void clearscope(struct in6_addr *); 495 void sa2addr(struct sockaddr *, int *, union eigrpd_addr *); 496 497 /* eigrpd.c */ 498 int main_imsg_compose_eigrpe(int, pid_t, void *, uint16_t); 499 int main_imsg_compose_rde(int, pid_t, void *, uint16_t); 500 void imsg_event_add(struct imsgev *); 501 int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, 502 pid_t, int, void *, uint16_t); 503 struct eigrp *eigrp_find(struct eigrpd_conf *, int, uint16_t); 504 void merge_config(struct eigrpd_conf *, struct eigrpd_conf *); 505 struct eigrpd_conf *config_new_empty(void); 506 void config_clear(struct eigrpd_conf *); 507 508 /* printconf.c */ 509 void print_config(struct eigrpd_conf *); 510 511 /* logmsg.c */ 512 const char *log_in6addr(const struct in6_addr *); 513 const char *log_in6addr_scope(const struct in6_addr *, unsigned int); 514 const char *log_sockaddr(void *); 515 const char *log_addr(int, union eigrpd_addr *); 516 const char *log_prefix(struct rt_node *); 517 const char *log_route_origin(int, struct rde_nbr *); 518 const char *opcode_name(uint8_t); 519 const char *af_name(int); 520 const char *if_type_name(enum iface_type); 521 const char *dual_state_name(int); 522 const char *ext_proto_name(int); 523 524 #endif /* _EIGRPD_H_ */ 525