Annotation of embedaddon/pimd/mrt.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 1998-2001
3: * University of Southern California/Information Sciences Institute.
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: * 1. Redistributions of source code must retain the above copyright
10: * notice, this list of conditions and the following disclaimer.
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution.
14: * 3. Neither the name of the project nor the names of its contributors
15: * may be used to endorse or promote products derived from this software
16: * without specific prior written permission.
17: *
18: * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
19: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21: * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
22: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28: * SUCH DAMAGE.
29: */
30: /*
31: * $Id: mrt.h,v 1.16 2001/09/10 20:31:36 pavlin Exp $
32: */
33:
34: #define MRTF_SPT 0x0001 /* iif toward source */
35: #define MRTF_WC 0x0002 /* (*,G) entry */
36: #define MRTF_RP 0x0004 /* iif toward RP */
37: #define MRTF_NEW 0x0008 /* new created routing entry */
38: #define MRTF_IIF_REGISTER 0x0020 /* ??? */
39: #define MRTF_REGISTER 0x0080 /* ??? */
40: #define MRTF_KERNEL_CACHE 0x0200 /* a mirror for the kernel cache */
41: #define MRTF_NULL_OIF 0x0400 /* null oif cache.. ??? */
42: #define MRTF_REG_SUPP 0x0800 /* register suppress ??? */
43: #define MRTF_ASSERTED 0x1000 /* upstream is not that of src ??? */
44: #define MRTF_SG 0x2000 /* (S,G) pure, not hanging off of (*,G)*/
45: #define MRTF_PMBR 0x4000 /* (*,*,RP) entry (for interop) */
46: #define MRTF_MFC_CLONE_SG 0x8000 /* clone (S,G) MFC from (*,G) or (*,*,RP) */
47:
48: /* Macro to duplicate oif info (oif bits, timers) */
49: #define VOIF_COPY(from, to) \
50: do { \
51: VIFM_COPY((from)->joined_oifs, (to)->joined_oifs); \
52: VIFM_COPY((from)->oifs, (to)->oifs); \
53: VIFM_COPY((from)->leaves, (to)->leaves); \
54: VIFM_COPY((from)->pruned_oifs, (to)->pruned_oifs); \
55: VIFM_COPY((from)->asserted_oifs, (to)->asserted_oifs); \
56: memcpy((to)->vif_timers, (from)->vif_timers, \
57: numvifs * sizeof((from)->vif_timers[0])); \
58: memcpy((to)->vif_deletion_delay, (from)->vif_deletion_delay, \
59: numvifs * sizeof((from)->vif_deletion_delay[0])); \
60: } while (0)
61:
62: #define FREE_MRTENTRY(mrtentry_ptr) \
63: do { \
64: kernel_cache_t *curr; \
65: kernel_cache_t *next; \
66: \
67: if ((mrtentry_ptr)->vif_timers) \
68: free((mrtentry_ptr)->vif_timers); \
69: if ((mrtentry_ptr)->vif_deletion_delay) \
70: free((mrtentry_ptr)->vif_deletion_delay); \
71: curr = (mrtentry_ptr)->kernel_cache; \
72: while (curr) { \
73: next = curr->next; \
74: free(curr); \
75: curr = next; \
76: } \
77: free(mrtentry_ptr); \
78: } while (0)
79:
80:
81: /*
82: * The complicated structure used by the more complicated Join/Prune
83: * message building
84: */
85: typedef struct build_jp_message_ {
86: struct build_jp_message_ *next; /* Used to chain the free entries */
87: uint8_t *jp_message; /* The Join/Prune message */
88: uint32_t jp_message_size; /* Size of the Join/Prune message (in bytes) */
89: uint16_t holdtime; /* Join/Prune message holdtime field */
90: uint32_t curr_group; /* Current group address */
91: uint8_t curr_group_msklen;/* Current group masklen */
92: uint8_t *join_list; /* The working area for the join addresses */
93: uint32_t join_list_size; /* The size of the join_list (in bytes) */
94: uint16_t join_addr_number; /* Number of the join addresses in join_list */
95: uint8_t *prune_list; /* The working area for the prune addresses */
96: uint32_t prune_list_size; /* The size of the prune_list (in bytes) */
97: uint16_t prune_addr_number;/* Number of the prune addresses in prune_list*/
98: uint8_t *rp_list_join; /* The working area for RP join addresses */
99: uint32_t rp_list_join_size;/* The size of the rp_list_join (in bytes) */
100: uint16_t rp_list_join_number;/* Number of RP addresses in rp_list_join */
101: uint8_t *rp_list_prune; /* The working area for RP prune addresses */
102: uint32_t rp_list_prune_size;/* The size of the rp_list_prune (in bytes) */
103: uint16_t rp_list_prune_number;/* Number of RP addresses in rp_list_prune */
104: uint8_t *num_groups_ptr; /* Pointer to number_of_groups in jp_message */
105: } build_jp_message_t;
106:
107:
108: typedef struct pim_nbr_entry {
109: struct pim_nbr_entry *next; /* link to next neighbor */
110: struct pim_nbr_entry *prev; /* link to prev neighbor */
111: uint32_t address; /* neighbor address */
112: int8_t dr_prio_present;/* If set, this neighbor has prio */
113: uint32_t dr_prio; /* DR priority: 1 (default) */
114: uint32_t genid; /* Cached generation ID */
115: vifi_t vifi; /* which interface */
116: uint16_t timer; /* for timing out neighbor */
117: build_jp_message_t *build_jp_message; /* A structure for fairly
118: * complicated Join/Prune
119: * message construction.
120: */
121: } pim_nbr_entry_t;
122:
123:
124: typedef struct srcentry {
125: struct srcentry *next; /* link to next entry */
126: struct srcentry *prev; /* link to prev entry */
127: uint32_t address; /* source or RP address */
128: struct mrtentry *mrtlink; /* link to routing entries */
129: vifi_t incoming; /* incoming vif */
130: struct pim_nbr_entry *upstream; /* upstream router */
131: uint32_t metric; /* Unicast Routing Metric to the source */
132: uint32_t preference; /* The metric preference (for assers)*/
133: uint16_t timer; /* Entry timer??? Delete? */
134: struct cand_rp *cand_rp; /* Used if this is rpentry_t */
135: } srcentry_t;
136: typedef srcentry_t rpentry_t;
137:
138:
139: /* (RP<->group) matching table related structures */
140: typedef struct cand_rp {
141: struct cand_rp *next; /* Next candidate RP */
142: struct cand_rp *prev; /* Previous candidate RP */
143: struct rp_grp_entry *rp_grp_next; /* The rp_grp_entry chain for that RP*/
144: rpentry_t *rpentry; /* Pointer to the RP entry */
145: } cand_rp_t;
146:
147: typedef struct grp_mask {
148: struct grp_mask *next;
149: struct grp_mask *prev;
150: struct rp_grp_entry *grp_rp_next;
151: uint32_t group_addr;
152: uint32_t group_mask;
153: uint32_t hash_mask;
154: uint16_t fragment_tag; /* Used for garbage collection */
155: uint8_t group_rp_number; /* Used when assembling segments */
156: } grp_mask_t;
157:
158: typedef struct rp_grp_entry {
159: struct rp_grp_entry *rp_grp_next; /* Next entry for same RP */
160: struct rp_grp_entry *rp_grp_prev; /* Prev entry for same RP */
161: struct rp_grp_entry *grp_rp_next; /* Next entry for same grp prefix */
162: struct rp_grp_entry *grp_rp_prev; /* Prev entry for same grp prefix */
163: struct grpentry *grplink; /* Link to all grps via this entry */
164: uint16_t holdtime; /* The RP holdtime */
165: uint16_t fragment_tag; /* The fragment tag from the
166: * received BSR message */
167: uint8_t priority; /* The RP priority */
168: grp_mask_t *group; /* Pointer to (group,mask) entry */
169: cand_rp_t *rp; /* Pointer to the RP */
170: } rp_grp_entry_t;
171:
172:
173: typedef struct grpentry {
174: struct grpentry *next; /* link to next entry */
175: struct grpentry *prev; /* link to prev entry */
176: struct grpentry *rpnext; /* next grp for the same RP */
177: struct grpentry *rpprev; /* prev grp for the same RP */
178: uint32_t group; /* subnet group of multicasts */
179: uint32_t rpaddr; /* The IP address of the RP */
180: struct mrtentry *mrtlink; /* link to (S,G) routing entries */
181: rp_grp_entry_t *active_rp_grp;/* Pointer to the active rp_grp entry*/
182: struct mrtentry *grp_route; /* Pointer to the (*,G) routing entry*/
183: } grpentry_t;
184:
185: typedef struct mrtentry {
186: struct mrtentry *grpnext; /* next entry of same group */
187: struct mrtentry *grpprev; /* prev entry of same group */
188: struct mrtentry *srcnext; /* next entry of same source */
189: struct mrtentry *srcprev; /* prev entry of same source */
190: struct grpentry *group; /* pointer to group entry */
191: struct srcentry *source; /* pointer to source entry (or RP) */
192: vifi_t incoming; /* the iif (either toward S or RP) */
193: vifbitmap_t oifs; /* The current result oifs */
194: vifbitmap_t joined_oifs; /* The joined oifs (Join received) */
195: vifbitmap_t pruned_oifs; /* The pruned oifs (Prune received) */
196: vifbitmap_t asserted_oifs;/* The asserted oifs (lost Assert) */
197: vifbitmap_t leaves; /* Has directly connected members */
198: struct pim_nbr_entry *upstream; /* upstream router, needed because
199: * of the asserts it may be different
200: * than the source (or RP) upstream
201: * router.
202: */
203: uint32_t metric; /* Routing Metric for this entry */
204: uint32_t preference; /* The metric preference value */
205: uint32_t pmbr_addr; /* The PMBR address (for interop) */
206: uint16_t *vif_timers; /* vifs timer list */
207: uint16_t *vif_deletion_delay; /* vifs deletion delay list */
208: uint16_t flags; /* The MRTF_* flags */
209: uint16_t timer; /* entry timer */
210: uint16_t jp_timer; /* The Join/Prune timer */
211: uint16_t rs_timer; /* Register-Suppression Timer */
212: u_int assert_timer;
213: u_int assert_rate_timer;
214: struct kernel_cache *kernel_cache; /* List of the kernel cache entries */
215: #ifdef RSRR
216: struct rsrr_cache *rsrr_cache; /* Used to save RSRR requests for
217: * route change notification. */
218: #endif /* RSRR */
219: } mrtentry_t;
220:
221:
222: /*
223: * Used to get forwarded data related counts (number of packet, number of
224: * bits, etc)
225: */
226: struct sg_count {
227: uint32_t pktcnt; /* Number of packets for (s,g) */
228: uint32_t bytecnt; /* Number of bytes for (s,g) */
229: uint32_t wrong_if; /* Number of packets received on wrong iif for (s,g) */
230: };
231:
232: struct vif_count {
233: uint32_t icount; /* Input packet count on vif */
234: uint32_t ocount; /* Output packet count on vif */
235: uint32_t ibytes; /* Input byte count on vif */
236: uint32_t obytes; /* Output byte count on vif */
237: };
238:
239: /*
240: * Structure to keep track of existing (S,G) MFC entries in the kernel
241: * for particular (*,G) or (*,*,RP) entry. We must keep track for
242: * each active source which doesn't have (S,G) entry in the daemon's
243: * routing table. We need to keep track of such sources for two reasons:
244: *
245: * (1) If the kernel does not support (*,G) MFC entries (currently, the
246: * "official" mcast code doesn't), we must know all installed (s,G) entries
247: * in the kernel and modify them if the iif or oif for the (*,G) changes.
248: *
249: * (2) By checking periodically the traffic coming from the shared tree,
250: * we can either delete the idle sources or switch to the shortest path.
251: *
252: * Note that even if we have (*,G) implemented in the kernel, we still
253: * need to have this structure because of (2)
254: */
255: typedef struct kernel_cache {
256: struct kernel_cache *next;
257: struct kernel_cache *prev;
258: uint32_t source;
259: uint32_t group;
260: struct sg_count sg_count; /* The (s,g) data retated counters (see above) */
261: } kernel_cache_t;
262:
263: /**
264: * Local Variables:
265: * version-control: t
266: * indent-tabs-mode: t
267: * c-file-style: "ellemtel"
268: * c-basic-offset: 4
269: * End:
270: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>