Lines Matching refs:chan
64 struct l2cap_channel *chan;
70 chan = malloc(sizeof(struct l2cap_channel), M_BLUETOOTH,
72 if (chan == NULL)
75 chan->lc_proto = proto;
76 chan->lc_upper = upper;
78 chan->lc_state = L2CAP_CLOSED;
80 chan->lc_lcid = L2CAP_NULL_CID;
81 chan->lc_rcid = L2CAP_NULL_CID;
83 chan->lc_laddr.bt_len = sizeof(struct sockaddr_bt);
84 chan->lc_laddr.bt_family = AF_BLUETOOTH;
85 chan->lc_laddr.bt_psm = L2CAP_PSM_ANY;
87 chan->lc_raddr.bt_len = sizeof(struct sockaddr_bt);
88 chan->lc_raddr.bt_family = AF_BLUETOOTH;
89 chan->lc_raddr.bt_psm = L2CAP_PSM_ANY;
91 chan->lc_imtu = L2CAP_MTU_DEFAULT;
92 chan->lc_omtu = L2CAP_MTU_DEFAULT;
93 chan->lc_flush = L2CAP_FLUSH_TIMO_DEFAULT;
95 memcpy(&chan->lc_iqos, &l2cap_default_qos, sizeof(l2cap_qos_t));
96 memcpy(&chan->lc_oqos, &l2cap_default_qos, sizeof(l2cap_qos_t));
98 MBUFQ_INIT(&chan->lc_txq);
100 *handle = chan;
110 l2cap_bind_pcb(struct l2cap_channel *chan, struct sockaddr_bt *addr)
113 if (chan->lc_lcid != L2CAP_NULL_CID)
116 memcpy(&chan->lc_laddr, addr, sizeof(struct sockaddr_bt));
126 l2cap_sockaddr_pcb(struct l2cap_channel *chan, struct sockaddr_bt *addr)
129 memcpy(addr, &chan->lc_laddr, sizeof(struct sockaddr_bt));
147 l2cap_connect_pcb(struct l2cap_channel *chan, struct sockaddr_bt *dest)
152 memcpy(&chan->lc_raddr, dest, sizeof(struct sockaddr_bt));
154 if (L2CAP_PSM_INVALID(chan->lc_raddr.bt_psm))
157 if (bdaddr_any(&chan->lc_raddr.bt_bdaddr))
161 if (bdaddr_any(&chan->lc_laddr.bt_bdaddr)) {
162 err = hci_route_lookup(&chan->lc_laddr.bt_bdaddr,
163 &chan->lc_raddr.bt_bdaddr);
168 unit = hci_unit_lookup(&chan->lc_laddr.bt_bdaddr);
173 err = l2cap_cid_alloc(chan);
178 chan->lc_link = hci_acl_open(unit, &chan->lc_raddr.bt_bdaddr);
179 if (chan->lc_link == NULL)
183 err = l2cap_setmode(chan);
185 chan->lc_state = L2CAP_WAIT_SEND_CONNECT_REQ;
186 (*chan->lc_proto->connecting)(chan->lc_upper);
197 chan->lc_state = L2CAP_WAIT_RECV_CONNECT_RSP;
198 err = l2cap_send_connect_req(chan);
205 chan->lc_state = L2CAP_CLOSED;
206 hci_acl_close(chan->lc_link, err);
207 chan->lc_link = NULL;
217 l2cap_peeraddr_pcb(struct l2cap_channel *chan, struct sockaddr_bt *addr)
220 memcpy(addr, &chan->lc_raddr, sizeof(struct sockaddr_bt));
238 l2cap_disconnect_pcb(struct l2cap_channel *chan, int linger)
242 if (chan->lc_state == L2CAP_CLOSED
243 || chan->lc_state == L2CAP_WAIT_DISCONNECT)
246 chan->lc_flags |= L2CAP_SHUTDOWN;
252 if ((MBUFQ_FIRST(&chan->lc_txq) == NULL && chan->lc_pending == 0)
254 chan->lc_state = L2CAP_WAIT_DISCONNECT;
255 err = l2cap_send_disconnect_req(chan);
257 l2cap_close(chan, err);
270 struct l2cap_channel *chan;
272 chan = *handle;
275 if (chan->lc_state != L2CAP_CLOSED)
276 l2cap_close(chan, 0);
278 if (chan->lc_lcid != L2CAP_NULL_CID) {
279 LIST_REMOVE(chan, lc_ncid);
280 chan->lc_lcid = L2CAP_NULL_CID;
283 MBUFQ_DRAIN(&chan->lc_txq);
290 free(chan, M_BLUETOOTH);
311 l2cap_listen_pcb(struct l2cap_channel *chan)
316 if (chan->lc_lcid != L2CAP_NULL_CID)
323 if (chan->lc_laddr.bt_psm == L2CAP_PSM_ANY) {
336 chan->lc_laddr.bt_psm = psm;
337 } else if (L2CAP_PSM_INVALID(chan->lc_laddr.bt_psm))
346 chan->lc_lcid = L2CAP_SIGNAL_CID;
355 if (used->lc_laddr.bt_psm < chan->lc_laddr.bt_psm)
358 if (used->lc_laddr.bt_psm == chan->lc_laddr.bt_psm
360 && !bdaddr_any(&chan->lc_laddr.bt_bdaddr))
367 LIST_INSERT_HEAD(&l2cap_listen_list, chan, lc_ncid);
369 LIST_INSERT_AFTER(prev, chan, lc_ncid);
397 l2cap_send_pcb(struct l2cap_channel *chan, struct mbuf *m)
402 if (chan->lc_state == L2CAP_CLOSED) {
410 plen, chan->lc_lcid, chan->lc_pending);
419 hdr->dcid = htole16(chan->lc_rcid);
422 MBUFQ_ENQUEUE(&chan->lc_txq, m);
425 if (chan->lc_pending == 0)
426 return l2cap_start(chan);
445 l2cap_setopt(struct l2cap_channel *chan, const struct sockopt *sopt)
458 else if (chan->lc_state == L2CAP_CLOSED)
459 chan->lc_imtu = mtu;
478 chan->lc_mode = mode;
480 if (chan->lc_state == L2CAP_OPEN)
481 err = l2cap_setmode(chan);
501 l2cap_getopt(struct l2cap_channel *chan, struct sockopt *sopt)
506 return sockopt_set(sopt, &chan->lc_imtu, sizeof(uint16_t));
509 return sockopt_set(sopt, &chan->lc_omtu, sizeof(uint16_t));
512 return sockopt_set(sopt, &chan->lc_iqos, sizeof(l2cap_qos_t));
515 return sockopt_set(sopt, &chan->lc_oqos, sizeof(l2cap_qos_t));
518 return sockopt_set(sopt, &chan->lc_flush, sizeof(uint16_t));
521 return sockopt_setint(sopt, chan->lc_mode);