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:
matthias.ringwald 2009-10-21 19:58:40 +00:00
parent f625128c99
commit 6f60b3f468
7 changed files with 39 additions and 39 deletions

View File

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

View File

@ -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);

View File

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

View File

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

View File

@ -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);

View File

@ -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;
} }

View File

@ -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);
} }
} }