1 /* $OpenBSD: dvmrpd.h,v 1.24 2021/01/19 12:26:38 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 struct imsgev { 57 struct imsgbuf ibuf; 58 void (*handler)(int, short, void *); 59 struct event ev; 60 void *data; 61 short events; 62 }; 63 64 enum imsg_type { 65 IMSG_NONE, 66 IMSG_CTL_RELOAD, 67 IMSG_CTL_SHOW_IFACE, 68 IMSG_CTL_SHOW_IGMP, 69 IMSG_CTL_SHOW_NBR, 70 IMSG_CTL_SHOW_RIB, 71 IMSG_CTL_SHOW_MFC, 72 IMSG_CTL_MFC_COUPLE, 73 IMSG_CTL_MFC_DECOUPLE, 74 IMSG_CTL_KROUTE, 75 IMSG_CTL_KROUTE_ADDR, 76 IMSG_CTL_IFINFO, 77 IMSG_CTL_SHOW_SUM, 78 IMSG_CTL_END, 79 IMSG_CTL_LOG_VERBOSE, 80 IMSG_IFINFO, 81 IMSG_ROUTE_REPORT, 82 IMSG_FULL_ROUTE_REPORT, 83 IMSG_FULL_ROUTE_REPORT_END, 84 IMSG_MFC_ADD, 85 IMSG_MFC_DEL, 86 IMSG_GROUP_ADD, 87 IMSG_GROUP_DEL, 88 IMSG_NBR_DEL, 89 IMSG_SEND_PRUNE, 90 IMSG_RECV_PRUNE, 91 IMSG_FLASH_UPDATE, 92 IMSG_FLASH_UPDATE_DS 93 }; 94 95 /* interface states */ 96 #define IF_STA_DOWN 0x01 97 #define IF_STA_QUERIER 0x02 98 #define IF_STA_NONQUERIER 0x04 99 #define IF_STA_ANY 0x07 100 #define IF_STA_ACTIVE (~IF_STA_DOWN) 101 102 /* interface events */ 103 enum iface_event { 104 IF_EVT_NOTHING, 105 IF_EVT_UP, 106 IF_EVT_QTMOUT, /* query timer expired */ 107 IF_EVT_QRECVD, /* query received, check for lower IP */ 108 IF_EVT_QPRSNTTMOUT, /* other querier present timeout */ 109 IF_EVT_DOWN 110 }; 111 112 /* interface actions */ 113 enum iface_action { 114 IF_ACT_NOTHING, 115 IF_ACT_STRT, 116 IF_ACT_QPRSNT, 117 IF_ACT_RST 118 }; 119 120 /* interface types */ 121 enum iface_type { 122 IF_TYPE_POINTOPOINT, 123 IF_TYPE_BROADCAST 124 }; 125 126 /* neighbor states */ 127 #define NBR_STA_DOWN 0x01 128 #define NBR_STA_1_WAY 0x02 129 #define NBR_STA_2_WAY 0x04 130 #define NBR_STA_ACTIVE (~NBR_STA_DOWN) 131 #define NBR_STA_ANY 0xff 132 133 struct group { 134 TAILQ_ENTRY(group) entry; 135 struct event dead_timer; 136 struct event v1_host_timer; 137 struct event retrans_timer; 138 139 struct in_addr addr; 140 141 struct iface *iface; 142 143 time_t uptime; 144 int state; 145 }; 146 147 struct rde_group { 148 TAILQ_ENTRY(rde_group) entry; 149 struct in_addr rde_group; 150 }; 151 152 struct mfc { 153 struct in_addr origin; 154 struct in_addr group; 155 u_short ifindex; 156 u_int8_t ttls[MAXVIFS]; 157 }; 158 159 struct prune { 160 struct in_addr origin; 161 struct in_addr netmask; 162 struct in_addr group; 163 struct in_addr nexthop; 164 u_short ifindex; 165 u_int32_t lifetime; 166 }; 167 168 struct nbr_msg { 169 struct in_addr address; 170 unsigned int ifindex; 171 }; 172 173 TAILQ_HEAD(rr_head, rr_entry); 174 RB_HEAD(src_head, src_node); 175 176 struct iface { 177 LIST_ENTRY(iface) entry; 178 struct event probe_timer; 179 struct event query_timer; 180 struct event querier_present_timer; 181 time_t uptime; 182 LIST_HEAD(, nbr) nbr_list; 183 TAILQ_HEAD(, group) group_list; 184 TAILQ_HEAD(, rde_group) rde_group_list; 185 struct rr_head rr_list; 186 187 char name[IF_NAMESIZE]; 188 struct in_addr addr; 189 struct in_addr dst; 190 struct in_addr mask; 191 struct in_addr querier; /* designated querier */ 192 193 u_int64_t baudrate; 194 u_int32_t gen_id; 195 u_int32_t group_cnt; 196 u_int32_t probe_interval; 197 198 u_int32_t query_interval; 199 u_int32_t query_resp_interval; 200 u_int32_t recv_query_resp_interval; 201 u_int32_t group_member_interval; 202 u_int32_t querier_present_interval; 203 u_int32_t startup_query_interval; 204 u_int32_t startup_query_cnt; 205 u_int32_t last_member_query_interval; 206 u_int32_t last_member_query_cnt; 207 u_int32_t last_member_query_time; 208 u_int32_t v1_querier_present_tmout; 209 u_int32_t v1_host_present_interval; 210 u_int32_t startup_query_counter; /* actual counter */ 211 u_int32_t dead_interval; 212 213 unsigned int ifindex; /* ifindex and vif */ 214 int fd; 215 int state; 216 int mtu; 217 int nbr_cnt; 218 int adj_cnt; 219 220 u_int16_t flags; 221 u_int16_t metric; 222 enum iface_type type; 223 224 u_int8_t robustness; 225 u_int8_t linkstate; 226 u_int8_t if_type; 227 u_int8_t passive; 228 u_int8_t igmp_version; 229 }; 230 231 /* dvmrp_conf */ 232 struct dvmrpd_conf { 233 struct event ev; 234 struct event report_timer; 235 u_int32_t gen_id; 236 u_int32_t opts; 237 #define DVMRPD_OPT_VERBOSE 0x00000001 238 #define DVMRPD_OPT_VERBOSE2 0x00000002 239 #define DVMRPD_OPT_NOACTION 0x00000004 240 int maxdepth; 241 LIST_HEAD(, iface) iface_list; 242 int dvmrp_socket; 243 int mroute_socket; 244 int flags; 245 }; 246 247 /* kroute */ 248 struct kroute { 249 struct in_addr prefix; 250 struct in_addr nexthop; 251 u_int16_t flags; 252 u_short ifindex; 253 u_int8_t prefixlen; 254 }; 255 256 struct kif { 257 char ifname[IF_NAMESIZE]; 258 u_int64_t baudrate; 259 int flags; 260 int mtu; 261 u_short ifindex; 262 u_int8_t if_type; 263 u_int8_t link_state; 264 u_int8_t nh_reachable; /* for nexthop verification */ 265 }; 266 267 /* control data structures */ 268 struct ctl_iface { 269 char name[IF_NAMESIZE]; 270 struct in_addr addr; 271 struct in_addr mask; 272 struct in_addr querier; 273 274 time_t probe_timer; 275 time_t query_timer; 276 time_t querier_present_timer; 277 time_t uptime; 278 279 u_int64_t baudrate; 280 u_int32_t gen_id; 281 u_int32_t group_cnt; 282 u_int32_t probe_interval; 283 u_int32_t query_interval; 284 u_int32_t query_resp_interval; 285 u_int32_t recv_query_resp_interval; 286 u_int32_t group_member_interval; 287 u_int32_t querier_present_interval; 288 u_int32_t startup_query_interval; 289 u_int32_t startup_query_cnt; 290 u_int32_t last_member_query_interval; 291 u_int32_t last_member_query_cnt; 292 u_int32_t last_member_query_time; 293 u_int32_t v1_querier_present_tmout; 294 u_int32_t v1_host_present_interval; 295 u_int32_t dead_interval; 296 297 unsigned int ifindex; 298 int state; 299 int mtu; 300 int nbr_cnt; 301 int adj_cnt; 302 303 u_int16_t flags; 304 u_int16_t metric; 305 enum iface_type type; 306 u_int8_t robustness; 307 u_int8_t linkstate; 308 u_int8_t if_type; 309 u_int8_t passive; 310 u_int8_t igmp_version; 311 }; 312 313 struct ctl_group { 314 time_t dead_timer; 315 time_t v1_host_timer; 316 time_t retrans_timer; 317 time_t uptime; 318 struct in_addr addr; 319 int state; 320 }; 321 322 struct ctl_nbr { 323 char name[IF_NAMESIZE]; 324 struct in_addr id; 325 struct in_addr addr; 326 time_t dead_timer; 327 time_t uptime; 328 int state; 329 }; 330 331 struct ctl_rt { 332 struct in_addr prefix; 333 struct in_addr nexthop; 334 struct in_addr area; 335 struct in_addr adv_rtr; 336 time_t uptime; 337 time_t expire; 338 u_int32_t cost; 339 u_int8_t flags; 340 u_int8_t prefixlen; 341 }; 342 343 struct ctl_mfc { 344 u_int8_t ttls[MAXVIFS]; /* outgoing vif(s) */ 345 struct in_addr origin; 346 struct in_addr group; 347 time_t uptime; 348 time_t expire; 349 u_short ifindex; /* incoming vif */ 350 }; 351 352 struct ctl_sum { 353 struct in_addr rtr_id; 354 u_int32_t hold_time; 355 }; 356 357 /* dvmrpd.c */ 358 void main_imsg_compose_dvmrpe(int, pid_t, void *, u_int16_t); 359 360 /* parse.y */ 361 struct dvmrpd_conf *parse_config(char *, int); 362 int cmdline_symset(char *); 363 364 int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t, 365 int, void *, u_int16_t); 366 void imsg_event_add(struct imsgev *); 367 368 /* in_cksum.c */ 369 u_int16_t in_cksum(void *, size_t); 370 371 /* kroute.c */ 372 int kif_init(void); 373 void kif_clear(void); 374 int kr_init(void); 375 void kr_shutdown(void); 376 void kr_dispatch_msg(int, short, void *); 377 void kr_ifinfo(char *); 378 struct kif *kif_findname(char *); 379 380 u_int8_t prefixlen_classful(in_addr_t); 381 u_int8_t mask2prefixlen(in_addr_t); 382 in_addr_t prefixlen2mask(u_int8_t); 383 384 /* kmroute.c */ 385 int kmr_init(int); 386 void kmr_shutdown(void); 387 void kmr_recv_msg(int, short, void *); 388 void kmr_mfc_couple(void); 389 void kmr_mfc_decouple(void); 390 void kmroute_clear(void); 391 int mrt_init(int); 392 int mrt_done(int); 393 int mrt_add_vif(int, struct iface *); 394 void mrt_del_vif(int, struct iface *); 395 int mrt_add_mfc(int, struct mfc *); 396 int mrt_del_mfc(int, struct mfc *); 397 398 /* log.h */ 399 const char *nbr_state_name(int); 400 const char *if_state_name(int); 401 const char *if_type_name(enum iface_type); 402 const char *group_state_name(int); 403 404 /* printconf.c */ 405 void print_config(struct dvmrpd_conf *); 406 407 /* interface.c */ 408 struct iface *if_find_index(u_short); 409 410 #define PREFIX_SIZE(x) (((x) + 7) / 8) 411 412 #endif /* _DVMRPD_H_ */ 413