From 5e17682b5a6a9fa120b1c7293289bbd490563013 Mon Sep 17 00:00:00 2001 From: Ryo Suzumoto Date: Thu, 2 Mar 2023 05:04:21 +0900 Subject: [PATCH 1/5] add max_rx_frame_size_ to dssc --- Drivers/Super/driver_super.c | 33 +++++++++++++++++++++++++++++++-- Drivers/Super/driver_super.h | 10 +++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/Drivers/Super/driver_super.c b/Drivers/Super/driver_super.c index 1c6cfb17a..7e0a440be 100644 --- a/Drivers/Super/driver_super.c +++ b/Drivers/Super/driver_super.c @@ -853,8 +853,8 @@ static void DS_analyze_rx_buffer_variable_pickup_with_rx_frame_size_(DS_StreamCo { rx_frame_size = DS_analyze_rx_buffer_get_framelength_(p_stream_config); - // バッファー超えはエラーを出す! - if (rx_frame_size > buffer->capacity) + // バッファー超え or 上限値超えはエラーを出す! + if (rx_frame_size > buffer->capacity || rx_frame_size > p->settings.max_rx_frame_size_) { p->info.rec_status_.status_code = DS_STREAM_REC_STATUS_RX_FRAME_TOO_LONG; #ifdef DS_DEBUG @@ -953,12 +953,28 @@ static void DS_analyze_rx_buffer_variable_pickup_with_footer_(DS_StreamConfig* p // まだまだ受信する DS_confirm_stream_rec_buffer_(buffer, unprocessed_data_len); // unprocessed_data_len byte 確定 p->info.rec_status_.status_code = DS_STREAM_REC_STATUS_RECEIVING_DATA; + + if (buffer->confirmed_frame_len > p->settings.max_rx_frame_size_) + { + p->info.rec_status_.status_code = DS_STREAM_REC_STATUS_RX_FRAME_TOO_LONG; +#ifdef DS_DEBUG + Printf("DS: RX frame size is too long\n"); +#endif + } return; } processed_data_len = (uint16_t)(p_footer_last - &(buffer->buffer[memchr_offset]) + 1); // buffer->confirmed_frame_len が更新されることに注意! DS_confirm_stream_rec_buffer_(buffer, processed_data_len); // processed_data_len byte 確定 + if (buffer->confirmed_frame_len > p->settings.max_rx_frame_size_) + { + p->info.rec_status_.status_code = DS_STREAM_REC_STATUS_RX_FRAME_TOO_LONG; +#ifdef DS_DEBUG + Printf("DS: RX frame size is too long\n"); +#endif + return; + } body_data_len = buffer->confirmed_frame_len - p->settings.rx_header_size_ - p->settings.rx_footer_size_; if (body_data_len < 0) @@ -1174,6 +1190,7 @@ static DS_ERR_CODE DS_reset_stream_config_(DS_StreamConfig* p_stream_config) p->settings.rx_footer_ = NULL; p->settings.rx_footer_size_ = 0; p->settings.rx_frame_size_ = 0; + p->settings.max_rx_frame_size_ = 0xffff; p->settings.rx_framelength_pos_ = -1; p->settings.rx_framelength_type_size_ = 0; @@ -1488,6 +1505,18 @@ void DSSC_set_rx_frame_size(DS_StreamConfig* p_stream_config, p_stream_config->internal.is_validation_needed_for_rec_ = 1; } +uint16_t DSSC_get_max_rx_frame_size(const DS_StreamConfig* p_stream_config) +{ + return (uint16_t)p_stream_config->settings.max_rx_frame_size_; +} + +void DSSC_set_max_rx_frame_size(DS_StreamConfig* p_stream_config, + const uint16_t max_rx_frame_size) +{ + p_stream_config->settings.max_rx_frame_size_ = max_rx_frame_size; + p_stream_config->internal.is_validation_needed_for_rec_ = 1; +} + void DSSC_set_rx_framelength_pos(DS_StreamConfig* p_stream_config, const int16_t rx_framelength_pos) { diff --git a/Drivers/Super/driver_super.h b/Drivers/Super/driver_super.h index 21f81d4fd..f686ba700 100644 --- a/Drivers/Super/driver_super.h +++ b/Drivers/Super/driver_super.h @@ -327,9 +327,14 @@ struct DS_StreamConfig ヘッダがない場合は0に設定 初期値: 0 */ int16_t rx_frame_size_; /*!< 受信データ(テレメトリ)フレームサイズ - 受信データがない場合は0に設定 + 受信データがない場合は 0 に設定 受信データが可変の場合は負数に設定 初期値: 0 */ + uint16_t max_rx_frame_size_; /*!< 受信データ(テレメトリ)の想定される最大フレームサイズ + これよりも長いフレームが来た(来そうな)場合は,そのフレーム(候補)は破棄される + これにより,ヘッダ内部のフレーム長が巨大な値に化けていた場合などに永遠に受信してしまうことを防ぐことができる + rx_frame_size_ が固定長の場合は無視される + 初期値: 0xffff */ int16_t rx_framelength_pos_; /*!< 受信データ内のフレームサイズデータの存在する場所(先頭から数えて何 byte 目に位置するか.0 起算) 受信データが可変長の場合のみ使用される. フレームサイズデータがない場合には負に設定する. @@ -589,6 +594,9 @@ uint16_t DSSC_get_rx_footer_size(const DS_StreamConfig* p_stream_config); int16_t DSSC_get_rx_frame_size(const DS_StreamConfig* p_stream_config); void DSSC_set_rx_frame_size(DS_StreamConfig* p_stream_config, const int16_t rx_frame_size); +uint16_t DSSC_get_max_rx_frame_size(const DS_StreamConfig* p_stream_config); +void DSSC_set_max_rx_frame_size(DS_StreamConfig* p_stream_config, + const uint16_t max_rx_frame_size); void DSSC_set_rx_framelength_pos(DS_StreamConfig* p_stream_config, const int16_t rx_framelength_pos); From 34d3519f749c1d4b99cbcc9c70395f9fdda196da Mon Sep 17 00:00:00 2001 From: Ryo Suzumoto Date: Thu, 2 Mar 2023 05:12:25 +0900 Subject: [PATCH 2/5] add DSSC_set_max_rx_frame_size in CTCP_init_dssc --- Drivers/Protocol/common_tlm_cmd_packet_for_driver_super.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Drivers/Protocol/common_tlm_cmd_packet_for_driver_super.c b/Drivers/Protocol/common_tlm_cmd_packet_for_driver_super.c index ab4534a95..7fdbeba53 100644 --- a/Drivers/Protocol/common_tlm_cmd_packet_for_driver_super.c +++ b/Drivers/Protocol/common_tlm_cmd_packet_for_driver_super.c @@ -59,7 +59,10 @@ DS_ERR_CODE CTCP_init_dssc(DS_StreamConfig* p_stream_config, int16_t tx_frame_buffer_size, DS_ERR_CODE (*data_analyzer)(DS_StreamConfig* p_stream_config, void* p_driver)) { - if (tx_frame_buffer_size < EB90_FRAME_HEADER_SIZE + CTCP_MAX_LEN + EB90_FRAME_FOOTER_SIZE) + // MOBC か 2nd OBC かによって,送信側 (tx 側) が CTP になるか CCP になるかは不明なため,ひとまず CTCP に + // メモリが苦しい OBC もあるので,考えてもいいかも + const uint16_t max_frame_size = EB90_FRAME_HEADER_SIZE + CTCP_MAX_LEN + EB90_FRAME_FOOTER_SIZE; + if (tx_frame_buffer_size < max_frame_size) { return DS_ERR_CODE_ERR; } @@ -73,6 +76,7 @@ DS_ERR_CODE CTCP_init_dssc(DS_StreamConfig* p_stream_config, DSSC_set_rx_header(p_stream_config, EB90_FRAME_kStx, EB90_FRAME_STX_SIZE); DSSC_set_rx_footer(p_stream_config, EB90_FRAME_kEtx, EB90_FRAME_ETX_SIZE); DSSC_set_rx_frame_size(p_stream_config, -1); // 可変 + DSSC_set_max_rx_frame_size(p_stream_config, max_frame_size); DSSC_set_rx_framelength_pos(p_stream_config, EB90_FRAME_STX_SIZE); DSSC_set_rx_framelength_type_size(p_stream_config, 2); DSSC_set_rx_framelength_offset(p_stream_config, From 25a589580abe65a20ede27c0df1c9881680d0ccc Mon Sep 17 00:00:00 2001 From: Ryo Suzumoto Date: Thu, 9 Mar 2023 14:21:08 +0900 Subject: [PATCH 3/5] fix for review --- Drivers/Super/driver_super.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Drivers/Super/driver_super.c b/Drivers/Super/driver_super.c index 7e0a440be..b0c20d0af 100644 --- a/Drivers/Super/driver_super.c +++ b/Drivers/Super/driver_super.c @@ -935,7 +935,7 @@ static void DS_analyze_rx_buffer_variable_pickup_with_footer_(DS_StreamConfig* p // ヘッダなしの場合は,ここがフレーム先頭 const uint16_t unprocessed_data_len = DS_get_unprocessed_size_from_stream_rec_buffer_(buffer); uint8_t* p_footer_last; // inclusive - int32_t body_data_len; // サイズ的にはu16でよいが,負数もとりたいので i32 としている + int32_t body_data_len; // サイズ的には u16 でよいが,負数もとりたいので i32 としている uint16_t processed_data_len; uint16_t i; const uint16_t memchr_offset = buffer->pos_of_frame_head_candidate + buffer->confirmed_frame_len; @@ -950,22 +950,16 @@ static void DS_analyze_rx_buffer_variable_pickup_with_footer_(DS_StreamConfig* p if (p_footer_last == NULL) { - // まだまだ受信する - DS_confirm_stream_rec_buffer_(buffer, unprocessed_data_len); // unprocessed_data_len byte 確定 - p->info.rec_status_.status_code = DS_STREAM_REC_STATUS_RECEIVING_DATA; - - if (buffer->confirmed_frame_len > p->settings.max_rx_frame_size_) - { - p->info.rec_status_.status_code = DS_STREAM_REC_STATUS_RX_FRAME_TOO_LONG; -#ifdef DS_DEBUG - Printf("DS: RX frame size is too long\n"); -#endif - } - return; + // まだフッタまで候補まで受信していない → 受信データはすべて今回のフレームとして確定 + processed_data_len = unprocessed_data_len; + } + else + { + // フッタ候補発見 → フッタ候補までフレーム確定 + processed_data_len = (uint16_t)(p_footer_last - &(buffer->buffer[memchr_offset]) + 1); } - processed_data_len = (uint16_t)(p_footer_last - &(buffer->buffer[memchr_offset]) + 1); - // buffer->confirmed_frame_len が更新されることに注意! + // ↓ buffer->confirmed_frame_len が更新されることに注意! DS_confirm_stream_rec_buffer_(buffer, processed_data_len); // processed_data_len byte 確定 if (buffer->confirmed_frame_len > p->settings.max_rx_frame_size_) { @@ -976,6 +970,13 @@ static void DS_analyze_rx_buffer_variable_pickup_with_footer_(DS_StreamConfig* p return; } + // フッタ候補未発見の場合はここで処理を返す + if (p_footer_last == NULL) + { + p->info.rec_status_.status_code = DS_STREAM_REC_STATUS_RECEIVING_DATA; + return; + } + body_data_len = buffer->confirmed_frame_len - p->settings.rx_header_size_ - p->settings.rx_footer_size_; if (body_data_len < 0) { From 9224b1c9a10f4eff04a15e9ba5a4bd4563cf0941 Mon Sep 17 00:00:00 2001 From: Ryo Suzumoto Date: Thu, 9 Mar 2023 17:19:17 +0900 Subject: [PATCH 4/5] fix comment --- Drivers/Super/driver_super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Drivers/Super/driver_super.c b/Drivers/Super/driver_super.c index b0c20d0af..2a103e75f 100644 --- a/Drivers/Super/driver_super.c +++ b/Drivers/Super/driver_super.c @@ -950,7 +950,7 @@ static void DS_analyze_rx_buffer_variable_pickup_with_footer_(DS_StreamConfig* p if (p_footer_last == NULL) { - // まだフッタまで候補まで受信していない → 受信データはすべて今回のフレームとして確定 + // まだフッタ候補まで受信していない → 受信データはすべて今回のフレームとして確定 processed_data_len = unprocessed_data_len; } else From 796213086ea793b42b2757650aad2fd418fd3bc5 Mon Sep 17 00:00:00 2001 From: Ryo Suzumoto Date: Fri, 10 Mar 2023 08:52:25 +0900 Subject: [PATCH 5/5] update version --- c2a_core_main.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/c2a_core_main.h b/c2a_core_main.h index a86faf1e8..cce33dc15 100644 --- a/c2a_core_main.h +++ b/c2a_core_main.h @@ -10,6 +10,6 @@ void C2A_core_main(void); #define C2A_CORE_VER_MAJOR (3) #define C2A_CORE_VER_MINOR (8) #define C2A_CORE_VER_PATCH (0) -#define C2A_CORE_VER_PRE ("beta.4") +#define C2A_CORE_VER_PRE ("beta.5") #endif