1 /* $OpenBSD: dvmrpd.h,v 1.23 2021/01/19 11:46:10 claudio Exp $ */ 2 3 /* 4 * Copyright (c) 2004, 2005, 2006 Esben Norby <norby@openbsd.org> 5 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #ifndef _DVMRPD_H_ 21 #define _DVMRPD_H_ 22 23 #include <sys/queue.h> 24 #include <sys/socket.h> 25 #include <sys/time.h> 26 #include <sys/tree.h> 27 #include <net/if.h> 28 #include <netinet/in.h> 29 #include <event.h> 30 31 #include <imsg.h> 32 33 #define CONF_FILE "/etc/dvmrpd.conf" 34 #define DVMRPD_SOCKET "/var/run/dvmrpd.sock" 35 #define DVMRPD_USER "_dvmrpd" 36 37 #define NBR_HASHSIZE 128 38 39 #define NBR_IDSELF 1 40 #define NBR_CNTSTART (NBR_IDSELF + 1) 41 42 #define READ_BUF_SIZE 65535 43 #define RT_BUF_SIZE 16384 44 45 #define DVMRPD_FLAG_NO_FIB_UPDATE 0x0001 46 47 #define F_DVMRPD_INSERTED 0x0001 48 #define F_KERNEL 0x0002 49 #define F_CONNECTED 0x0004 50 #define F_DOWN 0x0010 51 #define F_STATIC 0x0020 52 #define F_LONGER 0x0040 53 54 #define MAXVIFS 32 /* XXX */ 55 56 static const char * const log_procnames[] = { 57 "parent", 58 "dvmrpe", 59 "rde" 60 }; 61 62 struct imsgev { 63 struct imsgbuf ibuf; 64 void (*handler)(int, short, void *); 65 struct event ev; 66 void *data; 67 short events; 68 }; 69 70 enum imsg_type { 71 IMSG_NONE, 72 IMSG_CTL_RELOAD, 73 IMSG_CTL_SHOW_IFACE, 74 IMSG_CTL_SHOW_IGMP, 75 IMSG_CTL_SHOW_NBR, 76 IMSG_CTL_SHOW_RIB, 77 IMSG_CTL_SHOW_MFC, 78 IMSG_CTL_MFC_COUPLE, 79 IMSG_CTL_MFC_DECOUPLE, 80 IMSG_CTL_KROUTE, 81 IMSG_CTL_KROUTE_ADDR, 82 IMSG_CTL_IFINFO, 83 IMSG_CTL_SHOW_SUM, 84 IMSG_CTL_END, 85 IMSG_CTL_LOG_VERBOSE, 86 IMSG_IFINFO, 87 IMSG_ROUTE_REPORT, 88 IMSG_FULL_ROUTE_REPORT, 89 IMSG_FULL_ROUTE_REPORT_END, 90 IMSG_MFC_ADD, 91 IMSG_MFC_DEL, 92 IMSG_GROUP_ADD, 93 IMSG_GROUP_DEL, 94 IMSG_NBR_DEL, 95 IMSG_SEND_PRUNE, 96 IMSG_RECV_PRUNE, 97 IMSG_FLASH_UPDATE, 98 IMSG_FLASH_UPDATE_DS 99 }; 100 101 /* interface states */ 102 #define IF_STA_DOWN 0x01 103 #define IF_STA_QUERIER 0x02 104 #define IF_STA_NONQUERIER 0x04 105 #define IF_STA_ANY 0x07 106 #define IF_STA_ACTIVE (~IF_STA_DOWN) 107 108 /* interface events */ 109 enum iface_event { 110 IF_EVT_NOTHING, 111 IF_EVT_UP, 112 IF_EVT_QTMOUT, /* query timer expired */ 113 IF_EVT_QRECVD, /* query received, check for lower IP */ 114 IF_EVT_QPRSNTTMOUT, /* other querier present timeout */ 115 IF_EVT_DOWN 116 }; 117 118 /* interface actions */ 119 enum iface_action { 120 IF_ACT_NOTHING, 121 IF_ACT_STRT, 122 IF_ACT_QPRSNT, 123 IF_ACT_RST 124 }; 125 126 /* interface types */ 127 enum iface_type { 128 IF_TYPE_POINTOPOINT, 129 IF_TYPE_BROADCAST 130 }; 131 132 /* neighbor states */ 133 #define NBR_STA_DOWN 0x01 134 #define NBR_STA_1_WAY 0x02 135 #define NBR_STA_2_WAY 0x04 136 #define NBR_STA_ACTIVE (~NBR_STA_DOWN) 137 #define NBR_STA_ANY 0xff 138 139 struct group { 140 TAILQ_ENTRY(group) entry; 141 struct event dead_timer; 142 struct event v1_host_timer; 143 struct event retrans_timer; 144 145 struct in_addr addr; 146 147 struct iface *iface; 148 149 time_t uptime; 150 int state; 151 }; 152 153 struct rde_group { 154 TAILQ_ENTRY(rde_group) entry; 155 struct in_addr rde_group; 156 }; 157 158 struct mfc { 159 struct in_addr origin; 160 struct in_addr group; 161 u_short ifindex; 162 u_int8_t ttls[MAXVIFS]; 163 }; 164 165 struct prune { 166 struct in_addr origin; 167 struct in_addr netmask; 168 struct in_addr group; 169 struct in_addr nexthop; 170 u_short ifindex; 171 u_int32_t lifetime; 172 }; 173 174 struct nbr_msg { 175 struct in_addr address; 176 unsigned int ifindex; 177 }; 178 179 TAILQ_HEAD(rr_head, rr_entry); 180 RB_HEAD(src_head, src_node); 181 182 struct iface { 183 LIST_ENTRY(iface) entry; 184 struct event probe_timer; 185 struct event query_timer; 186 struct event querier_present_timer; 187 time_t uptime; 188 LIST_HEAD(, nbr) nbr_list; 189 TAILQ_HEAD(, group) group_list; 190 TAILQ_HEAD(, rde_group) rde_group_list; 191 struct rr_head rr_list; 192 193 char name[IF_NAMESIZE]; 194 struct in_addr addr; 195 struct in_addr dst; 196 struct in_addr mask; 197 struct in_addr querier; /* designated querier */ 198 199 u_int64_t baudrate; 200 u_int32_t gen_id; 201 u_int32_t group_cnt; 202 u_int32_t probe_interval; 203 204 u_int32_t query_interval; 205 u_int32_t query_resp_interval; 206 u_int32_t recv_query_resp_interval; 207 u_int32_t group_member_interval; 208 u_int32_t querier_present_interval; 209 u_int32_t startup_query_interval; 210 u_int32_t startup_query_cnt; 211 u_int32_t last_member_query_interval; 212 u_int32_t last_member_query_cnt; 213 u_int32_t last_member_query_time; 214 u_int32_t v1_querier_present_tmout; 215 u_int32_t v1_host_present_interval; 216 u_int32_t startup_query_counter; /* actual counter */ 217 u_int32_t dead_interval; 218 219 unsigned int ifindex; /* ifindex and vif */ 220 int fd; 221 int state; 222 int mtu; 223 int nbr_cnt; 224 int adj_cnt; 225 226 u_int16_t flags; 227 u_int16_t metric; 228 enum iface_type type; 229 230 u_int8_t robustness; 231 u_int8_t linkstate; 232 u_int8_t if_type; 233 u_int8_t passive; 234 u_int8_t igmp_version; 235 }; 236 237 /* dvmrp_conf */ 238 enum { 239 PROC_MAIN, 240 PROC_DVMRP_ENGINE, 241 PROC_RDE_ENGINE 242 } dvmrpd_process; 243 244 struct dvmrpd_conf { 245 struct event ev; 246 struct event report_timer; 247 u_int32_t gen_id; 248 u_int32_t opts; 249 #define DVMRPD_OPT_VERBOSE 0x00000001 250 #define DVMRPD_OPT_VERBOSE2 0x00000002 251 #define DVMRPD_OPT_NOACTION 0x00000004 252 int maxdepth; 253 LIST_HEAD(, iface) iface_list; 254 int dvmrp_socket; 255 int mroute_socket; 256 int flags; 257 }; 258 259 /* kroute */ 260 struct kroute { 261 struct in_addr prefix; 262 struct in_addr nexthop; 263 u_int16_t flags; 264 u_short ifindex; 265 u_int8_t prefixlen; 266 }; 267 268 struct kif { 269 char ifname[IF_NAMESIZE]; 270 u_int64_t baudrate; 271 int flags; 272 int mtu; 273 u_short ifindex; 274 u_int8_t if_type; 275 u_int8_t link_state; 276 u_int8_t nh_reachable; /* for nexthop verification */ 277 }; 278 279 /* control data structures */ 280 struct ctl_iface { 281 char name[IF_NAMESIZE]; 282 struct in_addr addr; 283 struct in_addr mask; 284 struct in_addr querier; 285 286 time_t probe_timer; 287 time_t query_timer; 288 time_t querier_present_timer; 289 time_t uptime; 290 291 u_int64_t baudrate; 292 u_int32_t gen_id; 293 u_int32_t group_cnt; 294 u_int32_t probe_interval; 295 u_int32_t query_interval; 296 u_int32_t query_resp_interval; 297 u_int32_t recv_query_resp_interval; 298 u_int32_t group_member_interval; 299 u_int32_t querier_present_interval; 300 u_int32_t startup_query_interval; 301 u_int32_t startup_query_cnt; 302 u_int32_t last_member_query_interval; 303 u_int32_t last_member_query_cnt; 304 u_int32_t last_member_query_time; 305 u_int32_t v1_querier_present_tmout; 306 u_int32_t v1_host_present_interval; 307 u_int32_t dead_interval; 308 309 unsigned int ifindex; 310 int state; 311 int mtu; 312 int nbr_cnt; 313 int adj_cnt; 314 315 u_int16_t flags; 316 u_int16_t metric; 317 enum iface_type type; 318 u_int8_t robustness; 319 u_int8_t linkstate; 320 u_int8_t if_type; 321 u_int8_t passive; 322 u_int8_t igmp_version; 323 }; 324 325 struct ctl_group { 326 time_t dead_timer; 327 time_t v1_host_timer; 328 time_t retrans_timer; 329 time_t uptime; 330 struct in_addr addr; 331 int state; 332 }; 333 334 struct ctl_nbr { 335 char name[IF_NAMESIZE]; 336 struct in_addr id; 337 struct in_addr addr; 338 time_t dead_timer; 339 time_t uptime; 340 int state; 341 }; 342 343 struct ctl_rt { 344 struct in_addr prefix; 345 struct in_addr nexthop; 346 struct in_addr area; 347 struct in_addr adv_rtr; 348 time_t uptime; 349 time_t expire; 350 u_int32_t cost; 351 u_int8_t flags; 352 u_int8_t prefixlen; 353 }; 354 355 struct ctl_mfc { 356 u_int8_t ttls[MAXVIFS]; /* outgoing vif(s) */ 357 struct in_addr origin; 358 struct in_addr group; 359 time_t uptime; 360 time_t expire; 361 u_short ifindex; /* incoming vif */ 362 }; 363 364 struct ctl_sum { 365 struct in_addr rtr_id; 366 u_int32_t hold_time; 367 }; 368 369 /* dvmrpd.c */ 370 void main_imsg_compose_dvmrpe(int, pid_t, void *, u_int16_t); 371 372 /* parse.y */ 373 struct dvmrpd_conf *parse_config(char *, int); 374 int cmdline_symset(char *); 375 376 int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t, 377 int, void *, u_int16_t); 378 void imsg_event_add(struct imsgev *); 379 380 /* in_cksum.c */ 381 u_int16_t in_cksum(void *, size_t); 382 383 /* kroute.c */ 384 int kif_init(void); 385 void kif_clear(void); 386 int kr_init(void); 387 void kr_shutdown(void); 388 void kr_dispatch_msg(int, short, void *); 389 void kr_ifinfo(char *); 390 struct kif *kif_findname(char *); 391 392 u_int8_t prefixlen_classful(in_addr_t); 393 u_int8_t mask2prefixlen(in_addr_t); 394 in_addr_t prefixlen2mask(u_int8_t); 395 396 /* kmroute.c */ 397 int kmr_init(int); 398 void kmr_shutdown(void); 399 void kmr_recv_msg(int, short, void *); 400 void kmr_mfc_couple(void); 401 void kmr_mfc_decouple(void); 402 void kmroute_clear(void); 403 int mrt_init(int); 404 int mrt_done(int); 405 int mrt_add_vif(int, struct iface *); 406 void mrt_del_vif(int, struct iface *); 407 int mrt_add_mfc(int, struct mfc *); 408 int mrt_del_mfc(int, struct mfc *); 409 410 /* log.h */ 411 const char *nbr_state_name(int); 412 const char *if_state_name(int); 413 const char *if_type_name(enum iface_type); 414 const char *group_state_name(int); 415 416 /* printconf.c */ 417 void print_config(struct dvmrpd_conf *); 418 419 /* interface.c */ 420 struct iface *if_find_index(u_short); 421 422 #define PREFIX_SIZE(x) (((x) + 7) / 8) 423 424 #endif /* _DVMRPD_H_ */ 425