[BACK]Return to dvmrpd.h CVS log [TXT][DIR] Up to [local] / src / usr.sbin / dvmrpd

File: [local] / src / usr.sbin / dvmrpd / dvmrpd.h (download)

Revision 1.8, Tue Sep 11 18:23:05 2007 UTC (16 years, 8 months ago) by claudio
Branch: MAIN
CVS Tags: OPENBSD_4_4_BASE, OPENBSD_4_4, OPENBSD_4_3_BASE, OPENBSD_4_3
Changes since 1.7: +3 -4 lines

The same dance as in all other routing daemons. baudrate is 64bit plus
initialize iface->baudrate when the interface is created. An additional
gimmick don't set the ictl->baudrate twice when building the control message.

/*	$OpenBSD: dvmrpd.h,v 1.8 2007/09/11 18:23:05 claudio Exp $ */

/*
 * Copyright (c) 2004, 2005, 2006 Esben Norby <norby@openbsd.org>
 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _DVMRPD_H_
#define _DVMRPD_H_

#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/tree.h>
#include <net/if.h>
#include <netinet/in.h>
#include <event.h>

#define CONF_FILE		"/etc/dvmrpd.conf"
#define	DVMRPD_SOCKET		"/var/run/dvmrpd.sock"
#define DVMRPD_USER		"_dvmrpd"

#define NBR_HASHSIZE		128

#define NBR_IDSELF		1
#define NBR_CNTSTART		(NBR_IDSELF + 1)

#define	READ_BUF_SIZE		65535
#define	RT_BUF_SIZE		16384

#define	DVMRPD_FLAG_NO_FIB_UPDATE	0x0001

#define	F_DVMRPD_INSERTED	0x0001
#define	F_KERNEL		0x0002
#define	F_CONNECTED		0x0004
#define	F_DOWN			0x0010
#define	F_STATIC		0x0020
#define	F_LONGER		0x0040

#define MAXVIFS			32	/* XXX */

/* buffer */
struct buf {
	TAILQ_ENTRY(buf)	 entry;
	u_char			*buf;
	size_t			 size;
	size_t			 max;
	size_t			 wpos;
	size_t			 rpos;
	int			 fd;
};

struct msgbuf {
	u_int32_t		 queued;
	int			 fd;
	TAILQ_HEAD(, buf)	 bufs;
};

#define	IMSG_HEADER_SIZE	sizeof(struct imsg_hdr)
#define	MAX_IMSGSIZE		8192

struct buf_read {
	u_char			 buf[READ_BUF_SIZE];
	u_char			*rptr;
	size_t			 wpos;
};

struct imsgbuf {
	TAILQ_HEAD(, imsg_fd)	fds;
	struct buf_read		r;
	struct msgbuf		w;
	struct event		ev;
	void			(*handler)(int, short, void *);
	int			fd;
	pid_t			pid;
	short			events;
};

enum imsg_type {
	IMSG_NONE,
	IMSG_CTL_RELOAD,
	IMSG_CTL_SHOW_IFACE,
	IMSG_CTL_SHOW_IGMP,
	IMSG_CTL_SHOW_NBR,
	IMSG_CTL_SHOW_RIB,
	IMSG_CTL_SHOW_MFC,
	IMSG_CTL_MFC_COUPLE,
	IMSG_CTL_MFC_DECOUPLE,
	IMSG_CTL_KROUTE,
	IMSG_CTL_KROUTE_ADDR,
	IMSG_CTL_IFINFO,
	IMSG_CTL_SHOW_SUM,
	IMSG_CTL_END,
	IMSG_IFINFO,
	IMSG_ROUTE_REPORT,
	IMSG_FULL_ROUTE_REPORT,
	IMSG_FULL_ROUTE_REPORT_END,
	IMSG_MFC_ADD,
	IMSG_MFC_DEL
};

struct imsg_hdr {
	enum imsg_type	type;
	u_int16_t	len;
	u_int32_t	peerid;
	pid_t		pid;
};

struct imsg {
	struct imsg_hdr	 hdr;
	void		*data;
};

struct imsg_fd {
	TAILQ_ENTRY(imsg_fd)	entry;
	int			fd;
};

/* interface states */
#define	IF_STA_DOWN		0x01
#define IF_STA_QUERIER		0x02
#define	IF_STA_NONQUERIER	0x04
#define	IF_STA_ANY		0x07
#define	IF_STA_ACTIVE		(~IF_STA_DOWN)

/* interface events */
enum iface_event {
	IF_EVT_NOTHING,
	IF_EVT_UP,
	IF_EVT_QTMOUT,		/* query timer expired */
	IF_EVT_QRECVD,		/* query received, check for lower IP */
	IF_EVT_QPRSNTTMOUT,	/* other querier present timeout */
	IF_EVT_DOWN
};

