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