]>
git.saurik.com Git - apple/xnu.git/blob - bsd/netat/routing_tables.h
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 * This include file defines the RTMP table and ZIP table
30 * for the AppleTalk AIX router
33 * 0.01 03/16/94 LD Creation
34 * 0.10 08/19/94 LD merged
38 #ifndef _NETAT_ROUTING_TABLES_H_
39 #define _NETAT_ROUTING_TABLES_H_
40 #include <sys/appleapiopts.h>
43 /* RTMP table entry state bitmap (EntryState) values */
45 #define RTE_STATE_UNUSED 0 /* this entry is not in used */
46 #define RTE_STATE_BAD 2 /* The route is almost ready to be removed */
47 #define RTE_STATE_SUSPECT 4 /* didn't received an update for route */
48 #define RTE_STATE_GOOD 8 /* this route is 100% valid */
49 #define RTE_STATE_ZKNOWN 16 /* we know the zones for this entry */
50 #define RTE_STATE_UPDATED 32 /* set when updated from received rtmp table */
51 #define RTE_STATE_BKUP 64 /* for future use : AURP */
52 #define RTE_STATE_PERMANENT 128 /* This is a directly attached route */
54 #define PORT_ONLINE 32 /* router port in forwarding state */
55 #define PORT_SEEDING 31 /* router port seeding */
56 #define PORT_ACTIVATING 16 /* router port waiting for net infos */
57 #define PORT_ERR_NOZONE 6 /* router no zones for non seed port*/
58 #define PORT_ERR_BADRTMP 5 /* router problem bad rtmp version*/
59 #define PORT_ERR_STARTUP 4 /* router problem cable in start range*/
60 #define PORT_ERR_CABLER 3 /* router problem bad cable range*/
61 #define PORT_ERR_SEED 2 /* router startup seeding problem */
62 #define PORT_ONERROR 1 /* router port with generic problem*/
63 #define PORT_OFFLINE 0 /* router port disabled/not ready */
65 #define ZT_MAX 1024 /* Don't allow more zones than that */
66 #define ZT_MIN 32 /* Minimum for a good behaviour*/
67 #define ZT_DEFAULT 512 /* Minimum for a good behaviour*/
68 #define RT_MAX 4096 /* Don't allow more entries than that */
69 #define RT_MIN 128 /* Minimum for a good behaviour*/
70 #define RT_DEFAULT 1024 /* Minimum for a good behaviour*/
71 #define ZT_BYTES (ZT_MAX/8) /* Bytes in Zone Bitmap */
72 #define ZT_MAXEDOUT ZT_MAX+1 /* reached the entry limit.. */
73 #define RT_MIX_DEFAULT 2000 /* default for nbr of ppsec */
76 #define NOTIFY_N_DIST 31 /* Notify Neighbor distance (when shutdown or so) */
78 /* Useful macros to access the RTMP tuple fields */
80 #define TUPLENET(x) NET_VALUE(((at_rtmp_tuple *)(x))->at_rtmp_net)
81 #define TUPLEDIST(x) ((((at_rtmp_tuple *)(x))->at_rtmp_data) & RTMP_DISTANCE)
82 #define TUPLERANGE(x) ((((at_rtmp_tuple *)(x))->at_rtmp_data) & RTMP_RANGE_FLAG)
84 #define CableStart ifID->ifThisCableStart
85 #define CableStop ifID->ifThisCableEnd
87 #define RTMP_IDLENGTH 4 /* RTMP packet Node header length */
90 #define RTMP_VERSION_NUMBER 0x82 /* V2 only version of RTMP supported */
92 #define ERTR_SEED_CONFLICT 0x101 /* Conflict between port information and net
93 * value received for the port (fatal for Rtr)
95 #define ERTR_CABLE_CONFLICT 0x102 /* Conflict between port information and net
96 * information received in a RTMP packet
99 #define ERTR_RTMP_BAD_VERSION 0x103 /* We received a non phase-II RTMP packet
100 * that's bad... We can't deal with it
103 #define ERTR_CABLE_STARTUP 0x104 /* the cable range we're on happen to
104 * be in the startup range. Shouldn't
107 #define ERTR_CABLE_NOZONE 0x105 /* We haven't found any zones for that port
108 * after all the timeout expired
112 /* RTMP table entry */
114 typedef struct rt_entry
{
116 struct rt_entry
*left
; /* btree left pointer */
117 struct rt_entry
*right
; /* btree right pointer */
119 at_net_al NetStop
; /* Last net # in the range, or network # if
120 non extended network */
121 at_net_al NetStart
; /* Starting network number in the range, 0
122 non extended network */
123 at_net_al NextIRNet
; /* Network number of next Internet Router */
124 at_node NextIRNode
; /* Node ID of next Router */
125 u_char ZoneBitMap
[ZT_BYTES
]; /* One bit per Zone defined for this entry */
126 u_char NetDist
; /* Distance in hops of the destination net */
127 u_char NetPort
; /* Physical port number to forward to */
128 u_char EntryState
; /* State of the entry bitmap field */
135 /* ZIP Table entry */
139 u_short ZoneCount
; /* Count of reference to zone entry */
140 at_nvestr_t Zone
; /* zone name as a Network Visible Entity */
144 /* for zone retrieval to user space only */
146 unsigned short entryno
; /* zone table entry number (1st = 0) */
147 ZT_entry zt
; /* the zone table entry */
150 #ifdef KERNEL_PRIVATE
152 /* Macros for Routing table B-tree easy access */
154 #define RT_DELETE(NetStop, NetStart) {\
156 if ((found = rt_bdelete(NetStop, NetStart))) { \
157 memset(found, '\0', sizeof(RT_entry)); \
158 found->right = RT_table_freelist; \
159 RT_table_freelist = found; \
163 /* Set/Reset and test the All zones known bit in for the entry field */
165 #define RT_ALL_ZONES_KNOWN(entry) ((entry)->EntryState & RTE_STATE_ZKNOWN)
166 #define RT_SET_ZONE_KNOWN(entry) ((entry)->EntryState |= RTE_STATE_ZKNOWN)
167 #define RT_CLR_ZONE_KNOWN(entry) ((entry)->EntryState ^= RTE_STATE_ZKNOWN)
170 * check if a zone number is in a given zone map
172 #define ZT_ISIN_ZMAP(znum, zmap) ((zmap)[(znum-1) >> 3] & 0x80 >> (znum-1) % 8)
174 /* remove a zone from the zone bitmap, and check if the zone
175 * is still in use by someone else.
178 #define ZT_CLR_ZMAP(num, zmap) { \
179 if ((zmap)[(num-1) >> 3] & 0x80 >> (num-1) % 8) { \
180 (zmap)[(num-1) >> 3] ^= 0x80 >> (num-1) % 8; \
181 ZT_table[(num-1)].ZoneCount-- ; \
185 /* set a bit in an entry bit map */
187 #define ZT_SET_ZMAP(num, zmap) { \
188 if (!zmap[(num-1) >> 3] & 0x80 >> (num-1) % 8) { \
189 zmap[(num-1) >> 3] |= 0x80 >> (num-1) % 8; \
190 ZT_table[(num-1)].ZoneCount++ ; \
194 extern int regDefaultZone(at_ifaddr_t
*);
195 extern int zonename_equal(at_nvestr_t
*, at_nvestr_t
*);
197 extern RT_entry
*RT_table_freelist
;
198 extern RT_entry RT_table_start
;
199 extern RT_entry
*RT_table
;
200 extern RT_entry
*rt_binsert (RT_entry
*);
201 extern RT_entry
*rt_insert( at_net_al NStop
, at_net_al NStart
, at_net_al NxNet
,
202 at_node NxNode
, u_char NtDist
, u_char NtPort
, u_char EntS
);
203 extern RT_entry
*rt_bdelete (at_net_al NetStop
, at_net_al NetStart
);
204 extern RT_entry
*rt_blookup(int);
205 extern RT_entry
*rt_getNextRoute(int);
207 extern ZT_entry
*ZT_table
;
208 extern short RT_maxentry
;
209 extern short ZT_maxentry
;
211 extern int RouterMix
;
213 extern int zt_add_zone(char *, short);
214 extern int zt_add_zonename(at_nvestr_t
*);
215 extern int zt_ent_zindex(u_char
*);
216 extern ZT_entryno
*zt_getNextZone(int);
217 extern void zt_remove_zones(u_char
*);
218 extern void zt_set_zmap(u_short
, unsigned char *);
219 extern void rtmp_router_input(gbuf_t
*, at_ifaddr_t
*);
220 void trackrouter(at_ifaddr_t
*, unsigned short, unsigned char);
221 int zt_find_zname(at_nvestr_t
*);
222 struct at_nvestr
*getRTRLocalZone(struct zone_usage
*);
223 int zt_ent_zcount(RT_entry
*);
224 int zt_get_zmcast(at_ifaddr_t
*, at_nvestr_t
*, char *);
226 void getRtmpTable(RT_entry
*, int, int c
);
227 void getZipTable(ZT_entry
*, int, int c
);
228 int getZipTableSize(void);
230 int rt_table_init(void );
231 void getIfUsage( int, at_ifnames_t
*);
234 #endif /* KERNEL_PRIVATE */
237 #endif /* _NETAT_ROUTING_TABLES_H_ */