mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-29 04:20:20 +00:00
forward channel ID to client packet handler. only deliver payload to client instead of complete header incl acl + l2cap headers. fix examples
This commit is contained in:
parent
f625128c99
commit
6f60b3f468
6
TODO.txt
6
TODO.txt
@ -1,11 +1,7 @@
|
|||||||
/* new todo file for BTstack */
|
/* new todo file for BTstack */
|
||||||
|
|
||||||
NEXT:
|
NEXT:
|
||||||
- forward channel ID to client packet handler
|
|
||||||
- change BTstack.h, BTstack.c and all example apps
|
|
||||||
- map l2cap errors to general status code starting from 0x80
|
- map l2cap errors to general status code starting from 0x80
|
||||||
- create <btstack/errors.h>
|
|
||||||
- add timeouts to cocoa run loop
|
|
||||||
- CocoaTouch User Interface Components
|
- CocoaTouch User Interface Components
|
||||||
- move all inquiry related code from BTstackCocoaAppDelegate into BTInquiryViewController
|
- move all inquiry related code from BTstackCocoaAppDelegate into BTInquiryViewController
|
||||||
- figure out why stack doesn't shut Bluetooth off when in sleep for a while/after wakeup
|
- figure out why stack doesn't shut Bluetooth off when in sleep for a while/after wakeup
|
||||||
@ -17,6 +13,8 @@ NEXT:
|
|||||||
|
|
||||||
== Release Version 0.1
|
== Release Version 0.1
|
||||||
|
|
||||||
|
- create <btstack/errors.h>
|
||||||
|
- add timeouts to cocoa run loop
|
||||||
- implement rest of L2CAP state machine
|
- implement rest of L2CAP state machine
|
||||||
- incoming connections
|
- incoming connections
|
||||||
- list of supported PSM
|
- list of supported PSM
|
||||||
|
@ -20,16 +20,14 @@ bd_addr_t addr = {0x00, 0x19, 0x1d, 0x90, 0x44, 0x68 }; // WiiMote
|
|||||||
static void (*data_cb)(uint8_t x, uint8_t y, uint8_t z);
|
static void (*data_cb)(uint8_t x, uint8_t y, uint8_t z);
|
||||||
static void (*state_cb)(char *text);
|
static void (*state_cb)(char *text);
|
||||||
|
|
||||||
void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||||
bd_addr_t event_addr;
|
bd_addr_t event_addr;
|
||||||
|
|
||||||
switch (packet_type) {
|
switch (packet_type) {
|
||||||
|
|
||||||
case L2CAP_DATA_PACKET:
|
case L2CAP_DATA_PACKET:
|
||||||
// just dump data for now
|
if (packet[0] == 0xa1 && packet[1] == 0x31){
|
||||||
// hexdump( packet, size );
|
(*data_cb)(packet[4], packet[5], packet[6]);
|
||||||
if (packet[8] == 0xa1 && packet[9] == 0x31){
|
|
||||||
(*data_cb)(packet[12], packet[13], packet[14]);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -52,14 +50,13 @@ void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
|||||||
|
|
||||||
case L2CAP_EVENT_CHANNEL_OPENED:
|
case L2CAP_EVENT_CHANNEL_OPENED:
|
||||||
// inform about new l2cap connection
|
// inform about new l2cap connection
|
||||||
bt_flip_addr(event_addr, &packet[2]);
|
bt_flip_addr(event_addr, &packet[3]);
|
||||||
uint16_t psm = READ_BT_16(packet, 10);
|
uint16_t psm = READ_BT_16(packet, 11);
|
||||||
uint16_t source_cid = READ_BT_16(packet, 12);
|
uint16_t source_cid = READ_BT_16(packet, 13);
|
||||||
printf("Channel successfully opened: ");
|
printf("Channel successfully opened: ");
|
||||||
print_bd_addr(event_addr);
|
print_bd_addr(event_addr);
|
||||||
printf(", handle 0x%02x, psm 0x%02x, source cid 0x%02x, dest cid 0x%02x\n",
|
printf(", handle 0x%02x, psm 0x%02x, source cid 0x%02x, dest cid 0x%02x\n",
|
||||||
READ_BT_16(packet, 8), psm, source_cid, READ_BT_16(packet, 14));
|
READ_BT_16(packet, 9), psm, source_cid, READ_BT_16(packet, 15));
|
||||||
|
|
||||||
if (psm == 0x13) {
|
if (psm == 0x13) {
|
||||||
// interupt channel openedn succesfully, now open control channel, too.
|
// interupt channel openedn succesfully, now open control channel, too.
|
||||||
bt_send_cmd(&l2cap_create_channel, event_addr, 0x11);
|
bt_send_cmd(&l2cap_create_channel, event_addr, 0x11);
|
||||||
|
@ -134,7 +134,7 @@ void _bt_rfcomm_send_uih_pn_command(uint16_t source_cid, uint8_t initiator, uint
|
|||||||
rfcomm_send_packet(source_cid, address, BT_RFCOMM_UIH, 0, (uint8_t *) payload, pos);
|
rfcomm_send_packet(source_cid, address, BT_RFCOMM_UIH, 0, (uint8_t *) payload, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||||
bd_addr_t event_addr;
|
bd_addr_t event_addr;
|
||||||
|
|
||||||
static uint8_t msc_resp_send = 0;
|
static uint8_t msc_resp_send = 0;
|
||||||
@ -142,6 +142,7 @@ void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
|||||||
static uint8_t credits_used = 0;
|
static uint8_t credits_used = 0;
|
||||||
static uint8_t credits_free = 0;
|
static uint8_t credits_free = 0;
|
||||||
uint8_t packet_processed = 0;
|
uint8_t packet_processed = 0;
|
||||||
|
|
||||||
switch (packet_type) {
|
switch (packet_type) {
|
||||||
|
|
||||||
case L2CAP_DATA_PACKET:
|
case L2CAP_DATA_PACKET:
|
||||||
@ -149,7 +150,7 @@ void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
|||||||
// rfcomm: data[9] = command
|
// rfcomm: data[9] = command
|
||||||
|
|
||||||
// received 1. message BT_RF_COMM_UA
|
// received 1. message BT_RF_COMM_UA
|
||||||
if (size == 12 && packet[9] == BT_RFCOMM_UA && packet[8] == 0x03){
|
if (size == 4 && packet[1] == BT_RFCOMM_UA && packet[0] == 0x03){
|
||||||
packet_processed++;
|
packet_processed++;
|
||||||
printf("Received RFCOMM unnumbered acknowledgement for channel 0 - multiplexer working\n");
|
printf("Received RFCOMM unnumbered acknowledgement for channel 0 - multiplexer working\n");
|
||||||
printf("Sending UIH Parameter Negotiation Command\n");
|
printf("Sending UIH Parameter Negotiation Command\n");
|
||||||
@ -157,7 +158,7 @@ void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// received UIH Parameter Negotiation Response
|
// received UIH Parameter Negotiation Response
|
||||||
if (size == 22 && packet[9] == BT_RFCOMM_UIH && packet[11] == BT_RFCOMM_PN_RSP){
|
if (size == 14 && packet[1] == BT_RFCOMM_UIH && packet[3] == BT_RFCOMM_PN_RSP){
|
||||||
packet_processed++;
|
packet_processed++;
|
||||||
printf("UIH Parameter Negotiation Response\n");
|
printf("UIH Parameter Negotiation Response\n");
|
||||||
printf("Sending SABM #1\n");
|
printf("Sending SABM #1\n");
|
||||||
@ -165,7 +166,7 @@ void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// received 2. message BT_RF_COMM_UA
|
// received 2. message BT_RF_COMM_UA
|
||||||
if (size == 12 && packet[9] == BT_RFCOMM_UA && packet[8] == ((RFCOMM_CHANNEL_ID << 3) | 3) ){
|
if (size == 4 && packet[1] == BT_RFCOMM_UA && packet[0] == ((RFCOMM_CHANNEL_ID << 3) | 3) ){
|
||||||
packet_processed++;
|
packet_processed++;
|
||||||
printf("Received RFCOMM unnumbered acknowledgement for channel 1 - channel opened\n");
|
printf("Received RFCOMM unnumbered acknowledgement for channel 1 - channel opened\n");
|
||||||
printf("Sending MSC 'I'm ready'\n");
|
printf("Sending MSC 'I'm ready'\n");
|
||||||
@ -173,33 +174,32 @@ void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// received BT_RFCOMM_MSC_CMD
|
// received BT_RFCOMM_MSC_CMD
|
||||||
if (size == 16 && packet[9] == BT_RFCOMM_UIH && packet[11] == BT_RFCOMM_MSC_CMD){
|
if (size == 8 && packet[1] == BT_RFCOMM_UIH && packet[3] == BT_RFCOMM_MSC_CMD){
|
||||||
packet_processed++;
|
packet_processed++;
|
||||||
printf("Received BT_RFCOMM_MSC_CMD\n");
|
printf("Received BT_RFCOMM_MSC_CMD\n");
|
||||||
printf("Responding to 'I'm ready'\n");
|
printf("Responding to 'I'm ready'\n");
|
||||||
// fine with this
|
// fine with this
|
||||||
uint8_t * payload = &packet[8];
|
uint8_t address = packet[0] | 2; // set response
|
||||||
uint8_t address = payload[0] | 2; // set response
|
packet[3] = BT_RFCOMM_MSC_RSP; // " "
|
||||||
payload[3] = BT_RFCOMM_MSC_RSP; // " "
|
rfcomm_send_packet(source_cid, address, BT_RFCOMM_UIH_PF, 0x30, packet, 8);
|
||||||
rfcomm_send_packet(source_cid, address, BT_RFCOMM_UIH_PF, 0x30, payload, 8);
|
|
||||||
msc_resp_send = 1;
|
msc_resp_send = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// received BT_RFCOMM_MSC_RSP
|
// received BT_RFCOMM_MSC_RSP
|
||||||
if (size == 16 && packet[9] == BT_RFCOMM_UIH && packet[11] == BT_RFCOMM_MSC_RSP){
|
if (size == 8 && packet[1] == BT_RFCOMM_UIH && packet[3] == BT_RFCOMM_MSC_RSP){
|
||||||
packet_processed++;
|
packet_processed++;
|
||||||
msc_resp_received = 1;
|
msc_resp_received = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet[9] == BT_RFCOMM_UIH && packet[8] == ((RFCOMM_CHANNEL_ID<<3)|1)){
|
if (packet[1] == BT_RFCOMM_UIH && packet[0] == ((RFCOMM_CHANNEL_ID<<3)|1)){
|
||||||
credits_used++;
|
credits_used++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet[9] == BT_RFCOMM_UIH_PF && packet[8] == ((RFCOMM_CHANNEL_ID<<3)|1)){
|
if (packet[1] == BT_RFCOMM_UIH_PF && packet[0] == ((RFCOMM_CHANNEL_ID<<3)|1)){
|
||||||
if (!credits_free) {
|
if (!credits_free) {
|
||||||
printf("Got %u credits, can send!\n", packet[10]);
|
printf("Got %u credits, can send!\n", packet[2]);
|
||||||
}
|
}
|
||||||
credits_free = packet[10];
|
credits_free = packet[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t send_credits_packet = 0;
|
uint8_t send_credits_packet = 0;
|
||||||
|
@ -18,19 +18,20 @@ hci_con_handle_t con_handle;
|
|||||||
uint16_t source_cid_interrupt;
|
uint16_t source_cid_interrupt;
|
||||||
uint16_t source_cid_control;
|
uint16_t source_cid_control;
|
||||||
|
|
||||||
void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
|
void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||||
bd_addr_t event_addr;
|
bd_addr_t event_addr;
|
||||||
|
|
||||||
switch (packet_type) {
|
switch (packet_type) {
|
||||||
|
|
||||||
case L2CAP_DATA_PACKET:
|
case L2CAP_DATA_PACKET:
|
||||||
// just dump data for now
|
// just dump data for now
|
||||||
|
printf("source cid %x -- ", channel);
|
||||||
hexdump( packet, size );
|
hexdump( packet, size );
|
||||||
|
|
||||||
// HOME => disconnect
|
// HOME => disconnect
|
||||||
if (packet[8] == 0xA1) { // Status report
|
if (packet[0] == 0xA1) { // Status report
|
||||||
if (packet[9] == 0x30 || packet[9] == 0x31) { // type 0x30 or 0x31
|
if (packet[1] == 0x30 || packet[1] == 0x31) { // type 0x30 or 0x31
|
||||||
if (packet[11] & 0x080) { // homne button pressed
|
if (packet[3] & 0x080) { // homne button pressed
|
||||||
printf("Disconnect baseband\n");
|
printf("Disconnect baseband\n");
|
||||||
bt_send_cmd(&hci_disconnect, con_handle, 0x13); // remote closed connection
|
bt_send_cmd(&hci_disconnect, con_handle, 0x13); // remote closed connection
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,8 @@ int bt_close();
|
|||||||
// send hci cmd packet
|
// send hci cmd packet
|
||||||
int bt_send_cmd(hci_cmd_t *cmd, ...);
|
int bt_send_cmd(hci_cmd_t *cmd, ...);
|
||||||
|
|
||||||
// register packet handler
|
// register packet handler -- channel only valid for l2cap and rfcomm packets
|
||||||
void bt_register_packet_handler (void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size));
|
void bt_register_packet_handler (void (*handler)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size));
|
||||||
|
|
||||||
void bt_send_acl(uint8_t * data, uint16_t len);
|
void bt_send_acl(uint8_t * data, uint16_t len);
|
||||||
|
|
||||||
|
@ -22,11 +22,11 @@ static uint8_t hci_cmd_buffer[3+255];
|
|||||||
static connection_t *btstack_connection = NULL;
|
static connection_t *btstack_connection = NULL;
|
||||||
|
|
||||||
/** prototypes & dummy functions */
|
/** prototypes & dummy functions */
|
||||||
static void dummy_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){};
|
static void dummy_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){};
|
||||||
static int btstack_packet_handler(connection_t *connection, uint16_t packet_type, uint16_t channel, uint8_t *data, uint16_t size);
|
static int btstack_packet_handler(connection_t *connection, uint16_t packet_type, uint16_t channel, uint8_t *data, uint16_t size);
|
||||||
|
|
||||||
/** local globals :) */
|
/** local globals :) */
|
||||||
static void (*client_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size) = dummy_handler;
|
static void (*client_packet_handler)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size) = dummy_handler;
|
||||||
|
|
||||||
|
|
||||||
// init BTstack library
|
// init BTstack library
|
||||||
@ -57,12 +57,12 @@ int bt_send_cmd(hci_cmd_t *cmd, ...){
|
|||||||
|
|
||||||
int btstack_packet_handler(connection_t *connection, uint16_t packet_type, uint16_t channel, uint8_t *data, uint16_t size){
|
int btstack_packet_handler(connection_t *connection, uint16_t packet_type, uint16_t channel, uint8_t *data, uint16_t size){
|
||||||
// printf("BTstack client handler: packet type %u, data[0] %x\n", packet_type, data[0]);
|
// printf("BTstack client handler: packet type %u, data[0] %x\n", packet_type, data[0]);
|
||||||
(*client_packet_handler)(packet_type, data, size);
|
(*client_packet_handler)(packet_type, channel, data, size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// register packet handler
|
// register packet handler
|
||||||
void bt_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){
|
void bt_register_packet_handler(void (*handler)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size)){
|
||||||
client_packet_handler = handler;
|
client_packet_handler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,9 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
// size of HCI ACL + L2CAP Header for regular data packets
|
||||||
|
#define COMPLETE_L2CAP_HEADER 8
|
||||||
|
|
||||||
static void null_event_handler(uint8_t *packet, uint16_t size);
|
static void null_event_handler(uint8_t *packet, uint16_t size);
|
||||||
static void null_data_handler(uint16_t source_cid, uint8_t *packet, uint16_t size);
|
static void null_data_handler(uint16_t source_cid, uint8_t *packet, uint16_t size);
|
||||||
|
|
||||||
@ -321,7 +324,8 @@ void l2cap_acl_handler( uint8_t *packet, uint16_t size ){
|
|||||||
// Find channel for this channel_id and connection handle
|
// Find channel for this channel_id and connection handle
|
||||||
l2cap_channel_t * channel = l2cap_get_channel_for_source_cid(channel_id);
|
l2cap_channel_t * channel = l2cap_get_channel_for_source_cid(channel_id);
|
||||||
if (channel) {
|
if (channel) {
|
||||||
socket_connection_send_packet(channel->connection, L2CAP_DATA_PACKET, 0, packet, size);
|
socket_connection_send_packet(channel->connection, L2CAP_DATA_PACKET, channel_id,
|
||||||
|
&packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user