Lines Matching refs:kcb
279 kcb_delete(struct ctl_cb *kcb) in kcb_delete() argument
281 if (kcb != 0) { in kcb_delete()
282 lck_mtx_destroy(&kcb->mtx, &ctl_lck_grp); in kcb_delete()
283 kfree_type(struct ctl_cb, kcb); in kcb_delete()
297 struct ctl_cb *kcb = 0; in ctl_attach() local
299 kcb = kalloc_type(struct ctl_cb, Z_WAITOK | Z_ZERO | Z_NOFAIL); in ctl_attach()
301 lck_mtx_init(&kcb->mtx, &ctl_lck_grp, &ctl_lck_attr); in ctl_attach()
302 kcb->so = so; in ctl_attach()
303 so->so_pcb = (caddr_t)kcb; in ctl_attach()
311 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_sofreelastref() local
315 if (kcb != 0) { in ctl_sofreelastref()
317 if ((kctl = kcb->kctl) != 0) { in ctl_sofreelastref()
319 TAILQ_REMOVE(&kctl->kcb_head, kcb, next); in ctl_sofreelastref()
324 kcb_delete(kcb); in ctl_sofreelastref()
335 ctl_kcb_increment_use_count(struct ctl_cb *kcb, lck_mtx_t *mutex_held) in ctl_kcb_increment_use_count() argument
338 while (kcb->require_clearing_count > 0) { in ctl_kcb_increment_use_count()
339 msleep(&kcb->require_clearing_count, mutex_held, PSOCK | PCATCH, "kcb_require_clearing", NULL); in ctl_kcb_increment_use_count()
341 kcb->kcb_usecount++; in ctl_kcb_increment_use_count()
345 ctl_kcb_require_clearing(struct ctl_cb *kcb, lck_mtx_t *mutex_held) in ctl_kcb_require_clearing() argument
347 assert(kcb->kcb_usecount != 0); in ctl_kcb_require_clearing()
348 kcb->require_clearing_count++; in ctl_kcb_require_clearing()
349 kcb->kcb_usecount--; in ctl_kcb_require_clearing()
350 while (kcb->kcb_usecount > 0) { // we need to wait until no one else is running in ctl_kcb_require_clearing()
351 msleep(&kcb->kcb_usecount, mutex_held, PSOCK | PCATCH, "kcb_usecount", NULL); in ctl_kcb_require_clearing()
353 kcb->kcb_usecount++; in ctl_kcb_require_clearing()
357 ctl_kcb_done_clearing(struct ctl_cb *kcb) in ctl_kcb_done_clearing() argument
359 assert(kcb->require_clearing_count != 0); in ctl_kcb_done_clearing()
360 kcb->require_clearing_count--; in ctl_kcb_done_clearing()
361 wakeup((caddr_t)&kcb->require_clearing_count); in ctl_kcb_done_clearing()
365 ctl_kcb_decrement_use_count(struct ctl_cb *kcb) in ctl_kcb_decrement_use_count() argument
367 assert(kcb->kcb_usecount != 0); in ctl_kcb_decrement_use_count()
368 kcb->kcb_usecount--; in ctl_kcb_decrement_use_count()
369 wakeup((caddr_t)&kcb->kcb_usecount); in ctl_kcb_decrement_use_count()
375 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_detach() local
377 if (kcb == 0) { in ctl_detach()
382 ctl_kcb_increment_use_count(kcb, mtx_held); in ctl_detach()
383 ctl_kcb_require_clearing(kcb, mtx_held); in ctl_detach()
385 if (kcb->kctl != NULL && kcb->kctl->bind != NULL && in ctl_detach()
386 kcb->userdata != NULL && !(so->so_state & SS_ISCONNECTED)) { in ctl_detach()
389 if (kcb->kctl->disconnect != NULL) { in ctl_detach()
391 (*kcb->kctl->disconnect)(kcb->kctl->kctlref, in ctl_detach()
392 kcb->sac.sc_unit, kcb->userdata); in ctl_detach()
399 kcb->status = KCTL_DISCONNECTED; in ctl_detach()
402 ctl_kcb_done_clearing(kcb); in ctl_detach()
403 ctl_kcb_decrement_use_count(kcb); in ctl_detach()
413 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_setup_kctl() local
418 if (kcb == 0) { in ctl_setup_kctl()
422 if (kcb->kctl != NULL) { in ctl_setup_kctl()
465 error = (*kctl->setup)(&sa.sc_unit, &kcb->userdata); in ctl_setup_kctl()
493 bcopy(&sa, &kcb->sac, sizeof(struct sockaddr_ctl)); in ctl_setup_kctl()
494 kcb->kctl = kctl; in ctl_setup_kctl()
496 TAILQ_INSERT_BEFORE(kcb_next, kcb, next); in ctl_setup_kctl()
498 TAILQ_INSERT_TAIL(&kctl->kcb_head, kcb, next); in ctl_setup_kctl()
537 kcb->status = KCTL_DISCONNECTED; in ctl_setup_kctl()
540 TAILQ_REMOVE(&kctl->kcb_head, kcb, next); in ctl_setup_kctl()
541 kcb->kctl = NULL; in ctl_setup_kctl()
542 kcb->sac.sc_unit = 0; in ctl_setup_kctl()
555 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_bind() local
557 if (kcb == NULL) { in ctl_bind()
562 ctl_kcb_increment_use_count(kcb, mtx_held); in ctl_bind()
563 ctl_kcb_require_clearing(kcb, mtx_held); in ctl_bind()
570 if (kcb->kctl == NULL) { in ctl_bind()
574 if (kcb->kctl->bind == NULL) { in ctl_bind()
580 error = (*kcb->kctl->bind)(kcb->kctl->kctlref, &kcb->sac, &kcb->userdata); in ctl_bind()
584 ctl_kcb_done_clearing(kcb); in ctl_bind()
585 ctl_kcb_decrement_use_count(kcb); in ctl_bind()
593 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_connect() local
595 if (kcb == NULL) { in ctl_connect()
600 ctl_kcb_increment_use_count(kcb, mtx_held); in ctl_connect()
601 ctl_kcb_require_clearing(kcb, mtx_held); in ctl_connect()
604 if (kcb->status != KCTL_DISCONNECTED && ctl_panic_debug) { in ctl_connect()
607 kcb->status = KCTL_CONNECTING; in ctl_connect()
615 if (kcb->kctl == NULL) { in ctl_connect()
621 error = (*kcb->kctl->connect)(kcb->kctl->kctlref, &kcb->sac, &kcb->userdata); in ctl_connect()
628 kcb->status = KCTL_CONNECTED; in ctl_connect()
632 if (error && kcb->kctl->disconnect) { in ctl_connect()
643 (*kcb->kctl->disconnect)(kcb->kctl->kctlref, kcb->sac.sc_unit, kcb->userdata); in ctl_connect()
649 kcb->status = KCTL_DISCONNECTED; in ctl_connect()
652 TAILQ_REMOVE(&kcb->kctl->kcb_head, kcb, next); in ctl_connect()
653 kcb->kctl = NULL; in ctl_connect()
654 kcb->sac.sc_unit = 0; in ctl_connect()
661 ctl_kcb_done_clearing(kcb); in ctl_connect()
662 ctl_kcb_decrement_use_count(kcb); in ctl_connect()
669 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_disconnect() local
671 if ((kcb = (struct ctl_cb *)so->so_pcb)) { in ctl_disconnect()
673 ctl_kcb_increment_use_count(kcb, mtx_held); in ctl_disconnect()
674 ctl_kcb_require_clearing(kcb, mtx_held); in ctl_disconnect()
675 struct kctl *kctl = kcb->kctl; in ctl_disconnect()
679 (*kctl->disconnect)(kctl->kctlref, kcb->sac.sc_unit, in ctl_disconnect()
680 kcb->userdata); in ctl_disconnect()
686 kcb->status = KCTL_DISCONNECTED; in ctl_disconnect()
691 kcb->kctl = 0; in ctl_disconnect()
692 kcb->sac.sc_unit = 0; in ctl_disconnect()
693 while (kcb->usecount != 0) { in ctl_disconnect()
694 msleep(&kcb->usecount, &ctl_mtx, 0, "kcb->usecount", 0); in ctl_disconnect()
696 TAILQ_REMOVE(&kctl->kcb_head, kcb, next); in ctl_disconnect()
701 ctl_kcb_done_clearing(kcb); in ctl_disconnect()
702 ctl_kcb_decrement_use_count(kcb); in ctl_disconnect()
710 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_peeraddr() local
714 if (kcb == NULL) { /* sanity check */ in ctl_peeraddr()
718 if ((kctl = kcb->kctl) == NULL) { in ctl_peeraddr()
727 sc.sc_unit = kcb->sac.sc_unit; in ctl_peeraddr()
770 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_usr_rcvd() local
773 if (kcb == NULL) { in ctl_usr_rcvd()
778 ctl_kcb_increment_use_count(kcb, mtx_held); in ctl_usr_rcvd()
780 if ((kctl = kcb->kctl) == NULL) { in ctl_usr_rcvd()
787 (*kctl->rcvd)(kctl->kctlref, kcb->sac.sc_unit, kcb->userdata, flags); in ctl_usr_rcvd()
794 ctl_kcb_decrement_use_count(kcb); in ctl_usr_rcvd()
805 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_send() local
812 if (kcb == NULL) { /* sanity check */ in ctl_send()
817 ctl_kcb_increment_use_count(kcb, mtx_held); in ctl_send()
819 if (error == 0 && (kctl = kcb->kctl) == NULL) { in ctl_send()
826 error = (*kctl->send)(kctl->kctlref, kcb->sac.sc_unit, kcb->userdata, in ctl_send()
838 ctl_kcb_decrement_use_count(kcb); in ctl_send()
849 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_send_list() local
856 if (kcb == NULL) { /* sanity check */ in ctl_send_list()
861 ctl_kcb_increment_use_count(kcb, mtx_held); in ctl_send_list()
863 if (error == 0 && (kctl = kcb->kctl) == NULL) { in ctl_send_list()
875 error = (*kctl->send_list)(kctl->kctlref, kcb->sac.sc_unit, in ctl_send_list()
876 kcb->userdata, m, flags); in ctl_send_list()
885 error = (*kctl->send)(kctl->kctlref, kcb->sac.sc_unit, in ctl_send_list()
886 kcb->userdata, m, flags); in ctl_send_list()
902 ctl_kcb_decrement_use_count(kcb); in ctl_send_list()
1316 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb; in ctl_ctloutput() local
1327 if (kcb == NULL) { /* sanity check */ in ctl_ctloutput()
1331 if ((kctl = kcb->kctl) == NULL) { in ctl_ctloutput()
1336 ctl_kcb_increment_use_count(kcb, mtx_held); in ctl_ctloutput()
1358 kcb->sac.sc_unit, kcb->userdata, sopt->sopt_name, in ctl_ctloutput()
1391 error = (*kctl->getopt)(kctl->kctlref, kcb->sac.sc_unit, in ctl_ctloutput()
1392 kcb->userdata, sopt->sopt_name, in ctl_ctloutput()
1397 kcb->kctl->name, len, in ctl_ctloutput()
1415 ctl_kcb_decrement_use_count(kcb); in ctl_ctloutput()
1908 struct ctl_cb *kcb; in kcb_find() local
1912 TAILQ_FOREACH(kcb, &kctl->kcb_head, next) in kcb_find()
1913 if (kcb->sac.sc_unit == unit) { in kcb_find()
1914 return kcb; in kcb_find()
1924 struct ctl_cb *kcb; in kcb_find_socket() local
1945 kcb = kcb_find(kctl, unit); in kcb_find_socket()
1946 if (kcb == NULL || kcb->kctl != kctl || (so = kcb->so) == NULL) { in kcb_find_socket()
1953 kcb->usecount++; in kcb_find_socket()
1969 if ((kctl = kctl_from_ref(kctlref)) == NULL || kcb->kctl == NULL) { in kcb_find_socket()
1978 kcb->usecount--; in kcb_find_socket()
1979 if (kcb->usecount == 0) { in kcb_find_socket()
1980 wakeup((event_t)&kcb->usecount); in kcb_find_socket()
2101 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb;
2108 return &kcb->mtx;
2161 struct ctl_cb *kcb;
2164 TAILQ_FOREACH(kcb, &kctl->kcb_head, next)
2267 struct ctl_cb *kcb;
2269 for (kcb = TAILQ_FIRST(&kctl->kcb_head);
2270 i < n && kcb != NULL;
2271 i++, kcb = TAILQ_NEXT(kcb, next)) {
2286 xk->xkp_unit = kcb->sac.sc_unit;
2287 xk->xkp_kctpcb = (uint64_t)VM_KERNEL_ADDRPERM(kcb);
2293 sotoxsocket_n(kcb->so, xso);
2294 sbtoxsockbuf_n(kcb->so ?
2295 &kcb->so->so_rcv : NULL, xsbrcv);
2296 sbtoxsockbuf_n(kcb->so ?
2297 &kcb->so->so_snd : NULL, xsbsnd);
2298 sbtoxsockstat_n(kcb->so, xsostats);
2357 struct ctl_cb *kcb = (struct ctl_cb *)so->so_pcb;
2360 struct kctl *kctl = kcb->kctl;
2373 kcsi->kcsi_unit = kcb->sac.sc_unit;