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