dvmrpd.h revision 1.14
1/* $OpenBSD: dvmrpd.h,v 1.14 2009/03/06 18:39:13 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_GROUP_ADD, 115 IMSG_GROUP_DEL, 116 IMSG_FLASH_UPDATE, 117 IMSG_FLASH_UPDATE_DS 118}; 119 120struct imsg_hdr { 121 enum imsg_type type; 122 u_int16_t len; 123 u_int32_t peerid; 124 pid_t pid; 125}; 126 127struct imsg { 128 struct imsg_hdr hdr; 129 void *data; 130}; 131 132struct imsg_fd { 133 TAILQ_ENTRY(imsg_fd) entry; 134 int fd; 135}; 136 137/* interface states */ 138#define IF_STA_DOWN 0x01 139#define IF_STA_QUERIER 0x02 140#define IF_STA_NONQUERIER 0x04 141#define IF_STA_ANY 0x07 142#define IF_STA_ACTIVE (~IF_STA_DOWN) 143 144/* interface events */ 145enum iface_event { 146 IF_EVT_NOTHING, 147 IF_EVT_UP, 148 IF_EVT_QTMOUT, /* query timer expired */ 149 IF_EVT_QRECVD, /* query received, check for lower IP */ 150 IF_EVT_QPRSNTTMOUT, /* other querier present timeout */ 151 IF_EVT_DOWN 152}; 153 154/* interface actions */ 155enum iface_action { 156 IF_ACT_NOTHING, 157 IF_ACT_STRT, 158 IF_ACT_QPRSNT, 159 IF_ACT_RST 160}; 161 162/* interface types */ 163enum iface_type { 164 IF_TYPE_POINTOPOINT, 165 IF_TYPE_BROADCAST 166}; 167 168/* neighbor states */ 169#define NBR_STA_DOWN 0x01 170#define NBR_STA_1_WAY 0x02 171#define NBR_STA_2_WAY 0x04 172#define NBR_STA_ACTIVE (~NBR_STA_DOWN) 173#define NBR_STA_ANY 0xff 174 175struct group { 176 TAILQ_ENTRY(group) entry; 177 struct event dead_timer; 178 struct event v1_host_timer; 179 struct event retrans_timer; 180 181 struct in_addr addr; 182 183 struct iface *iface; 184 185 time_t uptime; 186 int state; 187}; 188 189struct rde_group { 190 TAILQ_ENTRY(rde_group) entry; 191 struct in_addr rde_group; 192}; 193 194struct mfc { 195 struct in_addr origin; 196 struct in_addr group; 197 u_short ifindex; 198 u_int8_t ttls[MAXVIFS]; 199}; 200 201TAILQ_HEAD(rr_head, rr_entry); 202RB_HEAD(src_head, src_node); 203 204struct iface { 205 LIST_ENTRY(iface) entry; 206 struct event probe_timer; 207 struct event query_timer; 208 struct event querier_present_timer; 209 time_t uptime; 210 LIST_HEAD(, nbr) nbr_list; 211 TAILQ_HEAD(, group) group_list; 212 TAILQ_HEAD(, rde_group) rde_group_list; 213 struct rr_head rr_list; 214 215 char name[IF_NAMESIZE]; 216 struct in_addr addr; 217 struct in_addr dst; 218 struct in_addr mask; 219 struct in_addr querier; /* designated querier */ 220 221 u_int64_t baudrate; 222 u_int32_t gen_id; 223 u_int32_t group_cnt; 224 u_int32_t probe_interval; 225 226 u_int32_t query_interval; 227 u_int32_t query_resp_interval; 228 u_int32_t recv_query_resp_interval; 229 u_int32_t group_member_interval; 230 u_int32_t querier_present_interval; 231 u_int32_t startup_query_interval; 232 u_int32_t startup_query_cnt; 233 u_int32_t last_member_query_interval; 234 u_int32_t last_member_query_cnt; 235 u_int32_t last_member_query_time; 236 u_int32_t v1_querier_present_tmout; 237 u_int32_t v1_host_present_interval; 238 u_int32_t startup_query_counter; /* actual counter */ 239 u_int32_t dead_interval; 240 241 unsigned int ifindex; /* ifindex and vif */ 242 int fd; 243 int state; 244 int mtu; 245 int nbr_cnt; 246 int adj_cnt; 247 248 u_int16_t flags; 249 u_int16_t metric; 250 enum iface_type type; 251 252 u_int8_t robustness; 253 u_int8_t linkstate; 254 u_int8_t media_type; 255 u_int8_t passive; 256 u_int8_t igmp_version; 257}; 258 259/* dvmrp_conf */ 260enum { 261 PROC_MAIN, 262 PROC_DVMRP_ENGINE, 263 PROC_RDE_ENGINE 264} dvmrpd_process; 265 266struct dvmrpd_conf { 267 struct event ev; 268 struct event report_timer; 269 u_int32_t gen_id; 270 u_int32_t opts; 271#define DVMRPD_OPT_VERBOSE 0x00000001 272#define DVMRPD_OPT_VERBOSE2 0x00000002 273#define DVMRPD_OPT_NOACTION 0x00000004 274 int maxdepth; 275 LIST_HEAD(, iface) iface_list; 276 int dvmrp_socket; 277 int mroute_socket; 278 int flags; 279}; 280 281/* kroute */ 282struct kroute { 283 struct in_addr prefix; 284 struct in_addr nexthop; 285 u_int16_t flags; 286 u_short ifindex; 287 u_int8_t prefixlen; 288}; 289 290struct kif { 291 char ifname[IF_NAMESIZE]; 292 u_int64_t baudrate; 293 int flags; 294 int mtu; 295 u_short ifindex; 296 u_int8_t media_type; 297 u_int8_t link_state; 298 u_int8_t nh_reachable; /* for nexthop verification */ 299}; 300 301/* control data structures */ 302struct ctl_iface { 303 char name[IF_NAMESIZE]; 304 struct in_addr addr; 305 struct in_addr mask; 306 struct in_addr querier; 307 308 time_t probe_timer; 309 time_t query_timer; 310 time_t querier_present_timer; 311 time_t uptime; 312 313 u_int64_t baudrate; 314 u_int32_t gen_id; 315 u_int32_t group_cnt; 316 u_int32_t probe_interval; 317 u_int32_t query_interval; 318 u_int32_t query_resp_interval; 319 u_int32_t recv_query_resp_interval; 320 u_int32_t group_member_interval; 321 u_int32_t querier_present_interval; 322 u_int32_t startup_query_interval; 323 u_int32_t startup_query_cnt; 324 u_int32_t last_member_query_interval; 325 u_int32_t last_member_query_cnt; 326 u_int32_t last_member_query_time; 327 u_int32_t v1_querier_present_tmout; 328 u_int32_t v1_host_present_interval; 329 u_int32_t dead_interval; 330 331 unsigned int ifindex; 332 int state; 333 int mtu; 334 int nbr_cnt; 335 int adj_cnt; 336 337 u_int16_t flags; 338 u_int16_t metric; 339 enum iface_type type; 340 u_int8_t robustness; 341 u_int8_t linkstate; 342 u_int8_t mediatype; 343 u_int8_t passive; 344 u_int8_t igmp_version; 345}; 346 347struct ctl_group { 348 time_t dead_timer; 349 time_t v1_host_timer; 350 time_t retrans_timer; 351 time_t uptime; 352 struct in_addr addr; 353 int state; 354}; 355 356struct ctl_nbr { 357 char name[IF_NAMESIZE]; 358 struct in_addr id; 359 struct in_addr addr; 360 time_t dead_timer; 361 time_t uptime; 362 int state; 363}; 364 365struct ctl_rt { 366 struct in_addr prefix; 367 struct in_addr nexthop; 368 struct in_addr area; 369 struct in_addr adv_rtr; 370 time_t uptime; 371 time_t expire; 372 u_int32_t cost; 373 u_int8_t flags; 374 u_int8_t prefixlen; 375}; 376 377struct ctl_mfc { 378 u_int8_t ttls[MAXVIFS]; /* outgoing vif(s) */ 379 struct in_addr origin; 380 struct in_addr group; 381 time_t uptime; 382 time_t expire; 383 u_short ifindex; /* incoming vif */ 384}; 385 386struct ctl_sum { 387 struct in_addr rtr_id; 388 u_int32_t hold_time; 389}; 390 391/* buffer.c */ 392struct buf *buf_open(size_t); 393struct buf *buf_dynamic(size_t, size_t); 394int buf_add(struct buf *, void *, size_t); 395void *buf_reserve(struct buf *, size_t); 396void *buf_seek(struct buf *, size_t, size_t); 397int buf_close(struct msgbuf *, struct buf *); 398void buf_free(struct buf *); 399void msgbuf_init(struct msgbuf *); 400void msgbuf_clear(struct msgbuf *); 401int msgbuf_write(struct msgbuf *); 402 403/* dvmrpd.c */ 404void main_imsg_compose_dvmrpe(int, pid_t, void *, u_int16_t); 405 406/* parse.y */ 407struct dvmrpd_conf *parse_config(char *, int); 408int cmdline_symset(char *); 409 410/* imsg.c */ 411void imsg_init(struct imsgbuf *, int, void (*)(int, short, void *)); 412ssize_t imsg_read(struct imsgbuf *); 413ssize_t imsg_get(struct imsgbuf *, struct imsg *); 414int imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t, 415 void *, u_int16_t); 416struct buf *imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t, 417 u_int16_t); 418int imsg_add(struct buf *, void *, u_int16_t); 419int imsg_close(struct imsgbuf *, struct buf *); 420void imsg_free(struct imsg *); 421void imsg_event_add(struct imsgbuf *); /* needs to be provided externally */ 422 423/* in_cksum.c */ 424u_int16_t in_cksum(void *, size_t); 425 426/* kroute.c */ 427int kif_init(void); 428void kif_clear(void); 429int kr_init(void); 430void kr_shutdown(void); 431void kr_dispatch_msg(int, short, void *); 432void kr_ifinfo(char *); 433struct kif *kif_findname(char *); 434 435u_int8_t prefixlen_classful(in_addr_t); 436u_int8_t mask2prefixlen(in_addr_t); 437in_addr_t prefixlen2mask(u_int8_t); 438 439/* kmroute.c */ 440int kmr_init(int); 441void kmr_shutdown(void); 442void kmr_recv_msg(int, short, void *); 443void kmr_mfc_couple(void); 444void kmr_mfc_decouple(void); 445void kmroute_clear(void); 446int mrt_init(int); 447int mrt_done(int); 448int mrt_add_vif(int, struct iface *); 449void mrt_del_vif(int, struct iface *); 450int mrt_add_mfc(int, struct mfc *); 451int mrt_del_mfc(int, struct mfc *); 452 453/* log.h */ 454const char *nbr_state_name(int); 455const char *if_state_name(int); 456const char *if_type_name(enum iface_type); 457const char *group_state_name(int); 458 459/* printconf.c */ 460void print_config(struct dvmrpd_conf *); 461 462/* interface.c */ 463struct iface *if_find_index(u_short); 464 465#define PREFIX_SIZE(x) (((x) + 7) / 8) 466 467#endif /* _DVMRPD_H_ */ 468