1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
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.
14 *
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
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.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
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_
40#include <sys/appleapiopts.h>
41#ifdef PRIVATE
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
114typedef 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
137typedef 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 */
145typedef struct {
146	unsigned short 	entryno;	/* zone table entry number (1st = 0) */
147	ZT_entry	zt;		/* the zone table entry */
148} ZT_entryno;
149
150#ifdef KERNEL_PRIVATE
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
194extern int regDefaultZone(at_ifaddr_t *);
195extern int zonename_equal(at_nvestr_t *, at_nvestr_t *);
196
197extern RT_entry *RT_table_freelist;
198extern RT_entry RT_table_start;
199extern RT_entry *RT_table;
200extern RT_entry *rt_binsert (RT_entry *);
201extern 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);
203extern RT_entry *rt_bdelete (at_net_al NetStop, at_net_al NetStart);
204extern RT_entry *rt_blookup(int);
205extern RT_entry *rt_getNextRoute(int);
206
207extern ZT_entry *ZT_table;
208extern short	RT_maxentry;
209extern short	ZT_maxentry;
210
211extern int RouterMix;
212
213extern int zt_add_zone(char *, short);
214extern int zt_add_zonename(at_nvestr_t *);
215extern int zt_ent_zindex(u_char *);
216extern ZT_entryno *zt_getNextZone(int);
217extern void zt_remove_zones(u_char *);
218extern void zt_set_zmap(u_short, unsigned char *);
219extern void rtmp_router_input(gbuf_t *, at_ifaddr_t *);
220void trackrouter(at_ifaddr_t *, unsigned short, unsigned char);
221int zt_find_zname(at_nvestr_t *);
222struct at_nvestr *getRTRLocalZone(struct zone_usage *);
223int zt_ent_zcount(RT_entry *);
224int zt_get_zmcast(at_ifaddr_t *, at_nvestr_t *, char *);
225
226void getRtmpTable(RT_entry *, int, int	c);
227void getZipTable(ZT_entry *, int, int	c);
228int getZipTableSize(void);
229
230int rt_table_init(void );
231void getIfUsage( int, at_ifnames_t *);
232
233
234#endif /* KERNEL_PRIVATE */
235
236#endif /* PRIVATE */
237#endif /* _NETAT_ROUTING_TABLES_H_ */
238