• Home
  • Raw
  • Download

Lines Matching refs:l2cap

53         struct l2cap_instance_s *l2cap;  member
94 struct l2cap_instance_s l2cap; member
185 static void l2cap_command_reject(struct l2cap_instance_s *l2cap, int id, in l2cap_command_reject() argument
196 pkt = l2cap->signalling_ch.params.sdu_out(&l2cap->signalling_ch.params, in l2cap_command_reject()
208 l2cap->signalling_ch.params.sdu_submit(&l2cap->signalling_ch.params); in l2cap_command_reject()
211 static void l2cap_command_reject_cid(struct l2cap_instance_s *l2cap, int id, in l2cap_command_reject_cid() argument
219 l2cap_command_reject(l2cap, id, reason, &params, L2CAP_CMD_REJ_CID_SIZE); in l2cap_command_reject_cid()
222 static void l2cap_connection_response(struct l2cap_instance_s *l2cap, in l2cap_connection_response() argument
229 pkt = l2cap->signalling_ch.params.sdu_out(&l2cap->signalling_ch.params, in l2cap_connection_response()
235 hdr->ident = l2cap->last_id; in l2cap_connection_response()
243 l2cap->signalling_ch.params.sdu_submit(&l2cap->signalling_ch.params); in l2cap_connection_response()
246 static void l2cap_configuration_request(struct l2cap_instance_s *l2cap, in l2cap_configuration_request() argument
253 pkt = l2cap->signalling_ch.params.sdu_out(&l2cap->signalling_ch.params, in l2cap_configuration_request()
259 l2cap->last_id = l2cap->next_id; in l2cap_configuration_request()
260 l2cap->next_id = l2cap->next_id == 255 ? 1 : l2cap->next_id + 1; in l2cap_configuration_request()
263 hdr->ident = l2cap->last_id; in l2cap_configuration_request()
271 l2cap->signalling_ch.params.sdu_submit(&l2cap->signalling_ch.params); in l2cap_configuration_request()
274 static void l2cap_configuration_response(struct l2cap_instance_s *l2cap, in l2cap_configuration_response() argument
281 pkt = l2cap->signalling_ch.params.sdu_out(&l2cap->signalling_ch.params, in l2cap_configuration_response()
287 hdr->ident = l2cap->last_id; in l2cap_configuration_response()
296 l2cap->signalling_ch.params.sdu_submit(&l2cap->signalling_ch.params); in l2cap_configuration_response()
299 static void l2cap_disconnection_response(struct l2cap_instance_s *l2cap, in l2cap_disconnection_response() argument
306 pkt = l2cap->signalling_ch.params.sdu_out(&l2cap->signalling_ch.params, in l2cap_disconnection_response()
312 hdr->ident = l2cap->last_id; in l2cap_disconnection_response()
318 l2cap->signalling_ch.params.sdu_submit(&l2cap->signalling_ch.params); in l2cap_disconnection_response()
321 static void l2cap_echo_response(struct l2cap_instance_s *l2cap, in l2cap_echo_response() argument
328 pkt = l2cap->signalling_ch.params.sdu_out(&l2cap->signalling_ch.params, in l2cap_echo_response()
334 hdr->ident = l2cap->last_id; in l2cap_echo_response()
339 l2cap->signalling_ch.params.sdu_submit(&l2cap->signalling_ch.params); in l2cap_echo_response()
342 static void l2cap_info_response(struct l2cap_instance_s *l2cap, int type, in l2cap_info_response() argument
349 pkt = l2cap->signalling_ch.params.sdu_out(&l2cap->signalling_ch.params, in l2cap_info_response()
355 hdr->ident = l2cap->last_id; in l2cap_info_response()
363 l2cap->signalling_ch.params.sdu_submit(&l2cap->signalling_ch.params); in l2cap_info_response()
377 static int l2cap_cid_new(struct l2cap_instance_s *l2cap) in l2cap_cid_new() argument
382 if (!l2cap->cid[i]) in l2cap_cid_new()
399 static struct l2cap_chan_s *l2cap_channel_open(struct l2cap_instance_s *l2cap, in l2cap_channel_open() argument
405 int cid = l2cap_cid_new(l2cap); in l2cap_channel_open()
409 psm_info = l2cap_psm(l2cap->dev, psm); in l2cap_channel_open()
422 ch->l2cap = l2cap; in l2cap_channel_open()
425 if (!psm_info->new_channel(l2cap->dev, &ch->params)) { in l2cap_channel_open()
426 l2cap->cid[cid] = ch; in l2cap_channel_open()
445 l2cap_connection_response(l2cap, cid, source_cid, result, status); in l2cap_channel_open()
450 static void l2cap_channel_close(struct l2cap_instance_s *l2cap, in l2cap_channel_close() argument
459 l2cap_command_reject_cid(l2cap, l2cap->last_id, L2CAP_REJ_CID_INVAL, in l2cap_channel_close()
464 ch = l2cap->cid[cid]; in l2cap_channel_close()
473 l2cap->cid[cid] = NULL; in l2cap_channel_close()
479 l2cap_disconnection_response(l2cap, cid, source_cid); in l2cap_channel_close()
482 static void l2cap_channel_config_null(struct l2cap_instance_s *l2cap, in l2cap_channel_config_null() argument
485 l2cap_configuration_request(l2cap, ch->remote_cid, 0, NULL, 0); in l2cap_channel_config_null()
486 ch->config_req_id = l2cap->last_id; in l2cap_channel_config_null()
490 static void l2cap_channel_config_req_event(struct l2cap_instance_s *l2cap, in l2cap_channel_config_req_event() argument
494 l2cap_channel_config_null(l2cap, ch); in l2cap_channel_config_req_event()
497 static int l2cap_channel_config(struct l2cap_instance_s *l2cap, in l2cap_channel_config() argument
677 l2cap_configuration_response(l2cap, ch->remote_cid, in l2cap_channel_config()
683 static void l2cap_channel_config_req_msg(struct l2cap_instance_s *l2cap, in l2cap_channel_config_req_msg() argument
688 if (unlikely(cid >= L2CAP_CID_MAX || !l2cap->cid[cid])) { in l2cap_channel_config_req_msg()
689 l2cap_command_reject_cid(l2cap, l2cap->last_id, L2CAP_REJ_CID_INVAL, in l2cap_channel_config_req_msg()
693 ch = l2cap->cid[cid]; in l2cap_channel_config_req_msg()
702 if (l2cap_channel_config(l2cap, ch, flag, data, len)) in l2cap_channel_config_req_msg()
712 l2cap_channel_config_req_event(l2cap, ch); in l2cap_channel_config_req_msg()
715 static int l2cap_channel_config_rsp_msg(struct l2cap_instance_s *l2cap, in l2cap_channel_config_rsp_msg() argument
720 if (unlikely(cid >= L2CAP_CID_MAX || !l2cap->cid[cid])) { in l2cap_channel_config_rsp_msg()
721 l2cap_command_reject_cid(l2cap, l2cap->last_id, L2CAP_REJ_CID_INVAL, in l2cap_channel_config_rsp_msg()
725 ch = l2cap->cid[cid]; in l2cap_channel_config_rsp_msg()
727 if (ch->config_req_id != l2cap->last_id) in l2cap_channel_config_rsp_msg()
735 l2cap_channel_config_null(l2cap, ch); in l2cap_channel_config_rsp_msg()
738 l2cap_channel_config_req_event(l2cap, ch); in l2cap_channel_config_rsp_msg()
743 static void l2cap_channel_open_req_msg(struct l2cap_instance_s *l2cap, in l2cap_channel_open_req_msg() argument
746 struct l2cap_chan_s *ch = l2cap_channel_open(l2cap, psm, source_cid); in l2cap_channel_open_req_msg()
753 l2cap_channel_config_req_event(l2cap, ch); in l2cap_channel_open_req_msg()
756 static void l2cap_info(struct l2cap_instance_s *l2cap, int type) in l2cap_info() argument
764 data[len ++] = l2cap->group_ch.mps & 0xff; in l2cap_info()
765 data[len ++] = l2cap->group_ch.mps >> 8; in l2cap_info()
780 l2cap_info_response(l2cap, type, result, data, len); in l2cap_info()
783 static void l2cap_command(struct l2cap_instance_s *l2cap, int code, int id, in l2cap_command() argument
790 if (!id || (id != l2cap->last_id && id != l2cap->next_id)) { in l2cap_command()
796 l2cap->next_id = id; in l2cap_command()
798 if (id == l2cap->next_id) { in l2cap_command()
799 l2cap->last_id = l2cap->next_id; in l2cap_command()
800 l2cap->next_id = l2cap->next_id == 255 ? 1 : l2cap->next_id + 1; in l2cap_command()
825 l2cap_channel_open_req_msg(l2cap, in l2cap_command()
847 l2cap_channel_config_req_msg(l2cap, in l2cap_command()
860 if (l2cap_channel_config_rsp_msg(l2cap, in l2cap_command()
876 l2cap_channel_close(l2cap, in l2cap_command()
893 l2cap_echo_response(l2cap, params, len); in l2cap_command()
908 l2cap_info(l2cap, le16_to_cpu(((l2cap_info_req *) params)->type)); in l2cap_command()
925 l2cap_command_reject(l2cap, id, err, 0, 0); in l2cap_command()
941 struct l2cap_instance_s *l2cap = opaque; in l2cap_cframe_in() local
955 l2cap_command_reject(l2cap, hdr->ident, in l2cap_cframe_in()
960 l2cap_command(l2cap, hdr->code, hdr->ident, data, clen); in l2cap_cframe_in()
1057 static void l2cap_frame_in(struct l2cap_instance_s *l2cap, in l2cap_frame_in() argument
1063 if (unlikely(cid >= L2CAP_CID_MAX || !l2cap->cid[cid])) { in l2cap_frame_in()
1069 l2cap->cid[cid]->frame_in(l2cap->cid[cid], cid, frame, len); in l2cap_frame_in()
1073 static void l2cap_pdu_in(struct l2cap_instance_s *l2cap, in l2cap_pdu_in() argument
1076 const l2cap_hdr *hdr = (void *) l2cap->frame_in; in l2cap_pdu_in()
1078 if (unlikely(len + l2cap->frame_in_len > sizeof(l2cap->frame_in))) { in l2cap_pdu_in()
1079 if (l2cap->frame_in_len < sizeof(l2cap->frame_in)) { in l2cap_pdu_in()
1080 memcpy(l2cap->frame_in + l2cap->frame_in_len, data, in l2cap_pdu_in()
1081 sizeof(l2cap->frame_in) - l2cap->frame_in_len); in l2cap_pdu_in()
1082 l2cap->frame_in_len = sizeof(l2cap->frame_in); in l2cap_pdu_in()
1084 l2cap_frame_in(l2cap, hdr); in l2cap_pdu_in()
1090 memcpy(l2cap->frame_in + l2cap->frame_in_len, data, len); in l2cap_pdu_in()
1091 l2cap->frame_in_len += len; in l2cap_pdu_in()
1095 l2cap_frame_in(l2cap, hdr); in l2cap_pdu_in()
1100 static inline uint8_t *l2cap_pdu_out(struct l2cap_instance_s *l2cap, in l2cap_pdu_out() argument
1103 l2cap_hdr *hdr = (void *) l2cap->frame_out; in l2cap_pdu_out()
1105 l2cap->frame_out_len = len + L2CAP_HDR_SIZE; in l2cap_pdu_out()
1110 return l2cap->frame_out + L2CAP_HDR_SIZE; in l2cap_pdu_out()
1113 static inline void l2cap_pdu_submit(struct l2cap_instance_s *l2cap) in l2cap_pdu_submit() argument
1116 (l2cap->role ? in l2cap_pdu_submit()
1117 l2cap->link->slave->lmp_acl_data : l2cap->link->host->lmp_acl_resp) in l2cap_pdu_submit()
1118 (l2cap->link, l2cap->frame_out, 1, l2cap->frame_out_len); in l2cap_pdu_submit()
1132 return l2cap_pdu_out(chan->l2cap, chan->remote_cid, len); in l2cap_bframe_out()
1139 return l2cap_pdu_submit(chan->l2cap); in l2cap_bframe_submit()
1170 static void l2cap_init(struct l2cap_instance_s *l2cap, in l2cap_init() argument
1173 l2cap->link = link; in l2cap_init()
1174 l2cap->role = role; in l2cap_init()
1175 l2cap->dev = (struct bt_l2cap_device_s *) in l2cap_init()
1178 l2cap->next_id = 1; in l2cap_init()
1181 l2cap->signalling_ch.params.sdu_in = l2cap_cframe_in; in l2cap_init()
1182 l2cap->signalling_ch.params.sdu_out = l2cap_bframe_out; in l2cap_init()
1183 l2cap->signalling_ch.params.sdu_submit = l2cap_bframe_submit; in l2cap_init()
1184 l2cap->signalling_ch.params.opaque = l2cap; in l2cap_init()
1185 l2cap->signalling_ch.params.remote_mtu = 48; in l2cap_init()
1186 l2cap->signalling_ch.remote_cid = L2CAP_CID_SIGNALLING; in l2cap_init()
1187 l2cap->signalling_ch.frame_in = l2cap_bframe_in; in l2cap_init()
1188 l2cap->signalling_ch.mps = 65536; in l2cap_init()
1189 l2cap->signalling_ch.min_mtu = 48; in l2cap_init()
1190 l2cap->signalling_ch.mode = L2CAP_MODE_BASIC; in l2cap_init()
1191 l2cap->signalling_ch.l2cap = l2cap; in l2cap_init()
1192 l2cap->cid[L2CAP_CID_SIGNALLING] = &l2cap->signalling_ch; in l2cap_init()
1195 l2cap->group_ch.params.sdu_in = l2cap_gframe_in; in l2cap_init()
1196 l2cap->group_ch.params.opaque = l2cap; in l2cap_init()
1197 l2cap->group_ch.frame_in = l2cap_bframe_in; in l2cap_init()
1198 l2cap->group_ch.mps = 65533; in l2cap_init()
1199 l2cap->group_ch.l2cap = l2cap; in l2cap_init()
1200 l2cap->group_ch.remote_cid = L2CAP_CID_INVALID; in l2cap_init()
1201 l2cap->cid[L2CAP_CID_GROUP] = &l2cap->group_ch; in l2cap_init()
1204 static void l2cap_teardown(struct l2cap_instance_s *l2cap, int send_disconnect) in l2cap_teardown() argument
1211 if (l2cap->role) in l2cap_teardown()
1212 l2cap->dev->device.lmp_disconnect_slave(l2cap->link); in l2cap_teardown()
1215 l2cap->dev->device.lmp_disconnect_master(l2cap->link); in l2cap_teardown()
1219 if (l2cap->cid[cid]) { in l2cap_teardown()
1220 l2cap->cid[cid]->params.close(l2cap->cid[cid]->params.opaque); in l2cap_teardown()
1221 qemu_free(l2cap->cid[cid]); in l2cap_teardown()
1224 if (l2cap->role) in l2cap_teardown()
1225 qemu_free(l2cap); in l2cap_teardown()
1227 qemu_free(l2cap->link); in l2cap_teardown()
1235 struct slave_l2cap_instance_s *l2cap; in l2cap_lmp_connection_request() local
1239 l2cap = qemu_mallocz(sizeof(struct slave_l2cap_instance_s)); in l2cap_lmp_connection_request()
1240 l2cap->link.slave = &dev->device; in l2cap_lmp_connection_request()
1241 l2cap->link.host = link->host; in l2cap_lmp_connection_request()
1242 l2cap_init(&l2cap->l2cap, &l2cap->link, 0); in l2cap_lmp_connection_request()
1246 link->host->lmp_connection_complete(&l2cap->link); in l2cap_lmp_connection_request()
1253 struct l2cap_instance_s *l2cap; in l2cap_lmp_connection_complete() local
1260 l2cap = qemu_mallocz(sizeof(struct l2cap_instance_s)); in l2cap_lmp_connection_complete()
1261 l2cap_init(l2cap, link, 1); in l2cap_lmp_connection_complete()
1272 struct l2cap_instance_s *l2cap = in l2cap_lmp_disconnect_host() local
1277 l2cap_teardown(l2cap, 0); in l2cap_lmp_disconnect_host()
1282 struct slave_l2cap_instance_s *l2cap = in l2cap_lmp_disconnect_slave() local
1285 l2cap_teardown(&l2cap->l2cap, 0); in l2cap_lmp_disconnect_slave()
1291 struct slave_l2cap_instance_s *l2cap = in l2cap_lmp_acl_data_slave() local
1295 l2cap->l2cap.frame_in_len = 0; in l2cap_lmp_acl_data_slave()
1297 l2cap_pdu_in(&l2cap->l2cap, data, len); in l2cap_lmp_acl_data_slave()
1305 struct l2cap_instance_s *l2cap = in l2cap_lmp_acl_data_host() local
1309 l2cap->frame_in_len = 0; in l2cap_lmp_acl_data_host()
1311 l2cap_pdu_in(l2cap, data, len); in l2cap_lmp_acl_data_host()