use state_var to store Connection Pending task

This commit is contained in:
matthias.ringwald@gmail.com 2014-01-16 20:11:45 +00:00
parent fd48b8f79d
commit ad67156049
3 changed files with 29 additions and 14 deletions

View File

@ -80,6 +80,8 @@ typedef enum {
* @praram enabled * @praram enabled
*/ */
void gap_set_bondable_mode(int enabled); void gap_set_bondable_mode(int enabled);
gap_security_level_t gap_security_level(hci_con_handle_t con_handle);
void gap_request_security_level(hci_con_handle_t con_handle, gap_security_level_t level);
#if defined __cplusplus #if defined __cplusplus
} }

View File

@ -493,6 +493,13 @@ void l2cap_run(void){
switch (channel->state){ switch (channel->state){
case L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT:
if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND) {
channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND);
l2cap_send_signaling_packet(channel->handle, CONNECTION_RESPONSE, channel->remote_sig_id, 0, 0, 1, 0);
}
break;
case L2CAP_STATE_WILL_SEND_CREATE_CONNECTION: case L2CAP_STATE_WILL_SEND_CREATE_CONNECTION:
// send connection request - set state first // send connection request - set state first
channel->state = L2CAP_STATE_WAIT_CONNECTION_COMPLETE; channel->state = L2CAP_STATE_WAIT_CONNECTION_COMPLETE;
@ -507,11 +514,6 @@ void l2cap_run(void){
btstack_memory_l2cap_channel_free(channel); btstack_memory_l2cap_channel_free(channel);
break; break;
case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_PENDING:
channel->state = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
l2cap_send_signaling_packet(channel->handle, CONNECTION_RESPONSE, channel->remote_sig_id, channel->local_cid, channel->remote_cid, 1 , 0);
break;
case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT: case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT:
channel->state = L2CAP_STATE_CONFIG; channel->state = L2CAP_STATE_CONFIG;
channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ); channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ);
@ -836,12 +838,20 @@ static void l2cap_handle_connection_request(hci_con_handle_t handle, uint8_t sig
} }
// set initial state // set initial state
channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_PENDING; channel->state = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
channel->state_var = L2CAP_CHANNEL_STATE_VAR_NONE; channel->state_var = L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND;
// add to connections list // add to connections list
linked_list_add(&l2cap_channels, (linked_item_t *) channel); linked_list_add(&l2cap_channels, (linked_item_t *) channel);
//
// gap_security_level_t current_level = gap_security_level(handle);
// gap_security_level_t required_level = LEVEL_2;
// if (current_level < required_level){
// gap_request_security_level(handle, required_level);
// return;
// }
// emit incoming connection request // emit incoming connection request
l2cap_emit_connection_request(channel); l2cap_emit_connection_request(channel);
} }

View File

@ -93,13 +93,13 @@ typedef enum {
L2CAP_STATE_CLOSED = 1, // no baseband L2CAP_STATE_CLOSED = 1, // no baseband
L2CAP_STATE_WILL_SEND_CREATE_CONNECTION, L2CAP_STATE_WILL_SEND_CREATE_CONNECTION,
L2CAP_STATE_WAIT_CONNECTION_COMPLETE, L2CAP_STATE_WAIT_CONNECTION_COMPLETE,
L2CAP_STATE_WAIT_AUTHENTICATION_RESULT,
L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT, L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT,
L2CAP_STATE_WAIT_CONNECT_RSP, // from peer L2CAP_STATE_WAIT_CONNECT_RSP, // from peer
L2CAP_STATE_CONFIG, L2CAP_STATE_CONFIG,
L2CAP_STATE_OPEN, L2CAP_STATE_OPEN,
L2CAP_STATE_WAIT_DISCONNECT, // from application L2CAP_STATE_WAIT_DISCONNECT, // from application
L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST, L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST,
L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_PENDING,
L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE, L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE,
L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT, L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT,
L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST, L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST,
@ -118,6 +118,7 @@ typedef enum {
L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_CONT = 1 << 7, // in CONF RSP, set CONTINUE flag L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_CONT = 1 << 7, // in CONF RSP, set CONTINUE flag
L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_INVALID = 1 << 8, // in CONF RSP, send UNKNOWN OPTIONS L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_INVALID = 1 << 8, // in CONF RSP, send UNKNOWN OPTIONS
L2CAP_CHANNEL_STATE_VAR_SEND_CMD_REJ_UNKNOWN = 1 << 9, // send CMD_REJ with reason unknown L2CAP_CHANNEL_STATE_VAR_SEND_CMD_REJ_UNKNOWN = 1 << 9, // send CMD_REJ with reason unknown
L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND = 1 << 10, // send Connection Respond with pending
} L2CAP_CHANNEL_STATE_VAR; } L2CAP_CHANNEL_STATE_VAR;
// info regarding an actual coneection // info regarding an actual coneection
@ -175,6 +176,8 @@ typedef struct {
// internal connection // internal connection
btstack_packet_handler_t packet_handler; btstack_packet_handler_t packet_handler;
// required security level
gap_security_level_t security_level;
} l2cap_service_t; } l2cap_service_t;