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