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