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

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

Revision 1.3, Wed Mar 21 19:33:48 2007 UTC (17 years, 2 months ago) by michele
Branch: MAIN
CVS Tags: OPENBSD_4_4_BASE, OPENBSD_4_4, OPENBSD_4_3_BASE, OPENBSD_4_3, OPENBSD_4_2_BASE, OPENBSD_4_2
Changes since 1.2: +26 -3 lines

Added code to parse unicast routes learned from route report packets.
Now we are able to select correctly designated forwarders and downstream
dependent routers per interface.

Tested and OK norby@

/*	$OpenBSD: rde.h,v 1.3 2007/03/21 19:33:48 michele Exp $ */

/*
 * Copyright (c) 2005, 2006 Esben Norby <norby@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 _RDE_H_
#define _RDE_H_

#include <sys/types.h>
#include <sys/time.h>
#include <sys/tree.h>
#include <sys/queue.h>
#include <event.h>
#include <limits.h>

struct rt_node {
	RB_ENTRY(rt_node)	 entry;
	struct event		 expiration_timer;
	u_int8_t		 ttls[MAXVIFS];	/* downstream vif(s) */
	struct in_addr		 prefix;
	struct in_addr		 nexthop;
	u_int32_t		 cost;
	u_short			 ifindex;	/* learned from this iface */
	time_t			 uptime;
	u_int8_t		 flags;
	u_int8_t		 prefixlen;
	u_int8_t		 invalid;
	u_int8_t		 connected;
};

struct mfc_node {
	RB_ENTRY(mfc_node)	 entry;
	struct event		 expiration_timer;
	u_int8_t		 ttls[MAXVIFS];	/* outgoing vif(s) */
	struct in_addr		 origin;
	struct in_addr		 group;
	u_short			 ifindex;	/* incoming vif */
	time_t			 uptime;
};

struct ds {
	LIST_ENTRY(ds)		 entry;
	struct in_addr		 addr;
};

struct adv_rtr {
	struct in_addr		 addr;
	u_int32_t		 metric;
};

struct src_node {
	RB_ENTRY(src_node)	 entry;
	struct in_addr		 origin;
	struct in_addr		 mask;
	struct adv_rtr		 adv_rtr[MAXVIFS];
	u_int16_t		 ds_cnt[MAXVIFS];
	LIST_HEAD(, ds)		 ds_list;
};

/* rde.c */
pid_t	rde(struct dvmrpd_conf *, int [2], int [2], int [2]);
int	rde_imsg_compose_parent(int, pid_t, void *, u_int16_t);
int	rde_imsg_compose_dvmrpe(int, u_int32_t, pid_t, void *, u_int16_t);

/* rde_mfc.c */
void		 mfc_init(void);
int		 mfc_compare(struct mfc_node *, struct mfc_node *);
struct mfc_node *mfc_find(in_addr_t, in_addr_t);
int		 mfc_insert(struct mfc_node *);
int		 mfc_remove(struct mfc_node *);
void		 mfc_clear(void);
void		 mfc_dump(pid_t);
void		 mfc_update(struct mfc *);
void		 mfc_delete(struct mfc *);

/* rde_srt.c */
void		 rt_init(void);
int		 rt_compare(struct rt_node *, struct rt_node *);
struct rt_node	*rt_find(in_addr_t, u_int8_t);
struct rt_node	*rr_new_rt(struct route_report *, int, int);
int		 rt_insert(struct rt_node *);
void		 rt_update(struct rt_node *);
int		 rt_remove(struct rt_node *);
void		 rt_clear(void);
void		 rt_snap(u_int32_t);
void		 rt_dump(pid_t);

int		 srt_check_route(struct route_report *, int);
int		 src_compare(struct src_node *, struct src_node *);

RB_PROTOTYPE(src_head, src_node, entry, src_compare);

#endif	/* _RDE_H_ */