日本无码免费高清在线|成人日本在线观看高清|A级片免费视频操逼欧美|全裸美女搞黄色大片网站|免费成人a片视频|久久无码福利成人激情久久|国产视频一二国产在线v|av女主播在线观看|五月激情影音先锋|亚洲一区天堂av

  • 手機(jī)站
  • 小程序

    汽車測(cè)試網(wǎng)

  • 公眾號(hào)
    • 汽車測(cè)試網(wǎng)

    • 在線課堂

    • 電車測(cè)試

理想汽車VCOS通信E2E實(shí)現(xiàn)分析

2025-06-05 09:44:29·  來(lái)源:汽車電子與軟件  
 


作者 | 不可說(shuō)出品 | 汽車電子與軟件


#01MVBS

MVBS,全稱為 Micro Vehicle Bus Service,是VBSLite工程的核心組件之一,理想的VCOS中面向MCU領(lǐng)域設(shè)計(jì)的通信中間件,實(shí)現(xiàn)資源受限環(huán)境下的高效業(yè)務(wù)互聯(lián)互通;主要采用以數(shù)據(jù)為中心的發(fā)布-訂閱(DCSP, Data-Centric Publish Subscribe)通信模型;并通過(guò)RTPS協(xié)議進(jìn)行數(shù)據(jù)傳輸,提供低時(shí)延、高可靠的數(shù)據(jù)通信,同時(shí)支持若干必要的QoS策略,同時(shí)提供RPC(Remote Function Call)功能,支持請(qǐng)求-調(diào)用通信模型,構(gòu)建支持多種通信模式的統(tǒng)一通信平臺(tái)。 在MVBS的QoS策略中,理想實(shí)現(xiàn)了E2E來(lái)保證通信質(zhì)量,使用的是CRC-32/P4算法。



#02CRC-32/P4算法

CRC-32/P4是一種特定的32位循環(huán)冗余校驗(yàn)(CRC-32)算法,屬于CRC校驗(yàn)算法的變體,通過(guò)特定的多項(xiàng)式和初始值設(shè)置,用于增強(qiáng)對(duì)數(shù)據(jù)傳輸或存儲(chǔ)中錯(cuò)誤的檢測(cè)能力。以下是對(duì)CRC-32/P4的詳細(xì)解析:

1. CRC-32基礎(chǔ)

作用:CRC-32是一種廣泛使用的錯(cuò)誤檢測(cè)碼(EDC),通過(guò)生成一個(gè)32位的校驗(yàn)值,驗(yàn)證數(shù)據(jù)在傳輸或存儲(chǔ)過(guò)程中是否出現(xiàn)錯(cuò)誤。

原理:基于多項(xiàng)式除法,將數(shù)據(jù)視為一個(gè)長(zhǎng)二進(jìn)制數(shù),與預(yù)定義的生成多項(xiàng)式進(jìn)行模2除法,余數(shù)即為CRC校驗(yàn)值。

2. CRC-32/P4的特點(diǎn)

特定多項(xiàng)式:CRC-32/P4使用特定的生成多項(xiàng)式(如代碼中的0xF4ACFB13U),與標(biāo)準(zhǔn)CRC-32(多項(xiàng)式為0x04C11DB7或0xEDB88320)不同,這使其適用于特定場(chǎng)景(如實(shí)時(shí)通信、嵌入式系統(tǒng))。

初始值與異或值:

初始值:0xFFFFFFFFU,表示CRC寄存器在開(kāi)始計(jì)算前的初始狀態(tài)。

最終異或值:0xFFFFFFFFU,在計(jì)算完成后對(duì)CRC值進(jìn)行異或操作,得到最終校驗(yàn)值。

查表法優(yōu)化:通過(guò)預(yù)計(jì)算的查找表(如下面章節(jié)中代碼中的crc_32P4_tab),加速CRC計(jì)算過(guò)程。

3. CRC-32/P4的應(yīng)用場(chǎng)景

實(shí)時(shí)通信系統(tǒng):如RTPS(實(shí)時(shí)發(fā)布-訂閱協(xié)議),用于檢測(cè)消息在傳輸過(guò)程中是否被篡改或損壞。

