]> git.saurik.com Git - apple/xnu.git/blob - bsd/netat/at_aarp.h
xnu-344.34.tar.gz
[apple/xnu.git] / bsd / netat / at_aarp.h
1 /*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22 #ifndef _NETAT_AT_AARP_H_
23 #define _NETAT_AT_AARP_H_
24 #include <sys/appleapiopts.h>
25 /*
26 * Copyright (c) 1988, 1989 Apple Computer, Inc.
27 */
28
29 /* "@(#)at_aarp.h: 2.0, 1.6; 10/4/93; Copyright 1988-89, Apple Computer, Inc." */
30
31 /* This is a header file for AARP.
32 *
33 * Author: R. C. Venkatraman
34 * Date : 3/2/88
35 *
36 */
37
38 /* AARP packet */
39
40 typedef struct {
41 u_short hardware_type;
42 u_short stack_type; /* indicates appletalk or xns*/
43 u_char hw_addr_len; /* len of hardware addr, e.g
44 * ethernet addr len, in bytes
45 */
46 u_char stack_addr_len; /* protocol stack addr len,
47 * e.g., appletalk addr len
48 * in bytes
49 */
50 u_short aarp_cmd;
51 struct etalk_addr src_addr;
52 struct atalk_addr src_at_addr;
53 struct etalk_addr dest_addr;
54 struct atalk_addr dest_at_addr; /* desired or dest. at addr */
55 } aarp_pkt_t;
56
57
58 /* Constants currently defined in AARP */
59
60 #define AARP_AT_TYPE 0x80F3 /* indicates aarp packet */
61 #define AARP_ETHER_HW_TYPE 0x1
62 #define AARP_AT_PROTO 0x809B /* indicates stack type */
63 #define AARP_ETHER_ADDR_LEN 6 /* in bytes */
64 #define AARP_AT_ADDR_LEN 4 /* in bytes */
65
66 /* AARP cmd definitions */
67
68 #define AARP_REQ_CMD 0x1 /* address lookup request */
69 #define AARP_RESP_CMD 0x2 /* address match response */
70 #define AARP_PROBE_CMD 0x3 /* new kid probing... */
71
72 /* AARP timer and retry counts */
73
74 #define AARP_MAX_PROBE_RETRIES 20
75 #define AARP_PROBE_TIMER_INT HZ/30 /* HZ defines in param.h */
76 #define AARP_MAX_REQ_RETRIES 10
77 #define AARP_REQ_TIMER_INT HZ/30
78 #define AARP_MAX_NODES_TRIED 200 /* max no. of addresses tried */
79 /* on the same net before */
80 /* giving up on the net# */
81 #define AARP_MAX_NETS_TRIED 10 /* max no. of net nos tried */
82 /* before giving up on startup*/
83
84 /* Probe states */
85
86 #define PROBE_IDLE 0x1 /* There is no node addr */
87 #define PROBE_TENTATIVE 0x2 /* probing */
88 #define PROBE_DONE 0x3 /* an appletalk addr has been */
89 /* assigned for the given node*/
90 /* Errors returned by AARP routines */
91 #define AARP_ERR_NOT_OURS 1 /* not our appletalk address */
92
93 /*************************************************/
94 /* Declarations for AARP Address Map Table (AMT) */
95 /*************************************************/
96
97 typedef struct {
98 struct atalk_addr dest_at_addr;
99 struct etalk_addr dest_addr;
100 char dummy[2]; /* pad out to struct size of 32 */
101 time_t last_time; /* the last time that this addr
102 * was used. Read in lbolt
103 * whenever the addr is used.
104 */
105 int no_of_retries; /* number of times we've xmitted */
106 gbuf_t *m; /* ptr to msg blk to be sent out */
107 at_ifaddr_t *elapp;
108 int error;
109 void *tmo;
110 } aarp_amt_t;
111
112 #define AMT_BSIZ 4 /* bucket size */
113 #define AMT_NB 64 /* number of buckets */
114 #define AMTSIZE (AMT_BSIZ * AMT_NB)
115
116 typedef struct {
117 aarp_amt_t et_aarp_amt[AMTSIZE];
118 } aarp_amt_array;
119
120 #define AMT_HASH(a) \
121 ((NET_VALUE(((struct atalk_addr *)&a)->atalk_net) + ((struct atalk_addr *)&a)->atalk_node) % AMT_NB)
122
123 #define AMT_LOOK(at, at_addr, elapp) { \
124 register n; \
125 at = &aarp_table[elapp->ifPort]->et_aarp_amt[AMT_HASH(at_addr) * AMT_BSIZ]; \
126 for (n = 0 ; ; at++) { \
127 if (ATALK_EQUAL(at->dest_at_addr, at_addr)) \
128 break; \
129 if (++n >= AMT_BSIZ) { \
130 at = NULL; \
131 break; \
132 } \
133 } \
134 }
135
136 #define NEW_AMT(at, at_addr, elapp) { \
137 register n; \
138 register aarp_amt_t *myat; \
139 myat = at = &aarp_table[elapp->ifPort]->et_aarp_amt[AMT_HASH(at_addr) * AMT_BSIZ]; \
140 for (n = 0 ; ; at++) { \
141 if (at->last_time == 0) \
142 break; \
143 if (++n >= AMT_BSIZ) { \
144 at = aarp_lru_entry(myat); \
145 break; \
146 } \
147 } \
148 }
149
150 #define AARP_NET_MCAST(p, elapp) \
151 (NET_VALUE((p)->dst_net) == elapp->ifThisNode.s_net) \
152 ) /* network-wide broadcast */
153
154 #define AARP_CABLE_MCAST(p) \
155 (NET_VALUE((p)->dst_net) == 0x0000 \
156 )
157
158 #define AARP_BROADCAST(p, elapp) \
159 (((p)->dst_node == 0xff) && \
160 ( \
161 (NET_VALUE((p)->dst_net) == 0x0000) || \
162 (NET_VALUE((p)->dst_net) == elapp->ifThisNode.s_net)) \
163 ) /* is this some kind of a broadcast address (?) */
164
165
166 #define ETHER_ADDR_EQUAL(addr1p, addr2p) \
167 (( \
168 ((addr1p)->etalk_addr_octet[0]==(addr2p)->etalk_addr_octet[0]) && \
169 ((addr1p)->etalk_addr_octet[1]==(addr2p)->etalk_addr_octet[1]) && \
170 ((addr1p)->etalk_addr_octet[2]==(addr2p)->etalk_addr_octet[2]) && \
171 ((addr1p)->etalk_addr_octet[3]==(addr2p)->etalk_addr_octet[3]) && \
172 ((addr1p)->etalk_addr_octet[4]==(addr2p)->etalk_addr_octet[4]) && \
173 ((addr1p)->etalk_addr_octet[5]==(addr2p)->etalk_addr_octet[5]) \
174 ) ? 1 : 0 \
175 )
176
177 #ifdef KERNEL
178 #ifdef __APPLE_API_PRIVATE
179
180 int aarp_chk_addr(at_ddp_t *, at_ifaddr_t *);
181 int aarp_rcv_pkt(aarp_pkt_t *, at_ifaddr_t *);
182
183 #endif /* __APPLE_API_PRIVATE */
184 #endif /* KERNEL */
185
186 #endif /* _NETAT_AT_AARP_H_ */