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 --- |