mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-06 03:40:16 +00:00
stm32-sx1280: reject too long packets, reset tx buffers on terminate
This commit is contained in:
parent
f8278fd5f2
commit
0f3448bc23
@ -340,6 +340,9 @@ static struct {
|
|||||||
// current incoming packet
|
// current incoming packet
|
||||||
ll_pdu_t * rx_pdu;
|
ll_pdu_t * rx_pdu;
|
||||||
|
|
||||||
|
// rx packet ready
|
||||||
|
bool rx_pdu_received;
|
||||||
|
|
||||||
// tx queue of outgoing pdus
|
// tx queue of outgoing pdus
|
||||||
btstack_linked_queue_t tx_queue;
|
btstack_linked_queue_t tx_queue;
|
||||||
|
|
||||||
@ -432,7 +435,7 @@ static void send_adv(void){
|
|||||||
memcpy(&adv_buffer[2], ctx.bd_addr_le, 6);
|
memcpy(&adv_buffer[2], ctx.bd_addr_le, 6);
|
||||||
memcpy(&adv_buffer[8], ctx.adv_data, ctx.adv_len);
|
memcpy(&adv_buffer[8], ctx.adv_data, ctx.adv_len);
|
||||||
uint16_t packet_size = 2 + adv_buffer[1];
|
uint16_t packet_size = 2 + adv_buffer[1];
|
||||||
SX1280HalWriteBuffer( SX1280_TX0_OFFSET, adv_buffer, packet_size );
|
SX1280HalWriteBuffer( tx_buffer_offset[ctx.next_tx_buffer], adv_buffer, packet_size );
|
||||||
SX1280SetTx( ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, 1 } );
|
SX1280SetTx( ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, 1 } );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,6 +567,7 @@ static void ll_terminate(void){
|
|||||||
ctx.tx_buffer_pdu[i] = NULL;
|
ctx.tx_buffer_pdu[i] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ctx.num_tx_pdus_on_controller = 0;
|
||||||
// free queued tx packets
|
// free queued tx packets
|
||||||
while (true){
|
while (true){
|
||||||
ll_pdu_t * tx_packet = (ll_pdu_t *) btstack_linked_queue_dequeue(&ctx.tx_queue);
|
ll_pdu_t * tx_packet = (ll_pdu_t *) btstack_linked_queue_dequeue(&ctx.tx_queue);
|
||||||
@ -646,7 +650,7 @@ static void radio_timer_handler(void){
|
|||||||
receive_first_master();
|
receive_first_master();
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("--SYNC-Ch %02u-Event %04u - t %08u--\n", ctx.channel, ctx.connection_event, t0);
|
// printf("--SYNC-Ch %02u-Event %04u - t %08u--\n", ctx.channel, ctx.connection_event, t0);
|
||||||
break;
|
break;
|
||||||
case LL_STATE_ADVERTISING:
|
case LL_STATE_ADVERTISING:
|
||||||
// send adv on all configured channels
|
// send adv on all configured channels
|
||||||
@ -664,6 +668,9 @@ static void radio_timer_handler(void){
|
|||||||
|
|
||||||
static void radio_fetch_rx_pdu(void){
|
static void radio_fetch_rx_pdu(void){
|
||||||
|
|
||||||
|
if (!ctx.rx_pdu_received) return;
|
||||||
|
ctx.rx_pdu_received = false;
|
||||||
|
|
||||||
// fetch reserved rx pdu
|
// fetch reserved rx pdu
|
||||||
ll_pdu_t * rx_packet = ctx.rx_pdu;
|
ll_pdu_t * rx_packet = ctx.rx_pdu;
|
||||||
btstack_assert(rx_packet != NULL);
|
btstack_assert(rx_packet != NULL);
|
||||||
@ -736,8 +743,14 @@ static void radio_on_rx_done(void ){
|
|||||||
// more data field not used yet
|
// more data field not used yet
|
||||||
// uint8_t more_data = (rx_packet->header >> 4) & 1;
|
// uint8_t more_data = (rx_packet->header >> 4) & 1;
|
||||||
|
|
||||||
// update state
|
// only accept packets where len <= payload size
|
||||||
ctx.next_expected_sequence_number = 1 - sequence_number;
|
if (rx_len <= LL_MAX_PAYLOAD){
|
||||||
|
// update state
|
||||||
|
ctx.next_expected_sequence_number = 1 - sequence_number;
|
||||||
|
|
||||||
|
// register pdu fetch
|
||||||
|
ctx.rx_pdu_received = true;
|
||||||
|
}
|
||||||
|
|
||||||
// report outgoing packet as ack'ed and free if confirmed by peer
|
// report outgoing packet as ack'ed and free if confirmed by peer
|
||||||
bool tx_acked = ctx.transmit_sequence_number != next_expected_sequence_number;
|
bool tx_acked = ctx.transmit_sequence_number != next_expected_sequence_number;
|
||||||
@ -807,7 +820,7 @@ static void radio_on_rx_done(void ){
|
|||||||
|
|
||||||
ctx.packet_nr_in_connection_event++;
|
ctx.packet_nr_in_connection_event++;
|
||||||
|
|
||||||
printf("RX %02x -- tx buffer %u, %02x %02x\n", rx_header, ctx.next_tx_buffer, packet_header[0], packet_header[1]);
|
// printf("RX %02x -- tx buffer %u, %02x %02x\n", rx_header, ctx.next_tx_buffer, packet_header[0], packet_header[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1001,6 +1014,8 @@ static void ll_handle_conn_ind(ll_pdu_t * rx_packet){
|
|||||||
SX1280HalWriteCommand( RADIO_SET_AUTOTX, buf, 2 );
|
SX1280HalWriteCommand( RADIO_SET_AUTOTX, buf, 2 );
|
||||||
|
|
||||||
// pre-load tx pdu
|
// pre-load tx pdu
|
||||||
|
ctx.num_tx_pdus_on_controller = 0;
|
||||||
|
ctx.next_tx_buffer = 0;
|
||||||
preload_tx_buffer();
|
preload_tx_buffer();
|
||||||
|
|
||||||
// get next packet
|
// get next packet
|
||||||
@ -1060,7 +1075,8 @@ static void ll_handle_control(ll_pdu_t * rx_packet){
|
|||||||
|
|
||||||
static void ll_handle_data(ll_pdu_t * rx_packet){
|
static void ll_handle_data(ll_pdu_t * rx_packet){
|
||||||
if (ll_state != LL_STATE_CONNECTED) return;
|
if (ll_state != LL_STATE_CONNECTED) return;
|
||||||
uint8_t acl_packet[40];
|
btstack_assert(rx_packet->len <= LL_MAX_PAYLOAD);
|
||||||
|
uint8_t acl_packet[4 + LL_MAX_PAYLOAD];
|
||||||
// ACL Header
|
// ACL Header
|
||||||
uint8_t ll_id = rx_packet->header & 3;
|
uint8_t ll_id = rx_packet->header & 3;
|
||||||
acl_packet[0] = 0x01;
|
acl_packet[0] = 0x01;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user