端到端(E2E)保護(hù):在代碼中,CRC-32/P4用于校驗(yàn)Reader/Writer ID、序列號(hào)(SN)和數(shù)據(jù)內(nèi)容,確保數(shù)據(jù)的完整性和順序性。

嵌入式系統(tǒng):適用于資源受限的環(huán)境,因其計(jì)算效率高且錯(cuò)誤檢測(cè)能力強(qiáng)。

4. 與標(biāo)準(zhǔn)CRC-32的區(qū)別

多項(xiàng)式不同:標(biāo)準(zhǔn)CRC-32通常使用0x04C11DB7或0xEDB88320,而CRC-32/P4使用0xF4ACFB13U,導(dǎo)致校驗(yàn)值分布和錯(cuò)誤檢測(cè)能力不同。

應(yīng)用場(chǎng)景不同:標(biāo)準(zhǔn)CRC-32適用于通用數(shù)據(jù)校驗(yàn)(如文件傳輸、網(wǎng)絡(luò)通信),而CRC-32/P4針對(duì)特定協(xié)議或系統(tǒng)優(yōu)化。

5. CRC-32/P4的優(yōu)勢(shì)

高效性:查表法使計(jì)算復(fù)雜度從O(n2)降至O(n),適合實(shí)時(shí)系統(tǒng)。

可靠性:能檢測(cè)大多數(shù)突發(fā)錯(cuò)誤和隨機(jī)錯(cuò)誤,錯(cuò)誤漏檢率低。

靈活性:通過(guò)調(diào)整多項(xiàng)式和初始值,可適應(yīng)不同需求。

6. 代碼中的實(shí)現(xiàn)細(xì)節(jié)

數(shù)據(jù)校驗(yàn)范圍:包括輸入數(shù)據(jù)、Reader/Writer ID(4字節(jié))、序列號(hào)(8字節(jié))和數(shù)據(jù)長(zhǎng)度(4字節(jié))。

序列號(hào)檢查:結(jié)合計(jì)數(shù)器機(jī)制,確保消息順序正確,防止亂序或重復(fù)。

錯(cuò)誤處理:通過(guò)日志輸出和狀態(tài)碼(如E2E_P04STATUS_ERROR)反饋校驗(yàn)結(jié)果。



#03理想E2E核心功能解析與代碼實(shí)現(xiàn)

1、CRC-32/P4計(jì)算

代碼結(jié)構(gòu)設(shè)計(jì):

函數(shù):e2e_calculate_crc32P4

作用:計(jì)算數(shù)據(jù)、Reader/WriterID、序列號(hào)(SN)和數(shù)據(jù)長(zhǎng)度的CRC-32/P4校驗(yàn)值。

關(guān)鍵參數(shù):

data_ptr:待校驗(yàn)的數(shù)據(jù)指針。

data_length:數(shù)據(jù)長(zhǎng)度。

reader_id/writer_id:通信雙方的實(shí)體ID。

sn:序列號(hào)(用于檢測(cè)消息順序)。

算法細(xì)節(jié):

使用預(yù)計(jì)算的查表crc_32P4_tab加速CRC計(jì)算。

初始值為0xFFFFFFFF,多項(xiàng)式為0xF4ACFB13,最終結(jié)果異或0xFFFFFFFF。

校驗(yàn)范圍包括:

1. 輸入數(shù)據(jù)(逐字節(jié))。2. Reader/WriterID(各4字節(jié))。3. 序列號(hào)(8字節(jié))。4. 數(shù)據(jù)長(zhǎng)度(4字節(jié))。 代碼實(shí)現(xiàn)思路:

1. 初始化參數(shù)

2. 檢查輸入有效性

避免空指針導(dǎo)致的未定義行為若data_ptr為NULL,直接返回默認(rèn)值0。

3. 初始化CRC值

設(shè)置CRC計(jì)算的初始狀態(tài)。需要將crc初始化為預(yù)定義的Crc_32P4_StartValue(0xFFFFFFFFU)。

4. 計(jì)算數(shù)據(jù)部分的CRC