/* interface actions */
enum iface_action {
	IF_ACT_NOTHING,
	IF_ACT_STRT,
	IF_ACT_QPRSNT,
	IF_ACT_RST
};

/* interface types */
enum iface_type {
	IF_TYPE_POINTOPOINT,
	IF_TYPE_BROADCAST
};

/* neighbor states */
#define	NBR_STA_DOWN		0x01
#define	NBR_STA_1_WAY		0x02
#define	NBR_STA_2_WAY		0x04
#define NBR_STA_ACTIVE		(~NBR_STA_DOWN)
#define NBR_STA_ANY		0xff

struct group {
	TAILQ_ENTRY(group)	 entry;
	struct event		 dead_timer;
	struct event		 v1_host_timer;
	struct event		 retrans_timer;

	struct in_addr		 addr;

	struct iface		*iface;

	time_t			 uptime;
	int			 state;
};

struct mfc {
	struct in_addr		 origin;
	struct in_addr		 group;
	u_short			 ifindex;
	u_int8_t		 ttls[MAXVIFS];
};

TAILQ_HEAD(rr_head, rr_entry);
RB_HEAD(src_head, src_node);

struct iface {
	LIST_ENTRY(iface)	 entry;
	struct event		 probe_timer;
	struct event		 query_timer;
	struct event		 querier_present_timer;
	time_t			 uptime;
	LIST_HEAD(, nbr)	 nbr_list;
	TAILQ_HEAD(, group)	 group_list;
	struct rr_head		 rr_list;

	char			 name[IF_NAMESIZE];
	struct in_addr		 addr;
	struct in_addr		 dst;
	struct in_addr		 mask;
	struct in_addr		 querier;	/* designated querier */

	u_int64_t		 baudrate;
	u_int32_t		 gen_id;
	u_int32_t		 group_cnt;
	u_int32_t		 probe_interval;

	u_int32_t		 query_interval;
	u_int32_t		 query_resp_interval;
	u_int32_t		 recv_query_resp_interval;
	u_int32_t		 group_member_interval;
	u_int32_t		 querier_present_interval;
	u_int32_t		 startup_query_interval;
	u_int32_t		 startup_query_cnt;
	u_int32_t		 last_member_query_interval;
	u_int32_t		 last_member_query_cnt;
	u_int32_t		 last_member_query_time;
	u_int32_t		 v1_querier_present_tmout;
	u_int32_t		 v1_host_present_interval;
	u_int32_t		 startup_query_counter; /* actual counter */
	u_int32_t		 dead_interval;

	unsigned int		 ifindex;		/* ifindex and vif */
	int			 fd;
	int			 state;
	int			 mtu;
	int			 nbr_cnt;
	int			 adj_cnt;

	u_int16_t		 flags;
	u_int16_t		 metric;
	enum iface_type		 type;

	u_int8_t		 robustness;
	u_int8_t		 linkstate;
	u_int8_t		 media_type;
	u_int8_t		 passive;
	u_int8_t		 igmp_version;
};

/* dvmrp_conf */
enum {
	PROC_MAIN,
	PROC_DVMRP_ENGINE,
	PROC_RDE_ENGINE
} dvmrpd_process;

struct dvmrpd_conf {
	struct event		 ev;
	struct event		 report_timer;
	u_int32_t		 gen_id;
	u_int32_t		 opts;
#define DVMRPD_OPT_VERBOSE	 0x00000001
#define DVMRPD_OPT_VERBOSE2	 0x00000002
#define DVMRPD_OPT_NOACTION	 0x00000004
	int			 maxdepth;
	LIST_HEAD(, iface)	 iface_list;
	struct src_head		 src_list;
	int			 dvmrp_socket;
	int			 mroute_socket;
	int			 flags;
};

/* kroute */
struct kroute {
	struct in_addr		 prefix;
	struct in_addr		 nexthop;
	u_int16_t		 flags;
	u_short			 ifindex;
	u_int8_t		 prefixlen;
};

struct kif {
	char			 ifname[IF_NAMESIZE];
	u_int64_t		 baudrate;
	int			 flags;
	int			 mtu;
	u_short			 ifindex;
	u_int8_t		 media_type;
	u_int8_t		 link_state;
	u_int8_t		 nh_reachable;	/* for nexthop verification */
};

/* control data structures */
struct ctl_iface {
	char			 name[IF_NAMESIZE];
	struct in_addr		 addr;
	struct in_addr		 mask;
	struct in_addr		 querier;

	time_t			 probe_timer;
	time_t			 query_timer;
	time_t			 querier_present_timer;
	time_t			 uptime;

