rfcomm.c (787071125c0ce7868f6249c10a43bdd6755f13c7) rfcomm.c (f8fbdce0c5067e7e7edd3a29934b1f9b79c8ff2d)
1/*
2 * Copyright (C) 2014 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 91 unchanged lines hidden (view full) ---

100static void rfcomm_emit_connection_request(rfcomm_channel_t *channel) {
101 log_info("RFCOMM_EVENT_INCOMING_CONNECTION addr %s channel #%u cid 0x%02x",
102 bd_addr_to_str(channel->multiplexer->remote_addr), channel->dlci>>1, channel->rfcomm_cid);
103 uint8_t event[11];
104 event[0] = RFCOMM_EVENT_INCOMING_CONNECTION;
105 event[1] = sizeof(event) - 2;
106 bt_flip_addr(&event[2], channel->multiplexer->remote_addr);
107 event[8] = channel->dlci >> 1;
1/*
2 * Copyright (C) 2014 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 91 unchanged lines hidden (view full) ---

100static void rfcomm_emit_connection_request(rfcomm_channel_t *channel) {
101 log_info("RFCOMM_EVENT_INCOMING_CONNECTION addr %s channel #%u cid 0x%02x",
102 bd_addr_to_str(channel->multiplexer->remote_addr), channel->dlci>>1, channel->rfcomm_cid);
103 uint8_t event[11];
104 event[0] = RFCOMM_EVENT_INCOMING_CONNECTION;
105 event[1] = sizeof(event) - 2;
106 bt_flip_addr(&event[2], channel->multiplexer->remote_addr);
107 event[8] = channel->dlci >> 1;
108 bt_store_16(event, 9, channel->rfcomm_cid);
108 little_endian_store_16(event, 9, channel->rfcomm_cid);
109 hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
110 (*app_packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, sizeof(event));
111}
112
113// API Change: BTstack-0.3.50x uses
114// data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16)
115// next Cydia release will use SVN version of this
116// data: event(8), len(8), status (8), address (48), handle (16), server channel(8), rfcomm_cid(16), max frame size(16)
117static void rfcomm_emit_channel_opened(rfcomm_channel_t *channel, uint8_t status) {
118 log_info("RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE status 0x%x addr %s handle 0x%x channel #%u cid 0x%02x mtu %u",
119 status, bd_addr_to_str(channel->multiplexer->remote_addr), channel->multiplexer->con_handle,
120 channel->dlci>>1, channel->rfcomm_cid, channel->max_frame_size);
121 uint8_t event[16];
122 uint8_t pos = 0;
123 event[pos++] = RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE; // 0
124 event[pos++] = sizeof(event) - 2; // 1
125 event[pos++] = status; // 2
126 bt_flip_addr(&event[pos], channel->multiplexer->remote_addr); pos += 6; // 3
109 hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
110 (*app_packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, sizeof(event));
111}
112
113// API Change: BTstack-0.3.50x uses
114// data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16)
115// next Cydia release will use SVN version of this
116// data: event(8), len(8), status (8), address (48), handle (16), server channel(8), rfcomm_cid(16), max frame size(16)
117static void rfcomm_emit_channel_opened(rfcomm_channel_t *channel, uint8_t status) {
118 log_info("RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE status 0x%x addr %s handle 0x%x channel #%u cid 0x%02x mtu %u",
119 status, bd_addr_to_str(channel->multiplexer->remote_addr), channel->multiplexer->con_handle,
120 channel->dlci>>1, channel->rfcomm_cid, channel->max_frame_size);
121 uint8_t event[16];
122 uint8_t pos = 0;
123 event[pos++] = RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE; // 0
124 event[pos++] = sizeof(event) - 2; // 1
125 event[pos++] = status; // 2
126 bt_flip_addr(&event[pos], channel->multiplexer->remote_addr); pos += 6; // 3
127 bt_store_16(event, pos, channel->multiplexer->con_handle); pos += 2; // 9
127 little_endian_store_16(event, pos, channel->multiplexer->con_handle); pos += 2; // 9
128 event[pos++] = channel->dlci >> 1; // 11
128 event[pos++] = channel->dlci >> 1; // 11
129 bt_store_16(event, pos, channel->rfcomm_cid); pos += 2; // 12 - channel ID
130 bt_store_16(event, pos, channel->max_frame_size); pos += 2; // max frame size
129 little_endian_store_16(event, pos, channel->rfcomm_cid); pos += 2; // 12 - channel ID
130 little_endian_store_16(event, pos, channel->max_frame_size); pos += 2; // max frame size
131 hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
132 (*app_packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, pos);
133}
134
135// data: event(8), len(8), rfcomm_cid(16)
136static void rfcomm_emit_channel_closed(rfcomm_channel_t * channel) {
137 log_info("RFCOMM_EVENT_CHANNEL_CLOSED cid 0x%02x", channel->rfcomm_cid);
138 uint8_t event[4];
139 event[0] = RFCOMM_EVENT_CHANNEL_CLOSED;
140 event[1] = sizeof(event) - 2;
131 hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
132 (*app_packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, pos);
133}
134
135// data: event(8), len(8), rfcomm_cid(16)
136static void rfcomm_emit_channel_closed(rfcomm_channel_t * channel) {
137 log_info("RFCOMM_EVENT_CHANNEL_CLOSED cid 0x%02x", channel->rfcomm_cid);
138 uint8_t event[4];
139 event[0] = RFCOMM_EVENT_CHANNEL_CLOSED;
140 event[1] = sizeof(event) - 2;
141 bt_store_16(event, 2, channel->rfcomm_cid);
141 little_endian_store_16(event, 2, channel->rfcomm_cid);
142 hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
143 (*app_packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, sizeof(event));
144}
145
146static void rfcomm_emit_remote_line_status(rfcomm_channel_t *channel, uint8_t line_status){
147 log_info("RFCOMM_EVENT_REMOTE_LINE_STATUS cid 0x%02x c, line status 0x%x", channel->rfcomm_cid, line_status);
148 uint8_t event[5];
149 event[0] = RFCOMM_EVENT_REMOTE_LINE_STATUS;
150 event[1] = sizeof(event) - 2;
142 hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event));
143 (*app_packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, sizeof(event));
144}
145
146static void rfcomm_emit_remote_line_status(rfcomm_channel_t *channel, uint8_t line_status){
147 log_info("RFCOMM_EVENT_REMOTE_LINE_STATUS cid 0x%02x c, line status 0x%x", channel->rfcomm_cid, line_status);
148 uint8_t event[5];
149 event[0] = RFCOMM_EVENT_REMOTE_LINE_STATUS;
150 event[1] = sizeof(event) - 2;
151 bt_store_16(event, 2, channel->rfcomm_cid);
151 little_endian_store_16(event, 2, channel->rfcomm_cid);
152 event[4] = line_status;
153 hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
154 (*app_packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, sizeof(event));
155}
156
157static void rfcomm_emit_port_configuration(rfcomm_channel_t *channel){
158 // notify client about new settings
159 uint8_t event[2+sizeof(rfcomm_rpn_data_t)];

--- 610 unchanged lines hidden (view full) ---

770 uint8_t status;
771
772 switch (packet[0]) {
773
774 // accept incoming PSM_RFCOMM connection if no multiplexer exists yet
775 case L2CAP_EVENT_INCOMING_CONNECTION:
776 // data: event(8), len(8), address(48), handle (16), psm (16), source cid(16) dest cid(16)
777 bt_flip_addr(event_addr, &packet[2]);
152 event[4] = line_status;
153 hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
154 (*app_packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, sizeof(event));
155}
156
157static void rfcomm_emit_port_configuration(rfcomm_channel_t *channel){
158 // notify client about new settings
159 uint8_t event[2+sizeof(rfcomm_rpn_data_t)];

--- 610 unchanged lines hidden (view full) ---

770 uint8_t status;
771
772 switch (packet[0]) {
773
774 // accept incoming PSM_RFCOMM connection if no multiplexer exists yet
775 case L2CAP_EVENT_INCOMING_CONNECTION:
776 // data: event(8), len(8), address(48), handle (16), psm (16), source cid(16) dest cid(16)
777 bt_flip_addr(event_addr, &packet[2]);
778 con_handle = READ_BT_16(packet, 8);
779 psm = READ_BT_16(packet, 10);
780 l2cap_cid = READ_BT_16(packet, 12);
778 con_handle = little_endian_read_16(packet, 8);
779 psm = little_endian_read_16(packet, 10);
780 l2cap_cid = little_endian_read_16(packet, 12);
781
782 if (psm != PSM_RFCOMM) break;
783
784 multiplexer = rfcomm_multiplexer_for_addr(event_addr);
785
786 if (multiplexer) {
787 log_info("INCOMING_CONNECTION (l2cap_cid 0x%02x) for PSM_RFCOMM => decline - multiplexer already exists", l2cap_cid);
788 l2cap_decline_connection(l2cap_cid, 0x04); // no resources available

--- 14 unchanged lines hidden (view full) ---

803
804 log_info("L2CAP_EVENT_INCOMING_CONNECTION (l2cap_cid 0x%02x) for PSM_RFCOMM => accept", l2cap_cid);
805 l2cap_accept_connection(l2cap_cid);
806 return 1;
807
808 // l2cap connection opened -> store l2cap_cid, remote_addr
809 case L2CAP_EVENT_CHANNEL_OPENED:
810
781
782 if (psm != PSM_RFCOMM) break;
783
784 multiplexer = rfcomm_multiplexer_for_addr(event_addr);
785
786 if (multiplexer) {
787 log_info("INCOMING_CONNECTION (l2cap_cid 0x%02x) for PSM_RFCOMM => decline - multiplexer already exists", l2cap_cid);
788 l2cap_decline_connection(l2cap_cid, 0x04); // no resources available

--- 14 unchanged lines hidden (view full) ---

803
804 log_info("L2CAP_EVENT_INCOMING_CONNECTION (l2cap_cid 0x%02x) for PSM_RFCOMM => accept", l2cap_cid);
805 l2cap_accept_connection(l2cap_cid);
806 return 1;
807
808 // l2cap connection opened -> store l2cap_cid, remote_addr
809 case L2CAP_EVENT_CHANNEL_OPENED:
810
811 if (READ_BT_16(packet, 11) != PSM_RFCOMM) break;
811 if (little_endian_read_16(packet, 11) != PSM_RFCOMM) break;
812
813 status = packet[2];
814 log_info("L2CAP_EVENT_CHANNEL_OPENED for PSM_RFCOMM, status %u", status);
815
816 // get multiplexer for remote addr
812
813 status = packet[2];
814 log_info("L2CAP_EVENT_CHANNEL_OPENED for PSM_RFCOMM, status %u", status);
815
816 // get multiplexer for remote addr
817 con_handle = READ_BT_16(packet, 9);
818 l2cap_cid = READ_BT_16(packet, 13);
817 con_handle = little_endian_read_16(packet, 9);
818 l2cap_cid = little_endian_read_16(packet, 13);
819 bt_flip_addr(event_addr, &packet[3]);
820 multiplexer = rfcomm_multiplexer_for_addr(event_addr);
821 if (!multiplexer) {
822 log_error("L2CAP_EVENT_CHANNEL_OPENED but no multiplexer prepared");
823 return 1;
824 }
825
826 // on l2cap open error discard everything

--- 26 unchanged lines hidden (view full) ---

853 if (BD_ADDR_CMP(event_addr, multiplexer->remote_addr)) break;
854 multiplexer->l2cap_cid = l2cap_cid;
855 multiplexer->con_handle = con_handle;
856 // send SABM #0
857 multiplexer->state = RFCOMM_MULTIPLEXER_SEND_SABM_0;
858 } else { // multiplexer->state == RFCOMM_MULTIPLEXER_W4_SABM_0
859
860 // set max frame size based on l2cap MTU
819 bt_flip_addr(event_addr, &packet[3]);
820 multiplexer = rfcomm_multiplexer_for_addr(event_addr);
821 if (!multiplexer) {
822 log_error("L2CAP_EVENT_CHANNEL_OPENED but no multiplexer prepared");
823 return 1;
824 }
825
826 // on l2cap open error discard everything

--- 26 unchanged lines hidden (view full) ---

853 if (BD_ADDR_CMP(event_addr, multiplexer->remote_addr)) break;
854 multiplexer->l2cap_cid = l2cap_cid;
855 multiplexer->con_handle = con_handle;
856 // send SABM #0
857 multiplexer->state = RFCOMM_MULTIPLEXER_SEND_SABM_0;
858 } else { // multiplexer->state == RFCOMM_MULTIPLEXER_W4_SABM_0
859
860 // set max frame size based on l2cap MTU
861 multiplexer->max_frame_size = rfcomm_max_frame_size_for_l2cap_mtu(READ_BT_16(packet, 17));
861 multiplexer->max_frame_size = rfcomm_max_frame_size_for_l2cap_mtu(little_endian_read_16(packet, 17));
862 }
863 return 1;
864
865 // l2cap disconnect -> state = RFCOMM_MULTIPLEXER_CLOSED;
866
867 case DAEMON_EVENT_HCI_PACKET_SENT:
868 // testing DMA done code
869 rfcomm_run();
870 break;
871
872 case L2CAP_EVENT_CHANNEL_CLOSED:
873 // data: event (8), len(8), channel (16)
862 }
863 return 1;
864
865 // l2cap disconnect -> state = RFCOMM_MULTIPLEXER_CLOSED;
866
867 case DAEMON_EVENT_HCI_PACKET_SENT:
868 // testing DMA done code
869 rfcomm_run();
870 break;
871
872 case L2CAP_EVENT_CHANNEL_CLOSED:
873 // data: event (8), len(8), channel (16)
874 l2cap_cid = READ_BT_16(packet, 2);
874 l2cap_cid = little_endian_read_16(packet, 2);
875 multiplexer = rfcomm_multiplexer_for_l2cap_cid(l2cap_cid);
876 log_info("L2CAP_EVENT_CHANNEL_CLOSED cid 0x%0x, mult %p", l2cap_cid, multiplexer);
877 if (!multiplexer) break;
878 log_info("L2CAP_EVENT_CHANNEL_CLOSED state %u", multiplexer->state);
879 switch (multiplexer->state) {
880 case RFCOMM_MULTIPLEXER_W4_CONNECT:
881 case RFCOMM_MULTIPLEXER_SEND_SABM_0:
882 case RFCOMM_MULTIPLEXER_W4_SABM_0:

--- 409 unchanged lines hidden (view full) ---

1292
1293 message_len = packet[payload_offset+1] >> 1;
1294
1295 switch (packet[payload_offset]) {
1296 case BT_RFCOMM_PN_CMD:
1297 message_dlci = packet[payload_offset+2];
1298 event_pn.super.type = CH_EVT_RCVD_PN;
1299 event_pn.priority = packet[payload_offset+4];
875 multiplexer = rfcomm_multiplexer_for_l2cap_cid(l2cap_cid);
876 log_info("L2CAP_EVENT_CHANNEL_CLOSED cid 0x%0x, mult %p", l2cap_cid, multiplexer);
877 if (!multiplexer) break;
878 log_info("L2CAP_EVENT_CHANNEL_CLOSED state %u", multiplexer->state);
879 switch (multiplexer->state) {
880 case RFCOMM_MULTIPLEXER_W4_CONNECT:
881 case RFCOMM_MULTIPLEXER_SEND_SABM_0:
882 case RFCOMM_MULTIPLEXER_W4_SABM_0:

--- 409 unchanged lines hidden (view full) ---

1292
1293 message_len = packet[payload_offset+1] >> 1;
1294
1295 switch (packet[payload_offset]) {
1296 case BT_RFCOMM_PN_CMD:
1297 message_dlci = packet[payload_offset+2];
1298 event_pn.super.type = CH_EVT_RCVD_PN;
1299 event_pn.priority = packet[payload_offset+4];
1300 event_pn.max_frame_size = READ_BT_16(packet, payload_offset+6);
1300 event_pn.max_frame_size = little_endian_read_16(packet, payload_offset+6);
1301 event_pn.credits_outgoing = packet[payload_offset+9];
1302 log_info("Received UIH Parameter Negotiation Command for #%u, credits %u",
1303 message_dlci, event_pn.credits_outgoing);
1304 rfcomm_channel_state_machine_2(multiplexer, message_dlci, (rfcomm_channel_event_t*) &event_pn);
1305 break;
1306
1307 case BT_RFCOMM_PN_RSP:
1308 message_dlci = packet[payload_offset+2];
1309 event_pn.super.type = CH_EVT_RCVD_PN_RSP;
1310 event_pn.priority = packet[payload_offset+4];
1301 event_pn.credits_outgoing = packet[payload_offset+9];
1302 log_info("Received UIH Parameter Negotiation Command for #%u, credits %u",
1303 message_dlci, event_pn.credits_outgoing);
1304 rfcomm_channel_state_machine_2(multiplexer, message_dlci, (rfcomm_channel_event_t*) &event_pn);
1305 break;
1306
1307 case BT_RFCOMM_PN_RSP:
1308 message_dlci = packet[payload_offset+2];
1309 event_pn.super.type = CH_EVT_RCVD_PN_RSP;
1310 event_pn.priority = packet[payload_offset+4];
1311 event_pn.max_frame_size = READ_BT_16(packet, payload_offset+6);
1311 event_pn.max_frame_size = little_endian_read_16(packet, payload_offset+6);
1312 event_pn.credits_outgoing = packet[payload_offset+9];
1313 log_info("Received UIH Parameter Negotiation Response max frame %u, credits %u",
1314 event_pn.max_frame_size, event_pn.credits_outgoing);
1315 rfcomm_channel_state_machine_2(multiplexer, message_dlci, (rfcomm_channel_event_t*) &event_pn);
1316 break;
1317
1318 case BT_RFCOMM_MSC_CMD:
1319 message_dlci = packet[payload_offset+2] >> 2;

--- 882 unchanged lines hidden ---
1312 event_pn.credits_outgoing = packet[payload_offset+9];
1313 log_info("Received UIH Parameter Negotiation Response max frame %u, credits %u",
1314 event_pn.max_frame_size, event_pn.credits_outgoing);
1315 rfcomm_channel_state_machine_2(multiplexer, message_dlci, (rfcomm_channel_event_t*) &event_pn);
1316 break;
1317
1318 case BT_RFCOMM_MSC_CMD:
1319 message_dlci = packet[payload_offset+2] >> 2;

--- 882 unchanged lines hidden ---