38#include <sys/kernel.h>
39#include <sys/endian.h>
40#include <sys/malloc.h>
77 (
ng_l2cap_con_p, u_int8_t, u_int16_t, u_int16_t, u_int16_t, u_int16_t);
97 ng_l2cap_hdr_t *hdr = NULL;
101 if (con->
rx_pkt->m_pkthdr.len <
sizeof(*hdr)) {
103"%s: %s - invalid L2CAP packet. Packet too small, len=%d\n",
105 con->
rx_pkt->m_pkthdr.len);
115 hdr = mtod(con->
rx_pkt, ng_l2cap_hdr_t *);
116 hdr->length = le16toh(hdr->length);
117 hdr->dcid = le16toh(hdr->dcid);
120 if (hdr->length != con->
rx_pkt->m_pkthdr.len -
sizeof(*hdr)) {
122"%s: %s - invalid L2CAP packet. Payload length mismatch, length=%d, len=%zd\n",
124 con->
rx_pkt->m_pkthdr.len -
sizeof(*hdr));
132 m_adj(con->
rx_pkt,
sizeof(*hdr));
136 m_adj(con->
rx_pkt,
sizeof(*hdr));
167 ng_l2cap_cmd_hdr_t *hdr = NULL;
168 struct mbuf *m = NULL;
170 while (con->
rx_pkt != NULL) {
172 if (con->
rx_pkt->m_pkthdr.len <
sizeof(*hdr)) {
174"%s: %s - invalid L2CAP signaling command. Packet too small, len=%d\n",
176 con->
rx_pkt->m_pkthdr.len);
187 hdr = mtod(con->
rx_pkt, ng_l2cap_cmd_hdr_t *);
188 hdr->length = le16toh(hdr->length);
189 m_adj(con->
rx_pkt,
sizeof(*hdr));
192 if (con->
rx_pkt->m_pkthdr.len < hdr->length) {
194"%s: %s - invalid L2CAP signaling command, code=%#x, ident=%d. " \
195"Invalid command length=%d, m_pkthdr.len=%d\n",
197 hdr->code, hdr->ident, hdr->length,
198 con->
rx_pkt->m_pkthdr.len);
205 if (con->
rx_pkt->m_pkthdr.len > hdr->length)
206 m = m_split(con->
rx_pkt, hdr->length, M_NOWAIT);
258"%s: %s - unknown L2CAP signaling command, code=%#x, ident=%d, length=%d\n",
260 hdr->code, hdr->ident, hdr->length);
282 ng_l2cap_cmd_hdr_t *hdr = NULL;
283 struct mbuf *m = NULL;
285 while (con->
rx_pkt != NULL) {
287 if (con->
rx_pkt->m_pkthdr.len <
sizeof(*hdr)) {
289"%s: %s - invalid L2CAP signaling command. Packet too small, len=%d\n",
291 con->
rx_pkt->m_pkthdr.len);
302 hdr = mtod(con->
rx_pkt, ng_l2cap_cmd_hdr_t *);
303 hdr->length = le16toh(hdr->length);
304 m_adj(con->
rx_pkt,
sizeof(*hdr));
307 if (con->
rx_pkt->m_pkthdr.len < hdr->length) {
309"%s: %s - invalid L2CAP signaling command, code=%#x, ident=%d. " \
310"Invalid command length=%d, m_pkthdr.len=%d\n",
312 hdr->code, hdr->ident, hdr->length,
313 con->
rx_pkt->m_pkthdr.len);
320 if (con->
rx_pkt->m_pkthdr.len > hdr->length)
321 m = m_split(con->
rx_pkt, hdr->length, M_NOWAIT);
340"%s: %s - unknown L2CAP signaling command, code=%#x, ident=%d, length=%d\n",
342 hdr->code, hdr->ident, hdr->length);
386 ng_l2cap_cmd_rej_cp *cp = NULL;
394 cp = mtod(con->
rx_pkt, ng_l2cap_cmd_rej_cp *);
395 cp->reason = le16toh(cp->reason);
435"%s: %s - unexpected L2CAP_CommandRej. Unexpected L2CAP command opcode=%d\n",
443"%s: %s - unexpected L2CAP_CommandRej command. " \
444"Requested ident does not exist, ident=%d\n",
460 struct mbuf *m = con->
rx_pkt;
461 ng_l2cap_con_req_cp *cp = NULL;
472 cp = mtod(m, ng_l2cap_con_req_cp *);
473 psm = le16toh(cp->psm);
474 dcid = le16toh(cp->scid);
524 struct mbuf *m = con->
rx_pkt;
525 ng_l2cap_con_rsp_cp *cp = NULL;
535 cp = mtod(m, ng_l2cap_con_rsp_cp *);
536 dcid = le16toh(cp->dcid);
537 scid = le16toh(cp->scid);
538 result = le16toh(cp->result);
539 status = le16toh(cp->status);
548"%s: %s - unexpected L2CAP_ConnectRsp command. ident=%d, con_handle=%d\n",
558"%s: %s - unexpected L2CAP_ConnectRsp. " \
559"Invalid channel state, cid=%d, state=%d\n",
568"%s: %s - unexpected L2CAP_ConnectRsp. Channel IDs do not match, scid=%d(%d)\n",
616"%s: %s - failed to open L2CAP channel, result=%d, status=%d\n",
647 struct mbuf *m = con->
rx_pkt;
648 ng_l2cap_cfg_req_cp *cp = NULL;
650 u_int16_t
dcid, respond, result;
651 ng_l2cap_cfg_opt_t hdr;
661 cp = mtod(m, ng_l2cap_cfg_req_cp *);
662 dcid = le16toh(cp->dcid);
664 m_adj(m,
sizeof(*cp));
670"%s: %s - unexpected L2CAP_ConfigReq command. " \
671"Channel does not exist, cid=%d\n",
679"%s: %s - unexpected L2CAP_ConfigReq. " \
680"Invalid channel state, cid=%d, state=%d\n",
690 for (result = 0, off = 0; ; ) {
695 }
else if (error > 0) {
721 m_adj(m, off -
sizeof(hdr));
722 m->m_pkthdr.len =
sizeof(hdr) + hdr.length;
780 struct mbuf *m = con->
rx_pkt;
781 ng_l2cap_cfg_rsp_cp *cp = NULL;
783 u_int16_t
scid, cflag, result;
784 ng_l2cap_cfg_opt_t hdr;
794 cp = mtod(m, ng_l2cap_cfg_rsp_cp *);
795 scid = le16toh(cp->scid);
797 result = le16toh(cp->result);
798 m_adj(m,
sizeof(*cp));
804"%s: %s - unexpected L2CAP_ConfigRsp command. ident=%d, con_handle=%d\n",
815"%s: %s - unexpected L2CAP_ConfigRsp. " \
816"Channel ID does not match, scid=%d(%d)\n",
825"%s: %s - unexpected L2CAP_ConfigRsp. " \
826"Invalid channel state, scid=%d, state=%d\n",
850 else if (error > 0) {
861 bcopy(&val.
flow, &
cmd->ch->oflow,
862 sizeof(
cmd->ch->oflow));
878"%s: %s - failed to parse configuration options, error=%d\n",
906"%s: %s - failed to send L2CA_Config response, error=%d\n",
934 ng_l2cap_discon_req_cp *cp = NULL;
944 cp = mtod(con->
rx_pkt, ng_l2cap_discon_req_cp *);
945 dcid = le16toh(cp->dcid);
946 scid = le16toh(cp->scid);
954"%s: %s - unexpected L2CAP_DisconnectReq message. " \
955"Channel does not exist, cid=%d\n",
964"%s: %s - unexpected L2CAP_DisconnectReq. " \
965"Invalid channel state, cid=%d, state=%d\n",
973"%s: %s - unexpected L2CAP_DisconnectReq. " \
974"Channel IDs does not match, channel: scid=%d, dcid=%d, " \
975"request: scid=%d, dcid=%d\n",
998 if (
cmd->aux == NULL) {
1036 dcid = le16toh(cp->dcid);
1037 scid = le16toh(cp->scid);
1045"%s: %s - unexpected L2CAP_DisconnectRsp command. ident=%d, con_handle=%d\n",
1054"%s: %s - unexpected L2CAP_DisconnectRsp. " \
1055"Invalid channel state, cid=%d, state=%d\n",
1064"%s: %s - unexpected L2CAP_DisconnectRsp. " \
1065"Channel IDs do not match, scid=%d(%d), dcid=%d(%d)\n",
1094 ng_l2cap_cmd_hdr_t *hdr = NULL;
1098 if (con->
rx_pkt == NULL) {
1100"%s: %s - ng_l2cap_prepend() failed, size=%zd\n",
1106 hdr = mtod(con->
rx_pkt, ng_l2cap_cmd_hdr_t *);
1109 hdr->length = htole16(con->
rx_pkt->m_pkthdr.len -
sizeof(*hdr));
1156"%s: %s - unexpected L2CAP_EchoRsp command. " \
1157"Requested ident does not exist, ident=%d\n",
1181 type = le16toh(mtod(con->
rx_pkt, ng_l2cap_info_req_cp *)->type);
1200 if (
cmd->aux == NULL) {
1221 ng_l2cap_info_rsp_cp *cp = NULL;
1230 cp = mtod(con->
rx_pkt, ng_l2cap_info_rsp_cp *);
1231 cp->type = le16toh(cp->type);
1232 cp->result = le16toh(cp->result);
1233 m_adj(con->
rx_pkt,
sizeof(*cp));
1239"%s: %s - unexpected L2CAP_InfoRsp command. " \
1240"Requested ident does not exist, ident=%d\n",
1258 if (con->
rx_pkt->m_pkthdr.len ==
sizeof(u_int16_t))
1259 *mtod(con->
rx_pkt, u_int16_t *) =
1260 le16toh(*mtod(con->
rx_pkt,u_int16_t *));
1265"%s: %s - invalid L2CAP_InfoRsp command. " \
1266"Bad connectionless MTU parameter, len=%d\n",
1268 con->
rx_pkt->m_pkthdr.len);
1274"%s: %s - invalid L2CAP_InfoRsp command. Unknown info type=%d\n",
1281 cp->result, con->
rx_pkt);
1304 if (
cmd->aux == NULL) {
1323 u_int16_t
dcid, u_int16_t result)
1332 if (
cmd->aux == NULL) {
1351 u_int16_t result,
struct mbuf *opt)
1363 if (
cmd->aux == NULL) {
1390 if (
cmd->aux == NULL) {
1418 int hint, len = m->m_pkthdr.len - (*off);
1422 if (len < 0 || len <
sizeof(*hdr))
1425 m_copydata(m, *off,
sizeof(*hdr), (caddr_t) hdr);
1426 *off +=
sizeof(*hdr);
1427 len -=
sizeof(*hdr);
1432 switch (hdr->type) {
1438 val->mtu = le16toh(val->mtu);
1448 val->flush_timo = le16toh(val->flush_timo);
1457 val->flow.token_rate = le32toh(val->flow.token_rate);
1458 val->flow.token_bucket_size =
1459 le32toh(val->flow.token_bucket_size);
1460 val->flow.peak_bandwidth = le32toh(val->flow.peak_bandwidth);
1461 val->flow.latency = le32toh(val->flow.latency);
1462 val->flow.delay_variation = le32toh(val->flow.delay_variation);
1468 *off += hdr->length;
#define NG_NODE_NAME(node)
u_int32_t bluetooth_l2cap_ertx_timeout(void)
u_int32_t bluetooth_l2cap_rtx_timeout(void)
#define NG_L2CAP_CONNLESS_MTU
#define NG_L2CAP_LESIGNAL_CID
#define NG_L2CAP_REJ_INVALID_CID
#define NG_L2CAP_L2CA_IDTYPE_LE
#define NG_L2CAP_PSM_NOT_SUPPORTED
#define NG_L2CAP_SIGNAL_CID
#define NG_L2CAP_L2CA_IDTYPE_BREDR
#define NG_L2CAP_ECHO_REQ
#define NG_L2CAP_L2CA_IDTYPE_SMP
#define NG_L2CAP_NOT_SUPPORTED
#define NG_L2CAP_OPT_QOS_SIZE
#define NG_L2CAP_W4_L2CAP_CON_RSP
#define NG_L2CAP_OPT_FLUSH_TIMO
#define NG_L2CAP_OPT_HINT(type)
#define NG_L2CAP_OPT_FLUSH_TIMO_SIZE
#define NG_L2CAP_INFO_REQ
#define NG_L2CAP_CMD_PARAM_UPDATE_REQUEST
#define NG_L2CAP_UPDATE_PARAM_ACCEPT
#define NG_L2CAP_MTU_DEFAULT
#define NG_L2CAP_OPT_MTU_SIZE
#define NG_L2CAP_L2CA_IDTYPE_ATT
ng_l2cap_discon_req_cp ng_l2cap_discon_rsp_cp
#define NG_L2CAP_ECHO_RSP
#define NG_L2CAP_OPT_CFLAG(flags)
#define NG_L2CAP_DISCON_REQ
#define NG_L2CAP_INFO_RSP
#define NG_L2CAP_W4_L2CAP_DISCON_RSP
#define NG_L2CAP_DISCON_RSP
#define NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE
ng_l2cap_cfg_opt_t * ng_l2cap_cfg_opt_p
#define NG_L2CAP_REJ_NOT_UNDERSTOOD
#define NG_L2CAP_NO_RESOURCES
#define NG_L2CAP_OPT_HINT_MASK
#define NG_L2CAP_UNKNOWN_OPTION
#define NG_L2CAP_W4_L2CA_CON_RSP
#define _ng_l2cap_info_rsp(_m, _ident, _type, _result, _mtu)
#define _ng_l2cap_discon_rsp(_m, _ident, _dcid, _scid)
#define _ng_l2cap_cmd_urs(_m, _ident, _result)
#define _ng_l2cap_cmd_rej(_m, _ident, _reason, _mtu, _scid, _dcid)
#define _ng_l2cap_con_rsp(_m, _ident, _dcid, _scid, _result, _status)
#define _ng_l2cap_cfg_rsp(_m, _ident, _scid, _flags, _result, _data)
static int ng_l2cap_process_discon_req(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_info_rsp(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_con_rsp(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_cmd_urq(ng_l2cap_con_p, u_int8_t)
static int send_l2cap_cfg_rsp(ng_l2cap_con_p, u_int8_t, u_int16_t, u_int16_t, struct mbuf *)
static int ng_l2cap_process_lesignal_cmd(ng_l2cap_con_p)
static int ng_l2cap_process_cmd_rej(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_cfg_req(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_echo_req(ng_l2cap_con_p, u_int8_t)
static int send_l2cap_con_rej(ng_l2cap_con_p, u_int8_t, u_int16_t, u_int16_t, u_int16_t)
static int ng_l2cap_process_con_req(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_discon_rsp(ng_l2cap_con_p, u_int8_t)
static int get_next_l2cap_opt(struct mbuf *, int *, ng_l2cap_cfg_opt_p, ng_l2cap_cfg_opt_val_p)
static int send_l2cap_param_urs(ng_l2cap_con_p, u_int8_t, u_int16_t)
int ng_l2cap_receive(ng_l2cap_con_p con)
static int ng_l2cap_process_info_req(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_cfg_rsp(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_cmd_urs(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_echo_rsp(ng_l2cap_con_p, u_int8_t)
static int ng_l2cap_process_signal_cmd(ng_l2cap_con_p)
static int send_l2cap_reject(ng_l2cap_con_p, u_int8_t, u_int16_t, u_int16_t, u_int16_t, u_int16_t)
void ng_l2cap_lp_deliver(ng_l2cap_con_p con)
ng_l2cap_cmd_p ng_l2cap_cmd_by_ident(ng_l2cap_con_p con, u_int8_t ident)
void ng_l2cap_free_chan(ng_l2cap_chan_p ch)
int ng_l2cap_command_untimeout(ng_l2cap_cmd_p cmd)
int ng_l2cap_command_timeout(ng_l2cap_cmd_p cmd, int timo)
struct mbuf * ng_l2cap_prepend(struct mbuf *m, int size)
ng_l2cap_cmd_p ng_l2cap_new_cmd(ng_l2cap_con_p con, ng_l2cap_chan_p ch, u_int8_t ident, u_int8_t code, u_int32_t token)
ng_l2cap_chan_p ng_l2cap_new_chan(ng_l2cap_p l2cap, ng_l2cap_con_p con, u_int16_t psm, int idtype)
ng_l2cap_chan_p ng_l2cap_chan_by_scid(ng_l2cap_p l2cap, u_int16_t scid, int idtype)
#define ng_l2cap_unlink_cmd(cmd)
#define ng_l2cap_free_cmd(cmd)
#define ng_l2cap_link_cmd(con, cmd)
int ng_l2cap_l2ca_con_rsp(ng_l2cap_chan_p ch, u_int32_t token, u_int16_t result, u_int16_t status)
int ng_l2cap_l2ca_discon_ind(ng_l2cap_chan_p ch)
int ng_l2cap_l2ca_cfg_rsp(ng_l2cap_chan_p ch, u_int32_t token, u_int16_t result)
int ng_l2cap_l2ca_receive(ng_l2cap_con_p con)
int ng_l2cap_l2ca_ping_rsp(ng_l2cap_con_p con, u_int32_t token, u_int16_t result, struct mbuf *data)
int ng_l2cap_l2ca_clt_receive(ng_l2cap_con_p con)
int ng_l2cap_l2ca_cfg_ind(ng_l2cap_chan_p ch)
int ng_l2cap_l2ca_con_ind(ng_l2cap_chan_p ch)
int ng_l2cap_l2ca_discon_rsp(ng_l2cap_chan_p ch, u_int32_t token, u_int16_t result)
int ng_l2cap_l2ca_get_info_rsp(ng_l2cap_con_p con, u_int32_t token, u_int16_t result, struct mbuf *data)
#define NG_L2CAP_M_PULLUP(m, s)