Home | History | Annotate | Download | only in netbt

Lines Matching defs:dlc

52  * Find DLC on session with matching dlci
57 struct rfcomm_dlc *dlc;
59 LIST_FOREACH(dlc, &rs->rs_dlcs, rd_next) {
60 if (dlc->rd_dlci == dlci)
64 return dlc;
70 * handle a new dlc request (since its called from a couple of places)
76 struct rfcomm_dlc *new, *dlc, *any, *best;
81 * Search amongst the listening DLC community for the best match for
82 * address & channel. We keep listening DLC's hanging on listening
100 LIST_FOREACH(dlc, &ls->rs_dlcs, rd_next) {
101 if (dlc->rd_laddr.bt_channel == chan)
102 best = dlc;
107 LIST_FOREACH(dlc, &ls->rs_dlcs, rd_next) {
108 if (dlc->rd_laddr.bt_channel == chan)
109 any = dlc;
114 dlc = best ? best : any;
119 * listening DLC's so all can be checked in turn..
121 if (dlc != NULL)
122 new = (*dlc->rd_proto->newconn)(dlc->rd_upper, &laddr, &raddr);
131 new->rd_mode = dlc->rd_mode;
147 * rfcomm_dlc_close(dlc, error)
149 * detach DLC from session and clean up
152 rfcomm_dlc_close(struct rfcomm_dlc *dlc, int err)
157 KASSERT(dlc->rd_state != RFCOMM_DLC_CLOSED);
160 rs = dlc->rd_session;
162 if (credit->rc_dlc == dlc)
165 callout_stop(&dlc->rd_timeout);
167 LIST_REMOVE(dlc, rd_next);
168 dlc->rd_session = NULL;
169 dlc->rd_state = RFCOMM_DLC_CLOSED;
171 (*dlc->rd_proto->disconnected)(dlc->rd_upper, err);
188 * rfcomm_dlc_timeout(dlc)
190 * DLC timeout function is scheduled when we sent any of SABM,
193 * DLC down.
198 struct rfcomm_dlc *dlc = arg;
201 callout_ack(&dlc->rd_timeout);
203 if (dlc->rd_state != RFCOMM_DLC_CLOSED)
204 rfcomm_dlc_close(dlc, ETIMEDOUT);
205 else if (dlc->rd_flags & RFCOMM_DLC_DETACH) {
206 callout_destroy(&dlc->rd_timeout);
207 free(dlc, M_BLUETOOTH);
216 * Set link mode for DLC. This is only called when the session is
221 rfcomm_dlc_setmode(struct rfcomm_dlc *dlc)
226 KASSERT(dlc->rd_session != NULL);
227 KASSERT(dlc->rd_session->rs_state == RFCOMM_SESSION_OPEN);
229 DPRINTF("dlci %d, auth %s, encrypt %s, secure %s\n", dlc->rd_dlci,
230 (dlc->rd_mode & RFCOMM_LM_AUTH ? "yes" : "no"),
231 (dlc->rd_mode & RFCOMM_LM_ENCRYPT ? "yes" : "no"),
232 (dlc->rd_mode & RFCOMM_LM_SECURE ? "yes" : "no"));
234 if (dlc->rd_mode & RFCOMM_LM_AUTH)
237 if (dlc->rd_mode & RFCOMM_LM_ENCRYPT)
240 if (dlc->rd_mode & RFCOMM_LM_SECURE)
245 err = l2cap_setopt(dlc->rd_session->rs_l2cap, &sopt);
254 * initiate DLC connection (session is already connected)
257 rfcomm_dlc_connect(struct rfcomm_dlc *dlc)
262 KASSERT(dlc->rd_session != NULL);
263 KASSERT(dlc->rd_session->rs_state == RFCOMM_SESSION_OPEN);
264 KASSERT(dlc->rd_state == RFCOMM_DLC_WAIT_SESSION);
273 pn.dlci = dlc->rd_dlci;
274 pn.priority = dlc->rd_dlci | 0x07;
275 pn.mtu = htole16(dlc->rd_mtu);
278 dlc->rd_rxcred = (dlc->rd_rxsize / dlc->rd_mtu);
279 dlc->rd_rxcred = uimin(dlc->rd_rxcred, RFCOMM_CREDITS_DEFAULT);
280 pn.credits = dlc->rd_rxcred;
282 err = rfcomm_session_send_mcc(dlc->rd_session, 1,
287 dlc->rd_state = RFCOMM_DLC_WAIT_CONNECT;
288 callout_schedule(&dlc->rd_timeout, rfcomm_mcc_timeout * hz);
296 * send "Modem Status Command" and mark DLC as open.
299 rfcomm_dlc_open(struct rfcomm_dlc *dlc)
304 KASSERT(dlc->rd_session != NULL);
305 KASSERT(dlc->rd_session->rs_state == RFCOMM_SESSION_OPEN);
308 msc.address = RFCOMM_MKADDRESS(1, dlc->rd_dlci);
309 msc.modem = dlc->rd_lmodem & 0xfe; /* EA = 0 */
312 err = rfcomm_session_send_mcc(dlc->rd_session, 1,
317 callout_schedule(&dlc->rd_timeout, rfcomm_mcc_timeout * hz);
319 dlc->rd_state = RFCOMM_DLC_OPEN;
320 (*dlc->rd_proto->connected)(dlc->rd_upper);
328 * Start sending data (and/or credits) for DLC. Our strategy is to
336 rfcomm_dlc_start(struct rfcomm_dlc *dlc)
338 struct rfcomm_session *rs = dlc->rd_session;
344 KASSERT(dlc->rd_state == RFCOMM_DLC_OPEN);
348 len = dlc->rd_mtu;
350 credits = (dlc->rd_rxsize / dlc->rd_mtu);
351 credits -= dlc->rd_rxcred;
357 if (dlc->rd_txcred == 0)
363 if (dlc->rd_rmodem & RFCOMM_MSC_FC)
366 if (dlc->rd_pending > RFCOMM_CREDITS_DEFAULT)
370 if (dlc->rd_txbuf == NULL)
382 && dlc->rd_rxcred > RFCOMM_CREDITS_DEFAULT)
390 m = dlc->rd_txbuf;
392 dlc->rd_txbuf = m_split(m, len, M_DONTWAIT);
393 if (dlc->rd_txbuf == NULL) {
394 dlc->rd_txbuf = m;
398 dlc->rd_txbuf = NULL;
404 dlc->rd_dlci, len, credits, dlc->rd_rxcred);
406 if (rfcomm_session_send_uih(rs, dlc, credits, m)) {
408 __func__, len, dlc->rd_dlci);
413 dlc->rd_pending++;
417 dlc->rd_txcred--;
420 dlc->rd_rxcred += credits;