Skip to content

Commit

Permalink
Merge pull request #508 from ut-issl/feature/max_rx_frame_size
Browse files Browse the repository at this point in the history
Pre Release (v3.8.0-beta.5): DS に受信フレームの最大値の設定を追加
  • Loading branch information
meltingrabbit committed Mar 10, 2023
2 parents aae0e30 + 7962130 commit 041feb6
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 12 deletions.
6 changes: 5 additions & 1 deletion Drivers/Protocol/common_tlm_cmd_packet_for_driver_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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,
Expand Down
48 changes: 39 additions & 9 deletions Drivers/Super/driver_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -950,15 +950,32 @@ 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;
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_)
{
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;
}

// フッタ候補未発見の場合はここで処理を返す
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)
Expand Down Expand Up @@ -1174,6 +1191,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;
Expand Down Expand Up @@ -1488,6 +1506,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)
{
Expand Down
10 changes: 9 additions & 1 deletion Drivers/Super/driver_super.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 起算)
受信データが可変長の場合のみ使用される.
フレームサイズデータがない場合には負に設定する.
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion c2a_core_main.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 041feb6

Please sign in to comment.