xref: /illumos-gate/usr/src/uts/common/inet/arp.h (revision 19d332fefbc61327bb6187d0eb818629f3b52c6f)
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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 /* Copyright (c) 1990 Mentat Inc. */
26 
27 #ifndef	_INET_ARP_H
28 #define	_INET_ARP_H
29 
30 #include <sys/types.h>
31 #include <net/if.h>
32 
33 #ifdef	__cplusplus
34 extern "C" {
35 #endif
36 
37 /*
38  * Warning: the interfaces described in this file are private to the
39  * implementation.  They may change at any time without notice and are not
40  * documented.  Do not depend on them.
41  */
42 
43 #define	ARP_REQUEST	1
44 #define	ARP_RESPONSE	2
45 #define	RARP_REQUEST	3
46 #define	RARP_RESPONSE	4
47 
48 #define	AR_IOCTL		(((unsigned)'A' & 0xFF)<<8)
49 #define	CMD_IN_PROGRESS		0x10000
50 
51 #define	AR_ENTRY_ADD		(AR_IOCTL + 1)
52 #define	AR_ENTRY_DELETE		(AR_IOCTL + 2)
53 #define	AR_ENTRY_QUERY		(AR_IOCTL + 3)
54 #define	AR_ENTRY_SQUERY		(AR_IOCTL + 6)
55 #define	AR_MAPPING_ADD		(AR_IOCTL + 7)
56 #define	AR_CLIENT_NOTIFY	(AR_IOCTL + 8)
57 #define	AR_INTERFACE_UP		(AR_IOCTL + 9)
58 #define	AR_INTERFACE_DOWN	(AR_IOCTL + 10)
59 #define	AR_INTERFACE_ON		(AR_IOCTL + 12)
60 #define	AR_INTERFACE_OFF	(AR_IOCTL + 13)
61 #define	AR_DLPIOP_DONE		(AR_IOCTL + 14)
62 /*
63  * This is not an ARP command per se, it is used to interface between
64  * ARP and IP during close.
65  */
66 #define	AR_ARP_CLOSING		(AR_IOCTL + 16)
67 #define	AR_ARP_EXTEND		(AR_IOCTL + 17)
68 #define	AR_IPMP_ACTIVATE	(AR_IOCTL + 18)
69 #define	AR_IPMP_DEACTIVATE	(AR_IOCTL + 19)
70 
71 /* Both ace_flags and area_flags; must also modify arp.c in mdb */
72 #define	ACE_F_PERMANENT		0x0001
73 #define	ACE_F_PUBLISH		0x0002
74 #define	ACE_F_DYING		0x0004
75 #define	ACE_F_RESOLVED		0x0008
76 /* Using bit mask extraction from target address */
77 #define	ACE_F_MAPPING		0x0010
78 #define	ACE_F_MYADDR		0x0020	/* IP claims to own this address */
79 #define	ACE_F_UNVERIFIED	0x0040	/* DAD not yet complete */
80 #define	ACE_F_AUTHORITY		0x0080	/* check for duplicate MACs */
81 #define	ACE_F_DEFEND		0x0100	/* single transmit (area_flags only) */
82 #define	ACE_F_OLD		0x0200	/* should revalidate when IP asks */
83 #define	ACE_F_FAST		0x0400	/* fast probe enabled */
84 #define	ACE_F_DELAYED		0x0800	/* rescheduled on arp_defend_rate */
85 #define	ACE_F_DAD_ABORTED	0x1000	/* DAD was aborted on link down */
86 
87 /* ared_flags */
88 #define	ARED_F_PRESERVE_PERM	0x0001	/* preserve permanent ace */
89 
90 /* ARP Command Structures */
91 
92 /* arc_t - Common command overlay */
93 typedef struct ar_cmd_s {
94 	uint32_t	arc_cmd;
95 	uint32_t	arc_name_offset;
96 	uint32_t	arc_name_length;
97 } arc_t;
98 
99 /*
100  * NOTE: when using area_t for an AR_ENTRY_SQUERY, the area_hw_addr_offset
101  * field isn't what you might think. See comments in ip_multi.c where
102  * the routine ill_create_squery() is called, and also in the routine
103  * itself, to see how this field is used *only* when the area_t holds
104  * an AR_ENTRY_SQUERY.
105  */
106 typedef	struct ar_entry_add_s {
107 	uint32_t	area_cmd;
108 	uint32_t	area_name_offset;
109 	uint32_t	area_name_length;
110 	uint32_t	area_proto;
111 	uint32_t	area_proto_addr_offset;
112 	uint32_t	area_proto_addr_length;
113 	uint32_t	area_proto_mask_offset;
114 	uint32_t	area_flags;		/* Same values as ace_flags */
115 	uint32_t	area_hw_addr_offset;
116 	uint32_t	area_hw_addr_length;
117 } area_t;
118 
119 typedef	struct ar_entry_delete_s {
120 	uint32_t	ared_cmd;
121 	uint32_t	ared_name_offset;
122 	uint32_t	ared_name_length;
123 	uint32_t	ared_proto;
124 	uint32_t	ared_proto_addr_offset;
125 	uint32_t	ared_proto_addr_length;
126 	uint32_t	ared_flags;
127 } ared_t;
128 
129 typedef	struct ar_entry_query_s {
130 	uint32_t	areq_cmd;
131 	uint32_t	areq_name_offset;
132 	uint32_t	areq_name_length;
133 	uint32_t	areq_proto;
134 	uint32_t	areq_target_addr_offset;
135 	uint32_t	areq_target_addr_length;
136 	uint32_t	areq_flags;
137 	uint32_t	areq_sender_addr_offset;
138 	uint32_t	areq_sender_addr_length;
139 	uint32_t	areq_xmit_count;	/* 0 ==> cache lookup only */
140 	uint32_t	areq_xmit_interval; /* # of milliseconds; 0: default */
141 		/* # ofquests to buffer; 0: default */
142 	uint32_t	areq_max_buffered;
143 	uchar_t	areq_sap[8];		/* to insert in returned template */
144 } areq_t;
145 
146 #define	AR_EQ_DEFAULT_XMIT_COUNT	6
147 #define	AR_EQ_DEFAULT_XMIT_INTERVAL	1000
148 #define	AR_EQ_DEFAULT_MAX_BUFFERED	4
149 
150 /*
151  * Structure used with AR_ENTRY_LLAQUERY to map from the link_addr
152  * (in Neighbor Discovery option format excluding the option type and
153  * length) to a hardware address.
154  * The response has the same format as for an AR_ENTRY_SQUERY - an M_CTL with
155  * arel_hw_addr updated.
156  * An IPv6 address will be passed in AR_ENTRY_LLAQUERY so that atmip
157  * can send it in AR_CLIENT_NOTIFY messages.
158  */
159 typedef	struct ar_entry_llaquery_s {
160 	uint32_t	arel_cmd;
161 	uint32_t	arel_name_offset;
162 	uint32_t	arel_name_length;
163 	uint32_t	arel_link_addr_offset;
164 	uint32_t	arel_link_addr_length;
165 	uint32_t	arel_hw_addr_offset;
166 	uint32_t	arel_hw_addr_length;
167 	uint32_t	arel_ip_addr_offset;
168 	uint32_t	arel_ip_addr_length;
169 } arel_t;
170 
171 typedef	struct ar_mapping_add_s {
172 	uint32_t	arma_cmd;
173 	uint32_t	arma_name_offset;
174 	uint32_t	arma_name_length;
175 	uint32_t	arma_proto;
176 	uint32_t	arma_proto_addr_offset;
177 	uint32_t	arma_proto_addr_length;
178 	uint32_t	arma_proto_mask_offset;
179 	uint32_t	arma_proto_extract_mask_offset;
180 	uint32_t	arma_flags;
181 	uint32_t	arma_hw_addr_offset;
182 	uint32_t	arma_hw_addr_length;
183 		/* Offset were we start placing */
184 	uint32_t	arma_hw_mapping_start;
185 					/* the mask&proto_addr */
186 } arma_t;
187 
188 /* Structure used to notify ARP of changes to IPMP group topology */
189 typedef	struct ar_ipmp_event_s {
190 	uint32_t	arie_cmd;
191 	uint32_t	arie_name_offset;
192 	uint32_t	arie_name_length;
193 	char		arie_grifname[LIFNAMSIZ];
194 } arie_t;
195 
196 /* Structure used to notify clients of interesting conditions. */
197 typedef struct ar_client_notify_s {
198 	uint32_t	arcn_cmd;
199 	uint32_t	arcn_name_offset;
200 	uint32_t	arcn_name_length;
201 	uint32_t	arcn_code;			/* Notification code. */
202 } arcn_t;
203 
204 /* Client Notification Codes */
205 #define	AR_CN_BOGON	1
206 #define	AR_CN_ANNOUNCE	2
207 #define	AR_CN_READY	3		/* DAD complete; address usable */
208 #define	AR_CN_FAILED	4		/* DAD failed; address unusable */
209 
210 /* ARP Header */
211 typedef struct arh_s {
212 	uchar_t	arh_hardware[2];
213 	uchar_t	arh_proto[2];
214 	uchar_t	arh_hlen;
215 	uchar_t	arh_plen;
216 	uchar_t	arh_operation[2];
217 	/* The sender and target hw/proto pairs follow */
218 } arh_t;
219 
220 #ifdef	__cplusplus
221 }
222 #endif
223 
224 #endif	/* _INET_ARP_H */
225