xref: /netbsd-src/usr.sbin/mrouted/prune.h (revision c60d41a9defbc86d2618a348d2dccca1f30bc3a7)
1*c60d41a9Swiz /*	$NetBSD: prune.h,v 1.6 2003/03/05 21:05:40 wiz Exp $	*/
2*c60d41a9Swiz 
3*c60d41a9Swiz /*
4*c60d41a9Swiz  * The mrouted program is covered by the license in the accompanying file
5*c60d41a9Swiz  * named "LICENSE".  Use of the mrouted program represents acceptance of
6*c60d41a9Swiz  * the terms and conditions listed in that file.
7*c60d41a9Swiz  *
8*c60d41a9Swiz  * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
9*c60d41a9Swiz  * Leland Stanford Junior University.
10*c60d41a9Swiz  */
11*c60d41a9Swiz 
12*c60d41a9Swiz /*
13*c60d41a9Swiz  * Group table
14*c60d41a9Swiz  *
15*c60d41a9Swiz  * Each group entry is a member of two doubly-linked lists:
16*c60d41a9Swiz  *
17*c60d41a9Swiz  * a) A list hanging off of the routing table entry for this source (rt_groups)
18*c60d41a9Swiz  *	sorted by group address under the routing entry (gt_next, gt_prev)
19*c60d41a9Swiz  * b) An independent list pointed to by kernel_table, which is a list of
20*c60d41a9Swiz  *	active source,group's (gt_gnext, gt_gprev).
21*c60d41a9Swiz  *
22*c60d41a9Swiz  */
23*c60d41a9Swiz struct gtable {
24*c60d41a9Swiz     struct gtable  *gt_next;		/* pointer to the next entry	    */
25*c60d41a9Swiz     struct gtable  *gt_prev;		/* back pointer for linked list	    */
26*c60d41a9Swiz     struct gtable  *gt_gnext;		/* fwd pointer for group list	    */
27*c60d41a9Swiz     struct gtable  *gt_gprev;		/* rev pointer for group list	    */
28*c60d41a9Swiz     u_int32_t	    gt_mcastgrp;	/* multicast group associated       */
29*c60d41a9Swiz     vifbitmap_t     gt_scope;		/* scoped interfaces                */
30*c60d41a9Swiz     u_char	    gt_ttls[MAXVIFS];	/* ttl vector for forwarding        */
31*c60d41a9Swiz     vifbitmap_t	    gt_grpmems;		/* forw. vifs for src, grp          */
32*c60d41a9Swiz     int		    gt_prsent_timer;	/* prune timer for this group	    */
33*c60d41a9Swiz     int  	    gt_timer;		/* timer for this group entry	    */
34*c60d41a9Swiz     time_t 	    gt_ctime;		/* time of entry creation         */
35*c60d41a9Swiz     u_char	    gt_grftsnt;		/* graft sent/retransmit timer	    */
36*c60d41a9Swiz     struct stable  *gt_srctbl;		/* source table			    */
37*c60d41a9Swiz     struct ptable  *gt_pruntbl;		/* prune table			    */
38*c60d41a9Swiz     struct rtentry *gt_route;		/* parent route			    */
39*c60d41a9Swiz #ifdef RSRR
40*c60d41a9Swiz     struct rsrr_cache *gt_rsrr_cache;	/* RSRR cache                       */
41*c60d41a9Swiz #endif /* RSRR */
42*c60d41a9Swiz };
43*c60d41a9Swiz 
44*c60d41a9Swiz /*
45*c60d41a9Swiz  * Source table
46*c60d41a9Swiz  *
47*c60d41a9Swiz  * When source-based prunes exist, there will be a struct ptable here as well.
48*c60d41a9Swiz  */
49*c60d41a9Swiz struct stable
50*c60d41a9Swiz {
51*c60d41a9Swiz     struct stable  *st_next;       	/* pointer to the next entry        */
52*c60d41a9Swiz     u_int32_t	    st_origin;		/* host origin of multicasts        */
53*c60d41a9Swiz     u_long	    st_pktcnt;		/* packet count for src-grp entry   */
54*c60d41a9Swiz };
55*c60d41a9Swiz 
56*c60d41a9Swiz /*
57*c60d41a9Swiz  * structure to store incoming prunes.  Can hang off of either group or source.
58*c60d41a9Swiz  */
59*c60d41a9Swiz struct ptable
60*c60d41a9Swiz {
61*c60d41a9Swiz     struct ptable  *pt_next;		/* pointer to the next entry	    */
62*c60d41a9Swiz     u_int32_t	    pt_router;		/* router that sent this prune	    */
63*c60d41a9Swiz     vifi_t	    pt_vifi;		/* vif prune received on	    */
64*c60d41a9Swiz     int		    pt_timer;		/* timer for prune		    */
65*c60d41a9Swiz };
66*c60d41a9Swiz 
67*c60d41a9Swiz /*
68*c60d41a9Swiz  * The packet format for a traceroute request.
69*c60d41a9Swiz  */
70*c60d41a9Swiz struct tr_query {
71*c60d41a9Swiz     u_int32_t  tr_src;		/* traceroute source */
72*c60d41a9Swiz     u_int32_t  tr_dst;		/* traceroute destination */
73*c60d41a9Swiz     u_int32_t  tr_raddr;		/* traceroute response address */
74*c60d41a9Swiz #if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)
75*c60d41a9Swiz     struct {
76*c60d41a9Swiz 	u_int	qid : 24;	/* traceroute query id */
77*c60d41a9Swiz 	u_int	ttl : 8;	/* traceroute response ttl */
78*c60d41a9Swiz     } q;
79*c60d41a9Swiz #else
80*c60d41a9Swiz     struct {
81*c60d41a9Swiz 	u_int   ttl : 8;	/* traceroute response ttl */
82*c60d41a9Swiz 	u_int   qid : 24;	/* traceroute query id */
83*c60d41a9Swiz     } q;
84*c60d41a9Swiz #endif /* BYTE_ORDER */
85*c60d41a9Swiz };
86*c60d41a9Swiz 
87*c60d41a9Swiz #define tr_rttl q.ttl
88*c60d41a9Swiz #define tr_qid  q.qid
89*c60d41a9Swiz 
90*c60d41a9Swiz /*
91*c60d41a9Swiz  * Traceroute response format.  A traceroute response has a tr_query at the
92*c60d41a9Swiz  * beginning, followed by one tr_resp for each hop taken.
93*c60d41a9Swiz  */
94*c60d41a9Swiz struct tr_resp {
95*c60d41a9Swiz     u_int32_t tr_qarr;		/* query arrival time */
96*c60d41a9Swiz     u_int32_t tr_inaddr;		/* incoming interface address */
97*c60d41a9Swiz     u_int32_t tr_outaddr;		/* outgoing interface address */
98*c60d41a9Swiz     u_int32_t tr_rmtaddr;		/* parent address in source tree */
99*c60d41a9Swiz     u_int32_t tr_vifin;		/* input packet count on interface */
100*c60d41a9Swiz     u_int32_t tr_vifout;		/* output packet count on interface */
101*c60d41a9Swiz     u_int32_t tr_pktcnt;		/* total incoming packets for src-grp */
102*c60d41a9Swiz     u_char  tr_rproto;		/* routing protocol deployed on router */
103*c60d41a9Swiz     u_char  tr_fttl;		/* ttl required to forward on outvif */
104*c60d41a9Swiz     u_char  tr_smask;		/* subnet mask for src addr */
105*c60d41a9Swiz     u_char  tr_rflags;		/* forwarding error codes */
106*c60d41a9Swiz };
107*c60d41a9Swiz 
108*c60d41a9Swiz /* defs within mtrace */
109*c60d41a9Swiz #define QUERY	1
110*c60d41a9Swiz #define RESP	2
111*c60d41a9Swiz #define QLEN	sizeof(struct tr_query)
112*c60d41a9Swiz #define RLEN	sizeof(struct tr_resp)
113*c60d41a9Swiz 
114*c60d41a9Swiz /* fields for tr_rflags (forwarding error codes) */
115*c60d41a9Swiz #define TR_NO_ERR	0
116*c60d41a9Swiz #define TR_WRONG_IF	1
117*c60d41a9Swiz #define TR_PRUNED	2
118*c60d41a9Swiz #define TR_OPRUNED	3
119*c60d41a9Swiz #define TR_SCOPED	4
120*c60d41a9Swiz #define TR_NO_RTE	5
121*c60d41a9Swiz #define TR_NO_FWD	7
122*c60d41a9Swiz #define TR_RP_OR_CORE	8
123*c60d41a9Swiz #define TR_RPF_INT	9
124*c60d41a9Swiz #define TR_NO_MULTICAST	10
125*c60d41a9Swiz #define TR_NO_SPACE	0x81
126*c60d41a9Swiz #define TR_OLD_ROUTER	0x82
127*c60d41a9Swiz #define TR_ADMIN_DENY	0x83
128*c60d41a9Swiz 
129*c60d41a9Swiz /* fields for tr_rproto (routing protocol) */
130*c60d41a9Swiz #define PROTO_DVMRP	1
131*c60d41a9Swiz #define PROTO_MOSPF	2
132*c60d41a9Swiz #define PROTO_PIM	3
133*c60d41a9Swiz #define PROTO_CBT	4
134*c60d41a9Swiz #define PROTO_PIM_SPEC	5
135*c60d41a9Swiz #define PROTO_PIM_STAT	6
136*c60d41a9Swiz #define PROTO_DVMRP_STAT 7
137*c60d41a9Swiz #define PROTO_PIM_MBGP	8
138*c60d41a9Swiz 
139*c60d41a9Swiz #define MASK_TO_VAL(x, i) { \
140*c60d41a9Swiz 			u_int32_t _x = ntohl(x); \
141*c60d41a9Swiz 			(i) = 1; \
142*c60d41a9Swiz 			while ((_x) <<= 1) \
143*c60d41a9Swiz 				(i)++; \
144*c60d41a9Swiz 			};
145*c60d41a9Swiz 
146*c60d41a9Swiz #define VAL_TO_MASK(x, i) { \
147*c60d41a9Swiz 			x = htonl(~((1 << (32 - (i))) - 1)); \
148*c60d41a9Swiz 			};
149*c60d41a9Swiz 
150*c60d41a9Swiz #define NBR_VERS(n)	(((n)->al_pv << 8) + (n)->al_mv)
151