1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
|
/*
*
* ===================================
* HARP | Host ATM Research Platform
* ===================================
*
*
* This Host ATM Research Platform ("HARP") file (the "Software") is
* made available by Network Computing Services, Inc. ("NetworkCS")
* "AS IS". NetworkCS does not provide maintenance, improvements or
* support of any kind.
*
* NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
* INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
* SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
* In no event shall NetworkCS be responsible for any damages, including
* but not limited to consequential damages, arising from or relating to
* any use of the Software or related support.
*
* Copyright 1994-1998 Network Computing Services, Inc.
*
* Copies of this Software may be made, however, the above copyright
* notice must be reproduced on all copies.
*
* @(#) $FreeBSD$
*
*/
/*
* ATM Forum UNI Support
* ---------------------
*
* IP interface control blocks
*
*/
#ifndef _UNI_UNIIP_VAR_H
#define _UNI_UNIIP_VAR_H
#ifdef _KERNEL
/*
* UNI IP network interface structure. There will be one such structure for
* each IP network interface attached via a UNI signalling instance.
*/
struct uniip {
struct uniip *uip_next; /* Next attached IP interface */
struct ip_nif *uip_ipnif; /* IP network interface */
u_char uip_flags; /* Interface flags (see below) */
/* ATMARP (RFC1577) */
u_char uip_arpstate; /* ARP interface state (see below) */
struct arpmap uip_arpsvrmap; /* ATMARP server map info */
struct ipvcc *uip_arpsvrvcc; /* ATMARP server's VCC */
int uip_nprefix; /* Count of IP prefixes (server only) */
struct uniarp_prf *uip_prefix; /* Array of IP prefixes (server only) */
struct atm_time uip_arptime; /* ARP timer controls */
};
#define uip_arpsvrip uip_arpsvrmap.am_dstip
#define uip_arpsvratm uip_arpsvrmap.am_dstatm
#define uip_arpsvrsub uip_arpsvrmap.am_dstatmsub
#endif /* _KERNEL */
/*
* UNI Interface Flags
*/
#define UIF_IFADDR 0x01 /* Interface address is set */
/*
* UNI ARP Interface States
*/
#define UIAS_NOTCONF 1 /* Not configured */
#define UIAS_SERVER_ACTIVE 2 /* Server - active */
#define UIAS_CLIENT_PADDR 3 /* Client - pending ATM address */
#define UIAS_CLIENT_POPEN 4 /* Client - pending server vcc open */
#define UIAS_CLIENT_REGISTER 5 /* Client - registering with server */
#define UIAS_CLIENT_ACTIVE 6 /* Client - active */
#ifdef _KERNEL
/*
* Structure for allowable IP prefixes for ATMARP server registration
*/
struct uniarp_prf {
struct in_addr upf_addr; /* Prefix address */
struct in_addr upf_mask; /* Prefix mask */
};
/*
* UNI ARP protocol constants
*/
#define UNIARP_AGING (60 * ATM_HZ) /* Aging timer tick */
#define UNIARP_HASHSIZ 19 /* Hash table size */
#define UNIARP_REGIS_REFRESH (15 * 60 * ATM_HZ)
/* Client registration refresh timer */
#define UNIARP_REGIS_RETRY (60 * ATM_HZ)
/* Client registration retry timer */
#define UNIARP_ARP_RETRY (3 * ATM_HZ) /* ARP command retry timer */
#define UNIARP_CLIENT_AGE 12 /* Client validation timeout */
#define UNIARP_CLIENT_RETRY 3 /* Client validation retrys */
#define UNIARP_SERVER_AGE 17 /* Server validation timeout */
#define UNIARP_SERVER_RETRY 3 /* Server validation retrys */
#define UNIARP_RETRY_AGE 1 /* Retry timeout */
#define UNIARP_REVALID_AGE 2 /* Revalidation timeout */
#define UNIARP_MIN_REFRESH 10 /* Minimum entry refresh time */
/*
* Structure for ATMARP mappings. Each of these structures will contain
* IP address to ATM hardware address mappings. There will be one such
* structure for each IP address and for each unresolved ATM address
* currently in use.
*/
struct uniarp {
struct arpmap ua_arpmap; /* Common entry header */
struct uniip *ua_intf; /* Interface where we learned answer */
struct uniarp *ua_next; /* Hash chain link */
u_char ua_flags; /* Flags (see below) */
u_char ua_origin; /* Source of mapping (see below) */
u_char ua_retry; /* Retry counter */
u_char ua_aging; /* Aging timeout value (minutes) */
struct ipvcc *ua_ivp; /* Head of IP VCC chain */
struct atm_time ua_time; /* Timer controls */
};
#define ua_dstip ua_arpmap.am_dstip
#define ua_dstatm ua_arpmap.am_dstatm
#define ua_dstatmsub ua_arpmap.am_dstatmsub
#endif /* _KERNEL */
/*
* UNIARP Entry Flags
*/
#define UAF_VALID ARPF_VALID /* Entry is valid */
#define UAF_REFRESH ARPF_REFRESH /* Entry has been refreshed */
#define UAF_LOCKED 0x04 /* Entry is locked */
#define UAF_USED 0x08 /* Entry has been used recently */
/*
* UNIARP Entry Origin
*
* The origin values are ranked according to the source precedence.
* Larger values are more preferred.
*/
#define UAO_LOCAL 100 /* Local address */
#define UAO_PERM ARP_ORIG_PERM /* Permanently installed */
#define UAO_REGISTER 40 /* Learned via client registration */
#define UAO_SCSP 30 /* Learned via SCSP */
#define UAO_LOOKUP 20 /* Learned via server lookup */
#define UAO_PEER_RSP 15 /* Learned from peer - inarp rsp */
#define UAO_PEER_REQ 10 /* Learned from peer - inarp req */
/*
* ATMARP/InATMARP Packet Format
*/
struct atmarp_hdr {
u_short ah_hrd; /* Hardware type (see below) */
u_short ah_pro; /* Protocol type */
u_char ah_shtl; /* Type/len of source ATM address */
u_char ah_sstl; /* Type/len of source ATM subaddress */
u_short ah_op; /* Operation code (see below) */
u_char ah_spln; /* Length of source protocol address */
u_char ah_thtl; /* Type/len of target ATM address */
u_char ah_tstl; /* Type/len of target ATM subaddress */
u_char ah_tpln; /* Length of target protocol address */
#ifdef notdef
/* Variable size fields */
u_char ah_sha[]; /* Source ATM address */
u_char ah_ssa[]; /* Source ATM subaddress */
u_char ah_spa[]; /* Source protocol address */
u_char ah_tha[]; /* Target ATM subaddress */
u_char ah_tsa[]; /* Target ATM address */
u_char ah_tpa[]; /* Target protocol subaddress */
#endif
};
/*
* Hardware types
*/
#define ARP_ATMFORUM 19
/*
* Operation types
*/
#define ARP_REQUEST 1 /* ATMARP request */
#define ARP_REPLY 2 /* ATMARP response */
#define INARP_REQUEST 8 /* InATMARP request */
#define INARP_REPLY 9 /* InATMARP response */
#define ARP_NAK 10 /* ATMARP negative ack */
/*
* Type/length fields
*/
#define ARP_TL_TMASK 0x40 /* Type mask */
#define ARP_TL_NSAPA 0x00 /* Type = ATM Forum NSAPA */
#define ARP_TL_E164 0x40 /* Type = E.164 */
#define ARP_TL_LMASK 0x3f /* Length mask */
#ifdef _KERNEL
/*
* Timer macros
*/
#define UNIIP_ARP_TIMER(s, t) atm_timeout(&(s)->uip_arptime, (t), uniarp_iftimeout)
#define UNIIP_ARP_CANCEL(s) atm_untimeout(&(s)->uip_arptime)
#define UNIARP_TIMER(s, t) atm_timeout(&(s)->ua_time, (t), uniarp_timeout)
#define UNIARP_CANCEL(s) atm_untimeout(&(s)->ua_time)
/*
* Macros for manipulating UNIARP tables and entries
*/
#define UNIARP_HASH(ip) ((u_long)(ip) % UNIARP_HASHSIZ)
#define UNIARP_ADD(ua) \
{ \
struct uniarp **h; \
h = &uniarp_arptab[UNIARP_HASH((ua)->ua_dstip.s_addr)]; \
LINK2TAIL((ua), struct uniarp, *h, ua_next); \
}
#define UNIARP_DELETE(ua) \
{ \
struct uniarp **h; \
h = &uniarp_arptab[UNIARP_HASH((ua)->ua_dstip.s_addr)]; \
UNLINK((ua), struct uniarp, *h, ua_next); \
}
#define UNIARP_LOOKUP(ip, ua) \
{ \
for ((ua) = uniarp_arptab[UNIARP_HASH(ip)]; \
(ua); (ua) = (ua)->ua_next) { \
if ((ua)->ua_dstip.s_addr == (ip)) \
break; \
} \
}
/*
* Global UNIARP Statistics
*/
struct uniarp_stat {
u_long uas_rcvdrop; /* Input packets dropped */
};
/*
* External variables
*/
extern struct uniip *uniip_head;
extern struct ip_serv uniip_ipserv;
extern struct uniarp *uniarp_arptab[];
extern struct uniarp *uniarp_nomaptab;
extern struct uniarp *uniarp_pvctab;
extern uma_zone_t uniarp_zone;
extern struct atm_time uniarp_timer;
extern int uniarp_print;
extern Atm_endpoint uniarp_endpt;
extern struct uniarp_stat uniarp_stat;
/*
* Global function declarations
*/
/* uniarp.c */
int uniarp_start(void);
void uniarp_stop(void);
void uniarp_ipact(struct uniip *);
void uniarp_ipdact(struct uniip *);
void uniarp_ifaddr(struct siginst *);
void uniarp_iftimeout(struct atm_time *);
int uniarp_ioctl(int, caddr_t, caddr_t);
caddr_t uniarp_getname(void *);
/* uniarp_cache.c */
int uniarp_cache_svc(struct uniip *, struct in_addr *,
Atm_addr *, Atm_addr *, u_int);
void uniarp_cache_pvc(struct ipvcc *, struct in_addr *,
Atm_addr *, Atm_addr *);
int uniarp_validate_ip(struct uniip *, struct in_addr *, u_int);
/* uniarp_input.c */
void uniarp_cpcs_data(void *, KBuffer *);
void uniarp_pdu_print(const struct ipvcc *,
const KBuffer *, const char *);
/* uniarp_output.c */
int uniarp_arp_req(struct uniip *, struct in_addr *);
int uniarp_arp_rsp(struct uniip *, struct arpmap *,
struct in_addr *, Atm_addr *,
Atm_addr *, struct ipvcc *);
int uniarp_arp_nak(struct uniip *, KBuffer *, struct ipvcc *);
int uniarp_inarp_req(struct uniip *, Atm_addr *,
Atm_addr *, struct ipvcc *);
int uniarp_inarp_rsp(struct uniip *, struct in_addr *,
Atm_addr *, Atm_addr *, struct ipvcc *);
/* uniarp_timer.c */
void uniarp_timeout(struct atm_time *);
void uniarp_aging(struct atm_time *);
/* uniarp_vcm.c */
int uniarp_pvcopen(struct ipvcc *);
int uniarp_svcout(struct ipvcc *, struct in_addr *);
int uniarp_svcin(struct ipvcc *, Atm_addr *, Atm_addr *);
int uniarp_svcactive(struct ipvcc *);
void uniarp_vcclose(struct ipvcc *);
void uniarp_connected(void *);
void uniarp_cleared(void *, struct t_atm_cause *);
/* uniip.c */
int uniip_start(void);
int uniip_stop(void);
#endif /* _KERNEL */
#endif /* _UNI_UNIIP_VAR_H */
|