xref: /illumos-gate/usr/src/uts/common/inet/ip/ip_arp.c (revision 14b24e2b79293068c8e016a69ef1d872fb5e2fd5)
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 /*
23  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #include <inet/ip_arp.h>
27 #include <inet/ip_ndp.h>
28 #include <net/if_arp.h>
29 #include <netinet/if_ether.h>
30 #include <sys/strsubr.h>
31 #include <inet/ip6.h>
32 #include <inet/ip.h>
33 #include <inet/ip_ire.h>
34 #include <inet/ip_if.h>
35 #include <sys/dlpi.h>
36 #include <sys/sunddi.h>
37 #include <sys/strsun.h>
38 #include <sys/sdt.h>
39 #include <inet/mi.h>
40 #include <inet/arp.h>
41 #include <inet/ipdrop.h>
42 #include <sys/sockio.h>
43 #include <inet/ip_impl.h>
44 #include <sys/policy.h>
45 
46 #define	ARL_LL_ADDR_OFFSET(arl)	(((arl)->arl_sap_length) < 0 ? \
47 	(sizeof (dl_unitdata_req_t)) : \
48 	((sizeof (dl_unitdata_req_t)) + (ABS((arl)->arl_sap_length))))
49 
50 /*
51  * MAC-specific intelligence.  Shouldn't be needed, but the DL_INFO_ACK
52  * doesn't quite do it for us.
53  */
54 typedef struct arp_m_s {
55 	t_uscalar_t	arp_mac_type;
56 	uint32_t	arp_mac_arp_hw_type;
57 	t_scalar_t	arp_mac_sap_length;
58 	uint32_t	arp_mac_hw_addr_length;
59 } arp_m_t;
60 
61 static int arp_close(queue_t *, int);
62 static void arp_rput(queue_t *, mblk_t *);
63 static void arp_wput(queue_t *, mblk_t *);
64 static arp_m_t	*arp_m_lookup(t_uscalar_t mac_type);
65 static void arp_notify(ipaddr_t, mblk_t *, uint32_t, ip_recv_attr_t *,
66 	ncec_t *);
67 static int arp_output(ill_t *, uint32_t, const uchar_t *, const uchar_t *,
68 	const uchar_t *, const uchar_t *, uchar_t *);
69 static int  arp_modclose(arl_t *);
70 static void  arp_mod_close_tail(arl_t *);
71 static mblk_t *arl_unbind(arl_t *);
72 static void arp_process_packet(ill_t *, mblk_t *);
73 static void arp_excl(ipsq_t *, queue_t *, mblk_t *, void *);
74 static void arp_drop_packet(const char *str, mblk_t *, ill_t *);
75 static int arp_open(queue_t *, dev_t *, int, int, cred_t *);
76 static int ip_sioctl_ifunitsel_arp(queue_t *, int *);
77 static int ip_sioctl_slifname_arp(queue_t *, void *);
78 static void arp_dlpi_send(arl_t *, mblk_t *);
79 static void arl_defaults_common(arl_t *, mblk_t *);
80 static int arp_modopen(queue_t *, dev_t *, int, int, cred_t *);
81 static void arp_ifname_notify(arl_t *);
82 static void arp_rput_dlpi_writer(ipsq_t *, queue_t *, mblk_t *, void *);
83 static arl_t *ill_to_arl(ill_t *);
84 
85 #define	DL_PRIM(mp)	(((union DL_primitives *)(mp)->b_rptr)->dl_primitive)
86 #define	IS_DLPI_DATA(mp)						\
87 	((DB_TYPE(mp) == M_PROTO) &&					\
88 	MBLKL(mp) >= sizeof (dl_unitdata_ind_t) &&			\
89 	(DL_PRIM(mp) == DL_UNITDATA_IND))
90 
91 #define	AR_NOTFOUND	1	/* No matching ace found in cache */
92 #define	AR_MERGED	2	/* Matching ace updated (RFC 826 Merge_flag) */
93 #define	AR_LOOPBACK	3	/* Our own arp packet was received */
94 #define	AR_BOGON	4	/* Another host has our IP addr. */
95 #define	AR_FAILED	5	/* Duplicate Address Detection has failed */
96 #define	AR_CHANGED	6	/* Address has changed; tell IP (and merged) */
97 
98 boolean_t arp_no_defense;
99 
100 struct module_info arp_mod_info = {
101 	IP_MOD_ID, "arp", 1, INFPSZ, 65536, 1024
102 };
103 static struct qinit rinit_arp = {
104 	(pfi_t)arp_rput, NULL, arp_open, arp_close, NULL, &arp_mod_info
105 };
106 static struct qinit winit_arp = {
107 	(pfi_t)arp_wput, NULL, arp_open, arp_close, NULL,
108 	&arp_mod_info
109 };
110 struct streamtab arpinfo = {
111 	&rinit_arp, &winit_arp
112 };
113 #define	ARH_FIXED_LEN	8
114 #define	AR_LL_HDR_SLACK	32
115 
116 /*
117  * pfhooks for ARP.
118  */
119 #define	ARP_HOOK_IN(_hook, _event, _ilp, _hdr, _fm, _m, ipst)		\
120 									\
121 	if ((_hook).he_interested) {                       		\
122 		hook_pkt_event_t info;                          	\
123 									\
124 		info.hpe_protocol = ipst->ips_arp_net_data;		\
125 		info.hpe_ifp = _ilp;                       		\
126 		info.hpe_ofp = 0;                       		\
127 		info.hpe_hdr = _hdr;                            	\
128 		info.hpe_mp = &(_fm);                           	\
129 		info.hpe_mb = _m;                               	\
130 		if (hook_run(ipst->ips_arp_net_data->netd_hooks,	\
131 		    _event, (hook_data_t)&info) != 0) {			\
132 			if (_fm != NULL) {                      	\
133 				freemsg(_fm);                   	\
134 				_fm = NULL;                     	\
135 			}                                       	\
136 			_hdr = NULL;                            	\
137 			_m = NULL;                              	\
138 		} else {                                        	\
139 			_hdr = info.hpe_hdr;                    	\
140 			_m = info.hpe_mb;                       	\
141 		}                                               	\
142 	}
143 
144 #define	ARP_HOOK_OUT(_hook, _event, _olp, _hdr, _fm, _m, ipst)		\
145 									\
146 	if ((_hook).he_interested) {                       		\
147 		hook_pkt_event_t info;                          	\
148 									\
149 		info.hpe_protocol = ipst->ips_arp_net_data;		\
150 		info.hpe_ifp = 0;                       		\
151 		info.hpe_ofp = _olp;                       		\
152 		info.hpe_hdr = _hdr;                            	\
153 		info.hpe_mp = &(_fm);                           	\
154 		info.hpe_mb = _m;                               	\
155 		if (hook_run(ipst->ips_arp_net_data->netd_hooks,	\
156 		    _event, (hook_data_t)&info) != 0) {			\
157 			if (_fm != NULL) {                      	\
158 				freemsg(_fm);                   	\
159 				_fm = NULL;                     	\
160 			}                                       	\
161 			_hdr = NULL;                            	\
162 			_m = NULL;                              	\
163 		} else {                                        	\
164 			_hdr = info.hpe_hdr;                    	\
165 			_m = info.hpe_mb;                       	\
166 		}                                               	\
167 	}
168 
169 static arp_m_t	arp_m_tbl[] = {
170 	{ DL_CSMACD,	ARPHRD_ETHER,	-2,	6},	/* 802.3 */
171 	{ DL_TPB,	ARPHRD_IEEE802,	-2,	6},	/* 802.4 */
172 	{ DL_TPR,	ARPHRD_IEEE802,	-2,	6},	/* 802.5 */
173 	{ DL_METRO,	ARPHRD_IEEE802,	-2,	6},	/* 802.6 */
174 	{ DL_ETHER,	ARPHRD_ETHER,	-2,	6},	/* Ethernet */
175 	{ DL_FDDI,	ARPHRD_ETHER,	-2,	6},	/* FDDI */
176 	{ DL_IB,	ARPHRD_IB,	-2,	20},	/* Infiniband */
177 	{ DL_OTHER,	ARPHRD_ETHER,	-2,	6}	/* unknown */
178 };
179 
180 static void
181 arl_refhold_locked(arl_t *arl)
182 {
183 	ASSERT(MUTEX_HELD(&arl->arl_lock));
184 	arl->arl_refcnt++;
185 	ASSERT(arl->arl_refcnt != 0);
186 }
187 
188 static void
189 arl_refrele(arl_t *arl)
190 {
191 	mutex_enter(&arl->arl_lock);
192 	ASSERT(arl->arl_refcnt != 0);
193 	arl->arl_refcnt--;
194 	if (arl->arl_refcnt > 1) {
195 		mutex_exit(&arl->arl_lock);
196 		return;
197 	}
198 
199 	/* ill_close or arp_unbind_complete may be waiting */
200 	cv_broadcast(&arl->arl_cv);
201 	mutex_exit(&arl->arl_lock);
202 }
203 
204 /*
205  * wake up any pending ip ioctls.
206  */
207 static void
208 arp_cmd_done(ill_t *ill, int err, t_uscalar_t lastprim)
209 {
210 	if (lastprim == DL_UNBIND_REQ && ill->ill_replumbing)
211 		arp_replumb_done(ill, 0);
212 	else
213 		arp_bringup_done(ill, err);
214 }
215 
216 static int
217 ip_nce_resolve_all(ill_t *ill, uchar_t *src_haddr, uint32_t hlen,
218     const in_addr_t *src_paddr, ncec_t **sncec, int op)
219 {
220 	int retv;
221 	ncec_t *ncec;
222 	boolean_t ll_changed;
223 	uchar_t *lladdr = NULL;
224 	int new_state;
225 
226 	ASSERT(ill != NULL);
227 
228 	ncec = ncec_lookup_illgrp_v4(ill, src_paddr);
229 	*sncec = ncec;
230 
231 	if (ncec == NULL) {
232 		retv = AR_NOTFOUND;
233 		goto done;
234 	}
235 
236 	mutex_enter(&ncec->ncec_lock);
237 	/*
238 	 * IP addr and hardware address match what we already
239 	 * have, then this is a broadcast packet emitted by one of our
240 	 * interfaces, reflected by the switch and received on another
241 	 * interface.  We return AR_LOOPBACK.
242 	 */
243 	lladdr = ncec->ncec_lladdr;
244 	if (NCE_MYADDR(ncec) && hlen == ncec->ncec_ill->ill_phys_addr_length &&
245 	    bcmp(lladdr, src_haddr, hlen) == 0) {
246 		mutex_exit(&ncec->ncec_lock);
247 		retv = AR_LOOPBACK;
248 		goto done;
249 	}
250 	/*
251 	 * If the entry is unverified, then we've just verified that
252 	 * someone else already owns this address, because this is a
253 	 * message with the same protocol address but different
254 	 * hardware address.
255 	 */
256 	if (ncec->ncec_flags & NCE_F_UNVERIFIED) {
257 		mutex_exit(&ncec->ncec_lock);
258 		ncec_delete(ncec);
259 		ncec_refrele(ncec);
260 		*sncec = NULL;
261 		retv = AR_FAILED;
262 		goto done;
263 	}
264 
265 	/*
266 	 * If the IP address matches ours and we're authoritative for
267 	 * this entry, then some other node is using our IP addr, so
268 	 * return AR_BOGON.  Also reset the transmit count to zero so
269 	 * that, if we're currently in initial announcement mode, we
270 	 * switch back to the lazier defense mode.  Knowing that
271 	 * there's at least one duplicate out there, we ought not
272 	 * blindly announce.
273 	 *
274 	 * NCE_F_AUTHORITY is set in one of two ways:
275 	 * 1. /sbin/arp told us so, via the "permanent" flag.
276 	 * 2. This is one of my addresses.
277 	 */
278 	if (ncec->ncec_flags & NCE_F_AUTHORITY) {
279 		ncec->ncec_unsolicit_count = 0;
280 		mutex_exit(&ncec->ncec_lock);
281 		retv = AR_BOGON;
282 		goto done;
283 	}
284 
285 	/*
286 	 * No address conflict was detected, and we are getting
287 	 * ready to update the ncec's hwaddr. The nce MUST NOT be on an
288 	 * under interface, because all dynamic nce's are created on the
289 	 * native interface (in the non-IPMP case) or on the IPMP
290 	 * meta-interface (in the IPMP case)
291 	 */
292 	ASSERT(!IS_UNDER_IPMP(ncec->ncec_ill));
293 
294 	/*
295 	 * update ncec with src_haddr, hlen.
296 	 *
297 	 * We are trying to resolve this ncec_addr/src_paddr and we
298 	 * got a REQUEST/RESPONSE from the ncec_addr/src_paddr.
299 	 * So the new_state is at least "STALE". If, in addition,
300 	 * this a solicited, unicast ARP_RESPONSE, we can transition
301 	 * to REACHABLE.
302 	 */
303 	new_state = ND_STALE;
304 	ip1dbg(("got info for ncec %p from addr %x\n",
305 	    (void *)ncec, *src_paddr));
306 	retv = AR_MERGED;
307 	if (ncec->ncec_state == ND_INCOMPLETE ||
308 	    ncec->ncec_state == ND_INITIAL) {
309 		ll_changed = B_TRUE;
310 	} else {
311 		ll_changed = nce_cmp_ll_addr(ncec, src_haddr, hlen);
312 		if (!ll_changed)
313 			new_state = ND_UNCHANGED;
314 		else
315 			retv = AR_CHANGED;
316 	}
317 	/*
318 	 * We don't have the equivalent of the IPv6 'S' flag indicating
319 	 * a solicited response, so we assume that if we are in
320 	 * INCOMPLETE, or got back an unchanged lladdr in PROBE state,
321 	 * and this is an ARP_RESPONSE, it must be a
322 	 * solicited response allowing us to transtion to REACHABLE.
323 	 */
324 	if (op == ARP_RESPONSE) {
325 		switch (ncec->ncec_state) {
326 		case ND_PROBE:
327 			new_state = (ll_changed ? ND_STALE : ND_REACHABLE);
328 			break;
329 		case ND_INCOMPLETE:
330 			new_state = ND_REACHABLE;
331 			break;
332 		}
333 	}
334 	/*
335 	 * Call nce_update() to refresh fastpath information on any
336 	 * dependent nce_t entries.
337 	 */
338 	nce_update(ncec, new_state, (ll_changed ? src_haddr : NULL));
339 	mutex_exit(&ncec->ncec_lock);
340 	nce_resolv_ok(ncec);
341 done:
342 	return (retv);
343 }
344 
345 /* Find an entry for a particular MAC type in the arp_m_tbl. */
346 static arp_m_t	*
347 arp_m_lookup(t_uscalar_t mac_type)
348 {
349 	arp_m_t	*arm;
350 
351 	for (arm = arp_m_tbl; arm < A_END(arp_m_tbl); arm++) {
352 		if (arm->arp_mac_type == mac_type)
353 			return (arm);
354 	}
355 	return (NULL);
356 }
357 
358 uint32_t
359 arp_hw_type(t_uscalar_t mactype)
360 {
361 	arp_m_t *arm;
362 
363 	if ((arm = arp_m_lookup(mactype)) == NULL)
364 		arm = arp_m_lookup(DL_OTHER);
365 	return (arm->arp_mac_arp_hw_type);
366 }
367 
368 /*
369  * Called when an DLPI control message has been acked; send down the next
370  * queued message (if any).
371  * The DLPI messages of interest being bind, attach and unbind since
372  * these are the only ones sent by ARP via arp_dlpi_send.
373  */
374 static void
375 arp_dlpi_done(arl_t *arl, ill_t *ill)
376 {
377 	mblk_t *mp;
378 	int err;
379 	t_uscalar_t prim;
380 
381 	mutex_enter(&arl->arl_lock);
382 	prim = arl->arl_dlpi_pending;
383 
384 	if ((mp = arl->arl_dlpi_deferred) == NULL) {
385 		arl->arl_dlpi_pending = DL_PRIM_INVAL;
386 		if (arl->arl_state_flags & ARL_LL_DOWN)
387 			err = ENETDOWN;
388 		else
389 			err = 0;
390 		mutex_exit(&arl->arl_lock);
391 
392 		mutex_enter(&ill->ill_lock);
393 		ill->ill_arl_dlpi_pending = 0;
394 		mutex_exit(&ill->ill_lock);
395 		arp_cmd_done(ill, err, prim);
396 		return;
397 	}
398 
399 	arl->arl_dlpi_deferred = mp->b_next;
400 	mp->b_next = NULL;
401 
402 	ASSERT(DB_TYPE(mp) == M_PROTO || DB_TYPE(mp) == M_PCPROTO);
403 
404 	arl->arl_dlpi_pending = DL_PRIM(mp);
405 	mutex_exit(&arl->arl_lock);
406 
407 	mutex_enter(&ill->ill_lock);
408 	ill->ill_arl_dlpi_pending = 1;
409 	mutex_exit(&ill->ill_lock);
410 
411 	putnext(arl->arl_wq, mp);
412 }
413 
414 /*
415  * This routine is called during module initialization when the DL_INFO_ACK
416  * comes back from the device.	We set up defaults for all the device dependent
417  * doo-dads we are going to need.  This will leave us ready to roll if we are
418  * attempting auto-configuration.  Alternatively, these defaults can be
419  * overridden by initialization procedures possessing higher intelligence.
420  *
421  * Caller will free the mp.
422  */
423 static void
424 arp_ll_set_defaults(arl_t *arl, mblk_t *mp)
425 {
426 	arp_m_t		*arm;
427 	dl_info_ack_t	*dlia = (dl_info_ack_t *)mp->b_rptr;
428 
429 	if ((arm = arp_m_lookup(dlia->dl_mac_type)) == NULL)
430 		arm = arp_m_lookup(DL_OTHER);
431 	ASSERT(arm != NULL);
432 
433 	/*
434 	 * We initialize based on parameters in the (currently) not too
435 	 * exhaustive arp_m_tbl.
436 	 */
437 	if (dlia->dl_version == DL_VERSION_2) {
438 		arl->arl_sap_length = dlia->dl_sap_length;
439 		arl->arl_phys_addr_length = dlia->dl_brdcst_addr_length;
440 		if (dlia->dl_provider_style == DL_STYLE2)
441 			arl->arl_needs_attach = 1;
442 	} else {
443 		arl->arl_sap_length = arm->arp_mac_sap_length;
444 		arl->arl_phys_addr_length = arm->arp_mac_hw_addr_length;
445 	}
446 	/*
447 	 * Note: the arp_hw_type in the arp header may be derived from
448 	 * the ill_mac_type and arp_m_lookup().
449 	 */
450 	arl->arl_sap = ETHERTYPE_ARP;
451 	arl_defaults_common(arl, mp);
452 }
453 
454 static void
455 arp_wput(queue_t *q, mblk_t *mp)
456 {
457 	int err = EINVAL;
458 	struct iocblk *ioc;
459 	mblk_t *mp1;
460 
461 	switch (DB_TYPE(mp)) {
462 	case M_IOCTL:
463 		ASSERT(q->q_next != NULL);
464 		ioc = (struct iocblk *)mp->b_rptr;
465 		if (ioc->ioc_cmd != SIOCSLIFNAME &&
466 		    ioc->ioc_cmd != IF_UNITSEL) {
467 			DTRACE_PROBE4(arl__dlpi, char *, "arp_wput",
468 			    char *, "<some ioctl>", char *, "-",
469 			    arl_t *, (arl_t *)q->q_ptr);
470 			putnext(q, mp);
471 			return;
472 		}
473 		if ((mp1 = mp->b_cont) == 0)
474 			err = EINVAL;
475 		else if (ioc->ioc_cmd == SIOCSLIFNAME)
476 			err = ip_sioctl_slifname_arp(q, mp1->b_rptr);
477 		else if (ioc->ioc_cmd == IF_UNITSEL)
478 			err = ip_sioctl_ifunitsel_arp(q, (int *)mp1->b_rptr);
479 		if (err == 0)
480 			miocack(q, mp, 0, 0);
481 		else
482 			miocnak(q, mp, 0, err);
483 		return;
484 	default:
485 		DTRACE_PROBE4(arl__dlpi, char *, "arp_wput default",
486 		    char *, "default mblk", char *, "-",
487 		    arl_t *, (arl_t *)q->q_ptr);
488 		putnext(q, mp);
489 		return;
490 	}
491 }
492 
493 /*
494  * similar to ill_dlpi_pending(): verify that the received DLPI response
495  * matches the one that is pending for the arl.
496  */
497 static boolean_t
498 arl_dlpi_pending(arl_t *arl, t_uscalar_t prim)
499 {
500 	t_uscalar_t pending;
501 
502 	mutex_enter(&arl->arl_lock);
503 	if (arl->arl_dlpi_pending == prim) {
504 		mutex_exit(&arl->arl_lock);
505 		return (B_TRUE);
506 	}
507 
508 	if (arl->arl_state_flags & ARL_CONDEMNED) {
509 		mutex_exit(&arl->arl_lock);
510 		return (B_FALSE);
511 	}
512 	pending = arl->arl_dlpi_pending;
513 	mutex_exit(&arl->arl_lock);
514 
515 	if (pending == DL_PRIM_INVAL) {
516 		ip0dbg(("arl_dlpi_pending unsolicited ack for %s on %s",
517 		    dl_primstr(prim), arl->arl_name));
518 	} else {
519 		ip0dbg(("arl_dlpi_pending ack for %s on %s expect %s",
520 		    dl_primstr(prim), arl->arl_name, dl_primstr(pending)));
521 	}
522 	return (B_FALSE);
523 }
524 
525 /* DLPI messages, other than DL_UNITDATA_IND are handled here. */
526 static void
527 arp_rput_dlpi(queue_t *q, mblk_t *mp)
528 {
529 	arl_t		*arl = (arl_t *)q->q_ptr;
530 	union DL_primitives *dlp;
531 	t_uscalar_t	prim;
532 	t_uscalar_t	reqprim = DL_PRIM_INVAL;
533 	ill_t		*ill;
534 
535 	if ((mp->b_wptr - mp->b_rptr) < sizeof (dlp->dl_primitive)) {
536 		putnext(q, mp);
537 		return;
538 	}
539 	dlp = (union DL_primitives *)mp->b_rptr;
540 	prim = dlp->dl_primitive;
541 
542 	/*
543 	 * If we received an ACK but didn't send a request for it, then it
544 	 * can't be part of any pending operation; discard up-front.
545 	 */
546 	switch (prim) {
547 	case DL_ERROR_ACK:
548 		/*
549 		 * ce is confused about how DLPI works, so we have to interpret
550 		 * an "error" on DL_NOTIFY_ACK (which we never could have sent)
551 		 * as really meaning an error on DL_NOTIFY_REQ.
552 		 *
553 		 * Note that supporting DL_NOTIFY_REQ is optional, so printing
554 		 * out an error message on the console isn't warranted except
555 		 * for debug.
556 		 */
557 		if (dlp->error_ack.dl_error_primitive == DL_NOTIFY_ACK ||
558 		    dlp->error_ack.dl_error_primitive == DL_NOTIFY_REQ) {
559 			reqprim = DL_NOTIFY_REQ;
560 		} else {
561 			reqprim = dlp->error_ack.dl_error_primitive;
562 		}
563 		break;
564 	case DL_INFO_ACK:
565 		reqprim = DL_INFO_REQ;
566 		break;
567 	case DL_OK_ACK:
568 		reqprim = dlp->ok_ack.dl_correct_primitive;
569 		break;
570 	case DL_BIND_ACK:
571 		reqprim = DL_BIND_REQ;
572 		break;
573 	default:
574 		DTRACE_PROBE2(rput_dl_badprim, arl_t *, arl,
575 		    union DL_primitives *, dlp);
576 		putnext(q, mp);
577 		return;
578 	}
579 	if (reqprim == DL_PRIM_INVAL || !arl_dlpi_pending(arl, reqprim)) {
580 		freemsg(mp);
581 		return;
582 	}
583 	DTRACE_PROBE4(arl__dlpi, char *, "arp_rput_dlpi received",
584 	    char *, dl_primstr(prim), char *, dl_primstr(reqprim),
585 	    arl_t *, arl);
586 
587 	ASSERT(prim != DL_NOTIFY_IND);
588 
589 	ill = arl_to_ill(arl);
590 
591 	switch (reqprim) {
592 	case DL_INFO_REQ:
593 		/*
594 		 * ill has not been set up yet for this case. This is the
595 		 * DL_INFO_ACK for the first DL_INFO_REQ sent from
596 		 * arp_modopen(). There should be no other arl_dlpi_deferred
597 		 * messages pending. We initialize the arl here.
598 		 */
599 		ASSERT(!arl->arl_dlpi_style_set);
600 		ASSERT(arl->arl_dlpi_pending == DL_INFO_REQ);
601 		ASSERT(arl->arl_dlpi_deferred == NULL);
602 		arl->arl_dlpi_pending = DL_PRIM_INVAL;
603 		arp_ll_set_defaults(arl, mp);
604 		freemsg(mp);
605 		return;
606 	case DL_UNBIND_REQ:
607 		mutex_enter(&arl->arl_lock);
608 		arl->arl_state_flags &= ~ARL_DL_UNBIND_IN_PROGRESS;
609 		/*
610 		 * This is not an error, so we don't set ARL_LL_DOWN
611 		 */
612 		arl->arl_state_flags &= ~ARL_LL_UP;
613 		arl->arl_state_flags |= ARL_LL_UNBOUND;
614 		if (arl->arl_state_flags & ARL_CONDEMNED) {
615 			/*
616 			 * if this is part of the unplumb the arl may
617 			 * vaporize any moment after we cv_signal the
618 			 * arl_cv so we reset arl_dlpi_pending here.
619 			 * All other cases (including replumb) will
620 			 * have the arl_dlpi_pending reset in
621 			 * arp_dlpi_done.
622 			 */
623 			arl->arl_dlpi_pending = DL_PRIM_INVAL;
624 		}
625 		cv_signal(&arl->arl_cv);
626 		mutex_exit(&arl->arl_lock);
627 		break;
628 	}
629 	if (ill != NULL) {
630 		/*
631 		 * ill ref obtained by arl_to_ill()  will be released
632 		 * by qwriter_ip()
633 		 */
634 		qwriter_ip(ill, ill->ill_wq, mp, arp_rput_dlpi_writer,
635 		    CUR_OP, B_TRUE);
636 		return;
637 	}
638 	freemsg(mp);
639 }
640 
641 /*
642  * Handling of DLPI messages that require exclusive access to the ipsq.
643  */
644 /* ARGSUSED */
645 static void
646 arp_rput_dlpi_writer(ipsq_t *ipsq, queue_t *q, mblk_t *mp, void *dummy_arg)
647 {
648 	union DL_primitives *dlp = (union DL_primitives *)mp->b_rptr;
649 	ill_t		*ill = (ill_t *)q->q_ptr;
650 	arl_t		*arl = ill_to_arl(ill);
651 
652 	if (arl == NULL) {
653 		/*
654 		 * happens as a result arp_modclose triggering unbind.
655 		 * arp_rput_dlpi will cv_signal the arl_cv and the modclose
656 		 * will complete, but when it does ipsq_exit, the waiting
657 		 * qwriter_ip gets into the ipsq but will find the arl null.
658 		 * There should be no deferred messages in this case, so
659 		 * just complete and exit.
660 		 */
661 		arp_cmd_done(ill, 0, DL_UNBIND_REQ);
662 		freemsg(mp);
663 		return;
664 	}
665 	switch (dlp->dl_primitive) {
666 	case DL_ERROR_ACK:
667 		switch (dlp->error_ack.dl_error_primitive) {
668 		case DL_UNBIND_REQ:
669 			mutex_enter(&arl->arl_lock);
670 			arl->arl_state_flags &= ~ARL_DL_UNBIND_IN_PROGRESS;
671 			arl->arl_state_flags &= ~ARL_LL_UP;
672 			arl->arl_state_flags |= ARL_LL_UNBOUND;
673 			arl->arl_state_flags |= ARL_LL_DOWN;
674 			cv_signal(&arl->arl_cv);
675 			mutex_exit(&arl->arl_lock);
676 			break;
677 		case DL_BIND_REQ:
678 			mutex_enter(&arl->arl_lock);
679 			arl->arl_state_flags &= ~ARL_LL_UP;
680 			arl->arl_state_flags |= ARL_LL_DOWN;
681 			arl->arl_state_flags |= ARL_LL_UNBOUND;
682 			cv_signal(&arl->arl_cv);
683 			mutex_exit(&arl->arl_lock);
684 			break;
685 		case DL_ATTACH_REQ:
686 			break;
687 		default:
688 			/* If it's anything else, we didn't send it. */
689 			arl_refrele(arl);
690 			putnext(q, mp);
691 			return;
692 		}
693 		break;
694 	case DL_OK_ACK:
695 		DTRACE_PROBE4(arl__dlpi, char *, "arp_rput_dlpi_writer ok",
696 		    char *, dl_primstr(dlp->ok_ack.dl_correct_primitive),
697 		    char *, dl_primstr(dlp->ok_ack.dl_correct_primitive),
698 		    arl_t *, arl);
699 		mutex_enter(&arl->arl_lock);
700 		switch (dlp->ok_ack.dl_correct_primitive) {
701 		case DL_UNBIND_REQ:
702 		case DL_ATTACH_REQ:
703 			break;
704 		default:
705 			ip0dbg(("Dropping unrecognized DL_OK_ACK for %s",
706 			    dl_primstr(dlp->ok_ack.dl_correct_primitive)));
707 			mutex_exit(&arl->arl_lock);
708 			arl_refrele(arl);
709 			freemsg(mp);
710 			return;
711 		}
712 		mutex_exit(&arl->arl_lock);
713 		break;
714 	case DL_BIND_ACK:
715 		DTRACE_PROBE2(rput_dl_bind, arl_t *, arl,
716 		    dl_bind_ack_t *, &dlp->bind_ack);
717 
718 		mutex_enter(&arl->arl_lock);
719 		ASSERT(arl->arl_state_flags & ARL_LL_BIND_PENDING);
720 		arl->arl_state_flags &=
721 		    ~(ARL_LL_BIND_PENDING|ARL_LL_DOWN|ARL_LL_UNBOUND);
722 		arl->arl_state_flags |= ARL_LL_UP;
723 		mutex_exit(&arl->arl_lock);
724 		break;
725 	case DL_UDERROR_IND:
726 		DTRACE_PROBE2(rput_dl_uderror, arl_t *, arl,
727 		    dl_uderror_ind_t *, &dlp->uderror_ind);
728 		arl_refrele(arl);
729 		putnext(q, mp);
730 		return;
731 	default:
732 		DTRACE_PROBE2(rput_dl_badprim, arl_t *, arl,
733 		    union DL_primitives *, dlp);
734 		arl_refrele(arl);
735 		putnext(q, mp);
736 		return;
737 	}
738 	arp_dlpi_done(arl, ill);
739 	arl_refrele(arl);
740 	freemsg(mp);
741 }
742 
743 void
744 arp_rput(queue_t *q, mblk_t *mp)
745 {
746 	arl_t		*arl = q->q_ptr;
747 	boolean_t	need_refrele = B_FALSE;
748 
749 	mutex_enter(&arl->arl_lock);
750 	if (((arl->arl_state_flags &
751 	    (ARL_CONDEMNED | ARL_LL_REPLUMBING)) != 0)) {
752 		/*
753 		 * Only allow high priority DLPI messages during unplumb or
754 		 * replumb, and we don't take an arl_refcnt for that case.
755 		 */
756 		if (DB_TYPE(mp) != M_PCPROTO) {
757 			mutex_exit(&arl->arl_lock);
758 			freemsg(mp);
759 			return;
760 		}
761 	} else {
762 		arl_refhold_locked(arl);
763 		need_refrele = B_TRUE;
764 	}
765 	mutex_exit(&arl->arl_lock);
766 
767 	switch (DB_TYPE(mp)) {
768 	case M_PCPROTO:
769 	case M_PROTO: {
770 		ill_t *ill;
771 
772 		/*
773 		 * could be one of
774 		 * (i)   real message from the wire, (DLPI_DATA)
775 		 * (ii)  DLPI message
776 		 * Take a ref on the ill associated with this arl to
777 		 * prevent the ill from being unplumbed until this thread
778 		 * is done.
779 		 */
780 		if (IS_DLPI_DATA(mp)) {
781 			ill = arl_to_ill(arl);
782 			if (ill == NULL) {
783 				arp_drop_packet("No ill", mp, ill);
784 				break;
785 			}
786 			arp_process_packet(ill, mp);
787 			ill_refrele(ill);
788 			break;
789 		}
790 		/* Miscellaneous DLPI messages get shuffled off. */
791 		arp_rput_dlpi(q, mp);
792 		break;
793 	}
794 	case M_ERROR:
795 	case M_HANGUP:
796 		if (mp->b_rptr < mp->b_wptr)
797 			arl->arl_error = (int)(*mp->b_rptr & 0xFF);
798 		if (arl->arl_error == 0)
799 			arl->arl_error = ENXIO;
800 		freemsg(mp);
801 		break;
802 	default:
803 		ip1dbg(("arp_rput other db type %x\n", DB_TYPE(mp)));
804 		putnext(q, mp);
805 		break;
806 	}
807 	if (need_refrele)
808 		arl_refrele(arl);
809 }
810 
811 static void
812 arp_process_packet(ill_t *ill, mblk_t *mp)
813 {
814 	mblk_t 		*mp1;
815 	arh_t		*arh;
816 	in_addr_t	src_paddr, dst_paddr;
817 	uint32_t	hlen, plen;
818 	boolean_t	is_probe;
819 	int		op;
820 	ncec_t		*dst_ncec, *src_ncec = NULL;
821 	uchar_t		*src_haddr, *arhp, *dst_haddr, *dp, *sp;
822 	int		err;
823 	ip_stack_t	*ipst;
824 	boolean_t	need_ill_refrele = B_FALSE;
825 	nce_t		*nce;
826 	uchar_t		*src_lladdr;
827 	dl_unitdata_ind_t *dlui;
828 	ip_recv_attr_t	iras;
829 
830 	ASSERT(ill != NULL);
831 	if (ill->ill_flags & ILLF_NOARP) {
832 		arp_drop_packet("Interface does not support ARP", mp, ill);
833 		return;
834 	}
835 	ipst = ill->ill_ipst;
836 	/*
837 	 * What we should have at this point is a DL_UNITDATA_IND message
838 	 * followed by an ARP packet.  We do some initial checks and then
839 	 * get to work.
840 	 */
841 	dlui = (dl_unitdata_ind_t *)mp->b_rptr;
842 	if (dlui->dl_group_address == 1) {
843 		/*
844 		 * multicast or broadcast  packet. Only accept on the ipmp
845 		 * nominated interface for multicasts ('cast_ill').
846 		 * If we have no cast_ill we are liberal and accept everything.
847 		 */
848 		if (IS_UNDER_IPMP(ill)) {
849 			/* For an under ill_grp can change under lock */
850 			rw_enter(&ipst->ips_ill_g_lock, RW_READER);
851 			if (!ill->ill_nom_cast && ill->ill_grp != NULL &&
852 			    ill->ill_grp->ig_cast_ill != NULL) {
853 				rw_exit(&ipst->ips_ill_g_lock);
854 				arp_drop_packet("Interface is not nominated "
855 				    "for multicast sends and receives",
856 				    mp, ill);
857 				return;
858 			}
859 			rw_exit(&ipst->ips_ill_g_lock);
860 		}
861 	}
862 	mp1 = mp->b_cont;
863 	if (mp1 == NULL) {
864 		arp_drop_packet("Missing ARP packet", mp, ill);
865 		return;
866 	}
867 	if (mp1->b_cont != NULL) {
868 		/* No fooling around with funny messages. */
869 		if (!pullupmsg(mp1, -1)) {
870 			arp_drop_packet("Funny message: pullup failed",
871 			    mp, ill);
872 			return;
873 		}
874 	}
875 	arh = (arh_t *)mp1->b_rptr;
876 	hlen = arh->arh_hlen;
877 	plen = arh->arh_plen;
878 	if (MBLKL(mp1) < ARH_FIXED_LEN + 2 * hlen + 2 * plen) {
879 		arp_drop_packet("mblk len too small", mp, ill);
880 		return;
881 	}
882 	/*
883 	 * hlen 0 is used for RFC 1868 UnARP.
884 	 *
885 	 * Note that the rest of the code checks that hlen is what we expect
886 	 * for this hardware address type, so might as well discard packets
887 	 * here that don't match.
888 	 */
889 	if ((hlen > 0 && hlen != ill->ill_phys_addr_length) || plen == 0) {
890 		DTRACE_PROBE2(rput_bogus, ill_t *, ill, mblk_t *, mp1);
891 		arp_drop_packet("Bogus hlen or plen", mp, ill);
892 		return;
893 	}
894 	/*
895 	 * Historically, Solaris has been lenient about hardware type numbers.
896 	 * We should check here, but don't.
897 	 */
898 	DTRACE_PROBE3(arp__physical__in__start, ill_t *, ill, arh_t *, arh,
899 	    mblk_t *, mp);
900 	/*
901 	 * If ill is in an ipmp group, it will be the under ill. If we want
902 	 * to report the packet as coming up the IPMP interface, we should
903 	 * convert it to the ipmp ill.
904 	 */
905 	ARP_HOOK_IN(ipst->ips_arp_physical_in_event, ipst->ips_arp_physical_in,
906 	    ill->ill_phyint->phyint_ifindex, arh, mp, mp1, ipst);
907 	DTRACE_PROBE1(arp__physical__in__end, mblk_t *, mp);
908 	if (mp == NULL)
909 		return;
910 	arhp = (uchar_t *)arh + ARH_FIXED_LEN;
911 	src_haddr = arhp;			/* ar$sha */
912 	arhp += hlen;
913 	bcopy(arhp, &src_paddr, IP_ADDR_LEN);	/* ar$spa */
914 	sp = arhp;
915 	arhp += IP_ADDR_LEN;
916 	dst_haddr = arhp;			/* ar$dha */
917 	arhp += hlen;
918 	bcopy(arhp, &dst_paddr, IP_ADDR_LEN);	/* ar$tpa */
919 	dp = arhp;
920 	op = BE16_TO_U16(arh->arh_operation);
921 
922 	DTRACE_PROBE2(ip__arp__input, (in_addr_t), src_paddr,
923 	    (in_addr_t), dst_paddr);
924 
925 	/* Determine if this is just a probe */
926 	is_probe = (src_paddr == INADDR_ANY);
927 
928 	/*
929 	 * The following test for loopback is faster than
930 	 * IP_LOOPBACK_ADDR(), because it avoids any bitwise
931 	 * operations.
932 	 * Note that these addresses are always in network byte order
933 	 */
934 	if ((*(uint8_t *)&src_paddr) == IN_LOOPBACKNET ||
935 	    (*(uint8_t *)&dst_paddr) == IN_LOOPBACKNET ||
936 	    CLASSD(src_paddr) || CLASSD(dst_paddr)) {
937 		arp_drop_packet("Martian IP addr", mp, ill);
938 		return;
939 	}
940 
941 	/*
942 	 * ira_ill is the only field used down the arp_notify path.
943 	 */
944 	bzero(&iras, sizeof (iras));
945 	iras.ira_ill = iras.ira_rill = ill;
946 	/*
947 	 * RFC 826: first check if the <protocol, sender protocol address> is
948 	 * in the cache, if there is a sender protocol address.  Note that this
949 	 * step also handles resolutions based on source.
950 	 */
951 	/* Note: after here we need to freeb(mp) and freemsg(mp1) separately */
952 	mp->b_cont = NULL;
953 	if (is_probe) {
954 		err = AR_NOTFOUND;
955 	} else {
956 		if (plen != 4) {
957 			arp_drop_packet("bad protocol len", mp, ill);
958 			return;
959 		}
960 		err = ip_nce_resolve_all(ill, src_haddr, hlen, &src_paddr,
961 		    &src_ncec, op);
962 		switch (err) {
963 		case AR_BOGON:
964 			ASSERT(src_ncec != NULL);
965 			arp_notify(src_paddr, mp1, AR_CN_BOGON,
966 			    &iras, src_ncec);
967 			break;
968 		case AR_FAILED:
969 			arp_notify(src_paddr, mp1, AR_CN_FAILED, &iras,
970 			    src_ncec);
971 			break;
972 		case AR_LOOPBACK:
973 			DTRACE_PROBE2(rput_loopback, ill_t *, ill, arh_t *,
974 			    arh);
975 			freemsg(mp1);
976 			break;
977 		default:
978 			goto update;
979 		}
980 		freemsg(mp);
981 		if (src_ncec != NULL)
982 			ncec_refrele(src_ncec);
983 		return;
984 	}
985 update:
986 	/*
987 	 * Now look up the destination address.  By RFC 826, we ignore the
988 	 * packet at this step if the target isn't one of our addresses (i.e.,
989 	 * one we have been asked to PUBLISH).  This is true even if the
990 	 * target is something we're trying to resolve and the packet
991 	 * is a response.
992 	 */
993 	dst_ncec = ncec_lookup_illgrp_v4(ill, &dst_paddr);
994 	if (dst_ncec == NULL || !NCE_PUBLISH(dst_ncec)) {
995 		/*
996 		 * Let the client know if the source mapping has changed, even
997 		 * if the destination provides no useful information for the
998 		 * client.
999 		 */
1000 		if (err == AR_CHANGED) {
1001 			arp_notify(src_paddr, mp1, AR_CN_ANNOUNCE, &iras,
1002 			    NULL);
1003 			freemsg(mp);
1004 		} else {
1005 			freemsg(mp);
1006 			arp_drop_packet("Target is not interesting", mp1, ill);
1007 		}
1008 		if (dst_ncec != NULL)
1009 			ncec_refrele(dst_ncec);
1010 		if (src_ncec != NULL)
1011 			ncec_refrele(src_ncec);
1012 		return;
1013 	}
1014 
1015 	if (dst_ncec->ncec_flags & NCE_F_UNVERIFIED) {
1016 		/*
1017 		 * Check for a reflection.  Some misbehaving bridges will
1018 		 * reflect our own transmitted packets back to us.
1019 		 */
1020 		ASSERT(NCE_PUBLISH(dst_ncec));
1021 		if (hlen != dst_ncec->ncec_ill->ill_phys_addr_length) {
1022 			ncec_refrele(dst_ncec);
1023 			if (src_ncec != NULL)
1024 				ncec_refrele(src_ncec);
1025 			freemsg(mp);
1026 			arp_drop_packet("bad arh_len", mp1, ill);
1027 			return;
1028 		}
1029 		if (!nce_cmp_ll_addr(dst_ncec, src_haddr, hlen)) {
1030 			DTRACE_PROBE3(rput_probe_reflected, ill_t *, ill,
1031 			    arh_t *, arh, ncec_t *, dst_ncec);
1032 			ncec_refrele(dst_ncec);
1033 			if (src_ncec != NULL)
1034 				ncec_refrele(src_ncec);
1035 			freemsg(mp);
1036 			arp_drop_packet("Reflected probe", mp1, ill);
1037 			return;
1038 		}
1039 		/*
1040 		 * Responses targeting our HW address that are not responses to
1041 		 * our DAD probe must be ignored as they are related to requests
1042 		 * sent before DAD was restarted.
1043 		 */
1044 		if (op == ARP_RESPONSE &&
1045 		    (nce_cmp_ll_addr(dst_ncec, dst_haddr, hlen) == 0)) {
1046 			ncec_refrele(dst_ncec);
1047 			if (src_ncec != NULL)
1048 				ncec_refrele(src_ncec);
1049 			freemsg(mp);
1050 			arp_drop_packet(
1051 			    "Response to request that was sent before DAD",
1052 			    mp1, ill);
1053 			return;
1054 		}
1055 		/*
1056 		 * Responses targeted to HW addresses which are not ours but
1057 		 * sent to our unverified proto address are also conflicts.
1058 		 * These may be reported by a proxy rather than the interface
1059 		 * with the conflicting address, dst_paddr is in conflict
1060 		 * rather than src_paddr. To ensure IP can locate the correct
1061 		 * ipif to take down, it is necessary to copy dst_paddr to
1062 		 * the src_paddr field before sending it to IP. The same is
1063 		 * required for probes, where src_paddr will be INADDR_ANY.
1064 		 */
1065 		if (is_probe || op == ARP_RESPONSE) {
1066 			bcopy(dp, sp, plen);
1067 			arp_notify(src_paddr, mp1, AR_CN_FAILED, &iras,
1068 			    NULL);
1069 			ncec_delete(dst_ncec);
1070 		} else if (err == AR_CHANGED) {
1071 			arp_notify(src_paddr, mp1, AR_CN_ANNOUNCE, &iras,
1072 			    NULL);
1073 		} else {
1074 			DTRACE_PROBE3(rput_request_unverified,
1075 			    ill_t *, ill, arh_t *, arh, ncec_t *, dst_ncec);
1076 			arp_drop_packet("Unverified request", mp1, ill);
1077 		}
1078 		freemsg(mp);
1079 		ncec_refrele(dst_ncec);
1080 		if (src_ncec != NULL)
1081 			ncec_refrele(src_ncec);
1082 		return;
1083 	}
1084 	/*
1085 	 * If it's a request, then we reply to this, and if we think the
1086 	 * sender's unknown, then we create an entry to avoid unnecessary ARPs.
1087 	 * The design assumption is that someone ARPing us is likely to send us
1088 	 * a packet soon, and that we'll want to reply to it.
1089 	 */
1090 	if (op == ARP_REQUEST) {
1091 		const uchar_t *nce_hwaddr;
1092 		struct in_addr nce_paddr;
1093 		clock_t now;
1094 		ill_t *under_ill = ill;
1095 		boolean_t send_unicast = B_TRUE;
1096 
1097 		ASSERT(NCE_PUBLISH(dst_ncec));
1098 
1099 		if ((dst_ncec->ncec_flags & (NCE_F_BCAST|NCE_F_MCAST)) != 0) {
1100 			/*
1101 			 * Ignore senders who are deliberately or accidentally
1102 			 * confused.
1103 			 */
1104 			goto bail;
1105 		}
1106 
1107 		if (!is_probe && err == AR_NOTFOUND) {
1108 			ASSERT(src_ncec == NULL);
1109 
1110 			if (IS_UNDER_IPMP(under_ill)) {
1111 				/*
1112 				 * create the ncec for the sender on ipmp_ill.
1113 				 * We pass in the ipmp_ill itself to avoid
1114 				 * creating an nce_t on the under_ill.
1115 				 */
1116 				ill = ipmp_ill_hold_ipmp_ill(under_ill);
1117 				if (ill == NULL)
1118 					ill = under_ill;
1119 				else
1120 					need_ill_refrele = B_TRUE;
1121 			}
1122 
1123 			err = nce_lookup_then_add_v4(ill, src_haddr, hlen,
1124 			    &src_paddr, 0, ND_STALE, &nce);
1125 
1126 			switch (err) {
1127 			case 0:
1128 			case EEXIST:
1129 				ip1dbg(("added ncec %p in state %d ill %s\n",
1130 				    (void *)src_ncec, src_ncec->ncec_state,
1131 				    ill->ill_name));
1132 				src_ncec = nce->nce_common;
1133 				break;
1134 			default:
1135 				/*
1136 				 * Either no memory, or the outgoing interface
1137 				 * is in the process of down/unplumb. In the
1138 				 * latter case, we will fail the send anyway,
1139 				 * and in the former case, we should try to send
1140 				 * the ARP response.
1141 				 */
1142 				src_lladdr = src_haddr;
1143 				goto send_response;
1144 			}
1145 			ncec_refhold(src_ncec);
1146 			nce_refrele(nce);
1147 			/* set up cleanup interval on ncec */
1148 		}
1149 
1150 		/*
1151 		 * This implements periodic address defense based on a modified
1152 		 * version of the RFC 3927 requirements.  Instead of sending a
1153 		 * broadcasted reply every time, as demanded by the RFC, we
1154 		 * send at most one broadcast reply per arp_broadcast_interval.
1155 		 */
1156 		now = ddi_get_lbolt();
1157 		if ((now - dst_ncec->ncec_last_time_defended) >
1158 		    MSEC_TO_TICK(ipst->ips_ipv4_dad_announce_interval)) {
1159 			dst_ncec->ncec_last_time_defended = now;
1160 			/*
1161 			 * If this is one of the long-suffering entries,
1162 			 * pull it out now.  It no longer needs separate
1163 			 * defense, because we're now doing that with this
1164 			 * broadcasted reply.
1165 			 */
1166 			dst_ncec->ncec_flags &= ~NCE_F_DELAYED;
1167 			send_unicast = B_FALSE;
1168 		}
1169 		if (src_ncec != NULL && send_unicast) {
1170 			src_lladdr = src_ncec->ncec_lladdr;
1171 		} else {
1172 			src_lladdr = under_ill->ill_bcast_mp->b_rptr +
1173 			    NCE_LL_ADDR_OFFSET(under_ill);
1174 		}
1175 send_response:
1176 		nce_hwaddr = dst_ncec->ncec_lladdr;
1177 		IN6_V4MAPPED_TO_INADDR(&dst_ncec->ncec_addr, &nce_paddr);
1178 
1179 		(void) arp_output(under_ill, ARP_RESPONSE,
1180 		    nce_hwaddr, (uchar_t *)&nce_paddr, src_haddr,
1181 		    (uchar_t *)&src_paddr, src_lladdr);
1182 	}
1183 bail:
1184 	if (dst_ncec != NULL) {
1185 		ncec_refrele(dst_ncec);
1186 	}
1187 	if (src_ncec != NULL) {
1188 		ncec_refrele(src_ncec);
1189 	}
1190 	if (err == AR_CHANGED) {
1191 		mp->b_cont = NULL;
1192 		arp_notify(src_paddr, mp1, AR_CN_ANNOUNCE, &iras, NULL);
1193 		mp1 = NULL;
1194 	}
1195 	if (need_ill_refrele)
1196 		ill_refrele(ill);
1197 done:
1198 	freemsg(mp);
1199 	freemsg(mp1);
1200 }
1201 
1202 /*
1203  * Basic initialization of the arl_t and the arl_common structure shared with
1204  * the ill_t that is done after SLIFNAME/IF_UNITSEL.
1205  */
1206 static int
1207 arl_ill_init(arl_t *arl, char *ill_name)
1208 {
1209 	ill_t *ill;
1210 	arl_ill_common_t *ai;
1211 
1212 	ill = ill_lookup_on_name(ill_name, B_FALSE, B_FALSE, B_FALSE,
1213 	    arl->arl_ipst);
1214 
1215 	if (ill == NULL)
1216 		return (ENXIO);
1217 
1218 	/*
1219 	 * By the time we set up the arl, we expect the ETHERTYPE_IP
1220 	 * stream to be fully bound and attached. So we copy/verify
1221 	 * relevant information as possible from/against the ill.
1222 	 *
1223 	 * The following should have been set up in arp_ll_set_defaults()
1224 	 * after the first DL_INFO_ACK was received.
1225 	 */
1226 	ASSERT(arl->arl_phys_addr_length == ill->ill_phys_addr_length);
1227 	ASSERT(arl->arl_sap == ETHERTYPE_ARP);
1228 	ASSERT(arl->arl_mactype == ill->ill_mactype);
1229 	ASSERT(arl->arl_sap_length == ill->ill_sap_length);
1230 
1231 	ai =  kmem_zalloc(sizeof (*ai), KM_SLEEP);
1232 	mutex_enter(&ill->ill_lock);
1233 	/* First ensure that the ill is not CONDEMNED.  */
1234 	if (ill->ill_state_flags & ILL_CONDEMNED) {
1235 		mutex_exit(&ill->ill_lock);
1236 		ill_refrele(ill);
1237 		kmem_free(ai, sizeof (*ai));
1238 		return (ENXIO);
1239 	}
1240 	if (ill->ill_common != NULL || arl->arl_common != NULL) {
1241 		mutex_exit(&ill->ill_lock);
1242 		ip0dbg(("%s: PPA already exists", ill->ill_name));
1243 		ill_refrele(ill);
1244 		kmem_free(ai, sizeof (*ai));
1245 		return (EEXIST);
1246 	}
1247 	mutex_init(&ai->ai_lock, NULL, MUTEX_DEFAULT, NULL);
1248 	ai->ai_arl = arl;
1249 	ai->ai_ill = ill;
1250 	ill->ill_common = ai;
1251 	arl->arl_common = ai;
1252 	mutex_exit(&ill->ill_lock);
1253 	(void) strlcpy(arl->arl_name, ill->ill_name, LIFNAMSIZ);
1254 	arl->arl_name_length = ill->ill_name_length;
1255 	ill_refrele(ill);
1256 	arp_ifname_notify(arl);
1257 	return (0);
1258 }
1259 
1260 /* Allocate and do common initializations for DLPI messages. */
1261 static mblk_t *
1262 ip_ar_dlpi_comm(t_uscalar_t prim, size_t size)
1263 {
1264 	mblk_t  *mp;
1265 
1266 	if ((mp = allocb(size, BPRI_HI)) == NULL)
1267 		return (NULL);
1268 
1269 	/*
1270 	 * DLPIv2 says that DL_INFO_REQ and DL_TOKEN_REQ (the latter
1271 	 * of which we don't seem to use) are sent with M_PCPROTO, and
1272 	 * that other DLPI are M_PROTO.
1273 	 */
1274 	DB_TYPE(mp) = (prim == DL_INFO_REQ) ? M_PCPROTO : M_PROTO;
1275 
1276 	mp->b_wptr = mp->b_rptr + size;
1277 	bzero(mp->b_rptr, size);
1278 	DL_PRIM(mp) = prim;
1279 	return (mp);
1280 }
1281 
1282 
1283 int
1284 ip_sioctl_ifunitsel_arp(queue_t *q, int *ppa)
1285 {
1286 	arl_t *arl;
1287 	char *cp, ill_name[LIFNAMSIZ];
1288 
1289 	if (q->q_next == NULL)
1290 		return (EINVAL);
1291 
1292 	do {
1293 		q = q->q_next;
1294 	} while (q->q_next != NULL);
1295 	cp = q->q_qinfo->qi_minfo->mi_idname;
1296 
1297 	arl = (arl_t *)q->q_ptr;
1298 	(void) snprintf(ill_name, sizeof (ill_name), "%s%d", cp, *ppa);
1299 	arl->arl_ppa = *ppa;
1300 	return (arl_ill_init(arl, ill_name));
1301 }
1302 
1303 int
1304 ip_sioctl_slifname_arp(queue_t *q, void *lifreq)
1305 {
1306 	arl_t *arl;
1307 	struct lifreq *lifr = lifreq;
1308 
1309 	/* ioctl not valid when IP opened as a device */
1310 	if (q->q_next == NULL)
1311 		return (EINVAL);
1312 
1313 	arl = (arl_t *)q->q_ptr;
1314 	arl->arl_ppa = lifr->lifr_ppa;
1315 	return (arl_ill_init(arl, lifr->lifr_name));
1316 }
1317 
1318 arl_t *
1319 ill_to_arl(ill_t *ill)
1320 {
1321 	arl_ill_common_t *ai = ill->ill_common;
1322 	arl_t *arl = NULL;
1323 
1324 	if (ai == NULL)
1325 		return (NULL);
1326 	/*
1327 	 * Find the arl_t that corresponds to this ill_t from the shared
1328 	 * ill_common structure. We can safely access the ai here as it
1329 	 * will only be freed in arp_modclose() after we have become
1330 	 * single-threaded.
1331 	 */
1332 	mutex_enter(&ai->ai_lock);
1333 	if ((arl = ai->ai_arl) != NULL) {
1334 		mutex_enter(&arl->arl_lock);
1335 		if (!(arl->arl_state_flags & ARL_CONDEMNED)) {
1336 			arl_refhold_locked(arl);
1337 			mutex_exit(&arl->arl_lock);
1338 		} else {
1339 			mutex_exit(&arl->arl_lock);
1340 			arl = NULL;
1341 		}
1342 	}
1343 	mutex_exit(&ai->ai_lock);
1344 	return (arl);
1345 }
1346 
1347 ill_t *
1348 arl_to_ill(arl_t *arl)
1349 {
1350 	arl_ill_common_t *ai = arl->arl_common;
1351 	ill_t *ill = NULL;
1352 
1353 	if (ai == NULL) {
1354 		/*
1355 		 * happens when the arp stream is just being opened, and
1356 		 * arl_ill_init has not been executed yet.
1357 		 */
1358 		return (NULL);
1359 	}
1360 	/*
1361 	 * Find the ill_t that corresponds to this arl_t from the shared
1362 	 * arl_common structure. We can safely access the ai here as it
1363 	 * will only be freed in arp_modclose() after we have become
1364 	 * single-threaded.
1365 	 */
1366 	mutex_enter(&ai->ai_lock);
1367 	if ((ill = ai->ai_ill) != NULL) {
1368 		mutex_enter(&ill->ill_lock);
1369 		if (!ILL_IS_CONDEMNED(ill)) {
1370 			ill_refhold_locked(ill);
1371 			mutex_exit(&ill->ill_lock);
1372 		} else {
1373 			mutex_exit(&ill->ill_lock);
1374 			ill = NULL;
1375 		}
1376 	}
1377 	mutex_exit(&ai->ai_lock);
1378 	return (ill);
1379 }
1380 
1381 int
1382 arp_ll_up(ill_t *ill)
1383 {
1384 	mblk_t	*attach_mp = NULL;
1385 	mblk_t	*bind_mp = NULL;
1386 	mblk_t	*unbind_mp = NULL;
1387 	arl_t 	*arl;
1388 
1389 	ASSERT(IAM_WRITER_ILL(ill));
1390 	arl = ill_to_arl(ill);
1391 
1392 	DTRACE_PROBE2(ill__downup, char *, "arp_ll_up", ill_t *, ill);
1393 	if (arl == NULL)
1394 		return (ENXIO);
1395 	DTRACE_PROBE2(arl__downup, char *, "arp_ll_up", arl_t *, arl);
1396 	if ((arl->arl_state_flags & ARL_LL_UP) != 0) {
1397 		arl_refrele(arl);
1398 		return (0);
1399 	}
1400 	if (arl->arl_needs_attach) { /* DL_STYLE2 */
1401 		attach_mp =
1402 		    ip_ar_dlpi_comm(DL_ATTACH_REQ, sizeof (dl_attach_req_t));
1403 		if (attach_mp == NULL)
1404 			goto bad;
1405 		((dl_attach_req_t *)attach_mp->b_rptr)->dl_ppa = arl->arl_ppa;
1406 	}
1407 
1408 	/* Allocate and initialize a bind message. */
1409 	bind_mp = ip_ar_dlpi_comm(DL_BIND_REQ, sizeof (dl_bind_req_t));
1410 	if (bind_mp == NULL)
1411 		goto bad;
1412 	((dl_bind_req_t *)bind_mp->b_rptr)->dl_sap = ETHERTYPE_ARP;
1413 	((dl_bind_req_t *)bind_mp->b_rptr)->dl_service_mode = DL_CLDLS;
1414 
1415 	unbind_mp = ip_ar_dlpi_comm(DL_UNBIND_REQ, sizeof (dl_unbind_req_t));
1416 	if (unbind_mp == NULL)
1417 		goto bad;
1418 	if (arl->arl_needs_attach) {
1419 		arp_dlpi_send(arl, attach_mp);
1420 	}
1421 	arl->arl_unbind_mp = unbind_mp;
1422 
1423 	arl->arl_state_flags |= ARL_LL_BIND_PENDING;
1424 	arp_dlpi_send(arl, bind_mp);
1425 	arl_refrele(arl);
1426 	return (EINPROGRESS);
1427 
1428 bad:
1429 	freemsg(attach_mp);
1430 	freemsg(bind_mp);
1431 	freemsg(unbind_mp);
1432 	arl_refrele(arl);
1433 	return (ENOMEM);
1434 }
1435 
1436 /*
1437  * consumes/frees mp
1438  */
1439 static void
1440 arp_notify(in_addr_t src, mblk_t *mp, uint32_t arcn_code,
1441     ip_recv_attr_t *ira, ncec_t *ncec)
1442 {
1443 	char		hbuf[MAC_STR_LEN];
1444 	char		sbuf[INET_ADDRSTRLEN];
1445 	ill_t		*ill = ira->ira_ill;
1446 	ip_stack_t	*ipst = ill->ill_ipst;
1447 	arh_t		*arh = (arh_t *)mp->b_rptr;
1448 
1449 	switch (arcn_code) {
1450 	case AR_CN_BOGON:
1451 		/*
1452 		 * Someone is sending ARP packets with a source protocol
1453 		 * address that we have published and for which we believe our
1454 		 * entry is authoritative and verified to be unique on
1455 		 * the network.
1456 		 *
1457 		 * arp_process_packet() sends AR_CN_FAILED for the case when
1458 		 * a DAD probe is received and the hardware address of a
1459 		 * non-authoritative entry has changed. Thus, AR_CN_BOGON
1460 		 * indicates a real conflict, and we have to do resolution.
1461 		 *
1462 		 * We back away quickly from the address if it's from DHCP or
1463 		 * otherwise temporary and hasn't been used recently (or at
1464 		 * all).  We'd like to include "deprecated" addresses here as
1465 		 * well (as there's no real reason to defend something we're
1466 		 * discarding), but IPMP "reuses" this flag to mean something
1467 		 * other than the standard meaning.
1468 		 */
1469 		if (ip_nce_conflict(mp, ira, ncec)) {
1470 			(void) mac_colon_addr((uint8_t *)(arh + 1),
1471 			    arh->arh_hlen, hbuf, sizeof (hbuf));
1472 			(void) ip_dot_addr(src, sbuf);
1473 			cmn_err(CE_WARN,
1474 			    "proxy ARP problem?  Node '%s' is using %s on %s",
1475 			    hbuf, sbuf, ill->ill_name);
1476 			if (!arp_no_defense)
1477 				(void) arp_announce(ncec);
1478 			/*
1479 			 * ncec_last_time_defended has been adjusted in
1480 			 * ip_nce_conflict.
1481 			 */
1482 		} else {
1483 			ncec_delete(ncec);
1484 		}
1485 		freemsg(mp);
1486 		break;
1487 	case AR_CN_ANNOUNCE: {
1488 		nce_hw_map_t hwm;
1489 		/*
1490 		 * ARP gives us a copy of any packet where it thinks
1491 		 * the address has changed, so that we can update our
1492 		 * caches.  We're responsible for caching known answers
1493 		 * in the current design.  We check whether the
1494 		 * hardware address really has changed in all of our
1495 		 * entries that have cached this mapping, and if so, we
1496 		 * blow them away.  This way we will immediately pick
1497 		 * up the rare case of a host changing hardware
1498 		 * address.
1499 		 */
1500 		if (src == 0) {
1501 			freemsg(mp);
1502 			break;
1503 		}
1504 		hwm.hwm_addr = src;
1505 		hwm.hwm_hwlen = arh->arh_hlen;
1506 		hwm.hwm_hwaddr = (uchar_t *)(arh + 1);
1507 		hwm.hwm_flags = 0;
1508 		ncec_walk_common(ipst->ips_ndp4, NULL,
1509 		    (pfi_t)nce_update_hw_changed, &hwm, B_TRUE);
1510 		freemsg(mp);
1511 		break;
1512 	}
1513 	case AR_CN_FAILED:
1514 		if (arp_no_defense) {
1515 			(void) mac_colon_addr((uint8_t *)(arh + 1),
1516 			    arh->arh_hlen, hbuf, sizeof (hbuf));
1517 			(void) ip_dot_addr(src, sbuf);
1518 
1519 			cmn_err(CE_WARN,
1520 			    "node %s is using our IP address %s on %s",
1521 			    hbuf, sbuf, ill->ill_name);
1522 			freemsg(mp);
1523 			break;
1524 		}
1525 		/*
1526 		 * mp will be freed by arp_excl.
1527 		 */
1528 		ill_refhold(ill);
1529 		qwriter_ip(ill, ill->ill_rq, mp, arp_excl, NEW_OP, B_FALSE);
1530 		return;
1531 	default:
1532 		ASSERT(0);
1533 		freemsg(mp);
1534 		break;
1535 	}
1536 }
1537 
1538 /*
1539  * arp_output is called to transmit an ARP Request or Response. The mapping
1540  * to RFC 826 variables is:
1541  *   haddr1 == ar$sha
1542  *   paddr1 == ar$spa
1543  *   haddr2 == ar$tha
1544  *   paddr2 == ar$tpa
1545  * The ARP frame is sent to the ether_dst in dst_lladdr.
1546  */
1547 static int
1548 arp_output(ill_t *ill, uint32_t operation,
1549     const uchar_t *haddr1, const uchar_t *paddr1, const uchar_t *haddr2,
1550     const uchar_t *paddr2, uchar_t *dst_lladdr)
1551 {
1552 	arh_t	*arh;
1553 	uint8_t	*cp;
1554 	uint_t	hlen;
1555 	uint32_t plen = IPV4_ADDR_LEN; /* ar$pln from RFC 826 */
1556 	uint32_t proto = IP_ARP_PROTO_TYPE;
1557 	mblk_t *mp;
1558 	arl_t *arl;
1559 
1560 	ASSERT(dst_lladdr != NULL);
1561 	hlen = ill->ill_phys_addr_length; /* ar$hln from RFC 826 */
1562 	mp = ill_dlur_gen(dst_lladdr, hlen, ETHERTYPE_ARP, ill->ill_sap_length);
1563 
1564 	if (mp == NULL)
1565 		return (ENOMEM);
1566 
1567 	/* IFF_NOARP flag is set or link down: do not send arp messages */
1568 	if ((ill->ill_flags & ILLF_NOARP) || !ill->ill_dl_up) {
1569 		freemsg(mp);
1570 		return (ENXIO);
1571 	}
1572 
1573 	mp->b_cont = allocb(AR_LL_HDR_SLACK + ARH_FIXED_LEN + (hlen * 4) +
1574 	    plen + plen, BPRI_MED);
1575 	if (mp->b_cont == NULL) {
1576 		freeb(mp);
1577 		return (ENOMEM);
1578 	}
1579 
1580 	/* Fill in the ARP header. */
1581 	cp = mp->b_cont->b_rptr + (AR_LL_HDR_SLACK + hlen + hlen);
1582 	mp->b_cont->b_rptr = cp;
1583 	arh = (arh_t *)cp;
1584 	U16_TO_BE16(arp_hw_type(ill->ill_mactype), arh->arh_hardware);
1585 	U16_TO_BE16(proto, arh->arh_proto);
1586 	arh->arh_hlen = (uint8_t)hlen;
1587 	arh->arh_plen = (uint8_t)plen;
1588 	U16_TO_BE16(operation, arh->arh_operation);
1589 	cp += ARH_FIXED_LEN;
1590 	bcopy(haddr1, cp, hlen);
1591 	cp += hlen;
1592 	if (paddr1 == NULL)
1593 		bzero(cp, plen);
1594 	else
1595 		bcopy(paddr1, cp, plen);
1596 	cp += plen;
1597 	if (haddr2 == NULL)
1598 		bzero(cp, hlen);
1599 	else
1600 		bcopy(haddr2, cp, hlen);
1601 	cp += hlen;
1602 	bcopy(paddr2, cp, plen);
1603 	cp += plen;
1604 	mp->b_cont->b_wptr = cp;
1605 
1606 	DTRACE_PROBE3(arp__physical__out__start,
1607 	    ill_t *, ill, arh_t *, arh, mblk_t *, mp);
1608 	ARP_HOOK_OUT(ill->ill_ipst->ips_arp_physical_out_event,
1609 	    ill->ill_ipst->ips_arp_physical_out,
1610 	    ill->ill_phyint->phyint_ifindex, arh, mp, mp->b_cont,
1611 	    ill->ill_ipst);
1612 	DTRACE_PROBE1(arp__physical__out__end, mblk_t *, mp);
1613 	if (mp == NULL)
1614 		return (0);
1615 
1616 	/* Ship it out. */
1617 	arl = ill_to_arl(ill);
1618 	if (arl == NULL) {
1619 		freemsg(mp);
1620 		return (0);
1621 	}
1622 	if (canputnext(arl->arl_wq))
1623 		putnext(arl->arl_wq, mp);
1624 	else
1625 		freemsg(mp);
1626 	arl_refrele(arl);
1627 	return (0);
1628 }
1629 
1630 /*
1631  * Process resolve requests.
1632  * If we are not yet reachable then we check and decrease ncec_rcnt; otherwise
1633  * we leave it alone (the caller will check and manage ncec_pcnt in those
1634  * cases.)
1635  */
1636 int
1637 arp_request(ncec_t *ncec, in_addr_t sender, ill_t *ill)
1638 {
1639 	int err;
1640 	const uchar_t *target_hwaddr;
1641 	struct in_addr nce_paddr;
1642 	uchar_t *dst_lladdr;
1643 	boolean_t use_rcnt = !NCE_ISREACHABLE(ncec);
1644 
1645 	ASSERT(MUTEX_HELD(&ncec->ncec_lock));
1646 	ASSERT(!IS_IPMP(ill));
1647 
1648 	if (use_rcnt && ncec->ncec_rcnt == 0) {
1649 		/* not allowed any more retransmits. */
1650 		return (0);
1651 	}
1652 
1653 	if ((ill->ill_flags & ILLF_NOARP) != 0)
1654 		return (0);
1655 
1656 	IN6_V4MAPPED_TO_INADDR(&ncec->ncec_addr, &nce_paddr);
1657 
1658 	target_hwaddr =
1659 	    ill->ill_bcast_mp->b_rptr + NCE_LL_ADDR_OFFSET(ill);
1660 
1661 	if (NCE_ISREACHABLE(ncec)) {
1662 		dst_lladdr =  ncec->ncec_lladdr;
1663 	} else {
1664 		dst_lladdr =  ill->ill_bcast_mp->b_rptr +
1665 		    NCE_LL_ADDR_OFFSET(ill);
1666 	}
1667 
1668 	mutex_exit(&ncec->ncec_lock);
1669 	err = arp_output(ill, ARP_REQUEST,
1670 	    ill->ill_phys_addr, (uchar_t *)&sender, target_hwaddr,
1671 	    (uchar_t *)&nce_paddr, dst_lladdr);
1672 	mutex_enter(&ncec->ncec_lock);
1673 
1674 	if (err != 0) {
1675 		/*
1676 		 * Some transient error such as ENOMEM or a down link was
1677 		 * encountered. If the link has been taken down permanently,
1678 		 * the ncec will eventually be cleaned up (ipif_down_tail()
1679 		 * will call ipif_nce_down() and flush the ncec), to terminate
1680 		 * recurring attempts to send ARP requests. In all other cases,
1681 		 * allow the caller another chance at success next time.
1682 		 */
1683 		return (ncec->ncec_ill->ill_reachable_retrans_time);
1684 	}
1685 
1686 	if (use_rcnt)
1687 		ncec->ncec_rcnt--;
1688 
1689 	return (ncec->ncec_ill->ill_reachable_retrans_time);
1690 }
1691 
1692 /* return B_TRUE if dropped */
1693 boolean_t
1694 arp_announce(ncec_t *ncec)
1695 {
1696 	ill_t *ill;
1697 	int err;
1698 	uchar_t *sphys_addr, *bcast_addr;
1699 	struct in_addr ncec_addr;
1700 	boolean_t need_refrele = B_FALSE;
1701 
1702 	ASSERT((ncec->ncec_flags & NCE_F_BCAST) == 0);
1703 	ASSERT((ncec->ncec_flags & NCE_F_MCAST) == 0);
1704 
1705 	if (IS_IPMP(ncec->ncec_ill)) {
1706 		/* sent on the cast_ill */
1707 		ill = ipmp_ill_hold_xmit_ill(ncec->ncec_ill, B_FALSE);
1708 		if (ill == NULL)
1709 			return (B_TRUE);
1710 		need_refrele = B_TRUE;
1711 	} else {
1712 		ill = ncec->ncec_ill;
1713 	}
1714 
1715 	/*
1716 	 * broadcast an announce to ill_bcast address.
1717 	 */
1718 	IN6_V4MAPPED_TO_INADDR(&ncec->ncec_addr, &ncec_addr);
1719 
1720 	sphys_addr = ncec->ncec_lladdr;
1721 	bcast_addr = ill->ill_bcast_mp->b_rptr + NCE_LL_ADDR_OFFSET(ill);
1722 
1723 	err = arp_output(ill, ARP_REQUEST,
1724 	    sphys_addr, (uchar_t *)&ncec_addr, bcast_addr,
1725 	    (uchar_t *)&ncec_addr, bcast_addr);
1726 
1727 	if (need_refrele)
1728 		ill_refrele(ill);
1729 	return (err != 0);
1730 }
1731 
1732 /* return B_TRUE if dropped */
1733 boolean_t
1734 arp_probe(ncec_t *ncec)
1735 {
1736 	ill_t *ill;
1737 	int err;
1738 	struct in_addr ncec_addr;
1739 	uchar_t *sphys_addr, *dst_lladdr;
1740 
1741 	if (IS_IPMP(ncec->ncec_ill)) {
1742 		ill = ipmp_ill_hold_xmit_ill(ncec->ncec_ill, B_FALSE);
1743 		if (ill == NULL)
1744 			return (B_TRUE);
1745 	} else {
1746 		ill = ncec->ncec_ill;
1747 	}
1748 
1749 	IN6_V4MAPPED_TO_INADDR(&ncec->ncec_addr, &ncec_addr);
1750 
1751 	sphys_addr = ncec->ncec_lladdr;
1752 	dst_lladdr = ill->ill_bcast_mp->b_rptr + NCE_LL_ADDR_OFFSET(ill);
1753 	err = arp_output(ill, ARP_REQUEST,
1754 	    sphys_addr, NULL, NULL, (uchar_t *)&ncec_addr, dst_lladdr);
1755 
1756 	if (IS_IPMP(ncec->ncec_ill))
1757 		ill_refrele(ill);
1758 	return (err != 0);
1759 }
1760 
1761 static mblk_t *
1762 arl_unbind(arl_t *arl)
1763 {
1764 	mblk_t *mp;
1765 
1766 	if ((mp = arl->arl_unbind_mp) != NULL) {
1767 		arl->arl_unbind_mp = NULL;
1768 		arl->arl_state_flags |= ARL_DL_UNBIND_IN_PROGRESS;
1769 	}
1770 	return (mp);
1771 }
1772 
1773 int
1774 arp_ll_down(ill_t *ill)
1775 {
1776 	arl_t 	*arl;
1777 	mblk_t *unbind_mp;
1778 	int err = 0;
1779 	boolean_t replumb = (ill->ill_replumbing == 1);
1780 
1781 	DTRACE_PROBE2(ill__downup, char *, "arp_ll_down", ill_t *, ill);
1782 	if ((arl = ill_to_arl(ill)) == NULL)
1783 		return (ENXIO);
1784 	DTRACE_PROBE2(arl__downup, char *, "arp_ll_down", arl_t *, arl);
1785 	mutex_enter(&arl->arl_lock);
1786 	unbind_mp = arl_unbind(arl);
1787 	if (unbind_mp != NULL) {
1788 		ASSERT(arl->arl_state_flags & ARL_DL_UNBIND_IN_PROGRESS);
1789 		DTRACE_PROBE2(arp__unbinding, mblk_t *, unbind_mp,
1790 		    arl_t *, arl);
1791 		err = EINPROGRESS;
1792 		if (replumb)
1793 			arl->arl_state_flags |= ARL_LL_REPLUMBING;
1794 	}
1795 	mutex_exit(&arl->arl_lock);
1796 	if (unbind_mp != NULL)
1797 		arp_dlpi_send(arl, unbind_mp);
1798 	arl_refrele(arl);
1799 	return (err);
1800 }
1801 
1802 /* ARGSUSED */
1803 int
1804 arp_close(queue_t *q, int flags)
1805 {
1806 	if (WR(q)->q_next != NULL) {
1807 		/* This is a module close */
1808 		return (arp_modclose(q->q_ptr));
1809 	}
1810 	qprocsoff(q);
1811 	q->q_ptr = WR(q)->q_ptr = NULL;
1812 	return (0);
1813 }
1814 
1815 static int
1816 arp_modclose(arl_t *arl)
1817 {
1818 	arl_ill_common_t *ai = arl->arl_common;
1819 	ill_t		*ill;
1820 	queue_t		*q = arl->arl_rq;
1821 	mblk_t		*mp, *nextmp;
1822 	ipsq_t		*ipsq = NULL;
1823 
1824 	ill = arl_to_ill(arl);
1825 	if (ill != NULL) {
1826 		if (!ill_waiter_inc(ill)) {
1827 			ill_refrele(ill);
1828 		} else {
1829 			ill_refrele(ill);
1830 			if (ipsq_enter(ill, B_FALSE, NEW_OP))
1831 				ipsq = ill->ill_phyint->phyint_ipsq;
1832 			ill_waiter_dcr(ill);
1833 		}
1834 		if (ipsq == NULL) {
1835 			/*
1836 			 * could not enter the ipsq because ill is already
1837 			 * marked CONDEMNED.
1838 			 */
1839 			ill = NULL;
1840 		}
1841 	}
1842 	if (ai != NULL && ipsq == NULL) {
1843 		/*
1844 		 * Either we did not get an ill because it was marked CONDEMNED
1845 		 * or we could not enter the ipsq because it was unplumbing.
1846 		 * In both cases, wait for the ill to complete ip_modclose().
1847 		 *
1848 		 * If the arp_modclose happened even before SLIFNAME, the ai
1849 		 * itself would be NULL, in which case we can complete the close
1850 		 * without waiting.
1851 		 */
1852 		mutex_enter(&ai->ai_lock);
1853 		while (ai->ai_ill != NULL)
1854 			cv_wait(&ai->ai_ill_unplumb_done, &ai->ai_lock);
1855 		mutex_exit(&ai->ai_lock);
1856 	}
1857 	ASSERT(ill == NULL || IAM_WRITER_ILL(ill));
1858 
1859 	mutex_enter(&arl->arl_lock);
1860 	/*
1861 	 * If the ill had completed unplumbing before arp_modclose(), there
1862 	 * would be no ill (and therefore, no ipsq) to serialize arp_modclose()
1863 	 * so that we need to explicitly check for ARL_CONDEMNED and back off
1864 	 * if it is set.
1865 	 */
1866 	if ((arl->arl_state_flags & ARL_CONDEMNED) != 0) {
1867 		mutex_exit(&arl->arl_lock);
1868 		ASSERT(ipsq == NULL);
1869 		return (0);
1870 	}
1871 	arl->arl_state_flags |= ARL_CONDEMNED;
1872 
1873 	/*
1874 	 * send out all pending dlpi messages, don't wait for the ack (which
1875 	 * will be ignored in arp_rput when CONDEMNED is set)
1876 	 *
1877 	 * We have to check for pending DL_UNBIND_REQ because, in the case
1878 	 * that ip_modclose() executed before arp_modclose(), the call to
1879 	 * ill_delete_tail->ipif_arp_down() would have triggered a
1880 	 * DL_UNBIND_REQ. When arp_modclose() executes ipsq_enter() will fail
1881 	 * (since ip_modclose() is in the ipsq) but the DL_UNBIND_ACK may not
1882 	 * have been processed yet. In this scenario, we cannot reset
1883 	 * arl_dlpi_pending, because the setting/clearing of arl_state_flags
1884 	 * related to unbind, and the associated cv_waits must be allowed to
1885 	 * continue.
1886 	 */
1887 	if (arl->arl_dlpi_pending != DL_UNBIND_REQ)
1888 		arl->arl_dlpi_pending = DL_PRIM_INVAL;
1889 	mp = arl->arl_dlpi_deferred;
1890 	arl->arl_dlpi_deferred = NULL;
1891 	mutex_exit(&arl->arl_lock);
1892 
1893 	for (; mp != NULL; mp = nextmp) {
1894 		nextmp = mp->b_next;
1895 		mp->b_next = NULL;
1896 		putnext(arl->arl_wq, mp);
1897 	}
1898 
1899 	/* Wait for data paths to quiesce */
1900 	mutex_enter(&arl->arl_lock);
1901 	while (arl->arl_refcnt != 0)
1902 		cv_wait(&arl->arl_cv, &arl->arl_lock);
1903 
1904 	/*
1905 	 * unbind, so that nothing else can come up from driver.
1906 	 */
1907 	mp = arl_unbind(arl);
1908 	mutex_exit(&arl->arl_lock);
1909 	if (mp != NULL)
1910 		arp_dlpi_send(arl, mp);
1911 	mutex_enter(&arl->arl_lock);
1912 
1913 	/* wait for unbind ack  */
1914 	while (arl->arl_state_flags & ARL_DL_UNBIND_IN_PROGRESS)
1915 		cv_wait(&arl->arl_cv, &arl->arl_lock);
1916 	mutex_exit(&arl->arl_lock);
1917 
1918 	qprocsoff(q);
1919 
1920 	if (ill != NULL) {
1921 		mutex_enter(&ill->ill_lock);
1922 		ill->ill_arl_dlpi_pending = 0;
1923 		mutex_exit(&ill->ill_lock);
1924 	}
1925 
1926 	if (ai != NULL) {
1927 		mutex_enter(&ai->ai_lock);
1928 		ai->ai_arl = NULL;
1929 		if (ai->ai_ill == NULL) {
1930 			mutex_destroy(&ai->ai_lock);
1931 			kmem_free(ai, sizeof (*ai));
1932 		} else {
1933 			mutex_exit(&ai->ai_lock);
1934 		}
1935 	}
1936 
1937 	/* free up the rest */
1938 	arp_mod_close_tail(arl);
1939 
1940 	q->q_ptr = WR(q)->q_ptr = NULL;
1941 
1942 	if (ipsq != NULL)
1943 		ipsq_exit(ipsq);
1944 
1945 	return (0);
1946 }
1947 
1948 static void
1949 arp_mod_close_tail(arl_t *arl)
1950 {
1951 	ip_stack_t	*ipst = arl->arl_ipst;
1952 	mblk_t		**mpp;
1953 
1954 	mutex_enter(&ipst->ips_ip_mi_lock);
1955 	mi_close_unlink(&ipst->ips_arp_g_head, (IDP)arl);
1956 	mutex_exit(&ipst->ips_ip_mi_lock);
1957 
1958 	/*
1959 	 * credp could be null if the open didn't succeed and ip_modopen
1960 	 * itself calls ip_close.
1961 	 */
1962 	if (arl->arl_credp != NULL)
1963 		crfree(arl->arl_credp);
1964 
1965 	/* Free all retained control messages. */
1966 	mpp = &arl->arl_first_mp_to_free;
1967 	do {
1968 		while (mpp[0]) {
1969 			mblk_t  *mp;
1970 			mblk_t  *mp1;
1971 
1972 			mp = mpp[0];
1973 			mpp[0] = mp->b_next;
1974 			for (mp1 = mp; mp1 != NULL; mp1 = mp1->b_cont) {
1975 				mp1->b_next = NULL;
1976 				mp1->b_prev = NULL;
1977 			}
1978 			freemsg(mp);
1979 		}
1980 	} while (mpp++ != &arl->arl_last_mp_to_free);
1981 
1982 	netstack_rele(ipst->ips_netstack);
1983 	mi_free(arl->arl_name);
1984 	mi_close_free((IDP)arl);
1985 }
1986 
1987 /*
1988  * DAD failed. Tear down ipifs with the specified srce address. Note that
1989  * tearing down the ipif also meas deleting the ncec through ipif_down,
1990  * so it is not possible to use nce_timer for recovery. Instead we start
1991  * a timer on the ipif. Caller has to free the mp.
1992  */
1993 void
1994 arp_failure(mblk_t *mp, ip_recv_attr_t *ira)
1995 {
1996 	ill_t *ill = ira->ira_ill;
1997 
1998 	if ((mp = copymsg(mp)) != NULL) {
1999 		ill_refhold(ill);
2000 		qwriter_ip(ill, ill->ill_rq, mp, arp_excl, NEW_OP, B_FALSE);
2001 	}
2002 }
2003 
2004 /*
2005  * This is for exclusive changes due to ARP.  Tear down an interface due
2006  * to AR_CN_FAILED and AR_CN_BOGON.
2007  */
2008 /* ARGSUSED */
2009 static void
2010 arp_excl(ipsq_t *ipsq, queue_t *rq, mblk_t *mp, void *dummy_arg)
2011 {
2012 	ill_t	*ill = rq->q_ptr;
2013 	arh_t *arh;
2014 	ipaddr_t src;
2015 	ipif_t	*ipif;
2016 	ip_stack_t *ipst = ill->ill_ipst;
2017 	uchar_t	*haddr;
2018 	uint_t	haddrlen;
2019 
2020 	/* first try src = ar$spa */
2021 	arh = (arh_t *)mp->b_rptr;
2022 	bcopy((char *)&arh[1] + arh->arh_hlen, &src, IP_ADDR_LEN);
2023 
2024 	haddrlen = arh->arh_hlen;
2025 	haddr = (uint8_t *)(arh + 1);
2026 
2027 	if (haddrlen == ill->ill_phys_addr_length) {
2028 		/*
2029 		 * Ignore conflicts generated by misbehaving switches that
2030 		 * just reflect our own messages back to us.  For IPMP, we may
2031 		 * see reflections across any ill in the illgrp.
2032 		 */
2033 		/* For an under ill_grp can change under lock */
2034 		rw_enter(&ipst->ips_ill_g_lock, RW_READER);
2035 		if (bcmp(haddr, ill->ill_phys_addr, haddrlen) == 0 ||
2036 		    IS_UNDER_IPMP(ill) && ill->ill_grp != NULL &&
2037 		    ipmp_illgrp_find_ill(ill->ill_grp, haddr,
2038 		    haddrlen) != NULL) {
2039 			rw_exit(&ipst->ips_ill_g_lock);
2040 			goto ignore_conflict;
2041 		}
2042 		rw_exit(&ipst->ips_ill_g_lock);
2043 	}
2044 
2045 	/*
2046 	 * Look up the appropriate ipif.
2047 	 */
2048 	ipif = ipif_lookup_addr(src, ill, ALL_ZONES, ipst);
2049 	if (ipif == NULL)
2050 		goto ignore_conflict;
2051 
2052 	/* Reload the ill to match the ipif */
2053 	ill = ipif->ipif_ill;
2054 
2055 	/* If it's already duplicate or ineligible, then don't do anything. */
2056 	if (ipif->ipif_flags & (IPIF_POINTOPOINT|IPIF_DUPLICATE)) {
2057 		ipif_refrele(ipif);
2058 		goto ignore_conflict;
2059 	}
2060 
2061 	/*
2062 	 * If we failed on a recovery probe, then restart the timer to
2063 	 * try again later.
2064 	 */
2065 	if (!ipif->ipif_was_dup) {
2066 		char hbuf[MAC_STR_LEN];
2067 		char sbuf[INET_ADDRSTRLEN];
2068 		char ibuf[LIFNAMSIZ];
2069 
2070 		(void) mac_colon_addr(haddr, haddrlen, hbuf, sizeof (hbuf));
2071 		(void) ip_dot_addr(src, sbuf);
2072 		ipif_get_name(ipif, ibuf, sizeof (ibuf));
2073 
2074 		cmn_err(CE_WARN, "%s has duplicate address %s (in use by %s);"
2075 		    " disabled", ibuf, sbuf, hbuf);
2076 	}
2077 	mutex_enter(&ill->ill_lock);
2078 	ASSERT(!(ipif->ipif_flags & IPIF_DUPLICATE));
2079 	ipif->ipif_flags |= IPIF_DUPLICATE;
2080 	ill->ill_ipif_dup_count++;
2081 	mutex_exit(&ill->ill_lock);
2082 	(void) ipif_down(ipif, NULL, NULL);
2083 	(void) ipif_down_tail(ipif);
2084 	mutex_enter(&ill->ill_lock);
2085 	if (!(ipif->ipif_flags & (IPIF_DHCPRUNNING|IPIF_TEMPORARY)) &&
2086 	    ill->ill_net_type == IRE_IF_RESOLVER &&
2087 	    !(ipif->ipif_state_flags & IPIF_CONDEMNED) &&
2088 	    ipst->ips_ip_dup_recovery > 0) {
2089 		ASSERT(ipif->ipif_recovery_id == 0);
2090 		ipif->ipif_recovery_id = timeout(ipif_dup_recovery,
2091 		    ipif, MSEC_TO_TICK(ipst->ips_ip_dup_recovery));
2092 	}
2093 	mutex_exit(&ill->ill_lock);
2094 	ipif_refrele(ipif);
2095 
2096 ignore_conflict:
2097 	freemsg(mp);
2098 }
2099 
2100 /*
2101  * This is a place for a dtrace hook.
2102  * Note that mp can be either the DL_UNITDATA_IND with a b_cont payload,
2103  * or just the ARP packet payload as an M_DATA.
2104  */
2105 /* ARGSUSED */
2106 static void
2107 arp_drop_packet(const char *str, mblk_t *mp, ill_t *ill)
2108 {
2109 	freemsg(mp);
2110 }
2111 
2112 static boolean_t
2113 arp_over_driver(queue_t *q)
2114 {
2115 	queue_t *qnext = STREAM(q)->sd_wrq->q_next;
2116 
2117 	/*
2118 	 * check if first module below stream head is IP or UDP.
2119 	 */
2120 	ASSERT(qnext != NULL);
2121 	if (strcmp(Q2NAME(qnext), "ip") != 0 &&
2122 	    strcmp(Q2NAME(qnext), "udp") != 0) {
2123 		/*
2124 		 * module below is not ip or udp, so arp has been pushed
2125 		 * on the driver.
2126 		 */
2127 		return (B_TRUE);
2128 	}
2129 	return (B_FALSE);
2130 }
2131 
2132 static int
2133 arp_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
2134 {
2135 	int err;
2136 
2137 	ASSERT(sflag & MODOPEN);
2138 	if (!arp_over_driver(q)) {
2139 		q->q_qinfo = dummymodinfo.st_rdinit;
2140 		WR(q)->q_qinfo = dummymodinfo.st_wrinit;
2141 		return ((*dummymodinfo.st_rdinit->qi_qopen)(q, devp, flag,
2142 		    sflag, credp));
2143 	}
2144 	err = arp_modopen(q, devp, flag, sflag, credp);
2145 	return (err);
2146 }
2147 
2148 /*
2149  * In most cases we must be a writer on the IP stream before coming to
2150  * arp_dlpi_send(), to serialize DLPI sends to the driver. The exceptions
2151  * when we are not a writer are very early duing initialization (in
2152  * arl_init, before the arl has done a SLIFNAME, so that we don't yet know
2153  * the associated ill) or during arp_mod_close, when we could not enter the
2154  * ipsq because the ill has already unplumbed.
2155  */
2156 static void
2157 arp_dlpi_send(arl_t *arl, mblk_t *mp)
2158 {
2159 	mblk_t **mpp;
2160 	t_uscalar_t prim;
2161 	arl_ill_common_t *ai;
2162 
2163 	ASSERT(DB_TYPE(mp) == M_PROTO || DB_TYPE(mp) == M_PCPROTO);
2164 
2165 #ifdef DEBUG
2166 	ai = arl->arl_common;
2167 	if (ai != NULL) {
2168 		mutex_enter(&ai->ai_lock);
2169 		if (ai->ai_ill != NULL)
2170 			ASSERT(IAM_WRITER_ILL(ai->ai_ill));
2171 		mutex_exit(&ai->ai_lock);
2172 	}
2173 #endif /* DEBUG */
2174 
2175 	mutex_enter(&arl->arl_lock);
2176 	if (arl->arl_dlpi_pending != DL_PRIM_INVAL) {
2177 		/* Must queue message. Tail insertion */
2178 		mpp = &arl->arl_dlpi_deferred;
2179 		while (*mpp != NULL)
2180 			mpp = &((*mpp)->b_next);
2181 
2182 		*mpp = mp;
2183 		mutex_exit(&arl->arl_lock);
2184 		return;
2185 	}
2186 	mutex_exit(&arl->arl_lock);
2187 	if ((prim = ((union DL_primitives *)mp->b_rptr)->dl_primitive)
2188 	    == DL_BIND_REQ) {
2189 		ASSERT((arl->arl_state_flags & ARL_DL_UNBIND_IN_PROGRESS) == 0);
2190 	}
2191 	/*
2192 	 * No need to take the arl_lock to examine ARL_CONDEMNED at this point
2193 	 * because the only thread that can see ARL_CONDEMNED here is the
2194 	 * closing arp_modclose() thread which sets the flag after becoming a
2195 	 * writer on the ipsq. Threads from IP must have finished and
2196 	 * cannot be active now.
2197 	 */
2198 	if (!(arl->arl_state_flags & ARL_CONDEMNED) ||
2199 	    (prim == DL_UNBIND_REQ)) {
2200 		if (prim != DL_NOTIFY_CONF) {
2201 			ill_t *ill = arl_to_ill(arl);
2202 
2203 			arl->arl_dlpi_pending = prim;
2204 			if (ill != NULL) {
2205 				mutex_enter(&ill->ill_lock);
2206 				ill->ill_arl_dlpi_pending = 1;
2207 				mutex_exit(&ill->ill_lock);
2208 				ill_refrele(ill);
2209 			}
2210 		}
2211 	}
2212 	DTRACE_PROBE4(arl__dlpi, char *, "arp_dlpi_send",
2213 	    char *, dl_primstr(prim), char *, "-",  arl_t *, arl);
2214 	putnext(arl->arl_wq, mp);
2215 }
2216 
2217 static void
2218 arl_defaults_common(arl_t *arl, mblk_t *mp)
2219 {
2220 	dl_info_ack_t	*dlia = (dl_info_ack_t *)mp->b_rptr;
2221 	/*
2222 	 * Till the ill is fully up  the ill is not globally visible.
2223 	 * So no need for a lock.
2224 	 */
2225 	arl->arl_mactype = dlia->dl_mac_type;
2226 	arl->arl_sap_length = dlia->dl_sap_length;
2227 
2228 	if (!arl->arl_dlpi_style_set) {
2229 		if (dlia->dl_provider_style == DL_STYLE2)
2230 			arl->arl_needs_attach = 1;
2231 		mutex_enter(&arl->arl_lock);
2232 		ASSERT(arl->arl_dlpi_style_set == 0);
2233 		arl->arl_dlpi_style_set = 1;
2234 		arl->arl_state_flags &= ~ARL_LL_SUBNET_PENDING;
2235 		cv_broadcast(&arl->arl_cv);
2236 		mutex_exit(&arl->arl_lock);
2237 	}
2238 }
2239 
2240 int
2241 arl_init(queue_t *q, arl_t *arl)
2242 {
2243 	mblk_t *info_mp;
2244 	dl_info_req_t   *dlir;
2245 
2246 	/* subset of ill_init */
2247 	mutex_init(&arl->arl_lock, NULL, MUTEX_DEFAULT, 0);
2248 
2249 	arl->arl_rq = q;
2250 	arl->arl_wq = WR(q);
2251 
2252 	info_mp = allocb(MAX(sizeof (dl_info_req_t), sizeof (dl_info_ack_t)),
2253 	    BPRI_HI);
2254 	if (info_mp == NULL)
2255 		return (ENOMEM);
2256 	/*
2257 	 * allocate sufficient space to contain device name.
2258 	 */
2259 	arl->arl_name = (char *)(mi_zalloc(2 * LIFNAMSIZ));
2260 	arl->arl_ppa = UINT_MAX;
2261 	arl->arl_state_flags |= (ARL_LL_SUBNET_PENDING | ARL_LL_UNBOUND);
2262 
2263 	/* Send down the Info Request to the driver. */
2264 	info_mp->b_datap->db_type = M_PCPROTO;
2265 	dlir = (dl_info_req_t *)info_mp->b_rptr;
2266 	info_mp->b_wptr = (uchar_t *)&dlir[1];
2267 	dlir->dl_primitive = DL_INFO_REQ;
2268 	arl->arl_dlpi_pending = DL_PRIM_INVAL;
2269 	qprocson(q);
2270 
2271 	arp_dlpi_send(arl, info_mp);
2272 	return (0);
2273 }
2274 
2275 int
2276 arl_wait_for_info_ack(arl_t *arl)
2277 {
2278 	int err;
2279 
2280 	mutex_enter(&arl->arl_lock);
2281 	while (arl->arl_state_flags & ARL_LL_SUBNET_PENDING) {
2282 		/*
2283 		 * Return value of 0 indicates a pending signal.
2284 		 */
2285 		err = cv_wait_sig(&arl->arl_cv, &arl->arl_lock);
2286 		if (err == 0) {
2287 			mutex_exit(&arl->arl_lock);
2288 			return (EINTR);
2289 		}
2290 	}
2291 	mutex_exit(&arl->arl_lock);
2292 	/*
2293 	 * ip_rput_other could have set an error  in ill_error on
2294 	 * receipt of M_ERROR.
2295 	 */
2296 	return (arl->arl_error);
2297 }
2298 
2299 void
2300 arl_set_muxid(ill_t *ill, int muxid)
2301 {
2302 	arl_t *arl;
2303 
2304 	arl = ill_to_arl(ill);
2305 	if (arl != NULL) {
2306 		arl->arl_muxid = muxid;
2307 		arl_refrele(arl);
2308 	}
2309 }
2310 
2311 int
2312 arl_get_muxid(ill_t *ill)
2313 {
2314 	arl_t *arl;
2315 	int muxid = 0;
2316 
2317 	arl = ill_to_arl(ill);
2318 	if (arl != NULL) {
2319 		muxid = arl->arl_muxid;
2320 		arl_refrele(arl);
2321 	}
2322 	return (muxid);
2323 }
2324 
2325 static int
2326 arp_modopen(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
2327 {
2328 	int	err;
2329 	zoneid_t zoneid;
2330 	netstack_t *ns;
2331 	ip_stack_t *ipst;
2332 	arl_t	*arl = NULL;
2333 
2334 	/*
2335 	 * Prevent unprivileged processes from pushing IP so that
2336 	 * they can't send raw IP.
2337 	 */
2338 	if (secpolicy_net_rawaccess(credp) != 0)
2339 		return (EPERM);
2340 
2341 	ns = netstack_find_by_cred(credp);
2342 	ASSERT(ns != NULL);
2343 	ipst = ns->netstack_ip;
2344 	ASSERT(ipst != NULL);
2345 
2346 	/*
2347 	 * For exclusive stacks we set the zoneid to zero
2348 	 * to make IP operate as if in the global zone.
2349 	 */
2350 	if (ipst->ips_netstack->netstack_stackid != GLOBAL_NETSTACKID)
2351 		zoneid = GLOBAL_ZONEID;
2352 	else
2353 		zoneid = crgetzoneid(credp);
2354 
2355 	arl = (arl_t *)mi_open_alloc_sleep(sizeof (arl_t));
2356 	q->q_ptr = WR(q)->q_ptr = arl;
2357 	arl->arl_ipst = ipst;
2358 	arl->arl_zoneid = zoneid;
2359 	err = arl_init(q, arl);
2360 
2361 	if (err != 0) {
2362 		mi_free(arl->arl_name);
2363 		mi_free(arl);
2364 		netstack_rele(ipst->ips_netstack);
2365 		q->q_ptr = NULL;
2366 		WR(q)->q_ptr = NULL;
2367 		return (err);
2368 	}
2369 
2370 	/*
2371 	 * Wait for the DL_INFO_ACK if a DL_INFO_REQ was sent.
2372 	 */
2373 	err = arl_wait_for_info_ack(arl);
2374 	if (err == 0)
2375 		arl->arl_credp = credp;
2376 	else
2377 		goto fail;
2378 
2379 	crhold(credp);
2380 
2381 	mutex_enter(&ipst->ips_ip_mi_lock);
2382 	err = mi_open_link(&ipst->ips_arp_g_head, (IDP)q->q_ptr, devp, flag,
2383 	    sflag, credp);
2384 	mutex_exit(&ipst->ips_ip_mi_lock);
2385 fail:
2386 	if (err) {
2387 		(void) arp_close(q, 0);
2388 		return (err);
2389 	}
2390 	return (0);
2391 }
2392 
2393 /*
2394  * Notify any downstream modules (esp softmac and hitbox) of the name
2395  * of this interface using an M_CTL.
2396  */
2397 static void
2398 arp_ifname_notify(arl_t *arl)
2399 {
2400 	mblk_t *mp1, *mp2;
2401 	struct iocblk *iocp;
2402 	struct lifreq *lifr;
2403 
2404 	if ((mp1 = mkiocb(SIOCSLIFNAME)) == NULL)
2405 		return;
2406 	if ((mp2 = allocb(sizeof (struct lifreq), BPRI_HI)) == NULL) {
2407 		freemsg(mp1);
2408 		return;
2409 	}
2410 
2411 	lifr = (struct lifreq *)mp2->b_rptr;
2412 	mp2->b_wptr += sizeof (struct lifreq);
2413 	bzero(lifr, sizeof (struct lifreq));
2414 
2415 	(void) strncpy(lifr->lifr_name, arl->arl_name, LIFNAMSIZ);
2416 	lifr->lifr_ppa = arl->arl_ppa;
2417 	lifr->lifr_flags = ILLF_IPV4;
2418 
2419 	/* Use M_CTL to avoid confusing anyone else who might be listening. */
2420 	DB_TYPE(mp1) = M_CTL;
2421 	mp1->b_cont = mp2;
2422 	iocp = (struct iocblk *)mp1->b_rptr;
2423 	iocp->ioc_count = msgsize(mp1->b_cont);
2424 	DTRACE_PROBE4(arl__dlpi, char *, "arp_ifname_notify",
2425 	    char *, "SIOCSLIFNAME", char *, "-",  arl_t *, arl);
2426 	putnext(arl->arl_wq, mp1);
2427 }
2428 
2429 void
2430 arp_send_replumb_conf(ill_t *ill)
2431 {
2432 	mblk_t *mp;
2433 	arl_t *arl = ill_to_arl(ill);
2434 
2435 	if (arl == NULL)
2436 		return;
2437 	/*
2438 	 * arl_got_replumb and arl_got_unbind to be cleared after we complete
2439 	 * arp_cmd_done.
2440 	 */
2441 	mp = mexchange(NULL, NULL, sizeof (dl_notify_conf_t), M_PROTO,
2442 	    DL_NOTIFY_CONF);
2443 	((dl_notify_conf_t *)(mp->b_rptr))->dl_notification =
2444 	    DL_NOTE_REPLUMB_DONE;
2445 	arp_dlpi_send(arl, mp);
2446 	mutex_enter(&arl->arl_lock);
2447 	arl->arl_state_flags &= ~ARL_LL_REPLUMBING;
2448 	mutex_exit(&arl->arl_lock);
2449 	arl_refrele(arl);
2450 }
2451 
2452 /*
2453  * The unplumb code paths call arp_unbind_complete() to make sure that it is
2454  * safe to tear down the ill. We wait for DL_UNBIND_ACK to complete, and also
2455  * for the arl_refcnt to fall to one so that, when we return from
2456  * arp_unbind_complete(), we know for certain that there are no threads in
2457  * arp_rput() that might access the arl_ill.
2458  */
2459 void
2460 arp_unbind_complete(ill_t *ill)
2461 {
2462 	arl_t *arl = ill_to_arl(ill);
2463 
2464 	if (arl == NULL)
2465 		return;
2466 	mutex_enter(&arl->arl_lock);
2467 	/*
2468 	 * wait for unbind ack and arl_refcnt to drop to 1. Note that the
2469 	 * quiescent arl_refcnt for this function is 1 (and not 0) because
2470 	 * ill_to_arl() will itself return after taking a ref on the arl_t.
2471 	 */
2472 	while (arl->arl_state_flags & ARL_DL_UNBIND_IN_PROGRESS)
2473 		cv_wait(&arl->arl_cv, &arl->arl_lock);
2474 	while (arl->arl_refcnt != 1)
2475 		cv_wait(&arl->arl_cv, &arl->arl_lock);
2476 	mutex_exit(&arl->arl_lock);
2477 	arl_refrele(arl);
2478 }
2479