rfcomm: multiplexer drop check for event in state switch

This commit is contained in:
Matthias Ringwald 2016-04-07 11:34:54 +02:00
parent 5ef5325c17
commit f7d61b104b

View File

@ -900,6 +900,11 @@ static void rfcomm_handle_can_send_now(uint16_t l2cap_cid){
} }
} }
static void rfcomm_multiplexer_set_state_and_request_can_send_now_event(rfcomm_multiplexer_t * multiplexer, RFCOMM_MULTIPLEXER_STATE state){
multiplexer->state = state;
l2cap_request_can_send_now_event(multiplexer->l2cap_cid);
}
/** /**
* @return handled packet * @return handled packet
*/ */
@ -996,8 +1001,7 @@ static int rfcomm_multiplexer_hci_event_handler(uint8_t *packet, uint16_t size){
multiplexer->l2cap_cid = l2cap_cid; multiplexer->l2cap_cid = l2cap_cid;
multiplexer->con_handle = con_handle; multiplexer->con_handle = con_handle;
// send SABM #0 // send SABM #0
multiplexer->state = RFCOMM_MULTIPLEXER_SEND_SABM_0; rfcomm_multiplexer_set_state_and_request_can_send_now_event(multiplexer, RFCOMM_MULTIPLEXER_SEND_SABM_0);
l2cap_request_can_send_now_event(multiplexer->l2cap_cid);
} else { // multiplexer->state == RFCOMM_MULTIPLEXER_W4_SABM_0 } else { // multiplexer->state == RFCOMM_MULTIPLEXER_W4_SABM_0
@ -1061,8 +1065,7 @@ static int rfcomm_multiplexer_l2cap_packet_handler(uint16_t channel, uint8_t *pa
if (multiplexer->state == RFCOMM_MULTIPLEXER_W4_SABM_0){ if (multiplexer->state == RFCOMM_MULTIPLEXER_W4_SABM_0){
log_info("Received SABM #0"); log_info("Received SABM #0");
multiplexer->outgoing = 0; multiplexer->outgoing = 0;
multiplexer->state = RFCOMM_MULTIPLEXER_SEND_UA_0; rfcomm_multiplexer_set_state_and_request_can_send_now_event(multiplexer, RFCOMM_MULTIPLEXER_SEND_UA_0);
l2cap_request_can_send_now_event(multiplexer->l2cap_cid);
return 1; return 1;
} }
break; break;
@ -1079,8 +1082,7 @@ static int rfcomm_multiplexer_l2cap_packet_handler(uint16_t channel, uint8_t *pa
case BT_RFCOMM_DISC: case BT_RFCOMM_DISC:
// DISC #0 -> send UA #0, close multiplexer // DISC #0 -> send UA #0, close multiplexer
log_info("Received DISC #0, (ougoing = %u)", multiplexer->outgoing); log_info("Received DISC #0, (ougoing = %u)", multiplexer->outgoing);
multiplexer->state = RFCOMM_MULTIPLEXER_SEND_UA_0_AND_DISC; rfcomm_multiplexer_set_state_and_request_can_send_now_event(multiplexer, RFCOMM_MULTIPLEXER_SEND_UA_0_AND_DISC);
l2cap_request_can_send_now_event(multiplexer->l2cap_cid);
return 1; return 1;
case BT_RFCOMM_DM: case BT_RFCOMM_DM:
@ -1164,6 +1166,8 @@ static int rfcomm_multiplexer_ready_to_send(rfcomm_multiplexer_t * multiplexer){
static void rfcomm_multiplexer_state_machine(rfcomm_multiplexer_t * multiplexer, RFCOMM_MULTIPLEXER_EVENT event){ static void rfcomm_multiplexer_state_machine(rfcomm_multiplexer_t * multiplexer, RFCOMM_MULTIPLEXER_EVENT event){
if (event != MULT_EV_READY_TO_SEND) return;
uint16_t l2cap_cid = multiplexer->l2cap_cid; uint16_t l2cap_cid = multiplexer->l2cap_cid;
// process stored DM responses // process stored DM responses
@ -1184,6 +1188,7 @@ static void rfcomm_multiplexer_state_machine(rfcomm_multiplexer_t * multiplexer,
if (multiplexer->fcon & 0x80){ if (multiplexer->fcon & 0x80){
multiplexer->fcon &= 0x01; multiplexer->fcon &= 0x01;
rfcomm_send_uih_fc_rsp(multiplexer, multiplexer->fcon); rfcomm_send_uih_fc_rsp(multiplexer, multiplexer->fcon);
if (multiplexer->fcon == 0) return; if (multiplexer->fcon == 0) return;
// trigger client to send again after sending FCon Response // trigger client to send again after sending FCon Response
rfcomm_notify_channel_can_send(); rfcomm_notify_channel_can_send();
@ -1192,60 +1197,39 @@ static void rfcomm_multiplexer_state_machine(rfcomm_multiplexer_t * multiplexer,
switch (multiplexer->state) { switch (multiplexer->state) {
case RFCOMM_MULTIPLEXER_SEND_SABM_0: case RFCOMM_MULTIPLEXER_SEND_SABM_0:
switch (event) { log_info("Sending SABM #0 - (multi 0x%p)", multiplexer);
case MULT_EV_READY_TO_SEND: multiplexer->state = RFCOMM_MULTIPLEXER_W4_UA_0;
log_info("Sending SABM #0 - (multi 0x%p)", multiplexer); rfcomm_send_sabm(multiplexer, 0);
multiplexer->state = RFCOMM_MULTIPLEXER_W4_UA_0;
rfcomm_send_sabm(multiplexer, 0);
break;
default:
break;
}
break; break;
case RFCOMM_MULTIPLEXER_SEND_UA_0: case RFCOMM_MULTIPLEXER_SEND_UA_0:
switch (event) { log_info("Sending UA #0");
case MULT_EV_READY_TO_SEND: multiplexer->state = RFCOMM_MULTIPLEXER_OPEN;
log_info("Sending UA #0"); rfcomm_send_ua(multiplexer, 0);
multiplexer->state = RFCOMM_MULTIPLEXER_OPEN;
rfcomm_send_ua(multiplexer, 0); rfcomm_multiplexer_opened(multiplexer);
rfcomm_multiplexer_opened(multiplexer);
break;
default:
break;
}
break; break;
case RFCOMM_MULTIPLEXER_SEND_UA_0_AND_DISC: case RFCOMM_MULTIPLEXER_SEND_UA_0_AND_DISC:
switch (event) { // try to detect authentication errors: drop link key if multiplexer closed before first channel got opened
case MULT_EV_READY_TO_SEND: if (!multiplexer->at_least_one_connection){
// try to detect authentication errors: drop link key if multiplexer closed before first channel got opened log_info("TODO: no connections established - delete link key prophylactically");
if (!multiplexer->at_least_one_connection){ // hci_send_cmd(&hci_delete_stored_link_key, multiplexer->remote_addr);
log_info("TODO: no connections established - delete link key prophylactically");
// hci_send_cmd(&hci_delete_stored_link_key, multiplexer->remote_addr);
}
log_info("Sending UA #0");
log_info("Closing down multiplexer");
multiplexer->state = RFCOMM_MULTIPLEXER_CLOSED;
rfcomm_send_ua(multiplexer, 0);
rfcomm_multiplexer_finalize(multiplexer);
l2cap_disconnect(l2cap_cid, 0x13);
default:
break;
} }
log_info("Sending UA #0");
log_info("Closing down multiplexer");
multiplexer->state = RFCOMM_MULTIPLEXER_CLOSED;
rfcomm_send_ua(multiplexer, 0);
rfcomm_multiplexer_finalize(multiplexer);
l2cap_disconnect(l2cap_cid, 0x13);
break; break;
case RFCOMM_MULTIPLEXER_OPEN: case RFCOMM_MULTIPLEXER_OPEN:
switch (event) { // respond to test command
case MULT_EV_READY_TO_SEND: if (multiplexer->test_data_len){
// respond to test command int len = multiplexer->test_data_len;
if (multiplexer->test_data_len){ log_info("Sending TEST Response with %u bytes", len);
int len = multiplexer->test_data_len; multiplexer->test_data_len = 0;
log_info("Sending TEST Response with %u bytes", len); rfcomm_send_uih_test_rsp(multiplexer, multiplexer->test_data, len);
multiplexer->test_data_len = 0; return;
rfcomm_send_uih_test_rsp(multiplexer, multiplexer->test_data, len);
return;
}
break;
default:
break;
} }
break; break;
default: default: