目录
一、概述
二、限制与约束
三、依赖模块
5.1 TCPIP模块
5.2 通用上层
四、功能描述
4.1 套接字连接
4.2 PDU传输
4.3 PDU Header option
4.4 PDU 接收
4.5 最佳匹配算法
4.6 消息接受策略
4.7 TP PDU取消
4.8 路由组
4.9 PDU fan-out
五、API接口
5.1 API定义
5.2 回调接口
5.3 调度接口
一、概述
该文档规定了AUTOSAR 基本软件模块套接字适配器(SoAd)的功能、API和配置。
套接字适配器模块旨在弥合这两个概念之间的差距。通过建立一个预先确定的配置,其中包括自动存储所需的信息,并在运行时保留开放更新一些项目,从而利用了冲突的概念。此外,SoAd还将基于回调的软件体系结构与TCP/IP世界中基于套接字的通信处理解耦。
SoAd模块的主要目的是在使用pdu(例如PDU路由器)的自动共享通信服务模块和基于套接字的TCP/IP堆栈之间创建一个接口。它将把I-PDUid映射到套接字连接,反之亦然。TCP/IP协议栈在TcpIp SWS中指定,如下图所示。
二、限制与约束
在以太网上使用TCP/IP传输数据需要大约60字节的报头信息。这意味着对于小消息,头开销可能达到令人无法接受的高百分比。
为了避免进一步的协议开销,这里描述了每个PDU使用单个套接字连接。然而,这种解决方案是非常资源密集型的,特别是当要传输许多小的pdu时。这里描述的一个解决方案是添加一个小的PDU标头,其中包含一个ID和长度信息。这允许通过一个套接字连接传输多个pdu。此外,本规范中还提供了一个资源保护方案。
该文档不包括UDP或TCP端口号的分配。在IANA分配的编号范围内没有预留空间。每个实现者都负责管理所使用的端口号。
该文档不包括IP地址的管理。这可以动态完成,例如通过使用DHCP,或静态完成。实现者的责任是防止地址冲突和实现对IANA地址分配的一致性。
该规范没有规定某个物理层或数据速率。
SOME/IP协议规范指定,在检查服务ID和方法ID是否有效之前,要先检查协议版本。SoAd不检查协议版本。独立于未来的版本,它总是将前4个字节解释为消息ID(本文档中的头ID),第二个4个字节解释为有效负载长度。
SOME/IP协议规范指定在检查方法ID是否有效之前检查接口版本。SoAd不检查接口版本。SoAd在专用路由路径上执行独立于所包含的接口版本的路由到已配置的消息id。
SOME/IP协议规范指定要检查服务ID和方法ID是否有效。无效的id应响应与相应的错误码。
SoAd检查SOME/IP消息ID(本文档中的报头ID),这是服务ID和方法ID的组合。如果ID无效,则该模块无法响应相应的错误代码。相反,它引发了运行时错误SOAD_E_INV_PDUHEADER_ID。
SOME/IP协议规范通过[PRS_SOMEIP_00535]规定,所有传输协议绑定都应支持在传输层PDU中传输多个SOME/IP邮件。在TCP中,该要求超出了SoAd的范围,因为在TCP流上的消息包装和运输不受SoAd的影响。如果UDP收集的SOME/IP消息,仅限于IF API。根据[SWS_SoAd_00553],我们将通过TP API从上层检索到SOME/IP消息,并立即通过UDP发送。在这种情况下,无法预见打包消息,也不支持打包消息。
三、依赖模块
5.1 TCPIP模块
TcpIp模块实现了TCP/IP协议系列的主要协议(TCP、UDP、TLS、IPv4、ARP、ICMP、DHCP、IPv6、NDP、ICMPv6、DHCPv6),并通过以太网提供动态的、基于套接字的通信。SoAd模块是TcpIp模块中可能的上层模块之一。
5.2 通用上层
SoAd模块提供了一个通用的上层支持,即SoAd为任何符合SoAd通用上层API/配置的上层提供其服务。SoAd的每个上层都可以指定它想要使用哪种服务。
在AUTOSAR 体系结构中,已经定义了许多SoAd上层模块。以下列表指定了这些模块,并提供了所使用的SoAd服务的粗略描述:
- PduR
- UdpNM
- SD
- DoIp
四、功能描述
SoAd可以通过TCP/IP网络实现基于pdu的通信。因此,AUTOSAR i-pdu被映射到由SoAd配置和维护的套接字连接。要为多个I-PDU使用套接字连接,可以选择在每个I-PDU前面添加一个SoAd PDU标头。指定一个消息接受策略来定义接受哪些来自远程节点的TCP连接和UDP数据报。套接字连接可以通过来自上层的请求自动打开或手动打开。对于断开和恢复套接字连接,我们定义了一个策略。SoAd的上层可以使用IF-API和TP-API来传输和接收pdu。为了有选择地启用/禁用PDU从或到套接字连接的路由,我们定义了PDU路由组,并可以由SoAd的上层进行控制。IF-PDU也可以转发到多个套接字连接,或者从套接字连接接收的消息可以作为不同的IF-PDU转发到SoAd(PDU输出)的相同或不同的上层。
4.1 套接字连接
对于TCP/IP通信的抽象,SoAd定义了套接字连接。SoAd套接字连接指定本地套接字(即本地地址标识符和本地端口)和远程套接字(即远程IP地址和端口)之间的连接,以及连接参数,如传输协议、SoAd PDU报头的使用、缓冲区要求、连接设置、传输协议相关参数等。每个套接字连接都可以通过一个唯一的标识符(SoConId)进行标识。为同时支持多个通信合作伙伴,每个本地套接字,套接字具有相同连接参数的连接可以分组到套接字连接组。
【规范】当使用SoAd_OpenSoCon()和SoAd_CloseSoCon()分别调用时,SoAd应存储打开或关闭套接字连接的请求,但仅在SoAd_MainFunction()中根据连接设置和关闭策略处理该请求。
【规范】SoAd应在下列情况下锁定远程地址:
- TCP套接字连接不处于SOAD_SOCON_OFFLINE状态,
- 主动接受,
- 未决的tppdu接收
- 有源传输
- nPdu特性的等待传输,
- 通过SoAd_IfRoutingGroupTransmit()或SoAd_IfSpecificRoutingGroupTransmit()启动的挂起传输
一个锁定的远程地址不能被上层修改。
4.2 PDU传输
对于通过UDP或TCP套接字传输上层模块PDU SoAd配置指定链接到套接字连接的PDU路由。PDU路由(SoAdPduRoute,SoAdPduSRouteDest)描述了从SoAd的上层模块到TcpIp堆栈的相关套接字的路由,该路由由套接字连接(SoAdSocketConnection,SoAdSocket ConnectionGroup)描述。
SoAd的上层模块可以分别使用接口(IF)API或传输协议(TP)API,用于传输请求和数据提供。
4.3 PDU Header option
【规范】如果为Socket连接和PDU传输启用PDU头选项(SoAdPduHeaderEnable 为真),应在PDU数据之前插入配置的PDU头和实际PDU长度,即TcpIp_UdpTransmit()或TcpIp_TcpTransmit()长度增加PDU头长度,在PDU数据之前,PDU头应复制到SoAd UDP传输缓冲区(如果有)和SoAd_CopyTxData()内TcpIp指定的内存,请求PDU数据的开始。
【规范】SoAd PDU标头应包括一个4字节的ID字段,用于唯一标识接收端的PDU和一个4字节长度的字段,指定PDU的数据长度。两者都以较大位数的字节顺序排列
4.4 PDU 接收
对于通过UDP或TCP套接字接收PDU,SoAd配置指定了一个可指套接字连接的套接字路由。Socket路由(SoAdSocketRoute, SoAdSocketRouteDest)描述从TcpIp堆栈的UDP或TCP套接字(SoAdSocketConnection, SoAdSocketConnectionGroup)到SoAd相关上层模块的路由。
SoAd的上层模块可以使用接口(IF)API或传输协议(TP)API用于PDU接收。
【规范】为了从UDP或TCP套接字接收消息,并将接收到的数据作为PDU转发到相关的上层,SoAd应负责
- 通过使用SoAd_RxIndication()
- 中提供的SocketId来识别相关的插座连接和插座路由。根据消息接受策略
- 筛选消息。将消息转换为PDU
- 如果PDU长度为0和(SoADPDu头启用为假或SoADRx上pper版面类型为TP)
- 则跳过进一步处理。根据Soad配置中指定的上层类型,调用配置的上层模块的上层类型相关的接收功能
【规范】如果一个UDP套接字连接组属于多个套接字连接,则该组的所有套接字连接之间共享一个UDP插座,并根据最佳匹配算法选择相关的套接字连接(见[SWS_SoAd_00680])
【规范】如果套接字连接禁用PDU头选项(SoAdPdu头启用为假),SoAd应将接收到的UDP或TCP消息1:1转换为SoAd_RxIndication()内的PDU,即每个TCP段和UDP消息形成一个单独的PDU.
【规范】如果SoAdSocketUdpStrictHeaderLenCheckEnabled启用了,SoAd应在将任何数据转发到上层之前,检查接收到的UDP消息的长度是否与所有PDU的累计长度,包括所有PDU头的累计长度相匹配。如果它们的长度不同,SoAd将无声地删除整个消息而不转发任何数据。
【规范】如果套接字连接启用了PDU头选项(SoADU头启用为真),SoAd应根据以下内容将消息转换为SoAd_RxIndication()内的PDU:
- 如果PDU头分成多个TCP段
- 则将其组装到接收缓冲区。从接收消息
- 中提取PDU头。根据接收到的PDU头ID(SOADID)选择相关的套接字路由;如果没有找到套接字路由,请丢弃PDU并引发运行时错误SOAD_E_INV_PDUHEADER_ID。
- 使用PDU标头的长度字段来标识实际PDU的长度和下一个PDU的开始时间,以继续执行(2),直到达到消息的结束时间为止。如果其余部分小于PDU标头或标头SoAd内的指示长度,则应停止处理并忽略消息的其余部分。
【规范】如果没有有效的PDU数据被转发到上层,并且在同一SoAd_RxIndication()的上下文中根据[SWS_SoAd_00592]覆盖了套接字连接的远程地址,则SoAd应恢复远程地址更改,并将套接字连接的状态设置回SOAD_SOCON_RECONNECT。
【规范】在TCP套接字连接的情况下,SoAd应通过分别调用SoAd_RxIndication()或SoAd_MainFunction()内的TcpIp_TcpReceived()来确认接收转发到上层或最终处理的所有数据(例如丢弃的数据或处理过的PDU头)。
【规范】SoAd应根据每个Socket连接的接收订单,独立处理TP-和IF-PDU。
【规范】当使用SoAd接收缓冲区时,SoAd应保存接收数据的顺序。
【规范】当接收到必须存储在SoAd接收缓冲区中的PDU或PDU的一部分大于剩余的可用缓冲区大小时,SoAd应提高运行时错误SOAD_E_NOBUFS.
【规范】如果测量数据被启用(参见SoADGET和重新安置测量数据),当丢弃接收到的PDU时,SoAd应增加相应的测量数据。
4.5 最佳匹配算法
【规范】SoAd应使用以下最佳匹配算法,根据所提供的(特定的)远程地址,选择套接字连接组的套接字连接:
- 应忽略没有(特定或通配符)远程地址集的套接字连接
- 其余插座连接的远程地址应与提供的远程地址进行比较,并根据以下订单列表选择最匹配的插座连接(后列项目优先):
- IP地址和端口匹配
- IP地址匹配(并为端口设置了通配符)
- 端口匹配(并为IP地址设置了通配符)
- 通配符同时用于IP地址和端口
- 不匹配(即不能选择套接字连接)
4.6 消息接受策略
【规范】如果SoAdSocketMsgAcceptanceFilterEnabled为TRUE,SoAd应只接受来自远程节点的TCP连接或UDP数据报,其源地址与套接字连接中指定的远程地址匹配(通过配置参数So SoAd_SetRemoteAddr()远程地址和远程端口或使用SoAd_SetRemoteAddr()API设置在线。
【规范】如果IP地址和端口都匹配,则远程地址相匹配。如果IP地址相同或指定的IP地址设置为TCPIP_IPADDR_ANY(TCPIP_IP6ADDR_ANY),则IP地址匹配。如果端口相同或指定的端口设置为TCPIP_PORT_ANY,则该端口匹配。
【规范】对于使用已配置的远程地址(即IP地址或端口的任意字通配符)的自动UDP套接字连接(即配置参数SoAdSocketAutomaticSoConSetup设置为TRUE),SoAd应(a)将套接字连接的状态更改为SOAD_SOCON_RECONNECT,(b)在PDU传输后将远程地址重置为已配置的远程地址,直接在调用相关传输确认功能之前(或者如果未配置则调用)。
【规范】对于使用已配置的远程地址(即IP地址或端口的通配符)的自动TCP套接字连接,在PDU传输后,直接调用(或(b)之前,在未配置这样的功能),并关闭下一个SoAd_MainFunction().c中的套接字连接
【规范】当套接字连接关闭时,SoAd应将远程地址重置为SoAd_MainFunction()内已配置的远程地址(或在未配置远程地址的情况下取消设置远程地址)
【规范】如果SoAdSocketMsgAcceptanceFilterEnabled为FALSE,SoAd应接受来自远程节点的所有TCP连接或UDP数据报
4.7 TP PDU取消
【规范】SoAd应在使用SoAd_TpCancelReceive()和SoAd_TpCancelTransmit()调用时存储取消请求,但仅在SoAd_MainFunction()中根据连接丢失和恢复策略处理该请求。
【规范】如果没有TP接收或TP传输的PDU调用SoAd_TpCancelReceive()或SoAd_TpCancelTransmit(),SoAd应忽略该请求并返回E_NOT_OK。
4.8 断开和恢复
【规范】在SoAd_MainFunction()内,SoAd应关闭与活动TP传输相关的任何通信取消请求的Socket连接。
【规范】在SoAd_MainFunction()内,SoAd应关闭与活动TP接收相关的任何通信取消请求的插座连接。
【规范】SoAd应自动重建处于SoAd_MainFunction()内连接状态SOAD_SOCON_RECONNECT的插座连接,与配置参数SoAdSocketAutomaticSoConSetup,无关,即即使该参数设置为FALSE,也应重新建立连接。重新连接应通过考虑配置参数的启动来完成。
【规范】SoAd应为连接重建中SoAd_TpTransmit()收到的TP-PDU Tx请求返回E_NOT_OK
【规范】如果UDP套接字连接配置为SoAdSocketUdpAliveSupervisionTimeout,且远程地址被覆盖,如[SWS_SoAd_00592]中所述,该套接字连接的活动监控定时器应以配置参数SoAdSocketUdpAliveSupervisionTimeout.指定的值启动
【规范】如果UDP套接字连接配置了SoAdSocketUdpAliveSupervisionTimeout,并且接收到通过消息接受过滤器的数据报,则计时器应使用配置参数指定的值重新启动
【规范】如果UDP套接字连接配置了SoAdSocketUdpAliveSupervisionTimeout,,活动监控计时器耗尽,远程地址没有由上层设置,SoAd应
- 将套接字连接的状态更改为SOAD_SOCON_RECONNECT,
- 停用活动监控定时器,
- 将远程地址重置为在SoAd_MainFunction()处配置的远程地址。
【规范】如果功能SoAd_ReleaseRemoteAddr()将套接字连接的远程地址重置为包含通配符和套接字连接的配置远程地址,处于SOAD_SOCON_ONLINE模式,SoAd应将套接字连接模式更改为SOAD_SOCON_RECONNECT.
4.8 路由组
为了有选择地启用/禁用pdu从或到套接字连接的路由,我们定义了路由组,并可以由SoAd的上层进行控制。
【规范】SoAd应维护每个已配置的路由组的状态,并在初始化时根据配置参数SoAdRoutingGroupIsEnabledAtInit.激活或停用该状态。
【规范】如果使用TxPduId指定了只属于非活动路径组的SoAd_IfTransmit(),则SoAd_IfTransmit()应始终跳过该组的传输,并应认为传输成功,除非所有的SoAd_IfTransmit()只属于非活动路径组。在后一种情况下,SoAd应返回E_NOT_OK。
【规范】如果使用TxPduId指定了只属于非活动路径组的SoAd_TpTransmit(),则SoAd_TpTransmit()应始终跳过该组的传输,并应认为传输成功,除非所有的SoAd_TpTransmit()只属于非活动路径组。在后一种情况下,SoAd应返回E_NOT_OK。
【规范】如果根据不活动的程序组接收到PDU,则SoAd只需丢弃PDU。
【规范】属于SoAdSocketConnectionGroup,节点的插座连接组中的每个插座连接保持独立的状态,并将它们作为单独的连接组来处理。
【规范】如果SoAd_EnableSpecificRouting()是属于同一插座连接组的插座连接组,则仅在以下情况下才能启用插座连接的独立状态:
- 对于同一SoAdSocketRouteDest尚未映射到其他套接字连接)和
- 在同一连接的另一个引用的套接字连接上没有启用套接字组(即套接字连接没有映射到同一路径的另一个连接)。
否则,应退还E_NOT_OK。
4.9 PDU fan-out
【规范】对于If类型的上层,SoAd应支持多个通道,即一个IF-PDU可以通过多个Socket连接传输。
【规范】SoAd应处理一个Socket连接组的Socket线路,如同它们是本组的每个Socket连接。
【规范】如果多个套接字连接的传输请求返回E_NOT_OK,SoAd应在SoAd_IfTransmit()返回E_NOT_OK。
【规范】当有多个套接字连接时,SoAd应呼叫上层,具有配置的传输确认功能([SoAd][If]TxConfirmation()),在所有相关套接字连接传输成功后,结果仅设置为E_OK一次。
4.10 缓冲区处理
【规范】SoAd应提供足够的缓冲区来存储不能在SoAd_RxIndication()上下文中转发到上层的接收数据,以及可以(或应该)不转发到TcpIp的数据的缓冲区。
【规范】SoAd应提供足够的缓冲区来存储暂时无法转发到TcpIp的数据,例如SoAd UDP TP传输缓冲区或UdpTx缓冲区,nPduUdpTx缓冲区。
五、API接口
5.1 API定义
- SoAd_GetVersionInfo
- SoAd_Init
- SoAd_IfTransmit
- SoAd_IfRoutingGroupTransmit
- SoAd_IfSpecificRoutingGroupTransmit
- SoAd_TpTransmit
- SoAd_TpCancelTransmit
- SoAd_TpCancelReceive
- SoAd_GetSoConId
- SoAd_OpenSoCon
- SoAd_CloseSoCon
- SoAd_GetSoConMode
- SoAd_RequestIpAddrAssignment
- SoAd_ReleaseIpAddrAssignment
- SoAd_GetLocalAddr
- SoAd_GetPhysAddr
- SoAd_GetRemoteAddr
- SoAd_EnableRouting
- SoAd_EnableSpecificRouting
- SoAd_DisableRouting
- SoAd_DisableSpecificRouting
- SoAd_SetRemoteAddr
- SoAd_SetUniqueRemoteAddr
- SoAd_ReleaseRemoteAddr
- SoAd_TpChangeParameter
- SoAd_ReadDhcpHostNameOption
- SoAd_WriteDhcpHostNameOption
- SoAd_GetAndResetMeasurementData
- SoAd_IsConnectionReady
5.2 回调接口
- SoAd_RxIndication
- SoAd_CopyTxData
- SoAd_TxConfirmation
- SoAd_TcpAccepted
- SoAd_TcpConnected
- SoAd_TcpIpEvent
- SoAd_LocalIpAddrAssignmentChg
5.3 调度接口
- SoAd_MainFunction