校驗(yàn)輸入數(shù)據(jù)的完整性。需要逐字節(jié)處理:遍歷data_length字節(jié)的數(shù)據(jù)。根據(jù)公式更新crc:crc=((crc>>8)&0x00FFFFFFU)^crc_32P4_tab[(crc^*data_pointer)&0xFFU]。就是將當(dāng)前CRC右移8位,并與查表結(jié)果異或,更新CRC值。

5. 計(jì)算Reader/WriterID的CRC

校驗(yàn)通信實(shí)體ID的合法性。固定長(zhǎng)度處理:分別對(duì)reader_id和writer_id的4字節(jié)數(shù)據(jù)執(zhí)行與數(shù)據(jù)部分相同的查表計(jì)算。

6. 計(jì)算序列號(hào)(SN)的CRC

確保消息順序的正確性。對(duì)sn的8字節(jié)數(shù)據(jù)執(zhí)行查表計(jì)算(邏輯同數(shù)據(jù)部分)。

7. 計(jì)算數(shù)據(jù)長(zhǎng)度的CRC

驗(yàn)證數(shù)據(jù)長(zhǎng)度字段的合法性。對(duì)data_length的4字節(jié)數(shù)據(jù)執(zhí)行查表計(jì)算。

8. 最終異或處理

標(biāo)準(zhǔn)化CRC結(jié)果;將最終CRC值與Crc_32P4_Xor(0xFFFFFFFFU)異或,得到最終校驗(yàn)碼。

9. 返回結(jié)果

輸出計(jì)算完成的CRC值。 代碼流程圖:

開(kāi)始

├─ 初始化指針和查表├─ 檢查 data_ptr 是否為 NULL → 是 → 返回 0 ├─ 初始化 crc = Crc_32P4_StartValue├─ 計(jì)算數(shù)據(jù)部分的 CRC(逐字節(jié))├─ 計(jì)算 Reader ID 的 CRC(4 字節(jié))├─ 計(jì)算 Writer ID 的 CRC(4 字節(jié))├─ 計(jì)算 SN 的 CRC(8 字節(jié))├─ 計(jì)算 data_length 的 CRC(4 字節(jié))├─ crc ^= Crc_32P4_Xor└─ 返回 crc 代碼實(shí)現(xiàn):

uint32_t e2e_calculate_crc32P4(const uint8_t* data_ptr,uint32_t data_length,const rtps_entity_id_t *reader_id,const rtps_entity_id_t *writer_id,struct rtps_sn *sn){uint32_t crc                = 0; const uint8_t* data_pointer     = data_ptr;const uint8_t* reader_id_pointer    = (const uint8_t*) reader_id;const uint8_t* writer_id_pointer    = (const uint8_t*) writer_id;const uint8_t* sn_pointer       = (const uint8_t*) sn;const uint8_t* data_length_pointer  = (const uint8_t*) &data_length;static const uint32_t crc_32P4_tab[] = {0x00000000U, 0x30850FF5U, 0x610A1FEAU, 0x518F101FU, 0xC2143FD4U,//省略查表內(nèi)容0x9F16DC99U};if (data_pointer != NULL) {crc = Crc_32P4_StartValue;for( uint32_t byte = 0; byte < data_length; byte++) {crc = ((crc >> 8) & 0x00FFFFFFU) ^ crc_32P4_tab[(crc ^ *data_pointer) & 0xFFU];data_pointer++;}for( uint32_t byte = 0; byte < 4U; byte++) {crc = ((crc >> 8) & 0x00FFFFFFU) ^ crc_32P4_tab[(crc ^ *reader_id_pointer) & 0xFFU];reader_id_pointer++;}for( uint32_t byte = 0; byte < 4U; byte++) {crc = ((crc >> 8) & 0x00FFFFFFU) ^ crc_32P4_tab[(crc ^ *writer_id_pointer) & 0xFFU];writer_id_pointer++;}for( uint32_t byte = 0; byte < 8U; byte++) {crc = ((crc >> 8) & 0x00FFFFFFU) ^ crc_32P4_tab[(crc ^ *sn_pointer) & 0xFFU];sn_pointer++;}for( uint32_t byte = 0; byte < 4U; byte++) {crc = ((crc >> 8) & 0x00FFFFFFU) ^ crc_32P4_tab[(crc ^ *data_length_pointer) & 0xFFU]; data_length_pointer++;}crc = crc ^ Crc_32P4_Xor;}return crc;}

2、端到端狀態(tài)檢查

代碼結(jié)構(gòu)設(shè)計(jì):

函數(shù):e2e_do_checkP04

作用:驗(yàn)證接收數(shù)據(jù)的CRC校驗(yàn)值和長(zhǎng)度是否合法。

關(guān)鍵邏輯:

檢查數(shù)據(jù)長(zhǎng)度是否在配置的min_data_length和max_data_length范圍內(nèi)。比較計(jì)算出的CRC(data_crc)與接收的CRC(header_src->crc)。返回狀態(tài)碼(如E2E_P04STATUS_OK或E2E_P04STATUS_ERROR)。 關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

rtps_entity_id_t:通信實(shí)體(Reader/Writer)的唯一標(biāo)識(shí)。

rtps_sn:序列號(hào),用于消息順序跟蹤。

structe2e_p04_cfg:E2E配置參數(shù)(如min_data_length、max_data_length、max_delta_counter)。 狀態(tài)返回

日志輸出:通過(guò)pr_err打印錯(cuò)誤信息(如數(shù)據(jù)長(zhǎng)度不匹配、CRC校驗(yàn)失敗、序列號(hào)異常)。

狀態(tài)碼:

E2E_P04STATUS_OK:校驗(yàn)通過(guò)。

E2E_P04STATUS_ERROR:CRC或長(zhǎng)度不匹配。

E2E_P04STATUS_NODATAAVAILABLE:數(shù)據(jù)長(zhǎng)度超出配置范圍。

E2E_P04STATUS_REPEATED/E2E_P04STATUS_OKSOMELOST/E2E_P04STATUS_WRONGSEQUENCE:序列號(hào)異常。 代碼實(shí)現(xiàn)思路:

1.初始化參數(shù)

2.檢查數(shù)據(jù)長(zhǎng)度合法性,確保數(shù)據(jù)長(zhǎng)度在配置的min_data_length和max_data_length范圍內(nèi)。

步驟:

條件判斷:

若header_src->length不滿足profile04_cfg.min_data_length<=header_src->length<=profile04_cfg.max_data_length,則:輸出錯(cuò)誤日志(E2E_P04STATTUS_NODATAAVAILABLE)并直接返回錯(cuò)誤狀態(tài)碼E2E_P04STATTUS_NODATAAVAILABLE。

數(shù)據(jù)長(zhǎng)度匹配檢查:

若data_size(實(shí)際接收的數(shù)據(jù)長(zhǎng)度)不等于header_src->length(配置的期望長(zhǎng)度),則:輸出錯(cuò)誤日志(E2E_P04STATUS_ERROR)、返回錯(cuò)誤狀態(tài)碼E2E_P04STATUS_ERROR。

3. 計(jì)算并驗(yàn)證CRC值

通過(guò)CRC-32/P4算法校驗(yàn)數(shù)據(jù)完整性。

調(diào)用CRC計(jì)算函數(shù):

使用e2e_calculate_crc32P4計(jì)算接收數(shù)據(jù)(pdata)、Reader/WriterID(reader_id、writer_id)、序列號(hào)(sn)和數(shù)據(jù)長(zhǎng)度的CRC值。

比對(duì)CRC值:

若header_src->crc(接收的CRC)不等于data_crc(計(jì)算的CRC):設(shè)置e2e_status為E2E_P04STATUS_ERROR、輸出錯(cuò)誤日志(包含接收的CRC和計(jì)算的CRC)。否則,保持e2e_status為E2E_P04STATUS_OK。

4. 返回校驗(yàn)結(jié)果,輸出最終的校驗(yàn)狀態(tài)。 代碼實(shí)現(xiàn)流程:

開(kāi)始

│├─ 初始化 data_crc 和 e2e_status├─ 檢查數(shù)據(jù)長(zhǎng)度是否在 [min_data_length, max_data_length] 范圍內(nèi) → 不滿足 → 返回 NODATAAVAILABLE├─ 檢查 data_size 是否等于 header_src->length → 不滿足 → 返回 ERROR├─ 調(diào)用 e2e_calculate_crc32P4 計(jì)算 CRC├─ 比對(duì) header_src->crc 和 data_crc → 不匹配 → 設(shè)置 e2e_status = ERROR└─ 返回 e2e_status

代碼實(shí)現(xiàn):

uint32_t e2e_do_checkP04(const struct e2e_header *header_src, const uint8_t *pdata,rtps_entity_id_t *reader_id, rtps_entity_id_t *writer_id, struct rtps_sn *sn,struct e2e_p04_cfg profile04_cfg, uint16_t data_size){uint32_t data_crc           = 0xFFFFFFFFU;enum E2E_P04CheckStatusType e2e_status  = E2E_P04STATUS_OK; if (!(profile04_cfg.min_data_length <= header_src->length) ||!(profile04_cfg.max_data_length >= header_src->length)) { pr_err(ERR_FAULT, "Error status:E2E_P04STATTUS_NODATAAVAILABLE!""[header_src->length:%u]\n",header_src->length);return (uint32_t)E2E_P04STATTUS_NODATAAVAILABLE;} if (!(data_size == header_src->length)) { pr_err(ERR_FAULT, "Error status:E2E_P04STATUS_ERROR! [data_size:%u]""[header_src->length:%u]\n", data_size, header_src->length);return (uint32_t)E2E_P04STATUS_ERROR;} data_crc = e2e_calculate_crc32P4(pdata, header_src->length,reader_id, writer_id, sn); if (header_src->crc != data_crc) {e2e_status = E2E_P04STATUS_ERROR; pr_err(ERR_FAULT, "Error status:E2E_P04STATUS_ERROR! ""[header_src->crc:%u] [data_crc:%u]\n",header_src->crc, data_crc);} else {e2e_status = E2E_P04STATUS_OK;}return (uint32_t)e2e_status;}

3、序列號(hào)自增計(jì)數(shù)

代碼結(jié)構(gòu)設(shè)計(jì):

函數(shù):e2e_increment_counter

作用:遞增一個(gè)16 位無(wú)符號(hào)整數(shù)計(jì)數(shù)器。

關(guān)鍵邏輯:

掩碼的作用:MAX_P04_COUNTER_MASK 確保計(jì)數(shù)器在達(dá)到最大值后重新從 0 開(kāi)始(模運(yùn)算效果)。

無(wú)符號(hào)整數(shù)處理:使用uint16_t 和 1u 避免符號(hào)擴(kuò)展和溢出問(wèn)題。 代碼實(shí)現(xiàn)思路:

1. 參數(shù)解析

獲取待遞增的計(jì)數(shù)器指針。輸入?yún)?shù)counter是一個(gè)指向uint16_t的指針,表示需要遞增的計(jì)數(shù)器。

2. 遞增計(jì)數(shù)器

將計(jì)數(shù)器值加1。

3. 應(yīng)用掩碼限制范圍

確保計(jì)數(shù)器值不超過(guò)MAX_P04_COUNTER_MASK(通常為0xFFFF或更?。?

按位與操作:(*counter+1u)&MAX_P04_COUNTER_MASK。

MAX_P04_COUNTER_MASK是一個(gè)掩碼,用于截?cái)喔呶?,限制?jì)數(shù)器范圍。

例如,若MAX_P04_COUNTER_MASK=0xFFFF,則計(jì)數(shù)器在0x0000到0xFFFF之間循環(huán)。

4. 更新計(jì)數(shù)器值

將計(jì)算后的新值寫回計(jì)數(shù)器。通過(guò)*counter=...將遞增并掩碼后的值賦給原計(jì)數(shù)器。

代碼流程:

開(kāi)始

├─ 解引用 counter 獲取當(dāng)前值├─ 計(jì)算新值:current_value + 1├─ 應(yīng)用掩碼:new_value & MAX_P04_COUNTER_MASK└─ 將新值寫回 counter 代碼實(shí)現(xiàn):

void e2e_increment_counter(uint16_t *counter){*counter = (uint16_t)((*counter + 1u) & MAX_P04_COUNTER_MASK);}

4、序列號(hào)計(jì)數(shù)器檢查

代碼結(jié)構(gòu)設(shè)計(jì):

函數(shù):e2e_check_counter

作用:檢測(cè)序列號(hào)(SN)的連續(xù)性,防止消息丟失或亂序。

關(guān)鍵邏輯:

首次接收時(shí)初始化計(jì)數(shù)器(e2e_first_rcv)。

后續(xù)接收時(shí)計(jì)算計(jì)數(shù)器差值(counter_delta):

counter_delta==1:正常。

1<counter_delta<=max_delta_counter:部分丟失(E2E_P04STATUS_OKSOMELOST)。

counter_delta<=0:重復(fù)消息(E2E_P04STATUS_REPEATED)。

counter_delta>max_delta_counter:嚴(yán)重亂序(E2E_P04STATUS_WRONGSEQUENCE)。

代碼思路:

該函數(shù)e2e_check_counter用于檢查通信系統(tǒng)中消息序列號(hào)(SN)的連續(xù)性,確保消息順序正確且無(wú)丟失或重復(fù)。

1. 檢查遠(yuǎn)程Writer狀態(tài)

確保Writer在線且可提供計(jì)數(shù)器信息。若wproxy==NULL(Writer離線),輸出錯(cuò)誤日志并直接返回。

2. 檢查Reader的E2E功能狀態(tài)

若Reader未啟用E2E,跳過(guò)后續(xù)檢查。調(diào)用reader_e2e_enabled(r)檢查Reader是否啟用E2E。若未啟用,設(shè)置rcc->e2e_status=E2E_P04STATUS_OK和rcc->counter=0,直接返回。

3. 處理首次接收消息

初始化首次接收的計(jì)數(shù)器。若wproxy->e2e_first_rcv為true(首次接收):

設(shè)置e2e_first_rcv=false,標(biāo)記非首次接收。

記錄當(dāng)前序列號(hào)到wproxy->last_e2e_count,直接返回。

4. 處理CRC或數(shù)據(jù)長(zhǎng)度錯(cuò)誤

若之前校驗(yàn)失敗,僅更新計(jì)數(shù)器,不修改狀態(tài)。若rcc->e2e_status!=E2E_P04STATUS_OK(校驗(yàn)失敗):更新wproxy->last_e2e_count為當(dāng)前序列號(hào),直接返回。

5. 計(jì)算序列號(hào)差值

檢測(cè)消息順序是否正常。

a) 計(jì)算差值:counter_delta=current_sn-last_e2e_count。current_sn通過(guò)rtps_sn_to_int64(&rcc->cc.sn)轉(zhuǎn)換得到。

b) 判斷差值范圍:

正常(counter_delta==1):消息順序正確,設(shè)置e2e_status=E2E_P04STATUS_OK。

部分丟失(1<counter_delta<=max_delta_counter+1):設(shè)置e2e_status=E2E_P04STATUS_OKSOMELOST,輸出錯(cuò)誤日志。

重復(fù)(counter_delta<=0):設(shè)置e2e_status=E2E_P04STATUS_REPEATED,輸出錯(cuò)誤日志。

嚴(yán)重亂序(counter_delta>max_delta_counter+1):設(shè)置e2e_status=E2E_P04STATUS_WRONGSEQUENCE,輸出錯(cuò)誤日志。

6. 更新計(jì)數(shù)器

記錄當(dāng)前序列號(hào)用于下一次比較:將wproxy->last_e2e_count更新為當(dāng)前序列號(hào)current_sn。

代碼流程:

開(kāi)始

├─ 檢查 wproxy 是否為 NULL → 是 → 輸出錯(cuò)誤日志并返回├─ 檢查 Reader 是否啟用 E2E → 未啟用 → 設(shè)置狀態(tài)為 OK,返回├─ 檢查是否為首次接收 → 是 → 初始化 last_e2e_count,返回├─ 檢查 e2e_status 是否為 OK → 不是 → 更新 last_e2e_count,返回├─ 計(jì)算 counter_delta = current_sn - last_e2e_count├─ 判斷 counter_delta 范圍:│ ├─ counter_delta == 1 → 設(shè)置狀態(tài)為 OK│ ├─ 1 < counter_delta <= max_delta_counter + 1 → 設(shè)置狀態(tài)為 OKSOMELOST,輸出日志│ ├─ counter_delta <= 0 → 設(shè)置狀態(tài)為 REPEATED,輸出日志│ └─ counter_delta > max_delta_counter + 1 → 設(shè)置狀態(tài)為 WRONGSEQUENCE,輸出日志└─ 更新 last_e2e_count 為 current_sn

代碼實(shí)現(xiàn):

void e2e_check_counter(struct reader *r, struct reader_cache_change *rcc, struct writer_proxy *wproxy){if (wproxy == NULL) { pr_err(ERR_FAULT, "The remote writer has offline, can't get counter and e2e_status from writer");return;}if (!(reader_e2e_enabled(r))) {rcc->e2e_status = (uint32_t)E2E_P04STATUS_OK;rcc->counter = 0;return;}if (wproxy->e2e_first_rcv) {wproxy->e2e_first_rcv= false;wproxy->last_e2e_count= rtps_sn_to_int64(&rcc->cc.sn);return;}if (rcc->e2e_status != (uint32_t)E2E_P04STATUS_OK) {wproxy->last_e2e_count= rtps_sn_to_int64(&rcc->cc.sn);return;}uint16_t counter_delta = (((int16_t)rtps_sn_to_int64(&rcc->cc.sn)) - wproxy->last_e2e_count);if (counter_delta <= (r->attr->ep_attr.e2e.e2e_p04_max_delta_counter + 1U)) {if (counter_delta > 0U) {if (counter_delta == 1U) {rcc->e2e_status = (uint32_t)E2E_P04STATUS_OK;} else {rcc->e2e_status = (uint32_t)E2E_P04STATUS_OKSOMELOST;pr_err(ERR_FAULT, "Error status:E2E_P04STATUS_OKSOMELOST! ""[profile04_cfg.max_delta_counter:%hu] [counter_delta:%hu]\n",r->attr->ep_attr.e2e.e2e_p04_max_delta_counter, counter_delta);}} else {rcc->e2e_status = (uint32_t)E2E_P04STATUS_REPEATED;pr_err(ERR_FAULT, "Error status:E2E_P04STATUS_REPEATED! ""[profile04_cfg.max_delta_counter:%hu] [counter_delta:%hu]\n",r->attr->ep_attr.e2e.e2e_p04_max_delta_counter, counter_delta);}} else {rcc->e2e_status = (uint32_t)E2E_P04STATUS_WRONGSEQUENCE;pr_err(ERR_FAULT, "Error status:E2E_P04STATUS_WRONGSEQUENCE! ""[profile04_cfg.max_delta_counter:%hu] [counter_delta:%hu]\n",r->attr->ep_attr.e2e.e2e_p04_max_delta_counter, counter_delta);}wproxy->last_e2e_count= rtps_sn_to_int64(&rcc->cc.sn);return;}



#04小  結(jié)

上文中分析的代碼實(shí)現(xiàn)了一個(gè)完整的端到端數(shù)據(jù)完整性保護(hù)機(jī)制,適用于對(duì)實(shí)時(shí)性和可靠性要求高的分布式系統(tǒng)。其核心是通過(guò)CRC-32/P4校驗(yàn)和序列號(hào)跟蹤,確保數(shù)據(jù)的正確性和順序性。 這套E2E校驗(yàn)算法被理想VCOS應(yīng)用與DDS中的RTPS協(xié)議。代碼中使用查表法加速CRC計(jì)算。代碼健壯性也比較好,覆蓋了數(shù)據(jù)長(zhǎng)度、CRC、序列號(hào)等多維度校驗(yàn)。 不過(guò)也有幾個(gè)可以改進(jìn)的方向:

安全性:CRC并非加密哈希,如需防篡改可改用SHA-256等算法。

可配置性:CRC多項(xiàng)式和初始值可通過(guò)配置文件動(dòng)態(tài)設(shè)置。

線程安全:若在多線程環(huán)境中使用,需增加對(duì)共享數(shù)據(jù)(如last_e2e_count)的鎖保護(hù)。

分享到:
 
反對(duì) 0 舉報(bào) 0 收藏 0 評(píng)論 0
滬ICP備11026917號(hào)-25