Lines Matching refs:rs
172 struct rfcomm_session *rs; in rfcomm_session_alloc() local
176 rs = malloc(sizeof(*rs), M_BLUETOOTH, M_NOWAIT | M_ZERO); in rfcomm_session_alloc()
177 if (rs == NULL) in rfcomm_session_alloc()
180 rs->rs_state = RFCOMM_SESSION_CLOSED; in rfcomm_session_alloc()
182 callout_init(&rs->rs_timeout, 0); in rfcomm_session_alloc()
183 callout_setfunc(&rs->rs_timeout, rfcomm_session_timeout, rs); in rfcomm_session_alloc()
185 SIMPLEQ_INIT(&rs->rs_credits); in rfcomm_session_alloc()
186 LIST_INIT(&rs->rs_dlcs); in rfcomm_session_alloc()
188 err = l2cap_attach_pcb(&rs->rs_l2cap, &rfcomm_session_proto, rs); in rfcomm_session_alloc()
190 free(rs, M_BLUETOOTH); in rfcomm_session_alloc()
195 (void)l2cap_getopt(rs->rs_l2cap, &sopt); in rfcomm_session_alloc()
196 (void)sockopt_get(&sopt, &rs->rs_mtu, sizeof(rs->rs_mtu)); in rfcomm_session_alloc()
202 (void)l2cap_bind_pcb(rs->rs_l2cap, laddr); in rfcomm_session_alloc()
204 LIST_INSERT_HEAD(list, rs, rs_next); in rfcomm_session_alloc()
206 return rs; in rfcomm_session_alloc()
215 rfcomm_session_free(struct rfcomm_session *rs) in rfcomm_session_free() argument
219 KASSERT(rs != NULL); in rfcomm_session_free()
220 KASSERT(LIST_EMPTY(&rs->rs_dlcs)); in rfcomm_session_free()
222 rs->rs_state = RFCOMM_SESSION_CLOSED; in rfcomm_session_free()
229 callout_stop(&rs->rs_timeout); in rfcomm_session_free()
230 if (callout_invoking(&rs->rs_timeout)) in rfcomm_session_free()
238 if (rs->rs_flags & RFCOMM_SESSION_FREE) in rfcomm_session_free()
241 rs->rs_flags |= RFCOMM_SESSION_FREE; in rfcomm_session_free()
244 while ((credit = SIMPLEQ_FIRST(&rs->rs_credits)) != NULL) { in rfcomm_session_free()
245 SIMPLEQ_REMOVE_HEAD(&rs->rs_credits, rc_next); in rfcomm_session_free()
249 KASSERT(SIMPLEQ_EMPTY(&rs->rs_credits)); in rfcomm_session_free()
252 LIST_REMOVE(rs, rs_next); in rfcomm_session_free()
253 l2cap_detach_pcb(&rs->rs_l2cap); in rfcomm_session_free()
254 callout_destroy(&rs->rs_timeout); in rfcomm_session_free()
255 free(rs, M_BLUETOOTH); in rfcomm_session_free()
267 struct rfcomm_session *rs; in rfcomm_session_lookup() local
270 LIST_FOREACH(rs, &rfcomm_session_active, rs_next) { in rfcomm_session_lookup()
271 if (rs->rs_state == RFCOMM_SESSION_CLOSED) in rfcomm_session_lookup()
274 l2cap_sockaddr_pcb(rs->rs_l2cap, &addr); in rfcomm_session_lookup()
280 l2cap_peeraddr_pcb(rs->rs_l2cap, &addr); in rfcomm_session_lookup()
289 return rs; in rfcomm_session_lookup()
305 struct rfcomm_session *rs = arg; in rfcomm_session_timeout() local
308 KASSERT(rs != NULL); in rfcomm_session_timeout()
311 callout_ack(&rs->rs_timeout); in rfcomm_session_timeout()
313 if (rs->rs_state != RFCOMM_SESSION_OPEN) { in rfcomm_session_timeout()
315 rs->rs_state = RFCOMM_SESSION_CLOSED; in rfcomm_session_timeout()
317 while (!LIST_EMPTY(&rs->rs_dlcs)) { in rfcomm_session_timeout()
318 dlc = LIST_FIRST(&rs->rs_dlcs); in rfcomm_session_timeout()
324 if (LIST_EMPTY(&rs->rs_dlcs)) { in rfcomm_session_timeout()
326 rfcomm_session_free(rs); in rfcomm_session_timeout()
348 struct rfcomm_session *rs = arg; in rfcomm_session_connected() local
363 (void)l2cap_getopt(rs->rs_l2cap, &sopt); in rfcomm_session_connected()
364 (void)sockopt_get(&sopt, &rs->rs_mtu, sizeof(rs->rs_mtu)); in rfcomm_session_connected()
367 rs->rs_mtu -= 6; /* (RFCOMM overhead could be this big) */ in rfcomm_session_connected()
368 if (rs->rs_mtu < RFCOMM_MTU_MIN) { in rfcomm_session_connected()
369 rfcomm_session_disconnected(rs, EINVAL); in rfcomm_session_connected()
373 if (IS_INITIATOR(rs)) { in rfcomm_session_connected()
376 err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_SABM, 0); in rfcomm_session_connected()
378 rfcomm_session_disconnected(rs, err); in rfcomm_session_connected()
380 callout_schedule(&rs->rs_timeout, rfcomm_ack_timeout * hz); in rfcomm_session_connected()
387 struct rfcomm_session *rs = arg; in rfcomm_session_disconnected() local
399 rs->rs_state = RFCOMM_SESSION_CLOSED; in rfcomm_session_disconnected()
401 while (!LIST_EMPTY(&rs->rs_dlcs)) { in rfcomm_session_disconnected()
402 dlc = LIST_FIRST(&rs->rs_dlcs); in rfcomm_session_disconnected()
407 rfcomm_session_free(rs); in rfcomm_session_disconnected()
414 struct rfcomm_session *new, *rs = arg; in rfcomm_session_newconn() local
432 new->rs_mtu = rs->rs_mtu; in rfcomm_session_newconn()
447 struct rfcomm_session *rs = arg; in rfcomm_session_complete() local
458 credit = SIMPLEQ_FIRST(&rs->rs_credits); in rfcomm_session_complete()
474 if ((rs->rs_flags & RFCOMM_SESSION_CFC) == 0 in rfcomm_session_complete()
486 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC, in rfcomm_session_complete()
493 SIMPLEQ_REMOVE_HEAD(&rs->rs_credits, rc_next); in rfcomm_session_complete()
500 if (rs->rs_state == RFCOMM_SESSION_CLOSED) { in rfcomm_session_complete()
501 if (SIMPLEQ_EMPTY(&rs->rs_credits)) in rfcomm_session_complete()
502 l2cap_disconnect_pcb(rs->rs_l2cap, 0); in rfcomm_session_complete()
515 struct rfcomm_session *rs = arg; in rfcomm_session_linkmode() local
533 next = LIST_FIRST(&rs->rs_dlcs); in rfcomm_session_linkmode()
542 err = rfcomm_session_send_frame(rs, in rfcomm_session_linkmode()
558 if (!LIST_EMPTY(&rs->rs_dlcs)) in rfcomm_session_linkmode()
561 rs->rs_state = RFCOMM_SESSION_WAIT_DISCONNECT; in rfcomm_session_linkmode()
562 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC, 0); in rfcomm_session_linkmode()
563 callout_schedule(&rs->rs_timeout, rfcomm_ack_timeout * hz); in rfcomm_session_linkmode()
568 rfcomm_session_send_frame(rs, in rfcomm_session_linkmode()
574 err = rfcomm_session_send_frame(rs, in rfcomm_session_linkmode()
577 rfcomm_session_send_frame(rs, in rfcomm_session_linkmode()
585 rfcomm_session_send_frame(rs, in rfcomm_session_linkmode()
611 struct rfcomm_session *rs = arg; in rfcomm_session_input() local
616 KASSERT(rs != NULL); in rfcomm_session_input()
680 rfcomm_session_recv_sabm(rs, dlci); in rfcomm_session_input()
685 rfcomm_session_recv_disc(rs, dlci); in rfcomm_session_input()
690 rfcomm_session_recv_ua(rs, dlci); in rfcomm_session_input()
694 rfcomm_session_recv_dm(rs, dlci); in rfcomm_session_input()
698 rfcomm_session_recv_uih(rs, dlci, pf, m, len); in rfcomm_session_input()
721 rfcomm_session_recv_sabm(struct rfcomm_session *rs, int dlci) in rfcomm_session_recv_sabm() argument
729 rs->rs_state = RFCOMM_SESSION_OPEN; in rfcomm_session_recv_sabm()
730 rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, 0); in rfcomm_session_recv_sabm()
731 LIST_FOREACH(dlc, &rs->rs_dlcs, rd_next) { in rfcomm_session_recv_sabm()
738 if (rs->rs_state != RFCOMM_SESSION_OPEN) { in rfcomm_session_recv_sabm()
744 if ((IS_INITIATOR(rs) && !RFCOMM_DIRECTION(dlci)) in rfcomm_session_recv_sabm()
745 || (!IS_INITIATOR(rs) && RFCOMM_DIRECTION(dlci))) { in rfcomm_session_recv_sabm()
754 dlc = rfcomm_dlc_lookup(rs, dlci); in rfcomm_session_recv_sabm()
756 dlc = rfcomm_dlc_newconn(rs, dlci); in rfcomm_session_recv_sabm()
778 err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, dlci); in rfcomm_session_recv_sabm()
797 rfcomm_session_recv_disc(struct rfcomm_session *rs, int dlci) in rfcomm_session_recv_disc() argument
814 rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, 0); in rfcomm_session_recv_disc()
815 rs->rs_state = RFCOMM_SESSION_CLOSED; in rfcomm_session_recv_disc()
819 dlc = rfcomm_dlc_lookup(rs, dlci); in rfcomm_session_recv_disc()
821 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM, dlci); in rfcomm_session_recv_disc()
826 rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, dlci); in rfcomm_session_recv_disc()
836 rfcomm_session_recv_ua(struct rfcomm_session *rs, int dlci) in rfcomm_session_recv_ua() argument
843 switch (rs->rs_state) { in rfcomm_session_recv_ua()
845 callout_stop(&rs->rs_timeout); in rfcomm_session_recv_ua()
846 rs->rs_state = RFCOMM_SESSION_OPEN; in rfcomm_session_recv_ua()
847 LIST_FOREACH(dlc, &rs->rs_dlcs, rd_next) { in rfcomm_session_recv_ua()
854 callout_stop(&rs->rs_timeout); in rfcomm_session_recv_ua()
855 rs->rs_state = RFCOMM_SESSION_CLOSED; in rfcomm_session_recv_ua()
856 l2cap_disconnect_pcb(rs->rs_l2cap, 0); in rfcomm_session_recv_ua()
872 dlc = rfcomm_dlc_lookup(rs, dlci); in rfcomm_session_recv_ua()
891 if (LIST_EMPTY(&rs->rs_dlcs)) { in rfcomm_session_recv_ua()
892 rs->rs_state = RFCOMM_SESSION_WAIT_DISCONNECT; in rfcomm_session_recv_ua()
893 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC, 0); in rfcomm_session_recv_ua()
894 callout_schedule(&rs->rs_timeout, rfcomm_ack_timeout * hz); in rfcomm_session_recv_ua()
904 rfcomm_session_recv_dm(struct rfcomm_session *rs, int dlci) in rfcomm_session_recv_dm() argument
910 dlc = rfcomm_dlc_lookup(rs, dlci); in rfcomm_session_recv_dm()
924 rfcomm_session_recv_uih(struct rfcomm_session *rs, int dlci, in rfcomm_session_recv_uih() argument
933 rfcomm_session_recv_mcc(rs, m); in rfcomm_session_recv_uih()
944 dlc = rfcomm_dlc_lookup(rs, dlci); in rfcomm_session_recv_uih()
947 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM, dlci); in rfcomm_session_recv_uih()
958 if (rs->rs_flags & RFCOMM_SESSION_CFC) { in rfcomm_session_recv_uih()
1002 rfcomm_session_recv_mcc(struct rfcomm_session *rs, struct mbuf *m) in rfcomm_session_recv_mcc() argument
1060 rfcomm_session_recv_mcc_test(rs, cr, m); in rfcomm_session_recv_mcc()
1064 rfcomm_session_recv_mcc_fcon(rs, cr); in rfcomm_session_recv_mcc()
1068 rfcomm_session_recv_mcc_fcoff(rs, cr); in rfcomm_session_recv_mcc()
1072 rfcomm_session_recv_mcc_msc(rs, cr, m); in rfcomm_session_recv_mcc()
1076 rfcomm_session_recv_mcc_rpn(rs, cr, m); in rfcomm_session_recv_mcc()
1080 rfcomm_session_recv_mcc_rls(rs, cr, m); in rfcomm_session_recv_mcc()
1084 rfcomm_session_recv_mcc_pn(rs, cr, m); in rfcomm_session_recv_mcc()
1088 rfcomm_session_recv_mcc_nsc(rs, cr, m); in rfcomm_session_recv_mcc()
1093 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_NSC, &b, sizeof(b)); in rfcomm_session_recv_mcc()
1104 rfcomm_session_recv_mcc_test(struct rfcomm_session *rs, int cr, struct mbuf *m) in rfcomm_session_recv_mcc_test() argument
1125 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_TEST, data, len); in rfcomm_session_recv_mcc_test()
1133 rfcomm_session_recv_mcc_fcon(struct rfcomm_session *rs, int cr) in rfcomm_session_recv_mcc_fcon() argument
1139 rs->rs_flags |= RFCOMM_SESSION_RFC; in rfcomm_session_recv_mcc_fcon()
1140 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_FCON, NULL, 0); in rfcomm_session_recv_mcc_fcon()
1147 rfcomm_session_recv_mcc_fcoff(struct rfcomm_session *rs, int cr) in rfcomm_session_recv_mcc_fcoff() argument
1153 rs->rs_flags &= ~RFCOMM_SESSION_RFC; in rfcomm_session_recv_mcc_fcoff()
1154 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_FCOFF, NULL, 0); in rfcomm_session_recv_mcc_fcoff()
1161 rfcomm_session_recv_mcc_msc(struct rfcomm_session *rs, int cr, struct mbuf *m) in rfcomm_session_recv_mcc_msc() argument
1175 dlc = rfcomm_dlc_lookup(rs, RFCOMM_DLCI(msc.address)); in rfcomm_session_recv_mcc_msc()
1185 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM, in rfcomm_session_recv_mcc_msc()
1212 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_MSC, &msc, len); in rfcomm_session_recv_mcc_msc()
1219 rfcomm_session_recv_mcc_rpn(struct rfcomm_session *rs, int cr, struct mbuf *m) in rfcomm_session_recv_mcc_rpn() argument
1278 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_RPN, &rpn, sizeof(rpn)); in rfcomm_session_recv_mcc_rpn()
1285 rfcomm_session_recv_mcc_rls(struct rfcomm_session *rs, int cr, struct mbuf *m) in rfcomm_session_recv_mcc_rls() argument
1307 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_RLS, &rls, sizeof(rls)); in rfcomm_session_recv_mcc_rls()
1314 rfcomm_session_recv_mcc_pn(struct rfcomm_session *rs, int cr, struct mbuf *m) in rfcomm_session_recv_mcc_pn() argument
1330 dlc = rfcomm_dlc_lookup(rs, pn.dlci); in rfcomm_session_recv_mcc_pn()
1337 dlc = rfcomm_dlc_newconn(rs, pn.dlci); in rfcomm_session_recv_mcc_pn()
1344 pn.mtu = uimin(pn.mtu, rs->rs_mtu); in rfcomm_session_recv_mcc_pn()
1352 rs->rs_flags |= RFCOMM_SESSION_CFC; in rfcomm_session_recv_mcc_pn()
1371 err = rfcomm_session_send_mcc(rs, 0, in rfcomm_session_recv_mcc_pn()
1386 err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC, in rfcomm_session_recv_mcc_pn()
1403 rs->rs_flags |= RFCOMM_SESSION_CFC; in rfcomm_session_recv_mcc_pn()
1420 err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_SABM, pn.dlci); in rfcomm_session_recv_mcc_pn()
1436 rfcomm_session_recv_mcc_nsc(struct rfcomm_session *rs, in rfcomm_session_recv_mcc_nsc() argument
1446 next = LIST_FIRST(&rs->rs_dlcs); in rfcomm_session_recv_mcc_nsc()
1452 rfcomm_session_free(rs); in rfcomm_session_recv_mcc_nsc()
1464 rfcomm_session_send_frame(struct rfcomm_session *rs, int type, int dlci) in rfcomm_session_send_frame() argument
1489 cr = IS_INITIATOR(rs) ? 0 : 1; in rfcomm_session_send_frame()
1491 cr = IS_INITIATOR(rs) ? 1 : 0; in rfcomm_session_send_frame()
1510 SIMPLEQ_INSERT_TAIL(&rs->rs_credits, credit, rc_next); in rfcomm_session_send_frame()
1515 return l2cap_send_pcb(rs->rs_l2cap, m); in rfcomm_session_send_frame()
1526 rfcomm_session_send_uih(struct rfcomm_session *rs, struct rfcomm_dlc *dlc, in rfcomm_session_send_uih() argument
1534 KASSERT(rs != NULL); in rfcomm_session_send_uih()
1573 *hdr = RFCOMM_MKADDRESS((IS_INITIATOR(rs) ? 1 : 0), in rfcomm_session_send_uih()
1615 err = l2cap_send_pcb(rs->rs_l2cap, m0); in rfcomm_session_send_uih()
1619 SIMPLEQ_INSERT_TAIL(&rs->rs_credits, credit, rc_next); in rfcomm_session_send_uih()
1640 rfcomm_session_send_mcc(struct rfcomm_session *rs, int cr, in rfcomm_session_send_mcc() argument
1703 return rfcomm_session_send_uih(rs, NULL, 0, m); in rfcomm_session_send_mcc()