summaryrefslogtreecommitdiffstats
path: root/sys/netatm/uni/uniip_var.h
blob: 7d7ef3d4774d19a89c569f956cfe228ecb8c9da0 (plain)
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 */
OpenPOWER on IntegriCloud