]>
Commit | Line | Data |
---|---|---|
1c79356b | 1 | /* |
5d5c5d0d A |
2 | * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. |
3 | * | |
2d21ac55 | 4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ |
1c79356b | 5 | * |
2d21ac55 A |
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. | |
8f6c56a5 | 14 | * |
2d21ac55 A |
15 | * Please obtain a copy of the License at |
16 | * http://www.opensource.apple.com/apsl/ and read it before using this file. | |
17 | * | |
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 | |
8f6c56a5 A |
20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
2d21ac55 A |
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. | |
8f6c56a5 | 25 | * |
2d21ac55 | 26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ |
1c79356b A |
27 | */ |
28 | /* | |
29 | * This include file defines the RTMP table and ZIP table | |
30 | * for the AppleTalk AIX router | |
31 | * | |
32 | * | |
33 | * 0.01 03/16/94 LD Creation | |
34 | * 0.10 08/19/94 LD merged | |
35 | * | |
36 | */ | |
37 | ||
38 | #ifndef _NETAT_ROUTING_TABLES_H_ | |
39 | #define _NETAT_ROUTING_TABLES_H_ | |
9bccf70c | 40 | #include <sys/appleapiopts.h> |
91447636 | 41 | #ifdef PRIVATE |
1c79356b A |
42 | |
43 | /* RTMP table entry state bitmap (EntryState) values */ | |
44 | ||
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 */ | |
53 | ||
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 */ | |
64 | ||
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 */ | |
74 | ||
75 | ||
76 | #define NOTIFY_N_DIST 31 /* Notify Neighbor distance (when shutdown or so) */ | |
77 | ||
78 | /* Useful macros to access the RTMP tuple fields */ | |
79 | ||
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) | |
83 | ||
84 | #define CableStart ifID->ifThisCableStart | |
85 | #define CableStop ifID->ifThisCableEnd | |
86 | ||
87 | #define RTMP_IDLENGTH 4 /* RTMP packet Node header length */ | |
88 | ||
89 | ||
90 | #define RTMP_VERSION_NUMBER 0x82 /* V2 only version of RTMP supported */ | |
91 | ||
92 | #define ERTR_SEED_CONFLICT 0x101 /* Conflict between port information and net | |
93 | * value received for the port (fatal for Rtr) | |
94 | */ | |
95 | #define ERTR_CABLE_CONFLICT 0x102 /* Conflict between port information and net | |
96 | * information received in a RTMP packet | |
97 | */ | |
98 | ||
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 | |
101 | */ | |
102 | ||
103 | #define ERTR_CABLE_STARTUP 0x104 /* the cable range we're on happen to | |
104 | * be in the startup range. Shouldn't | |
105 | */ | |
106 | ||
107 | #define ERTR_CABLE_NOZONE 0x105 /* We haven't found any zones for that port | |
108 | * after all the timeout expired | |
109 | */ | |
110 | ||
111 | ||
112 | /* RTMP table entry */ | |
113 | ||
114 | typedef struct rt_entry { | |
115 | ||
116 | struct rt_entry *left; /* btree left pointer */ | |
117 | struct rt_entry *right; /* btree right pointer */ | |
118 | ||
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 */ | |
129 | u_char RTMPFlag; | |
130 | u_char AURPFlag; | |
131 | ||
132 | } RT_entry; | |
133 | ||
134 | ||
135 | /* ZIP Table entry */ | |
136 | ||
137 | typedef struct { | |
138 | ||
139 | u_short ZoneCount; /* Count of reference to zone entry */ | |
140 | at_nvestr_t Zone; /* zone name as a Network Visible Entity */ | |
141 | ||
142 | } ZT_entry; | |
143 | ||
144 | /* for zone retrieval to user space only */ | |
145 | typedef struct { | |
146 | unsigned short entryno; /* zone table entry number (1st = 0) */ | |
147 | ZT_entry zt; /* the zone table entry */ | |
148 | } ZT_entryno; | |
149 | ||
91447636 | 150 | #ifdef KERNEL_PRIVATE |
1c79356b A |
151 | |
152 | /* Macros for Routing table B-tree easy access */ | |
153 | ||
154 | #define RT_DELETE(NetStop, NetStart) {\ | |
155 | RT_entry *found; \ | |
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; \ | |
160 | } \ | |
161 | } | |
162 | ||
163 | /* Set/Reset and test the All zones known bit in for the entry field */ | |
164 | ||
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) | |
168 | ||
169 | /* | |
170 | * check if a zone number is in a given zone map | |
171 | */ | |
172 | #define ZT_ISIN_ZMAP(znum, zmap) ((zmap)[(znum-1) >> 3] & 0x80 >> (znum-1) % 8) | |
173 | ||
174 | /* remove a zone from the zone bitmap, and check if the zone | |
175 | * is still in use by someone else. | |
176 | */ | |
177 | ||
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-- ; \ | |
182 | } \ | |
183 | } | |
184 | ||
185 | /* set a bit in an entry bit map */ | |
186 | ||
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++ ; \ | |
191 | } \ | |
192 | } | |
193 | ||
194 | extern int regDefaultZone(at_ifaddr_t *); | |
195 | extern int zonename_equal(at_nvestr_t *, at_nvestr_t *); | |
196 | ||
197 | extern RT_entry *RT_table_freelist; | |
198 | extern RT_entry RT_table_start; | |
199 | extern RT_entry *RT_table; | |
91447636 A |
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); | |
1c79356b A |
204 | extern RT_entry *rt_blookup(int); |
205 | extern RT_entry *rt_getNextRoute(int); | |
206 | ||
207 | extern ZT_entry *ZT_table; | |
208 | extern short RT_maxentry; | |
209 | extern short ZT_maxentry; | |
210 | ||
2d21ac55 | 211 | extern int RouterMix; |
1c79356b A |
212 | |
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 *); | |
2d21ac55 | 218 | extern void zt_set_zmap(u_short, unsigned char *); |
91447636 | 219 | extern void rtmp_router_input(gbuf_t *, at_ifaddr_t *); |
2d21ac55 A |
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 *); | |
225 | ||
226 | void getRtmpTable(RT_entry *, int, int c); | |
227 | void getZipTable(ZT_entry *, int, int c); | |
228 | int getZipTableSize(void); | |
229 | ||
230 | int rt_table_init(void ); | |
231 | void getIfUsage( int, at_ifnames_t *); | |
232 | ||
1c79356b | 233 | |
91447636 | 234 | #endif /* KERNEL_PRIVATE */ |
1c79356b | 235 | |
91447636 | 236 | #endif /* PRIVATE */ |
1c79356b | 237 | #endif /* _NETAT_ROUTING_TABLES_H_ */ |