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