AUTOSAR进阶图解==>AUTOSAR_SWS_E2ETransformer
AUTOSAR E2E Transformer 模块详解
目录
- 概述
1.1. 功能介绍
1.2. 使用场景 - 架构设计
2.1. 模块架构
2.2. 数据流程 - 配置模型
3.1. 配置结构
3.2. 优先级策略 - 状态机
4.1. 状态转换
4.2. 错误处理 - 限制与约束
- 总结
1. 概述
1.1. 功能介绍
E2E Transformer是AUTOSAR基础软件中的安全类模块,负责为安全相关数据通信提供端到端保护机制。E2E Transformer模块封装了E2E Library库的复杂配置和处理逻辑,为调用者提供了标准的转换接口。
模块主要功能包括:
- 基于配置调用E2E Library进行数据保护
- 实例化E2E配置和状态数据结构
- 为安全相关数据提供端到端保护
- 封装E2E复杂性,提供标准转换器接口
E2E Transformer由RTE调用,RTE调用是软件组件调用RTE API (读、写、发送、接收) 的结果。在发送方,E2E Transformer负责E2E保护数据;在接收方,E2E Transformer负责检查数据并通过RTE向软件组件提供E2E检查结果。
1.2. 使用场景
E2E Transformer适用于以下场景:
- 安全相关数据需要进行端到端保护
- 通过QM通信栈的安全相关I-信号通信
- 一对一的数据元素到I-信号映射
- 发送方单个数据元素序列化到一个I-信号
- 接收方可能有一个或多个数据元素代表整个接收的I-信号
特别注意,目前E2E Transformer主要支持以下通信情况:
- 仅考虑发送-接收(队列和非队列)通信,不支持客户端-服务器
- 仅考虑软件组件之间的周期性通信,不支持基于事件的通信
- 仅考虑ECU间通信(通过COM栈交换)
- 仅考虑队列发送-接收通信的非阻塞特性
2. 架构设计
2.1. 模块架构
下图展示了E2E Transformer在AUTOSAR架构中的位置及其与其他模块的关系:
组件 AUTOSAR 软件组件 (SWC):
- 职责: 包含安全相关组件和QM组件,是应用层的主要构成部分
- 功能点:
- 安全相关组件负责处理安全关键的数据和功能
- QM组件处理常规功能,不需要安全保证
- 软件组件通过RTE API与其他组件进行通信
组件 运行时环境 (RTE):
- 职责: 为软件组件提供通信环境,充当软件组件和基础软件之间的中间层
- 功能点:
- 提供统一的API供软件组件调用(读、写、发送、接收)
- 调用E2E Transformer进行数据保护和检查
- 负责数据的路由和传输
组件 E2E Transformer:
- 职责: 为安全相关数据提供端到端保护,封装E2E Library的使用
- 功能点:
- 管理E2E配置和状态数据结构
- 在发送端调用E2E Library保护数据
- 在接收端调用E2E Library检查数据
- 为安全相关通信提供端到端保护
组件 E2E Library:
- 职责: 提供实际的E2E保护算法和功能
- 功能点:
- 提供各种E2E配置文件(Profile)实现
- 包含保护、检查和状态机功能
- 为E2E Transformer提供虚拟(无状态)函数
组件 通信栈 (COM Stack):
- 职责: 负责数据在ECU间的传输和路由
- 功能点:
- COM模块处理信号的打包和解包
- PDU Router负责PDU的路由和传输
- 被视为"黑通道",不需要了解E2E保护的内部机制
/* E2E Transformer模块初始化示例 */
Std_ReturnType E2EXf_Init(const E2EXf_ConfigType* Config)
{Std_ReturnType ret = E_OK;/* 参数检查 */if (Config == NULL){return E_NOT_OK;}/* 初始化所有状态数据 */for (uint8 i = 0; i < Config->numOfProtectStates; i++){E2E_PXXProtectInit(&Config->protectStates[i]);}for (uint8 i = 0; i < Config->numOfCheckStates; i++){E2E_PXXCheckInit(&Config->checkStates[i]);}/* 设置初始化状态为TRUE */E2EXf_ModuleInitialized = TRUE;return ret;
}
2.2. 数据流程
下图展示了E2E Transformer在数据发送和接收过程中的数据流和处理步骤:
初始化阶段:
- 功能: 系统启动时初始化E2E Transformer模块的配置和状态
- 处理步骤:
- 软件组件触发初始化过程
- RTE调用E2EXf_Init()函数
- E2E Transformer初始化所有状态数据结构
- 对发送方和接收方分别执行初始化
数据发送阶段:
- 功能: 在发送数据时添加E2E保护
- 处理步骤:
- 发送方软件组件调用Rte_Write/Rte_Send API
- RTE调用E2E Transformer的转换函数
- E2E Transformer获取配置和状态数据
- E2E Transformer调用E2E_PXXProtect函数
- E2E Library添加校验和、计数器和数据ID等保护
- 保护后的数据通过COM栈发送到总线
数据接收阶段:
- 功能: 接收数据时检查E2E保护状态
- 处理步骤:
- COM栈接收数据并传递给RTE
- RTE调用E2E Transformer的转换函数
- E2E Transformer检查是否需要进行E2E检查
- 如果启用E2E检查,则获取配置和状态数据
- 调用E2E_PXXCheck检查CRC、计数器和数据ID
- 调用E2E_SMCheck更新状态机状态
- 将结果返回给RTE,最终传递给接收方软件组件
/* E2E Transformer调用E2E保护函数示例 */
Std_ReturnType E2EXf_Protect_<transformerId>(uint8* inputBuffer,uint8* outputBuffer,const E2EXf_ConfigType* Config)
{E2E_PXXProtectStateType* protectState;E2E_PXXConfigType* configData;Std_ReturnType result;/* 获取特定transformerId的配置和状态 */protectState = &Config->protectStateArray[<idx>];configData = &Config->configDataArray[<idx>];/* 调用E2E Library的保护函数 */result = E2E_PXXProtect(outputBuffer, /* 输出缓冲区 */configData, /* E2E配置数据 */protectState /* E2E保护状态 */);return result;
}/* E2E Transformer调用E2E检查函数示例 */
Std_ReturnType E2EXf_Check_<transformerId>(uint8* inputBuffer, uint8* outputBuffer,Std_ReturnType* status,const E2EXf_ConfigType* Config)
{E2E_PXXCheckStateType* checkState;E2E_SMCheckStateType* smState;E2E_PXXConfigType* configData;E2E_SMConfigType* smConfigData;E2E_PXXCheckStatusType checkStatus;Std_ReturnType result = E_OK;/* 检查是否禁用E2E检查 */if (Config->disableEndToEndCheck == TRUE){/* 仅复制数据,不执行检查 */memcpy(outputBuffer, inputBuffer, Config->dataLength);*status = E_OK;return E_OK;}/* 获取特定transformerId的配置和状态 */checkState = &Config->checkStateArray[<idx>];smState = &Config->smStateArray[<idx>];configData = &Config->configDataArray[<idx>];smConfigData = &Config->smConfigDataArray[<idx>];/* 调用E2E Library的检查函数 */result = E2E_PXXCheck(inputBuffer, /* 输入缓冲区 */configData, /* E2E配置数据 */checkState, /* E2E检查状态 */&checkStatus /* 检查结果 */);/* 调用状态机检查函数 */E2E_SMCheck(checkStatus, /* 检查结果 */smConfigData, /* 状态机配置 */smState /* 状态机状态 */);/* 返回状态 */*status = (smState->State == E2E_SM_VALID) ? E_OK : E_NOT_OK;return result;
}
3. 配置模型
3.1. 配置结构
E2E Transformer的配置模型如下图所示,包含了配置结构、元模型类及其关系:
类 E2EXf_ConfigType:
- 功能: E2E Transformer的主配置结构,包含所有配置数据和状态指针
- 关键属性:
- transformerId:
- 描述: 唯一标识特定转换器功能
- 类型: 字符串
- 取值范围: 符合AUTOSAR命名规范的唯一标识符
- 约束: 在同一ECU配置中必须唯一
- 配置结构指针:
- 描述: 指向特定E2E配置文件的配置结构
- 类型: 指针
- 约束: 根据使用的E2E配置文件类型不同而变化
- transformerId:
类 E2E_PXXConfigType:
- 功能: 特定E2E配置文件的配置结构,如P01、P02等
- 关键属性:
- DataID:
- 描述: 数据标识符,用于验证数据来源
- 类型: uint16
- 来源: EndToEndTransformationISignalProps.dataID
- DataLength:
- 描述: 数据长度,单位为字节
- 类型: uint16
- 来源: EndToEndTransformationISignalProps.dataLength
- Offset:
- 描述: 保护数据在消息中的偏移量
- 类型: uint16
- 来源: EndToEndTransformationDescription.offset
- MaxDeltaCounter:
- 描述: 允许的最大计数器增量
- 类型: uint8
- 来源: EndToEndTransformationComSpecProps.maxDeltaCounter或EndToEndTransformationDescription.maxDeltaCounter
- DataID:
类 E2E_SMConfigType:
- 功能: E2E状态机的配置结构
- 关键属性:
- WindowSize:
- 描述: 状态机的窗口大小
- 类型: uint8
- 来源: EndToEndTransformationComSpecProps.windowSize或EndToEndTransformationDescription.windowSize
- MaxErrorStateInit:
- 描述: 初始化时允许的最大错误状态计数
- 类型: uint8
- 来源: EndToEndTransformationComSpecProps.maxErrorStateInit或EndToEndTransformationDescription.maxErrorStateInit
- WindowSize:
元模型类 (SystemTemplate):
- 功能: 提供E2E Transformer配置的元数据模型
- 主要类别:
- EndToEndTransformationDescription: 定义E2E变体的全局配置
- EndToEndTransformationISignalProps: 定义特定I-信号的保护配置
- EndToEndTransformationComSpecProps: 定义可覆盖特定设置的检查容差
/* E2E配置文件P01的配置类型定义 */
typedef struct {uint16 DataID; /* 数据标识符 */uint16 DataLength; /* 数据长度(字节) */uint16 CounterOffset; /* 计数器在数据中的偏移量 */uint16 CRCOffset; /* CRC在数据中的偏移量 */uint8 DataIDNibbleOffset;/* DataID半字节偏移量 */E2E_P01_DataIDMode DataIDMode; /* DataID模式 */
} E2E_P01ConfigType;/* E2E配置文件P02的配置类型定义 */
typedef struct {uint16 DataID; /* 数据标识符 */uint16 DataLength; /* 数据长度(字节) */uint8 MaxDeltaCounterInit; /* 允许的最大计数器增量 */uint8 MaxNoNewOrRepeatedData; /* 允许的最大无新数据计数 */uint8 SyncCounterInit; /* 同步计数器初始值 */
} E2E_P02ConfigType;/* E2E状态机配置类型定义 */
typedef struct {uint8 WindowSize; /* 状态机窗口大小 */uint8 MinOkStateInit; /* 初始化时的最小OK状态 */uint8 MaxErrorStateInit; /* 初始化时允许的最大错误状态 */uint8 MinOkStateValid; /* 有效状态所需的最小OK状态数 */uint8 MaxErrorStateValid;/* 有效状态允许的最大错误状态数 */uint8 MinOkStateInvalid; /* 无效状态所需的最小OK状态数 */uint8 MaxErrorStateInvalid; /* 无效状态允许的最大错误状态数 */
} E2E_SMConfigType;
3.2. 优先级策略
E2E Transformer使用明确的配置优先级策略来解决不同配置源之间的冲突:
-
最高优先级 - EndToEndTransformationComSpecProps:
- 用于接收方定制配置,如特殊容差值
- 可以通过disableEndToEndCheck跳过E2E检查
- 覆盖其他两个级别的所有配置选项
-
中等优先级 - EndToEndTransformationISignalProps:
- 为特定I-信号定义保护配置
- 包含dataID、dataLength等I-信号特定参数
-
最低优先级 - EndToEndTransformationDescription:
- 定义全局E2E变体配置
- 包含多个I-信号共享的通用配置
这种分层配置策略允许不同软件组件根据其安全需求接收相同的数据:
- 一些软件组件可能需要调整的E2E检查容差值
- 某些QM软件组件可能完全不需要E2E检查
- 不同接收组件可能有不同的安全要求
/* 配置优先级应用示例 */
void ApplyConfigurationPriority(E2E_PXXConfigType* finalConfig,const EndToEndTransformationDescription* descConfig,const EndToEndTransformationISignalProps* isignalConfig,const EndToEndTransformationComSpecProps* comSpecConfig)
{/* 从最低优先级到最高优先级应用配置 *//* 1. 应用EndToEndTransformationDescription(最低优先级)*/finalConfig->Offset = descConfig->offset;finalConfig->MaxDeltaCounter = descConfig->maxDeltaCounter;/* 2. 应用EndToEndTransformationISignalProps(中等优先级)*/finalConfig->DataID = isignalConfig->dataID;finalConfig->DataLength = isignalConfig->dataLength;/* 3. 应用EndToEndTransformationComSpecProps(最高优先级)*/if (comSpecConfig != NULL){/* 覆盖先前设置的值 */if (comSpecConfig->maxDeltaCounterValid == TRUE){finalConfig->MaxDeltaCounter = comSpecConfig->maxDeltaCounter;}/* 检查是否禁用E2E检查 */if (comSpecConfig->disableEndToEndCheck == TRUE){/* 如果禁用,E2E Transformer将跳过E2E Library调用 */}}
}
4. 状态机
4.1. 状态转换
E2E Transformer使用状态机来跟踪接收数据的状态。下图显示了状态机的转换过程:
状态 初始化:
- 功能: 系统启动时初始化E2E功能
- 关键转换:
- E2EXf_Init(): 初始化E2E Transformer模块
- E2E_PXXProtectInit(): 初始化发送方保护状态
- E2E_PXXCheckInit(): 初始化接收方检查状态
- 初始化完成后进入运行时状态
状态 数据有效 (E2E_SM_VALID):
- 功能: 表示接收的数据被认为是有效的
- 关键属性:
- 所有状态计数器在可接受范围内
- NoNewOrRepeatedDataCounter < MaxNoNewOrRepeatedData
- WrongSequenceCounter = 0
- ErrorInDataCRCCounter = 0
- 关键转换:
- 保持VALID: 接收数据校验通过
- 转到INVALID: 无新数据或序列错误
- 转到ERROR: 检测到CRC错误
状态 数据无效 (E2E_SM_INVALID):
- 功能: 表示接收的数据被认为是无效的
- 关键属性:
- 可能由于超时或序列计数器错误而无效
- 需要接收MinOkStateValid个有效数据才能恢复到VALID状态
- 关键转换:
- 保持INVALID: 继续接收无效数据
- 转到VALID: 接收到MinOkStateValid个有效数据
- 转到ERROR: 检测到CRC错误
状态 错误状态 (E2E_SM_ERROR):
- 功能: 表示检测到严重错误,如CRC错误
- 关键属性:
- ErrorInDataCRCCounter > 0
- 通常需要特殊恢复流程
- 关键转换:
- 保持ERROR: CRC错误继续存在
- 转到INVALID: 接收到MinOkStateInvalid个有效数据
- 很少直接转到VALID: 通常需要先过渡到INVALID状态
/* 状态机检查函数示例 */
void E2E_SMCheck(E2E_PXXCheckStatusType CheckReturn,const E2E_SMConfigType* ConfigPtr,E2E_SMCheckStateType* StatePtr)
{/* 根据检查结果更新状态计数器 */if (CheckReturn == E2E_P01STATUS_OK){/* 收到有效数据 */StatePtr->NoNewOrRepeatedDataCounter = 0;StatePtr->WrongSequenceCounter = 0;StatePtr->ErrorInDataCrcCounter = 0;StatePtr->ValidDataCounter++;}else if (CheckReturn == E2E_P01STATUS_NO_NEW_DATA){/* 未收到新数据 */StatePtr->NoNewOrRepeatedDataCounter++;StatePtr->ValidDataCounter = 0;}else if (CheckReturn == E2E_P01STATUS_WRONG_SEQUENCE){/* 序列错误 */StatePtr->WrongSequenceCounter++;StatePtr->ValidDataCounter = 0;}else if (CheckReturn == E2E_P01STATUS_ERROR){/* CRC错误 */StatePtr->ErrorInDataCrcCounter++;StatePtr->ValidDataCounter = 0;}/* 根据计数器更新状态 */if (StatePtr->State == E2E_SM_VALID){if (StatePtr->ErrorInDataCrcCounter > 0){/* CRC错误导致转入ERROR状态 */StatePtr->State = E2E_SM_ERROR;}else if (StatePtr->NoNewOrRepeatedDataCounter > ConfigPtr->MaxNoNewOrRepeatedData ||StatePtr->WrongSequenceCounter > 0){/* 无新数据或序列错误导致转入INVALID状态 */StatePtr->State = E2E_SM_INVALID;}}else if (StatePtr->State == E2E_SM_INVALID){if (StatePtr->ErrorInDataCrcCounter > 0){/* CRC错误导致转入ERROR状态 */StatePtr->State = E2E_SM_ERROR;}else if (StatePtr->ValidDataCounter >= ConfigPtr->MinOkStateValid){/* 收到足够多有效数据后恢复到VALID状态 */StatePtr->State = E2E_SM_VALID;}}else if (StatePtr->State == E2E_SM_ERROR){if (StatePtr->ValidDataCounter >= ConfigPtr->MinOkStateInvalid){/* 收到足够多有效数据后转入INVALID状态 */StatePtr->State = E2E_SM_INVALID;}}
}
4.2. 错误处理
E2E Transformer的错误处理策略基于状态机和计数器:
-
初始化错误:
- 如果Config指针为NULL,E2EXf_Init()返回E_NOT_OK
- 在后期可选构建变体中,如果Config指向未知配置变体,返回E_NOT_OK
-
运行时错误:
- 使用状态计数器跟踪错误事件:
- NoNewOrRepeatedDataCounter: 跟踪无新数据事件
- WrongSequenceCounter: 跟踪序列错误事件
- ErrorInDataCrcCounter: 跟踪CRC错误事件
- 状态机根据这些计数器决定当前状态
- 使用状态计数器跟踪错误事件:
-
错误恢复:
- 从ERROR到INVALID状态的恢复:需要接收MinOkStateInvalid个有效数据
- 从INVALID到VALID状态的恢复:需要接收MinOkStateValid个有效数据
- 恢复参数通过E2E_SMConfigType配置
-
E2E检查禁用:
- 如果EndToEndTransformationComSpecProps.disableEndToEndCheck设置为TRUE
- E2E Transformer跳过E2E Library调用,只执行缓冲区处理
- 返回值始终为E_OK
/* 错误处理和状态检查示例 */
Std_ReturnType ProcessReceivedData(const uint8* dataPtr,uint32 dataLength,E2E_SMCheckStateType* smState)
{Std_ReturnType result = E_NOT_OK;if (dataPtr == NULL || smState == NULL){return E_NOT_OK;}/* 根据状态机状态决定处理策略 */switch (smState->State){case E2E_SM_VALID:/* 数据有效,正常处理 */result = ProcessValidData(dataPtr, dataLength);break;case E2E_SM_INVALID:/* 数据无效,使用上一个有效数据或默认值 */result = HandleInvalidData(dataLength);break;case E2E_SM_ERROR:/* 严重错误,可能需要特殊处理或报告 */result = HandleErrorState();break;default:/* 未预期的状态 */result = E_NOT_OK;break;}return result;
}
5. 限制与约束
E2E Transformer模块存在以下限制和约束:
-
通信模式限制:
- 仅支持发送-接收通信(队列和非队列)
- 不支持客户端-服务器通信
- 仅支持周期通信,不支持事件触发通信
-
部署限制:
- 仅考虑ECU间通信(通过COM栈交换的通信)
- 仅支持队列发送-接收通信的非阻塞特性
-
数据映射限制:
- 一对一的数据元素到I-信号映射
- 不支持数据拆分/合并
-
配置变体:
- 支持链接时配置
- 支持后期可选构建配置
- 不支持预编译时配置(除了BSW通用设置)
-
已知限制:
- 尚未规范向DEM报告错误的功能
尽管存在这些限制,但它们不一定限制E2E Transformer在满足这些约束的用例中的使用。
/* 配置变体处理示例 */
#ifdef LINK_TIME_CONFIGURATION/* 链接时配置 - 固定变体名称为空字符串 */#define E2E_VARIANT_NAME ""/* 初始化指针指向唯一配置结构 */const E2EXf_ConfigType* E2EXf_Config = &E2EXf_ConfigStruct_0;
#else/* 后期可选构建配置 - 变体名称基于PredefinedVariant */#define E2E_VARIANT_NAME PredefinedVariant_ShortName/* 配置指针初始设为NULL,在运行时通过E2EXf_Init设置 */const E2EXf_ConfigType* E2EXf_Config = NULL;
#endif
6. 总结
AUTOSAR E2E Transformer模块通过提供标准化接口和统一配置机制,为安全关键系统中的端到端数据保护提供了高效解决方案。
主要优势:
- 封装复杂性: 隐藏E2E Library的具体实现,为调用者提供标准接口
- 灵活配置: 三级配置机制满足不同软件组件的不同安全需求
- 严格保护: 通过多种机制(CRC、计数器、数据ID)保护数据完整性
- 状态感知: 状态机设计提供可靠的错误检测和恢复机制
- 无缝集成: 与AUTOSAR RTE和通信栈完全集成
适用场景:
- 汽车安全关键系统中的数据通信
- 需要防止数据损坏、重放攻击或丢失的应用
- 通过不可靠通信通道的安全数据传输
- 符合ISO 26262等安全标准的系统设计
E2E Transformer作为AUTOSAR基础软件的重要组成部分,为开发人员提供了强大的工具来保证关键数据在不可靠通信通道中的安全传输,同时保持与AUTOSAR标准架构的一致性和兼容性。