Lines Matching defs:dsp

41 dls_open(dls_link_t *dlp, dls_dl_handle_t ddh, dld_str_t *dsp)
73 dsp->ds_dlp = dlp;
74 dsp->ds_mh = dlp->dl_mh;
75 dsp->ds_mch = dlp->dl_mch;
76 dsp->ds_mip = dlp->dl_mip;
77 dsp->ds_ddh = ddh;
78 dsp->ds_local = local;
80 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
85 dls_close(dld_str_t *dsp)
87 dls_link_t *dlp = dsp->ds_dlp;
91 ASSERT(dsp->ds_datathr_cnt == 0);
92 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
94 if (dsp->ds_local)
96 dsp->ds_local = B_FALSE;
105 for (p = dsp->ds_dmap; p != NULL; p = nextp) {
106 (void) mac_multicast_remove(dsp->ds_mch, p->dma_addr);
110 dsp->ds_dmap = NULL;
112 dls_active_clear(dsp, B_TRUE);
117 if (dsp->ds_dlstate == DL_IDLE) {
118 dls_unbind(dsp);
119 dsp->ds_dlstate = DL_UNBOUND;
126 (void) dls_promisc(dsp, 0);
130 * for this 'dsp'. The dls_link_remove above cut off packets meant
135 dsp->ds_rx = NULL;
136 dsp->ds_rx_arg = NULL;
138 dsp->ds_dlp = NULL;
140 if (!mac_capab_get(dsp->ds_mh, MAC_CAPAB_LEGACY, NULL))
141 mac_stop(dsp->ds_mh);
151 dls_bind(dld_str_t *dsp, uint32_t sap)
155 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
160 if (!mac_sap_verify(dsp->ds_mh, sap, &dls_sap))
163 if (dsp->ds_promisc & DLS_PROMISC_SAP)
169 dsp->ds_sap = sap;
185 if (sap == ETHERTYPE_VLAN && dsp->ds_promisc == 0) {
188 if (dsp->ds_vlan_mph != NULL)
190 err = mac_promisc_add(dsp->ds_mch,
191 MAC_CLIENT_PROMISC_ALL, dls_rx_vlan_promisc, dsp,
192 &dsp->ds_vlan_mph, MAC_PROMISC_FLAGS_NO_PHYS);
194 if (err == 0 && dsp->ds_nonip &&
195 dsp->ds_dlp->dl_nonip_cnt++ == 0)
196 mac_rx_bypass_disable(dsp->ds_mch);
205 dls_link_add(dsp->ds_dlp, dls_sap, dsp);
206 if (dsp->ds_nonip && dsp->ds_dlp->dl_nonip_cnt++ == 0)
207 mac_rx_bypass_disable(dsp->ds_mch);
213 dls_unbind(dld_str_t *dsp)
215 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
217 if (dsp->ds_nonip && --dsp->ds_dlp->dl_nonip_cnt == 0)
218 mac_rx_bypass_enable(dsp->ds_mch);
225 if (dsp->ds_vlan_mph != NULL) {
226 mac_promisc_remove(dsp->ds_vlan_mph);
227 dsp->ds_vlan_mph = NULL;
235 dls_link_remove(dsp->ds_dlp, dsp);
236 dsp->ds_sap = 0;
240 * In order to prevent promiscuous-mode processing with dsp->ds_promisc
241 * set to inaccurate values, this function sets dsp->ds_promisc with new
247 dls_promisc(dld_str_t *dsp, uint32_t new_flags)
250 uint32_t old_flags = dsp->ds_promisc;
253 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
264 if (dsp->ds_promisc == 0 && new_flags != 0) {
269 dsp->ds_promisc = new_flags;
270 err = mac_promisc_add(dsp->ds_mch, mptype,
271 dls_rx_promisc, dsp, &dsp->ds_mph,
275 dsp->ds_promisc = old_flags;
280 if (dsp->ds_vlan_mph != NULL) {
281 mac_promisc_remove(dsp->ds_vlan_mph);
282 dsp->ds_vlan_mph = NULL;
284 } else if (dsp->ds_promisc != 0 && new_flags == 0) {
285 ASSERT(dsp->ds_mph != NULL);
287 mac_promisc_remove(dsp->ds_mph);
288 dsp->ds_promisc = new_flags;
289 dsp->ds_mph = NULL;
291 if (dsp->ds_sap == ETHERTYPE_VLAN &&
292 dsp->ds_dlstate != DL_UNBOUND) {
293 if (dsp->ds_vlan_mph != NULL)
295 err = mac_promisc_add(dsp->ds_mch,
296 MAC_CLIENT_PROMISC_ALL, dls_rx_vlan_promisc, dsp,
297 &dsp->ds_vlan_mph, MAC_PROMISC_FLAGS_NO_PHYS);
299 } else if (dsp->ds_promisc == DLS_PROMISC_SAP && new_flags != 0 &&
300 new_flags != dsp->ds_promisc) {
306 ASSERT(dsp->ds_mph != NULL);
307 mac_promisc_remove(dsp->ds_mph);
309 dsp->ds_promisc = new_flags;
310 err = mac_promisc_add(dsp->ds_mch, mptype,
311 dls_rx_promisc, dsp, &dsp->ds_mph, 0);
313 dsp->ds_promisc = old_flags;
316 dsp->ds_promisc = new_flags;
323 dls_multicst_add(dld_str_t *dsp, const uint8_t *addr)
330 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
336 addr_length = dsp->ds_mip->mi_addr_length;
344 rw_enter(&dsp->ds_rw_lock, RW_WRITER);
345 for (pp = &(dsp->ds_dmap); (p = *pp) != NULL; pp = &(p->dma_nextp)) {
361 rw_exit(&dsp->ds_rw_lock);
366 err = mac_multicast_add(dsp->ds_mch, addr);
371 rw_enter(&dsp->ds_rw_lock, RW_WRITER);
376 rw_exit(&dsp->ds_rw_lock);
381 dls_multicst_remove(dld_str_t *dsp, const uint8_t *addr)
387 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
393 addr_length = dsp->ds_mip->mi_addr_length;
401 rw_enter(&dsp->ds_rw_lock, RW_WRITER);
402 for (pp = &(dsp->ds_dmap); (p = *pp) != NULL; pp = &(p->dma_nextp)) {
412 rw_exit(&dsp->ds_rw_lock);
420 rw_exit(&dsp->ds_rw_lock);
425 mac_multicast_remove(dsp->ds_mch, addr);
431 dls_header(dld_str_t *dsp, const uint8_t *addr, uint16_t sap, uint_t pri,
438 boolean_t is_ethernet = (dsp->ds_mip->mi_media == DL_ETHER);
441 vid = mac_client_vid(dsp->ds_mch);
457 (pri != 0 && dsp->ds_dlp->dl_tagmode != LINK_TAGMODE_VLANONLY))) {
466 mp = mac_header(dsp->ds_mh, addr, mac_sap, payload, extra_len);
471 dsp->ds_dlp->dl_tagmode == LINK_TAGMODE_VLANONLY)) || !is_ethernet)
521 dls_rx_set(dld_str_t *dsp, dls_rx_t rx, void *arg)
523 mutex_enter(&dsp->ds_lock);
524 dsp->ds_rx = rx;
525 dsp->ds_rx_arg = arg;
526 mutex_exit(&dsp->ds_lock);
530 dls_accept_common(dld_str_t *dsp, mac_header_info_t *mhip, dls_rx_t *ds_rx,
534 size_t addr_length = dsp->ds_mip->mi_addr_length;
540 if (dsp->ds_dlstate != DL_IDLE)
543 if (dsp->ds_promisc != 0) {
554 if (!promisc && !(dsp->ds_promisc == DLS_PROMISC_MULTI &&
561 if (dsp->ds_promisc & DLS_PROMISC_PHYS)
588 if (dsp->ds_promisc & DLS_PROMISC_MULTI)
591 rw_enter(&dsp->ds_rw_lock, RW_READER);
592 for (dmap = dsp->ds_dmap; dmap != NULL;
596 rw_exit(&dsp->ds_rw_lock);
600 rw_exit(&dsp->ds_rw_lock);
611 mutex_enter(&dsp->ds_lock);
612 *ds_rx = dsp->ds_rx;
613 *ds_rx_arg = dsp->ds_rx_arg;
614 mutex_exit(&dsp->ds_lock);
621 dls_accept(dld_str_t *dsp, mac_header_info_t *mhip, dls_rx_t *ds_rx,
624 return (dls_accept_common(dsp, mhip, ds_rx, ds_rx_arg, B_FALSE,
629 dls_accept_promisc(dld_str_t *dsp, mac_header_info_t *mhip, dls_rx_t *ds_rx,
632 return (dls_accept_common(dsp, mhip, ds_rx, ds_rx_arg, B_TRUE,
679 dls_active_set(dld_str_t *dsp)
683 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
685 if (dsp->ds_passivestate == DLD_PASSIVE)
689 if ((dsp->ds_nactive == 0) &&
690 ((err = dls_mac_active_set(dsp->ds_dlp)) != 0)) {
697 dsp->ds_passivestate = DLD_ACTIVE;
698 dsp->ds_nactive++;
705 * dls_active_clear(dsp, B_FALSE) is called whenever the active operation
709 * dls_active_clear(dsp, B_TRUE).
712 dls_active_clear(dld_str_t *dsp, boolean_t all)
714 ASSERT(MAC_PERIM_HELD(dsp->ds_mh));
716 if (dsp->ds_passivestate == DLD_PASSIVE)
719 if (all && dsp->ds_nactive == 0)
722 ASSERT(dsp->ds_nactive > 0);
724 dsp->ds_nactive -= (all ? dsp->ds_nactive : 1);
725 if (dsp->ds_nactive != 0)
728 ASSERT(dsp->ds_passivestate == DLD_ACTIVE);
729 dls_mac_active_clear(dsp->ds_dlp);
730 dsp->ds_passivestate = DLD_UNINITIALIZED;