1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright (c) 1999 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ifndef	_SNOOP_MIP_H
28#define	_SNOOP_MIP_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36#define	ALIGN(ptr)		(ptr)
37
38/*
39 *	E X T E N S I O N S
40 */
41
42typedef struct {
43	uchar_t		type;
44	uchar_t		length;
45} exthdr_t;
46
47/* This header is used for Generalized MIP Authentication Extensions */
48typedef struct {
49	uint8_t		type;
50	uint8_t		subtype;
51	uint16_t	length;
52} gen_exthdr_t;
53
54#define	MN_HA_AUTH	32
55#define	MN_FA_AUTH	33
56#define	FA_HA_AUTH	34
57#define	GEN_AUTH	36
58#define	MN_HA_KEY	126
59#define	MN_HA_TRAVERSE	129
60#define	ENCAP_DELIV	130
61#define	MN_NAI		131
62#define	FA_CHALLENGE	132
63#define	MN_FA_KEY	133
64
65/* Subtypes for Generalized MIP Authentication Extension (GEN_AUTH) */
66#define	GEN_AUTH_MN_AAA		1
67
68#define	KEY_ALG_NONE		0
69#define	SA_MD5_MODE_PREF_SUF	2	/* ...in prefix+suffix */
70#define	SA_HMAC_MD5		3
71
72/*
73 * 	R E G I S T R A T I O N    P R O T O C O L
74 */
75
76#define	REG_TYPE_REQ	1
77#define	REG_TYPE_REP	3
78
79typedef struct ident_str {
80	uint32_t high_bits;	/* generated by the HA */
81	uint32_t low_bits;	/* generated by the MN */
82} ident_t;
83
84#ifdef __sparc
85#ifdef _BIT_FIELDS_HTOL
86typedef struct registration_request_str {
87	uchar_t		type;		/* must be REG_TYPE_REQ */
88	uchar_t
89		Simultaneous_registration : 	1,
90		Broadcasts_desired : 		1,
91		Decapsulation_done_locally : 	1, /* ...by the popup MN */
92		Minimal_encap_desired : 	1,
93		GRE_encap_desired : 		1,
94		VJ_compression_desired : 	1,
95		BiDirectional_Tunnel_desired : 	1,
96		reserved : 			1;
97	ushort_t	lifetime;	/* 0 = dereg; 0xffff = infinity */
98	in_addr_t	home_addr;	/* address of the MN */
99	in_addr_t	home_agent_addr; /* address of a HA */
100	in_addr_t	care_of_addr;	/* address of decap endpoint */
101	ident_t		identification;	/* for replay protection */
102} regreq_t;
103#endif /* _BIT_FIELDS_HTOL */
104#endif /* __sparc */
105
106#ifdef __i386
107#ifdef _BIT_FIELDS_LTOH
108typedef struct registration_request_str {
109	uchar_t		type;		/* must be REG_TYPE_REQ */
110	uchar_t
111		reserved : 			1,
112		BiDirectional_Tunnel_desired : 	1,
113		VJ_compression_desired : 	1,
114		GRE_encap_desired : 		1,
115		Minimal_encap_desired : 	1,
116		Decapsulation_done_locally : 	1, /* ...by the popup MN */
117		Broadcasts_desired : 		1,
118		Simultaneous_registration : 	1;
119	ushort_t	lifetime;	/* 0 = dereg; 0xffff = infinity */
120	in_addr_t	home_addr;	/* address of the MN */
121	in_addr_t	home_agent_addr; /* address of a HA */
122	in_addr_t	care_of_addr;	/* address of decap endpoint */
123	ident_t		identification;	/* for replay protection */
124} regreq_t;
125#endif /* _BIT_FIELDS_LTOH */
126#endif /* __i386 */
127
128/*
129 * Registration Reply sent by a home agent to a mobile node in
130 * response to a registration request.
131 */
132typedef struct registration_reply_str {
133	uchar_t		type;		/* must be REG_TYPE_REP */
134	uchar_t		code;		/* refer to draft document */
135	ushort_t	lifetime;	/* 0 = dereg; 0xffff = infinity */
136	in_addr_t	home_addr;	/* address of the mobile node */
137	in_addr_t	home_agent_addr; /* address of the home agent */
138	ident_t		identification;	/* derived from request's field */
139} regrep_t;
140
141/* service ok */
142#define	REPLY_CODE_ACK					0
143#define	REPLY_CODE_ACK_NO_SIMULTANEOUS			1
144
145/* denied by FA */
146#define	REPLY_CODE_FA_NACK_UNSPECIFIED			64
147#define	REPLY_CODE_FA_NACK_PROHIBITED			65
148#define	REPLY_CODE_FA_NACK_RESOURCES			66
149#define	REPLY_CODE_FA_NACK_MN_AUTH			67
150#define	REPLY_CODE_FA_NACK_HA_AUTH			68
151#define	REPLY_CODE_FA_NACK_LIFETIME			69
152#define	REPLY_CODE_FA_NACK_BAD_REQUEST			70
153#define	REPLY_CODE_FA_NACK_BAD_REPLY			71
154#define	REPLY_CODE_FA_NACK_ENCAP_UNAVAILABLE		72
155#define	REPLY_CODE_FA_NACK_VJ_UNAVAILABLE		73
156#define	REPLY_CODE_FA_NACK_BIDIR_TUNNEL_UNAVAILABLE	74
157#define	REPLY_CODE_FA_NACK_BIDIR_TUNNEL_NO_TBIT		75
158#define	REPLY_CODE_FA_NACK_BIDIR_TUNNEL_TOO_DISTANT	76
159#define	REPLY_CODE_FA_NACK_ICMP_HA_NET_UNREACHABLE	80
160#define	REPLY_CODE_FA_NACK_ICMP_HA_HOST_UNREACHABLE	81
161#define	REPLY_CODE_FA_NACK_ICMP_HA_PORT_UNREACHABLE	82
162#define	REPLY_CODE_FA_NACK_ICMP_HA_UNREACHABLE		88
163#define	REPLY_CODE_FA_NACK_UNIQUE_HOMEADDR_REQD		96
164#define	REPLY_CODE_FA_NACK_MISSING_NAI			97
165#define	REPLY_CODE_FA_NACK_MISSING_HOME_AGENT		98
166#define	REPLY_CODE_FA_NACK_MISSING_HOMEADDR		99
167#define	REPLY_CODE_FA_NACK_UNKNOWN_CHALLENGE		104
168#define	REPLY_CODE_FA_NACK_MISSING_CHALLENGE		105
169#define	REPLY_CODE_FA_NACK_MISSING_MN_FA		106
170
171/* denied by HA */
172#define	REPLY_CODE_HA_NACK_UNSPECIFIED			128
173#define	REPLY_CODE_HA_NACK_PROHIBITED			129
174#define	REPLY_CODE_HA_NACK_RESOURCES			130
175#define	REPLY_CODE_HA_NACK_MN_AUTH			131
176#define	REPLY_CODE_HA_NACK_FA_AUTH			132
177#define	REPLY_CODE_HA_NACK_ID_MISMATCH			133
178#define	REPLY_CODE_HA_NACK_BAD_REQUEST			134
179#define	REPLY_CODE_HA_NACK_TOO_MANY_BINDINGS		135
180#define	REPLY_CODE_HA_NACK_BAD_HA_ADDRESS		136
181#define	REPLY_CODE_HA_NACK_BIDIR_TUNNEL_UNAVAILABLE	137
182#define	REPLY_CODE_HA_NACK_BIDIR_TUNNEL_NO_TBIT		138
183#define	REPLY_CODE_HA_NACK_BIDIR_ENCAP_UNAVAILABLE	139
184
185/*
186 * OTHER EXTENSIONS
187 */
188
189/*
190 * The second set consists of those extensions which may appear only
191 * in ICMP Router Discovery messages [4].  Currently, Mobile IP
192 * defines the following Types for Extensions appearing in ICMP
193 * Router Discovery messages:
194 *
195 * 0  One-byte PaddingOne-byte Padding (encoded with no Length nor
196 * Data field)
197 * 16  Mobility Agent Advertisement
198 * 19  Prefix-Lengths
199 */
200#define	ICMP_ADV_MSG_PADDING_EXT	0
201#define	ICMP_ADV_MSG_MOBILITY_AGT_EXT	16
202#define	ICMP_ADV_MSG_PREFIX_LENGTH_EXT	19
203#define	ICMP_ADV_MSG_FA_CHALLENGE	24
204#define	ICMP_ADV_MSG_FA_NAI		25
205
206
207/*
208 * Mobility Agent Advertisement Extension
209 * The Mobility Agent Adv Extension follows the ICMP Router
210 * Advertisement fields.It is used to indicate that an ICMP Router
211 * Advertisement message is also an Agent Advertisement being sent
212 * by a mobility agent.
213 *
214 * Type		16
215 * Length	(6 + 4*N), where N is the number of care-of addresses
216 *		advertised.
217 *
218 * Sequence Number
219 * The count of Agent Advertisement messages sent since the
220 * agent was initialized (Section 2.3.2).
221 *
222 * Registration Lifetime
223 * The longest lifetime (measured in seconds) that this
224 * agent is willing to accept in any Registration Request.
225 * A value of 0xffff indicates infinity.  This field has no
226 * relation to the "Lifetime" field within the ICMP Router
227 * Advertisement portion of the Agent Advertisement.
228 *
229 * R	Registration required.  Registration with this foreign
230 * agent (or another foreign agent on this link) is required
231 * rather than using a co-located care-of address.
232 *
233 * B	Busy.  The foreign agent will not accept registrations
234 * from additional mobile nodes.
235 *
236 * H	Home agent.  This agent offers service as a home agent
237 * on the link on which this Agent Advertisement message is
238 * sent.
239 *
240 * F	Foreign agent.  This agent offers service as a foreign
241 * agent on the link on which this Agent Advertisement
242 * message is sent.
243 *
244 * M	Minimal encapsulation.  This agent implements receiving
245 * tunneled datagrams that use minimal encapsulation [15].
246 *
247 * G	GRE encapsulation.  This agent implements receiving
248 * tunneled datagrams that use GRE encapsulation [8].
249 *
250 * V 	Van Jacobson header compression.  This agent supports use
251 * of Van Jacobson header compression [10] over the link
252 * with any registered mobile node.
253 *
254 * reserved 	sent as zero; ignored on reception.
255 *
256 * Care-of Address(es)
257 * The advertised foreign agent care-of address(es) provided
258 * by this foreign agent.  An Agent Advertisement MUST
259 * include at least one care-of address if the 'F' bit
260 * is set.  The number of care-of addresses present is
261 * determined by the Length field in the Extension.
262 *
263 * A HA must always be prepared to serve the mobile nodes for
264 * which it is the home agent. A FA may at times be too busy
265 * to serve additional MNs; even so, it must continue to send
266 * Agent Advertisements, so that any mobile nodes already registered
267 * with it will know that they have not moved out of range of the
268 * foreign agent and that the  has not failed.  A foreign
269 * agent may indicate that it is "too busy" to allow new MNs to
270 * register with it, by setting the 'B' bit in its Agent Adv.
271 * An Agent Adv message MUST NOT have the 'B' bit set if the
272 * 'F' bit is not also set, and at least one of the 'F' bit and the
273 * 'H'  bit MUST be set in any Agent Advertisement message sent.
274 *
275 * When a FA wishes to require registration even from those
276 * mobile nodes which have acquired a co-located care-of address, it
277 * sets the 'R' bit to one. Because this bit applies only to foreign
278 * agents, an agent MUST NOT set the 'R' bit to one unless the 'F'
279 * bit is also set to one.
280 */
281#ifdef __sparc
282#ifdef _BIT_FIELDS_HTOL
283typedef struct mobility_agt_adv_extension {
284	uchar_t		type;
285	uchar_t		length;
286	ushort_t	sequence_num;
287	ushort_t	reg_lifetime;
288	ushort_t	reg_bit:1,
289			busy_bit:1,
290			ha_bit:1,
291			fa_bit:1,
292			minencap_bit:1,
293			greencap_bit:1,
294			vanjacob_hdr_comp_bit:1,
295			reverse_tunnel_bit:1,
296			reserved:8;
297} mobagtadvext_t;
298
299#endif /* _BIT_FIELDS_HTOL */
300#endif /* __sparc */
301
302#ifdef __i386
303#ifdef _BIT_FIELDS_LTOH
304typedef struct mobility_agt_adv_extension {
305	uchar_t		type;
306	uchar_t		length;
307	ushort_t	sequence_num;
308	ushort_t	reg_lifetime;
309	uchar_t
310			reverse_tunnel_bit:1,
311			vanjacob_hdr_comp_bit:1,
312			greencap_bit:1,
313			minencap_bit:1,
314			fa_bit:1,
315			ha_bit:1,
316			busy_bit:1,
317			reg_bit:1;
318	uchar_t		reserved;
319} mobagtadvext_t;
320#endif /* _BIT_FIELDS_LTOH */
321#endif /* __i386 */
322
323#ifdef __cplusplus
324}
325#endif
326
327#endif /* _SNOOP_MIP_H */
328