Merge branch 'support/ieee802154_test_based_on_opensource' into 'master'

ieee802154: add CONFIG_IEEE802154_TEST for supporting ieee802154 test

See merge request espressif/esp-idf!24148
This commit is contained in:
Shu Chen
2023-07-10 14:06:03 +08:00
5 changed files with 82 additions and 29 deletions

View File

@@ -14,6 +14,12 @@ if(CONFIG_IEEE802154_ENABLED)
"driver/esp_ieee802154_sec.c" "driver/esp_ieee802154_sec.c"
"driver/esp_ieee802154_timer.c") "driver/esp_ieee802154_timer.c")
list(APPEND private_include "private_include") list(APPEND private_include "private_include")
if(CONFIG_IEEE802154_TEST)
list(REMOVE_ITEM private_include "private_include")
list(APPEND include "private_include")
endif()
endif() endif()
idf_component_register( idf_component_register(

View File

@@ -36,7 +36,7 @@
extern void bt_bb_set_zb_tx_on_delay(uint16_t time); extern void bt_bb_set_zb_tx_on_delay(uint16_t time);
static volatile ieee802154_state_t s_ieee802154_state; IEEE802154_STATIC volatile ieee802154_state_t s_ieee802154_state;
static uint8_t *s_tx_frame = NULL; static uint8_t *s_tx_frame = NULL;
static uint8_t s_rx_frame[CONFIG_IEEE802154_RX_BUFFER_SIZE][127 + 1 + 1]; // +1: len, +1: for dma test static uint8_t s_rx_frame[CONFIG_IEEE802154_RX_BUFFER_SIZE][127 + 1 + 1]; // +1: len, +1: for dma test
static esp_ieee802154_frame_info_t s_rx_frame_info[CONFIG_IEEE802154_RX_BUFFER_SIZE]; static esp_ieee802154_frame_info_t s_rx_frame_info[CONFIG_IEEE802154_RX_BUFFER_SIZE];
@@ -85,7 +85,7 @@ uint8_t ieee802154_get_recent_lqi(void)
return s_rx_frame_info[s_recent_rx_frame_info_index].lqi; return s_rx_frame_info[s_recent_rx_frame_info_index].lqi;
} }
static void set_next_rx_buffer(void) IEEE802154_STATIC void set_next_rx_buffer(void)
{ {
if (s_rx_frame[s_rx_index][0] != 0) { if (s_rx_frame[s_rx_index][0] != 0) {
s_rx_index++; s_rx_index++;
@@ -194,7 +194,7 @@ static bool stop_ed(void)
return true; return true;
} }
static bool stop_current_operation(void) IEEE802154_STATIC bool stop_current_operation(void)
{ {
event_end_process(); event_end_process();
switch (s_ieee802154_state) { switch (s_ieee802154_state) {
@@ -270,11 +270,17 @@ static void isr_handle_timer0_done(void)
esp_ieee802154_transmit_failed(s_tx_frame, ESP_IEEE802154_TX_ERR_NO_ACK); esp_ieee802154_transmit_failed(s_tx_frame, ESP_IEEE802154_TX_ERR_NO_ACK);
next_operation(); next_operation();
} }
#if CONFIG_IEEE802154_TEST
esp_ieee802154_timer0_done();
#endif
} }
static void isr_handle_timer1_done(void) static void isr_handle_timer1_done(void)
{ {
// timer 1 is now unused. // timer 1 is now unused.
#if CONFIG_IEEE802154_TEST
esp_ieee802154_timer1_done();
#endif
} }
static IRAM_ATTR void isr_handle_tx_done(void) static IRAM_ATTR void isr_handle_tx_done(void)
@@ -315,12 +321,14 @@ static IRAM_ATTR void isr_handle_rx_done(void)
s_rx_frame_info[s_rx_index].pending = ieee802154_ack_config_pending_bit(s_rx_frame[s_rx_index]); s_rx_frame_info[s_rx_index].pending = ieee802154_ack_config_pending_bit(s_rx_frame[s_rx_index]);
// For 2015 enh-ack, SW should generate an enh-ack then send it manually // For 2015 enh-ack, SW should generate an enh-ack then send it manually
if (esp_ieee802154_enh_ack_generator(s_rx_frame[s_rx_index], &s_rx_frame_info[s_rx_index], s_enh_ack_frame) == ESP_OK) { if (esp_ieee802154_enh_ack_generator(s_rx_frame[s_rx_index], &s_rx_frame_info[s_rx_index], s_enh_ack_frame) == ESP_OK) {
#if !CONFIG_IEEE802154_TEST
// Send the Enh-Ack frame if generator succeeds. // Send the Enh-Ack frame if generator succeeds.
ieee802154_ll_set_tx_addr(s_enh_ack_frame); ieee802154_ll_set_tx_addr(s_enh_ack_frame);
s_tx_frame = s_enh_ack_frame; s_tx_frame = s_enh_ack_frame;
ieee802154_sec_update(); ieee802154_sec_update();
ieee802154_ll_enhack_generate_done_notify(); ieee802154_ll_enhack_generate_done_notify();
s_ieee802154_state = IEEE802154_STATE_TX_ENH_ACK; s_ieee802154_state = IEEE802154_STATE_TX_ENH_ACK;
#endif
} else { } else {
// Stop current process if generator returns errors. // Stop current process if generator returns errors.
ieee802154_ll_set_cmd(IEEE802154_CMD_STOP); ieee802154_ll_set_cmd(IEEE802154_CMD_STOP);
@@ -368,6 +376,10 @@ static IRAM_ATTR void isr_handle_rx_abort(void)
case IEEE802154_RX_ABORT_BY_UNEXPECTED_ACK: case IEEE802154_RX_ABORT_BY_UNEXPECTED_ACK:
case IEEE802154_RX_ABORT_BY_RX_RESTART: case IEEE802154_RX_ABORT_BY_RX_RESTART:
assert(s_ieee802154_state == IEEE802154_STATE_RX); assert(s_ieee802154_state == IEEE802154_STATE_RX);
#if CONFIG_IEEE802154_TEST
esp_ieee802154_receive_failed(rx_status);
next_operation();
#endif
break; break;
case IEEE802154_RX_ABORT_BY_COEX_BREAK: case IEEE802154_RX_ABORT_BY_COEX_BREAK:
assert(s_ieee802154_state == IEEE802154_STATE_RX); assert(s_ieee802154_state == IEEE802154_STATE_RX);
@@ -382,13 +394,21 @@ static IRAM_ATTR void isr_handle_rx_abort(void)
case IEEE802154_RX_ABORT_BY_TX_ACK_TIMEOUT: case IEEE802154_RX_ABORT_BY_TX_ACK_TIMEOUT:
case IEEE802154_RX_ABORT_BY_TX_ACK_COEX_BREAK: case IEEE802154_RX_ABORT_BY_TX_ACK_COEX_BREAK:
assert(s_ieee802154_state == IEEE802154_STATE_TX_ACK || s_ieee802154_state == IEEE802154_STATE_TX_ENH_ACK); assert(s_ieee802154_state == IEEE802154_STATE_TX_ACK || s_ieee802154_state == IEEE802154_STATE_TX_ENH_ACK);
#if !CONFIG_IEEE802154_TEST
esp_ieee802154_receive_done((uint8_t *)s_rx_frame[s_rx_index], &s_rx_frame_info[s_rx_index]); esp_ieee802154_receive_done((uint8_t *)s_rx_frame[s_rx_index], &s_rx_frame_info[s_rx_index]);
next_operation(); next_operation();
#else
esp_ieee802154_receive_failed(rx_status);
#endif
break; break;
case IEEE802154_RX_ABORT_BY_ENHACK_SECURITY_ERROR: case IEEE802154_RX_ABORT_BY_ENHACK_SECURITY_ERROR:
assert(s_ieee802154_state == IEEE802154_STATE_TX_ENH_ACK); assert(s_ieee802154_state == IEEE802154_STATE_TX_ENH_ACK);
#if !CONFIG_IEEE802154_TEST
esp_ieee802154_receive_done((uint8_t *)s_rx_frame[s_rx_index], &s_rx_frame_info[s_rx_index]); esp_ieee802154_receive_done((uint8_t *)s_rx_frame[s_rx_index], &s_rx_frame_info[s_rx_index]);
next_operation(); next_operation();
#else
esp_ieee802154_receive_failed(rx_status);
#endif
break; break;
default: default:
assert(false); assert(false);
@@ -538,7 +558,12 @@ static void ieee802154_isr(void *arg)
} }
if (events & IEEE802154_EVENT_TIMER0_OVERFLOW) { if (events & IEEE802154_EVENT_TIMER0_OVERFLOW) {
#if !CONFIG_IEEE802154_TEST
assert(s_ieee802154_state == IEEE802154_STATE_RX_ACK); assert(s_ieee802154_state == IEEE802154_STATE_RX_ACK);
#else
extern bool ieee802154_timer0_test;
assert(ieee802154_timer0_test || s_ieee802154_state == IEEE802154_STATE_RX_ACK);
#endif
isr_handle_timer0_done(); isr_handle_timer0_done();
events &= (uint16_t)(~IEEE802154_EVENT_TIMER0_OVERFLOW); events &= (uint16_t)(~IEEE802154_EVENT_TIMER0_OVERFLOW);
@@ -555,12 +580,12 @@ static void ieee802154_isr(void *arg)
} }
static IRAM_ATTR void ieee802154_enter_critical(void) IEEE802154_STATIC IRAM_ATTR void ieee802154_enter_critical(void)
{ {
portENTER_CRITICAL(&s_ieee802154_spinlock); portENTER_CRITICAL(&s_ieee802154_spinlock);
} }
static IRAM_ATTR void ieee802154_exit_critical(void) IEEE802154_STATIC IRAM_ATTR void ieee802154_exit_critical(void)
{ {
portEXIT_CRITICAL(&s_ieee802154_spinlock); portEXIT_CRITICAL(&s_ieee802154_spinlock);
} }
@@ -583,8 +608,9 @@ esp_err_t ieee802154_mac_init(void)
ieee802154_pib_init(); ieee802154_pib_init();
ieee802154_ll_enable_events(IEEE802154_EVENT_MASK); ieee802154_ll_enable_events(IEEE802154_EVENT_MASK);
#if !CONFIG_IEEE802154_TEST
ieee802154_ll_disable_events((IEEE802154_EVENT_TIMER0_OVERFLOW) | (IEEE802154_EVENT_TIMER1_OVERFLOW)); ieee802154_ll_disable_events((IEEE802154_EVENT_TIMER0_OVERFLOW) | (IEEE802154_EVENT_TIMER1_OVERFLOW));
#endif
ieee802154_ll_enable_tx_abort_events(BIT(IEEE802154_TX_ABORT_BY_RX_ACK_TIMEOUT - 1) | BIT(IEEE802154_TX_ABORT_BY_TX_COEX_BREAK - 1) | BIT(IEEE802154_TX_ABORT_BY_TX_SECURITY_ERROR - 1) | BIT(IEEE802154_TX_ABORT_BY_CCA_FAILED - 1) | BIT(IEEE802154_TX_ABORT_BY_CCA_BUSY - 1)); ieee802154_ll_enable_tx_abort_events(BIT(IEEE802154_TX_ABORT_BY_RX_ACK_TIMEOUT - 1) | BIT(IEEE802154_TX_ABORT_BY_TX_COEX_BREAK - 1) | BIT(IEEE802154_TX_ABORT_BY_TX_SECURITY_ERROR - 1) | BIT(IEEE802154_TX_ABORT_BY_CCA_FAILED - 1) | BIT(IEEE802154_TX_ABORT_BY_CCA_BUSY - 1));
ieee802154_ll_enable_rx_abort_events(BIT(IEEE802154_RX_ABORT_BY_TX_ACK_TIMEOUT - 1) | BIT(IEEE802154_RX_ABORT_BY_TX_ACK_COEX_BREAK - 1)); ieee802154_ll_enable_rx_abort_events(BIT(IEEE802154_RX_ABORT_BY_TX_ACK_TIMEOUT - 1) | BIT(IEEE802154_RX_ABORT_BY_TX_ACK_COEX_BREAK - 1));
@@ -614,14 +640,14 @@ esp_err_t ieee802154_mac_init(void)
return ret; return ret;
} }
static void start_ed(uint32_t duration) IEEE802154_STATIC void start_ed(uint32_t duration)
{ {
ieee802154_ll_enable_events(IEEE802154_EVENT_ED_DONE); ieee802154_ll_enable_events(IEEE802154_EVENT_ED_DONE);
ieee802154_ll_set_ed_duration(duration); ieee802154_ll_set_ed_duration(duration);
ieee802154_ll_set_cmd(IEEE802154_CMD_ED_START); ieee802154_ll_set_cmd(IEEE802154_CMD_ED_START);
} }
static void tx_init(const uint8_t *frame) IEEE802154_STATIC void tx_init(const uint8_t *frame)
{ {
s_tx_frame = (uint8_t *)frame; s_tx_frame = (uint8_t *)frame;
stop_current_operation(); stop_current_operation();
@@ -694,7 +720,7 @@ esp_err_t ieee802154_transmit_at(const uint8_t *frame, bool cca, uint32_t time)
return ESP_OK; return ESP_OK;
} }
static void rx_init(void) IEEE802154_STATIC void rx_init(void)
{ {
stop_current_operation(); stop_current_operation();
ieee802154_pib_update(); ieee802154_pib_update();

View File

@@ -12,45 +12,45 @@
static const char *TAG = "ieee802154 frame"; static const char *TAG = "ieee802154 frame";
static inline bool is_security_enabled(const uint8_t *frame) IEEE802154_STATIC IEEE802154_INLINE bool is_security_enabled(const uint8_t *frame)
{ {
return frame[IEEE802154_FRAME_SECURITY_OFFSET] & IEEE802154_FRAME_SECURITY_BIT; return frame[IEEE802154_FRAME_SECURITY_OFFSET] & IEEE802154_FRAME_SECURITY_BIT;
} }
static inline bool is_ie_present(const uint8_t *frame) IEEE802154_STATIC IEEE802154_INLINE bool is_ie_present(const uint8_t *frame)
{ {
return frame[IEEE802154_FRAME_IE_OFFSET] & IEEE802154_FRAME_IE_BIT; return frame[IEEE802154_FRAME_IE_OFFSET] & IEEE802154_FRAME_IE_BIT;
} }
static inline bool is_dsn_present(const uint8_t *frame) IEEE802154_STATIC IEEE802154_INLINE bool is_dsn_present(const uint8_t *frame)
{ {
return ((ieee802154_frame_get_version(frame) != IEEE802154_FRAME_VERSION_2) || return ((ieee802154_frame_get_version(frame) != IEEE802154_FRAME_VERSION_2) ||
!(frame[IEEE802154_FRAME_DSN_OFFSET] & IEEE802154_FRAME_DSN_BIT)); !(frame[IEEE802154_FRAME_DSN_OFFSET] & IEEE802154_FRAME_DSN_BIT));
} }
static inline uint8_t dst_addr_mode(const uint8_t *frame) IEEE802154_STATIC IEEE802154_INLINE uint8_t dst_addr_mode(const uint8_t *frame)
{ {
return frame[IEEE802154_FRAME_DST_MODE_OFFSET] & IEEE802154_FRAME_DST_MODE_MASK; return frame[IEEE802154_FRAME_DST_MODE_OFFSET] & IEEE802154_FRAME_DST_MODE_MASK;
} }
static inline uint8_t src_addr_mode(const uint8_t *frame) IEEE802154_STATIC IEEE802154_INLINE uint8_t src_addr_mode(const uint8_t *frame)
{ {
return frame[IEEE802154_FRAME_SRC_MODE_OFFSET] & IEEE802154_FRAME_SRC_MODE_MASK; return frame[IEEE802154_FRAME_SRC_MODE_OFFSET] & IEEE802154_FRAME_SRC_MODE_MASK;
} }
static inline bool is_panid_compression(const uint8_t *frame) IEEE802154_STATIC IEEE802154_INLINE bool is_panid_compression(const uint8_t *frame)
{ {
return frame[IEEE802154_FRAME_PANID_COMP_OFFSET] & IEEE802154_FRAME_PANID_COMP_BIT; return frame[IEEE802154_FRAME_PANID_COMP_OFFSET] & IEEE802154_FRAME_PANID_COMP_BIT;
} }
static inline bool is_suported_frame_type(uint8_t frame_type) IEEE802154_STATIC IEEE802154_INLINE bool is_suported_frame_type(uint8_t frame_type)
{ {
// HW supports 4 kinds of frame type: Beacon, Ack, Data, Command. // HW supports 4 kinds of frame type: Beacon, Ack, Data, Command.
return (frame_type == IEEE802154_FRAME_TYPE_BEACON || frame_type == IEEE802154_FRAME_TYPE_DATA || return (frame_type == IEEE802154_FRAME_TYPE_BEACON || frame_type == IEEE802154_FRAME_TYPE_DATA ||
frame_type == IEEE802154_FRAME_TYPE_ACK || frame_type == IEEE802154_FRAME_TYPE_COMMAND); frame_type == IEEE802154_FRAME_TYPE_ACK || frame_type == IEEE802154_FRAME_TYPE_COMMAND);
} }
static bool is_dst_panid_present(const uint8_t *frame) IEEE802154_STATIC bool is_dst_panid_present(const uint8_t *frame)
{ {
uint8_t dst_mode = dst_addr_mode(frame); uint8_t dst_mode = dst_addr_mode(frame);
bool dst_panid_present = false; bool dst_panid_present = false;
@@ -80,7 +80,7 @@ static bool is_dst_panid_present(const uint8_t *frame)
return dst_panid_present; return dst_panid_present;
} }
static bool is_src_panid_present(const uint8_t *frame) IEEE802154_STATIC bool is_src_panid_present(const uint8_t *frame)
{ {
uint8_t src_mode = src_addr_mode(frame); uint8_t src_mode = src_addr_mode(frame);
bool panid_compression = is_panid_compression(frame); bool panid_compression = is_panid_compression(frame);
@@ -109,12 +109,12 @@ static bool is_src_panid_present(const uint8_t *frame)
return src_panid_present; return src_panid_present;
} }
static uint8_t inline ieee802154_frame_address_offset(const uint8_t *frame) IEEE802154_STATIC uint8_t IEEE802154_INLINE ieee802154_frame_address_offset(const uint8_t *frame)
{ {
return IEEE802154_FRAME_PHR_SIZE + IEEE802154_FRAME_FCF_SIZE + (is_dsn_present(frame) ? IEEE802154_FRAME_DSN_SIZE : 0); return IEEE802154_FRAME_PHR_SIZE + IEEE802154_FRAME_FCF_SIZE + (is_dsn_present(frame) ? IEEE802154_FRAME_DSN_SIZE : 0);
} }
static IRAM_ATTR uint8_t ieee802154_frame_address_size(const uint8_t *frame) IEEE802154_STATIC IRAM_ATTR uint8_t ieee802154_frame_address_size(const uint8_t *frame)
{ {
uint8_t address_size = 0; uint8_t address_size = 0;
@@ -161,7 +161,7 @@ static IRAM_ATTR uint8_t ieee802154_frame_address_size(const uint8_t *frame)
return address_size; return address_size;
} }
static uint8_t ieee802154_frame_security_header_offset(const uint8_t *frame) IEEE802154_STATIC uint8_t ieee802154_frame_security_header_offset(const uint8_t *frame)
{ {
ESP_RETURN_ON_FALSE_ISR(is_suported_frame_type(ieee802154_frame_get_type(frame)), IEEE802154_FRAME_INVALID_ADDR_MODE, TAG, "invalid frame type"); ESP_RETURN_ON_FALSE_ISR(is_suported_frame_type(ieee802154_frame_get_type(frame)), IEEE802154_FRAME_INVALID_ADDR_MODE, TAG, "invalid frame type");
uint8_t offset = ieee802154_frame_address_offset(frame); uint8_t offset = ieee802154_frame_address_offset(frame);
@@ -175,7 +175,7 @@ static uint8_t ieee802154_frame_security_header_offset(const uint8_t *frame)
return offset; return offset;
} }
static uint8_t ieee802154_frame_get_security_field_len(const uint8_t *frame) IEEE802154_STATIC uint8_t ieee802154_frame_get_security_field_len(const uint8_t *frame)
{ {
ESP_RETURN_ON_FALSE_ISR(is_suported_frame_type(ieee802154_frame_get_type(frame)), IEEE802154_FRAME_INVALID_OFFSET, TAG, "invalid frame type"); ESP_RETURN_ON_FALSE_ISR(is_suported_frame_type(ieee802154_frame_get_type(frame)), IEEE802154_FRAME_INVALID_OFFSET, TAG, "invalid frame type");
@@ -211,7 +211,7 @@ static uint8_t ieee802154_frame_get_security_field_len(const uint8_t *frame)
return security_field_len; return security_field_len;
} }
static uint8_t ieee802154_frame_ie_header_offset(const uint8_t *frame) IEEE802154_STATIC uint8_t ieee802154_frame_ie_header_offset(const uint8_t *frame)
{ {
uint8_t offset = ieee802154_frame_security_header_offset(frame); uint8_t offset = ieee802154_frame_security_header_offset(frame);
uint8_t security_field_len = ieee802154_frame_get_security_field_len(frame); uint8_t security_field_len = ieee802154_frame_get_security_field_len(frame);
@@ -221,7 +221,7 @@ static uint8_t ieee802154_frame_ie_header_offset(const uint8_t *frame)
return offset; return offset;
} }
static uint8_t ieee802154_frame_get_mic_len(const uint8_t *frame) IEEE802154_STATIC uint8_t ieee802154_frame_get_mic_len(const uint8_t *frame)
{ {
uint8_t offset = ieee802154_frame_security_header_offset(frame); uint8_t offset = ieee802154_frame_security_header_offset(frame);
uint8_t mic_len = 0; uint8_t mic_len = 0;
@@ -247,7 +247,7 @@ static uint8_t ieee802154_frame_get_mic_len(const uint8_t *frame)
return mic_len; return mic_len;
} }
static uint8_t ieee802154_frame_get_ie_field_len(const uint8_t *frame) IEEE802154_STATIC uint8_t ieee802154_frame_get_ie_field_len(const uint8_t *frame)
{ {
uint8_t offset = ieee802154_frame_ie_header_offset(frame); uint8_t offset = ieee802154_frame_ie_header_offset(frame);
uint8_t ie_field_len = 0; uint8_t ie_field_len = 0;
@@ -274,7 +274,7 @@ static uint8_t ieee802154_frame_get_ie_field_len(const uint8_t *frame)
return ie_field_len; return ie_field_len;
} }
static IRAM_ATTR uint8_t ieee802154_frame_payload_offset(const uint8_t *frame) IEEE802154_STATIC IRAM_ATTR uint8_t ieee802154_frame_payload_offset(const uint8_t *frame)
{ {
uint8_t offset = ieee802154_frame_security_header_offset(frame); uint8_t offset = ieee802154_frame_security_header_offset(frame);
if (is_security_enabled(frame)) { if (is_security_enabled(frame)) {
@@ -298,17 +298,17 @@ static IRAM_ATTR uint8_t ieee802154_frame_payload_offset(const uint8_t *frame)
return offset - 1; return offset - 1;
} }
uint8_t inline ieee802154_frame_get_type(const uint8_t *frame) uint8_t IEEE802154_INLINE ieee802154_frame_get_type(const uint8_t *frame)
{ {
return frame[IEEE802154_FRAME_TYPE_OFFSET] & IEEE802154_FRAME_TYPE_MASK; return frame[IEEE802154_FRAME_TYPE_OFFSET] & IEEE802154_FRAME_TYPE_MASK;
} }
uint8_t inline ieee802154_frame_get_version(const uint8_t *frame) uint8_t IEEE802154_INLINE ieee802154_frame_get_version(const uint8_t *frame)
{ {
return frame[IEEE802154_FRAME_VERSION_OFFSET] & IEEE802154_FRAME_VERSION_MASK; return frame[IEEE802154_FRAME_VERSION_OFFSET] & IEEE802154_FRAME_VERSION_MASK;
} }
bool inline ieee802154_frame_is_ack_required(const uint8_t *frame) bool IEEE802154_INLINE ieee802154_frame_is_ack_required(const uint8_t *frame)
{ {
return frame[IEEE802154_FRAME_AR_OFFSET] & IEEE802154_FRAME_AR_BIT; return frame[IEEE802154_FRAME_AR_OFFSET] & IEEE802154_FRAME_AR_BIT;
} }

View File

@@ -393,3 +393,13 @@ __attribute__((weak)) esp_err_t esp_ieee802154_enh_ack_generator(uint8_t *frame,
{ {
return ESP_OK; return ESP_OK;
} }
__attribute__((weak)) void esp_ieee802154_timer0_done(void)
{
}
__attribute__((weak)) void esp_ieee802154_timer1_done(void)
{
}

View File

@@ -214,6 +214,17 @@ extern void esp_ieee802154_receive_failed(uint16_t error);
* *
*/ */
extern void esp_ieee802154_ed_failed(uint16_t error); extern void esp_ieee802154_ed_failed(uint16_t error);
#if CONFIG_IEEE802154_TEST
#define IEEE802154_STATIC
#define IEEE802154_INLINE
extern void esp_ieee802154_timer0_done(void);
extern void esp_ieee802154_timer1_done(void);
#else
#define IEEE802154_STATIC static
#define IEEE802154_INLINE inline
#endif // CONFIG_IEEE802154_TEST
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif