Lines Matching defs:arl

46 #define	ARL_LL_ADDR_OFFSET(arl)	(((arl)->arl_sap_length) < 0 ? \
48 ((sizeof (dl_unitdata_req_t)) + (ABS((arl)->arl_sap_length))))
181 arl_refhold_locked(arl_t *arl)
183 ASSERT(MUTEX_HELD(&arl->arl_lock));
184 arl->arl_refcnt++;
185 ASSERT(arl->arl_refcnt != 0);
189 arl_refrele(arl_t *arl)
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);
200 cv_broadcast(&arl->arl_cv);
201 mutex_exit(&arl->arl_lock);
375 arp_dlpi_done(arl_t *arl, ill_t *ill)
381 mutex_enter(&arl->arl_lock);
382 prim = arl->arl_dlpi_pending;
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)
390 mutex_exit(&arl->arl_lock);
399 arl->arl_dlpi_deferred = mp->b_next;
404 arl->arl_dlpi_pending = DL_PRIM(mp);
405 mutex_exit(&arl->arl_lock);
411 putnext(arl->arl_wq, mp);
424 arp_ll_set_defaults(arl_t *arl, mblk_t *mp)
438 arl->arl_sap_length = dlia->dl_sap_length;
439 arl->arl_phys_addr_length = dlia->dl_brdcst_addr_length;
441 arl->arl_needs_attach = 1;
443 arl->arl_sap_length = arm->arp_mac_sap_length;
444 arl->arl_phys_addr_length = arm->arp_mac_hw_addr_length;
450 arl->arl_sap = ETHERTYPE_ARP;
451 arl_defaults_common(arl, mp);
495 * matches the one that is pending for the arl.
498 arl_dlpi_pending(arl_t *arl, t_uscalar_t prim)
502 mutex_enter(&arl->arl_lock);
503 if (arl->arl_dlpi_pending == prim) {
504 mutex_exit(&arl->arl_lock);
508 if (arl->arl_state_flags & ARL_CONDEMNED) {
509 mutex_exit(&arl->arl_lock);
512 pending = arl->arl_dlpi_pending;
513 mutex_exit(&arl->arl_lock);
517 dl_primstr(prim), arl->arl_name));
520 dl_primstr(prim), arl->arl_name, dl_primstr(pending)));
529 arl_t *arl = (arl_t *)q->q_ptr;
574 DTRACE_PROBE2(rput_dl_badprim, arl_t *, arl,
579 if (reqprim == DL_PRIM_INVAL || !arl_dlpi_pending(arl, reqprim)) {
585 arl_t *, arl);
589 ill = arl_to_ill(arl);
597 * messages pending. We initialize the arl here.
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);
607 mutex_enter(&arl->arl_lock);
608 arl->arl_state_flags &= ~ARL_DL_UNBIND_IN_PROGRESS;
612 arl->arl_state_flags &= ~ARL_LL_UP;
613 arl->arl_state_flags |= ARL_LL_UNBOUND;
614 if (arl->arl_state_flags & ARL_CONDEMNED) {
616 * if this is part of the unplumb the arl may
623 arl->arl_dlpi_pending = DL_PRIM_INVAL;
625 cv_signal(&arl->arl_cv);
626 mutex_exit(&arl->arl_lock);
650 arl_t *arl = ill_to_arl(ill);
652 if (arl == NULL) {
657 * qwriter_ip gets into the ipsq but will find the arl null.
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);
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);
689 arl_refrele(arl);
698 arl_t *, arl);
699 mutex_enter(&arl->arl_lock);
707 mutex_exit(&arl->arl_lock);
708 arl_refrele(arl);
712 mutex_exit(&arl->arl_lock);
715 DTRACE_PROBE2(rput_dl_bind, arl_t *, arl,
718 mutex_enter(&arl->arl_lock);
719 ASSERT(arl->arl_state_flags & ARL_LL_BIND_PENDING);
720 arl->arl_state_flags &=
722 arl->arl_state_flags |= ARL_LL_UP;
723 mutex_exit(&arl->arl_lock);
726 DTRACE_PROBE2(rput_dl_uderror, arl_t *, arl,
728 arl_refrele(arl);
732 DTRACE_PROBE2(rput_dl_badprim, arl_t *, arl,
734 arl_refrele(arl);
738 arp_dlpi_done(arl, ill);
739 arl_refrele(arl);
746 arl_t *arl = q->q_ptr;
749 mutex_enter(&arl->arl_lock);
750 if (((arl->arl_state_flags &
757 mutex_exit(&arl->arl_lock);
762 arl_refhold_locked(arl);
765 mutex_exit(&arl->arl_lock);
776 * Take a ref on the ill associated with this arl to
781 ill = arl_to_ill(arl);
797 arl->arl_error = (int)(*mp->b_rptr & 0xFF);
798 if (arl->arl_error == 0)
799 arl->arl_error = ENXIO;
808 arl_refrele(arl);
1207 arl_ill_init(arl_t *arl, char *ill_name)
1213 arl->arl_ipst);
1219 * By the time we set up the arl, we expect the ETHERTYPE_IP
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);
1240 if (ill->ill_common != NULL || arl->arl_common != NULL) {
1248 ai->ai_arl = arl;
1251 arl->arl_common = ai;
1253 (void) strlcpy(arl->arl_name, ill->ill_name, LIFNAMSIZ);
1254 arl->arl_name_length = ill->ill_name_length;
1256 arp_ifname_notify(arl);
1286 arl_t *arl;
1297 arl = (arl_t *)q->q_ptr;
1299 arl->arl_ppa = *ppa;
1300 return (arl_ill_init(arl, ill_name));
1306 arl_t *arl;
1313 arl = (arl_t *)q->q_ptr;
1314 arl->arl_ppa = lifr->lifr_ppa;
1315 return (arl_ill_init(arl, lifr->lifr_name));
1322 arl_t *arl = NULL;
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);
1339 mutex_exit(&arl->arl_lock);
1340 arl = NULL;
1344 return (arl);
1348 arl_to_ill(arl_t *arl)
1350 arl_ill_common_t *ai = arl->arl_common;
1387 arl_t *arl;
1390 arl = ill_to_arl(ill);
1393 if (arl == NULL)
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);
1400 if (arl->arl_needs_attach) { /* DL_STYLE2 */
1405 ((dl_attach_req_t *)attach_mp->b_rptr)->dl_ppa = arl->arl_ppa;
1418 if (arl->arl_needs_attach) {
1419 arp_dlpi_send(arl, attach_mp);
1421 arl->arl_unbind_mp = unbind_mp;
1423 arl->arl_state_flags |= ARL_LL_BIND_PENDING;
1424 arp_dlpi_send(arl, bind_mp);
1425 arl_refrele(arl);
1432 arl_refrele(arl);
1558 arl_t *arl;
1617 arl = ill_to_arl(ill);
1618 if (arl == NULL) {
1622 if (canputnext(arl->arl_wq))
1623 putnext(arl->arl_wq, mp);
1626 arl_refrele(arl);
1762 arl_unbind(arl_t *arl)
1766 if ((mp = arl->arl_unbind_mp) != NULL) {
1767 arl->arl_unbind_mp = NULL;
1768 arl->arl_state_flags |= ARL_DL_UNBIND_IN_PROGRESS;
1776 arl_t *arl;
1782 if ((arl = ill_to_arl(ill)) == NULL)
1784 DTRACE_PROBE2(arl__downup, char *, "arp_ll_down", arl_t *, arl);
1785 mutex_enter(&arl->arl_lock);
1786 unbind_mp = arl_unbind(arl);
1788 ASSERT(arl->arl_state_flags & ARL_DL_UNBIND_IN_PROGRESS);
1790 arl_t *, arl);
1793 arl->arl_state_flags |= ARL_LL_REPLUMBING;
1795 mutex_exit(&arl->arl_lock);
1797 arp_dlpi_send(arl, unbind_mp);
1798 arl_refrele(arl);
1816 arp_modclose(arl_t *arl)
1818 arl_ill_common_t *ai = arl->arl_common;
1820 queue_t *q = arl->arl_rq;
1824 ill = arl_to_ill(arl);
1859 mutex_enter(&arl->arl_lock);
1866 if ((arl->arl_state_flags & ARL_CONDEMNED) != 0) {
1867 mutex_exit(&arl->arl_lock);
1871 arl->arl_state_flags |= ARL_CONDEMNED;
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);
1896 putnext(arl->arl_wq, mp);
1900 mutex_enter(&arl->arl_lock);
1901 while (arl->arl_refcnt != 0)
1902 cv_wait(&arl->arl_cv, &arl->arl_lock);
1907 mp = arl_unbind(arl);
1908 mutex_exit(&arl->arl_lock);
1910 arp_dlpi_send(arl, mp);
1911 mutex_enter(&arl->arl_lock);
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);
1938 arp_mod_close_tail(arl);
1949 arp_mod_close_tail(arl_t *arl)
1951 ip_stack_t *ipst = arl->arl_ipst;
1955 mi_close_unlink(&ipst->ips_arp_g_head, (IDP)arl);
1962 if (arl->arl_credp != NULL)
1963 crfree(arl->arl_credp);
1966 mpp = &arl->arl_first_mp_to_free;
1980 } while (mpp++ != &arl->arl_last_mp_to_free);
1983 mi_free(arl->arl_name);
1984 mi_close_free((IDP)arl);
2152 * arl_init, before the arl has done a SLIFNAME, so that we don't yet know
2157 arp_dlpi_send(arl_t *arl, mblk_t *mp)
2166 ai = arl->arl_common;
2175 mutex_enter(&arl->arl_lock);
2176 if (arl->arl_dlpi_pending != DL_PRIM_INVAL) {
2178 mpp = &arl->arl_dlpi_deferred;
2183 mutex_exit(&arl->arl_lock);
2186 mutex_exit(&arl->arl_lock);
2189 ASSERT((arl->arl_state_flags & ARL_DL_UNBIND_IN_PROGRESS) == 0);
2198 if (!(arl->arl_state_flags & ARL_CONDEMNED) ||
2201 ill_t *ill = arl_to_ill(arl);
2203 arl->arl_dlpi_pending = prim;
2213 char *, dl_primstr(prim), char *, "-", arl_t *, arl);
2214 putnext(arl->arl_wq, mp);
2218 arl_defaults_common(arl_t *arl, mblk_t *mp)
2225 arl->arl_mactype = dlia->dl_mac_type;
2226 arl->arl_sap_length = dlia->dl_sap_length;
2228 if (!arl->arl_dlpi_style_set) {
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);
2241 arl_init(queue_t *q, arl_t *arl)
2247 mutex_init(&arl->arl_lock, NULL, MUTEX_DEFAULT, 0);
2249 arl->arl_rq = q;
2250 arl->arl_wq = WR(q);
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);
2268 arl->arl_dlpi_pending = DL_PRIM_INVAL;
2271 arp_dlpi_send(arl, info_mp);
2276 arl_wait_for_info_ack(arl_t *arl)
2280 mutex_enter(&arl->arl_lock);
2281 while (arl->arl_state_flags & ARL_LL_SUBNET_PENDING) {
2285 err = cv_wait_sig(&arl->arl_cv, &arl->arl_lock);
2287 mutex_exit(&arl->arl_lock);
2291 mutex_exit(&arl->arl_lock);
2296 return (arl->arl_error);
2302 arl_t *arl;
2304 arl = ill_to_arl(ill);
2305 if (arl != NULL) {
2306 arl->arl_muxid = muxid;
2307 arl_refrele(arl);
2314 arl_t *arl;
2317 arl = ill_to_arl(ill);
2318 if (arl != NULL) {
2319 muxid = arl->arl_muxid;
2320 arl_refrele(arl);
2332 arl_t *arl = NULL;
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);
2362 mi_free(arl->arl_name);
2363 mi_free(arl);
2373 err = arl_wait_for_info_ack(arl);
2375 arl->arl_credp = credp;
2398 arp_ifname_notify(arl_t *arl)
2415 (void) strncpy(lifr->lifr_name, arl->arl_name, LIFNAMSIZ);
2416 lifr->lifr_ppa = arl->arl_ppa;
2425 char *, "SIOCSLIFNAME", char *, "-", arl_t *, arl);
2426 putnext(arl->arl_wq, mp1);
2433 arl_t *arl = ill_to_arl(ill);
2435 if (arl == NULL)
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);
2462 arl_t *arl = ill_to_arl(ill);
2464 if (arl == NULL)
2466 mutex_enter(&arl->arl_lock);
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);