	u_int64_t		 baudrate;
	u_int32_t		 gen_id;
	u_int32_t		 group_cnt;
	u_int32_t		 probe_interval;
	u_int32_t		 query_interval;
	u_int32_t		 query_resp_interval;
	u_int32_t		 recv_query_resp_interval;
	u_int32_t		 group_member_interval;
	u_int32_t		 querier_present_interval;
	u_int32_t		 startup_query_interval;
	u_int32_t		 startup_query_cnt;
	u_int32_t		 last_member_query_interval;
	u_int32_t		 last_member_query_cnt;
	u_int32_t		 last_member_query_time;
	u_int32_t		 v1_querier_present_tmout;
	u_int32_t		 v1_host_present_interval;
	u_int32_t		 dead_interval;

	unsigned int		 ifindex;
	int			 state;
	int			 mtu;
	int			 nbr_cnt;
	int			 adj_cnt;

	u_int16_t		 flags;
	u_int16_t		 metric;
	enum iface_type		 type;
	u_int8_t		 robustness;
	u_int8_t		 linkstate;
	u_int8_t		 mediatype;
	u_int8_t		 passive;
	u_int8_t		 igmp_version;
};

struct ctl_group {
	time_t			 dead_timer;
	time_t			 v1_host_timer;
	time_t			 retrans_timer;
	time_t			 uptime;
	struct in_addr		 addr;
	int			 state;
};

struct ctl_nbr {
	char			 name[IF_NAMESIZE];
	struct in_addr		 id;
	struct in_addr		 addr;
	time_t			 dead_timer;
	time_t			 uptime;
	int			 state;
};

struct ctl_rt {
	struct in_addr		 prefix;
	struct in_addr		 nexthop;
	struct in_addr		 area;
	struct in_addr		 adv_rtr;
	time_t			 uptime;
	time_t			 expire;
	u_int32_t		 cost;
	u_int8_t		 flags;
	u_int8_t		 prefixlen;
};

struct ctl_mfc {
	u_int8_t		 ttls[MAXVIFS];	/* outgoing vif(s) */
	struct in_addr		 origin;
	struct in_addr		 group;
	time_t			 uptime;
	time_t			 expire;
	u_short			 ifindex;	/* incoming vif */
};

struct ctl_sum {
	struct in_addr		 rtr_id;
	u_int32_t		 hold_time;
};

/* buffer.c */
struct buf	*buf_open(size_t);
struct buf	*buf_dynamic(size_t, size_t);
int		 buf_add(struct buf *, void *, size_t);
void		*buf_reserve(struct buf *, size_t);
void		*buf_seek(struct buf *, size_t, size_t);
int		 buf_close(struct msgbuf *, struct buf *);
void		 buf_free(struct buf *);
void		 msgbuf_init(struct msgbuf *);
void		 msgbuf_clear(struct msgbuf *);
int		 msgbuf_write(struct msgbuf *);

/* dvmrpd.c */
void main_imsg_compose_dvmrpe(int, pid_t, void *, u_int16_t);

/* parse.y */
struct dvmrpd_conf	*parse_config(char *, int);
int			 cmdline_symset(char *);

/* imsg.c */
void	 imsg_init(struct imsgbuf *, int, void (*)(int, short, void *));
ssize_t	 imsg_read(struct imsgbuf *);
ssize_t	 imsg_get(struct imsgbuf *, struct imsg *);
int	 imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
	    void *, u_int16_t);
struct buf	*imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
		    u_int16_t);
int	 imsg_add(struct buf *, void *, u_int16_t);
int	 imsg_close(struct imsgbuf *, struct buf *);
void	 imsg_free(struct imsg *);
void	 imsg_event_add(struct imsgbuf *); /* needs to be provided externally */

/* in_cksum.c */
u_int16_t	 in_cksum(void *, size_t);

/* kroute.c */
int		 kif_init(void);
void		 kif_clear(void);
int		 kr_init(void);
void		 kr_shutdown(void);
void		 kr_dispatch_msg(int, short, void *);
void		 kr_ifinfo(char *);
struct kif	*kif_findname(char *);

u_int8_t	 prefixlen_classful(in_addr_t);
u_int8_t	 mask2prefixlen(in_addr_t);
in_addr_t	 prefixlen2mask(u_int8_t);

/* kmroute.c */
int		 kmr_init(int);
void		 kmr_shutdown(void);
void		 kmr_recv_msg(int, short, void *);
void		 kmr_mfc_couple(void);
void		 kmr_mfc_decouple(void);
void		 kmroute_clear(void);
int		 mrt_init(int);
int		 mrt_done(int);
int		 mrt_add_vif(int, struct iface *);
void		 mrt_del_vif(int, struct iface *);
int		 mrt_add_mfc(int, struct mfc *);
int		 mrt_del_mfc(int, struct mfc *);

/* log.h */
const char	*nbr_state_name(int);
const char	*if_state_name(int);
const char	*if_type_name(enum iface_type);
const char	*group_state_name(int);

/* printconf.c */
void		 print_config(struct dvmrpd_conf *);

/* interface.c */
struct iface	*if_find_index(u_short);

#define	PREFIX_SIZE(x)	(((x) + 7) / 8)

#endif	/* _DVMRPD_H_ */