目录
一、概述
二、约束和假设
三、依赖模块
3.1 EthIf
3.2 EthSM
3.3 SoAd
3.4 KeyM
3.5 CSM
四、功能说明
4.1 系统扩展性
4.2 IPv4
4.2.1 IPv4
4.2.2 ARP
4.2.3 Auto-IP
4.2.4 ICMP
4.3 IPv6
4.4 IPSec
4.5 基于IP的协议
4.5.1 本地地址表
4.5.2 UDP
4.5.3 TCP
4.5.4 TLS
4.5.5 DHCP
4.6 消息接收
4.7 消息发送
4.8 TCP/IP协议栈状态处理
4.9 安全事件
4.10 错误分类
4.10.1 开发错误
4.10.2 运行错误
五、API说明
5.1 通用接口
5.2 核心通信控制
5.3 扩展的通信控制和信息
5.4 发送
5.5 回调接口
5.6 调度接口
一、概述
AUTOSAR TCP/IP模块提供了发送和接收互联网协议数据的功能。TCP/IP堆栈(TCPIP)位于套接字适配器(SoAd)和以太网接口(EthIf)模块之间。
二、约束和假设
该文档不包括UDP或TCP端口号的分配。在IANA分配的编号范围内没有预留空间。每个实现者都负责管理所使用的端口号。
该文档不包括IP地址的管理。这可以动态完成,例如通过使用DHCP,或静态完成。实现者的责任是防止地址冲突,并实现对IANA地址分配的一致性。
该规范没有规定某个物理层或数据速率。
虽然指定了CDD接口,允许额外的上层模块,但不支持一个插槽扇到多个上层模块。
AUTOSAR TLS实现有以下限制:
- TLS实现不应支持数据压缩或解压缩。
- 不支持会议重新谈判。
- 不支持在UDP上的安全连接(例如,对于DTLS)
- 不支持FQDN
- No client Hello padding extension IETF RFC7685
- No session hash and extended master secret IETF RFC 7627
- 不支持低于1.2的TLS版本。
- 不支持对具有已建立的TLS连接到普通TCP连接(没有TLS)的TCP连接的动态“降级”
- 静态TLS连接分配被绑定到服务器的端口配置。因此,不可能对不同的连接到同一服务器端口(可能来自不同的客户端)使用不同的TLS设置。
AUTOSAR IPsec实现有以下限制:
- 目前不支持在“隧道模式”下的IPsec。仅传输模式。
- 不支持IPv6
- 不支持多播
三、依赖模块
3.1 EthIf
以太网接口是TcpIp模块的下层模块。
3.2 EthSM
以太网状态管理器通过从TcpIp模块请求通信模式来控制TcpIp模块的通信模式。TcpIp通知EthSM关于通信模式的更改。
3.3 SoAd
套接字适配器是TcpIp模块的上层模块。
3.4 KeyM
密钥管理器模块为TLS和IPsec子模块提供了证书处理的操作。
3.5 CSM
加密服务管理器允许执行TLS和IPsec子模块所使用的加密作业和密钥操作。
四、功能说明
4.1 系统扩展性
TcpIp模块支持各种不同的用例,并不是每个用户都需要所有的用例。为了实现可伸缩的TcpIp堆栈,协议应根据以下可伸缩性类别进行分组:
- 可扩展性等级1:车载IPv4和诊断通信
- 可扩展性等级2:车载IPv6和诊断通信
- 可扩展性等级3:IPv4和IPv6(双堆栈)-车载和诊断通信
除了可伸缩性类之外,以下特性组还允许更细粒度地选择可选特性,以满足某些ecu的特定需求:
- 路径MTU发现
- IPv6Anycast地址
- NDP重定向消息
- DHCP Server
- TLS
- IPsec
4.2 IPv4
4.2.1 IPv4
Internet协议(IP)是TCP/IP栈的主要协议,负责从源地址标识的源主机传输到目标地址标识的一个或多个目标主机。IP隐藏了底层物理网络接口,是一种不可靠的、最大的、无连接的包传递协议。
【规范】TcpIp应实现IETFRFC791(版本4的互联网协议)中定义的互联网协议。
【规范】TcpIp应根据IETF RFC 894将IP数据包封装在以太网帧中。
【规范】TcpIp应通过根据IETF RFC 4632第3.1节的IP地址的IP地址外,使用网络掩码(前缀),支持IP地址所属网络的识别。
【规范】TcpIp应满足IETF RFC 1122、第3.2.1.1节(版本号)、3.2.1.2(校验和)、3.2.1.3(地址)、3.2.1.7(TTL)和3.3.2(重组)中规定的互联网协议相关要求。
【规范】根据IETF RFC 1112,第4节、第6.2节和第6.4.⌋()节,TcpIp应能够向由单个IP目标地址(多播地址)标识的一组主机发送IP数据报。
【规范】根据IETF第4节RFC 1112节和第7.2节(不包括对IGMP的要求),TcpIp应能够接收由单个IP目标地址(多播地址)标识的多播IP数据报。
【规范】TcpIp应能够根据IETF RFC 815(IP数据报重组算法)重新组装输入的数据报。
【规范】TcpIp应在传输前根据IETF 791节分段和重组中的描述对超大的IPv4帧进行分段。
【规范】TcpIp应发现IETFRFC1191(路径MTU发现)中定义的路径的最大传输单元(MTU)。
4.2.2 ARP
【规范】TcpIp应实现IETFRFC826中定义的地址解析协议(ARP)。
【规范】TcpIp应将ARP表(地址解析缓存)条目的数量限制为配置参数TcpIpArpTableSizeMax指定的数量。
【规范】如果不使用配置参数TcpIp表指定的ARP表超时,则TcpIp应删除ARP表的条目。如果TcpIpArp表入口超时设置为INF,则TcpIp模块不得从ARP表中删除条目。
【规范】TcpIp除了使用接收到的ARP包外,还应使用每个接收到的IP包中的信息来更新ARP表。
【规范】TcpIp应在每次ARP表更改后直接调用():
- 如果TcpIp添加新条目或更新现有条目,则有效参数设置为TRUE,参数PpAddrPtr和Ptr根据新或更新的条目设置。
- 如果TcpIp删除了一个条目,有效应设置为FALSE,参数IpAddrPtr和Ptr应根据删除的条目设置。
【规范】在将ARP请求传输后,TcpIp应根据在IETF RFC 1122第2.3.2.1节ARP缓存验证中描述的机制,在TcpIp请求超时秒内跳过向同一目的地的任何进一步的ARP请求的传输。
【规范】TcpIp应直接在TcpIp_RxIndication或第一个后续TcpIp_MainFunction的上下文中处理接收到的ARP数据包。
【规范】在分配一个新的IP地址时,TcpIp应根据IETF RFC 2002,发送一个可配置的号码(第4.6节的免费ARP回复)。这些公告应根据IETF RFC 5227第2.3节进行计时。宣布一个地址。
4.2.3 Auto-IP
【规范】TcpIp应支持IETFRFC3927(IPv4链路-本地地址的动态配置)中定义的IPv4链路本地地址的动态配置。
4.2.4 ICMP
【规范】TcpIp应支持IETFRFC792(版本4中的互联网控制消息协议)中定义的互联网控制消息协议(ICMPv4)消息的传输和接收。
【规范】如果TcpIp是有效的ICMPv4回声请求消息,并且TcpIpIcmpEchoReplyEnabled设置为TRUE,TcpIp才能回复它们。
【规范】如果配置了TcpIpIcmp处理程序,如果收到ICMPv4消息而没有由TcpIp直接处理,TcpIp应调用相应的_IcmpMsgHandler()。
4.3 IPv6
IPv6协议簇有以下协议IPv6、ICMPv6、NDP。
【规范】TcpIp应支持IPv6包传输的帧格式,以及按照IETFRFC2464(I太网网络上的IPv6包传输)中定义的在IPF6包上形成IPv6链路本地地址和无状态自动配置地址的方法。
【规范】TcpIp应支持IETFRFC6724(因特网协议版本6(IPv6)的默认地址选择)中定义的源地址选择算法。应只支持第5节中的源地址选择。
【规范】TcpIp应支持IETFRFC5095(IPv6中0型路由头的废弃)。可以利用IPv6的0型路由头所提供的功能来实现远程路径上的流量放大,以生成拒绝服务流量。鉴于此安全问题,本文档更新了IPv6规范,以不赞成使用IPv60型路由标头。
【规范】TcpIp应支持第5.1节。节点配置变量,第5.3节。创建链路-本地地址,第5.4节,重复地址检测,第5.5节全局地址的创建和第5.6节IETF-RFC4862的配置一致性(IPv6无状态地址自动配置)。
【规范】TcpIp应支持IETFRFC1981(IP版本6的路径MTU发现)中定义的IPv6的路径MTU发现。如果最大值。在使用MTU时,路径MTU发现不应试图增加该值。
【规范】TcpIp应支持IETF RFC 4429中定义的重复地址检测(IPv6的最优重复地址检测(DAD)中的重复地址检测)。
4.4 IPSec
【规范】IKEv2应根据IETF RFC 7296和RS_IPSEC_00021进行实施,并带有RS_IPSEC_00004中定义的限制。不应支持IKEv1。
【规范】一般的IKEv2连接配置,例如连接寿命和重新键入/重新认证超时、死对等点检测,可以通过“IKE连接”容器中的设置进行配置。
【规范】用于与其他IKEv2节点认证的IKEv2证书可以通过容器“IKEChectats”和“IKE证书”中的设置进行配置。
【规范】安全策略数据库定义了哪些连接应该受IPsec保护,哪些保护可以通过容器“TcpIpSpd条目”和“TcpIpIpSec优先级”中的设置进行配置。IpSec优先级用于建立检查临时项目的顺序。将执行第一个成功的规则匹配,而忽略所有优先级较低的规则。
【规范】IKEv2握手算法的优先级可以在容器“IKEIkeSasbook”中配置。
4.5 基于IP的协议
4.5.1 本地地址表
【规范】TcpIp应维护一个本地IP地址表,它可以在运行期间根据配置容器TcpIpLocalAddr(包括其子容器)分配给EthIf控制器。
【规范】如果没有提供TcpIp静态地址配置,则TcpIp应能够在运行时通过TcpIp_RequestIpAddrAssignment()指定一个多播IP地址
【规范】用于套接字的本地IP地址是通过TcpIp_Bind()指定的。
【规范】如果启动了配置为TCPIP_STORE的TcpIpAddr分配,TcpIp应检查NvMBlock是否有有效的IP地址。如果存在有效地址,TcpIp应像分配为静态地址一样分配该地址。如果没有有效地址,TcpIp应启动与TcpIpAddr分配相关的相应IP地址分配方法。一旦程序完成,TcpIp应将新地址存储在NvMBlock中。
4.5.2 UDP
【规范】TcpIp应实现IETFRFC768(用户数据报协议)中定义的用户数据报协议(UDP)。
【规范】TcpIp应满足IETF RFC 1122、第4.1.3.1节(端口)、4.1.3.4 (UDP校验和)和4.1.3.6(无效地址)中规定的UDP相关要求。
4.5.3 TCP
【规范】TcpIp应实施IETFRFC793(传输控制协议)中定义的传输控制协议(TCP)。
【规范】TcpIp应满足IETFRFC11224.2.2.2.3、4.4.2.2.2.6、4.2.2.2.7、4.2.2.2.10)、4.2.2.2.10)、4.2.2.17(2.2.15、TTL)、4.2.3.2)和4.2.3.10(远程地址验证)规定的TCP相关要求。
【规范】TcpIp应支持ETF RFC 1122中定义的TCP中的窗口和确认策略:
- 4.2.3.1重传超时计算
- 4.2.3.2何时发送一个ACK段
- 4.2.3.3何时发送窗口更新
- 4.2.3.4何时发送数据。
【规范】TcpIp应实现IETF RFC 1122: 4.2.3.4何时发送数据中定义的Nagle算法。
【规范】TcpIp应实现IETF RFC 5681中定义的拥塞控制策略:慢启动、避免拥塞、快速转发和快速恢复。
【规范】TcpIp应支持响应IETFRFC6582(对TCP快速恢复算法的新Reno修改)中定义的部分确认的特定算法。只有在启用了IETF RFC 5681的快速恢复策略时,才应使用该修改。
4.5.4 TLS
【规范】TcpIp应根据IETF RFC5246,至少在第7章和第8章中,支持TCP通信的传输层安全。
【规范】应考虑IETF根据RFC 7525关于安全TLS实施的进一步建议。
【规范】TLS版本低于1.2(IETF RFC5246)的TLS连接请求将分别被忽略并被拒绝,并发出警报。因此,如IETF RFC5246,App中所述,对低于TLS 1.2的TLS版本没有向后兼容性处理。E应得到实施或支持。
【规范】如果TLS连接引用了TLS密码套件对TLS_VERSION_V13类型的定义,则TLS V1.3应为首选的协议版本。只有当这失败并且TLS V1.2的密码套件也被分配给TLS连接时,才允许对TLS V1.2的降级操作。
4.5.5 DHCP
【规范】动态主机配置协议的服务器部分应可通过预编译时进行配置,配置参数TcpIpDhcp服务器已启用
【规范】动态主机配置协议的服务器部分应通过根据相关TcpIpCtrl的DHCP服务器配置分配一个可用的IP地址来响应客户端请求。
【规范】如果配置包含涉及以太网交换机特定端口的TcpIpDhcpAddressAssignments,DHCP服务器应通过DHCP客户端的MAC地址调用EthIf_GetPortMacAddr(),并选择与同一端口相关的TcpIpDhcpAddressAssignment的可用的端口。
【规范】TcpIp应为IETFRFC2131(动态主机配置协议)中定义的IPv4地址的动态配置,实现动态主机配置协议(DHCPv4)的客户端和服务器部分。
【规范】TcpIp应支持IEPFRFC4702(IPv4的动态主机配置协议(DHCPv4)客户端完全限定域名(FQDN)选项)中定义的IPv4客户端需求的动态主机配置协议的完全限定域名选项。不支持DNS。仅支持第2节客户端FQDN选项和第3节DHCP客户端行为。不支持第3.2、3.3、3.5小节。
4.6 消息接收
【规范】TcpIpIP层应将接收到的IP数据报映射到本地地址表(TcpIpAddrId)中的一个条目。
如果满足以下所有条件,则本地地址表映射将成功:
- 接收接口与分配给本地地址表条目(EthIfCtrl)的接口相匹配。
- IP头中包含的目标IP地址与本地地址表项当前分配的IP地址匹配。
所有不能映射到本地地址表中的入口的IP数据报将被悄悄丢弃。所有成功映射的IP数据报都应被转发到上层协议。
【规范】如果已经配置了IPsec,那么所有接收到的IP数据报都应映射到一个安全策略条目,并按如下方式进行处理:
- TCPIP_IPSEC_POLICY_PROTECT:只有根据IETFRFC4302,IP数据报包含有效的身份验证头,才会被转发到上层。否则,将删除IP数据报,并调用可选的回调。
- TCPIP_IPSEC_POLICY_BYPASS:IP数据报被转发到上层,而不需要进行任何IPSec处理。
- TCPIP_IPSEC_POLICY_DISCARD:丢弃IP数据报,不进行任何IPSec处理。
【规范】所有映射到本地地址表中的IPv6条目的IP数据报,配置了可选的TcpIpLocalAddrIPv6ExtHeaderFilterRef,其中包含至少一个未在引用的TcpIpIpV6ConfigExtHeaderFilter中列出的IPv6扩展头,都将被悄悄地丢弃。如果本地地址表中的Ipv6条目没有配置有可选的TcpIpLocalAddrIPv6ExtHeaderFilterRef,,则应处理该帧。
【规范】TcpIpUDP层应根据UDP协议报头中包含的目标端口和本地地址(TcpIpAddrId),将接收到的UDP数据报映射到套接字。如果满足以下任何条件,则本地地址(TcpIpAddrId)匹配:
- 该套接字已绑定到本地地址(TcpIpAddrId)
- 套接字本地地址使用通配符“ANY”,并且套接字EthIfCtrl与在本地地址中使用的EthIfCtrl相同(TcpIpAddrId)
- 该套接字已绑定到TCPIP_LOCALADDRID_ANY
套接字绑定到一个本地地址,并且EthIfCtrl与在本地地址(TcpIpAddrId)中使用的EthIfCtrl相同,并且接收到的本地地址(TcpIpAddrId)是一个广播地址。
【规范】对于本地地址(TcpIpAddrId)是广播或多播地址的接收UDP数据报,所有匹配的套接字应接收传入消息。
【规范】TcpIpTCP层应根据TCP协议报头中包含的目标端口和本地地址(TcpIpAddrId),将接收到的TCP数据报映射到套接字。如果满足以下任何条件,则本地地址(TcpIpAddrId)匹配:
- 该套接字被绑定到一个单播本地地址(TcpIpAddrId)
- 套接字本地地址使用通配符“ANY”,并且套接字EthIfCtrl与在本地地址中使用的EthIfCtrl相同(TcpIpAddrId)
- 该套接字已绑定到TCPIP_LOCALADDRID_ANY
【规范】除[SWS_TCPIP_00172]中描述的通用TCP映射标准外,协议头还应与TCP连接中包含的源端口、TCP连接的源端口、源IP地址、目标端口和目标IP地址匹配。
【规范】对于本地地址(TcpIpAddrId)为广播或多播地址的接收到的TCP数据报,应静默丢弃。
【规范】如果通过TcpIp_ChangeParameter()在套接字上启用了TCP选项的过滤,TcpIp应根据允许的选项列表(ECUC_TcpIp_00202:TcpIpTcp配置过滤器)检查接收到的段,如果它包含至少一个未列出的TCP选项,则段将被无声丢弃。
【规范】对于接收,TcpIp模块应忽略关于根据以下列表的以太网控制器配置的帧的协议校验和字段:
- 对于IPv4帧,如果在硬件中启用了IPv4校验和验证,即EthCtrlEnableOffloadChecksumIPv4被设置为TRUE
- 对于ICMP帧,如果在硬件中启用了ICMP校验和验证,即EthCtrlEnableOffloadChecksumICMP被设置为TRUE
- 对于TCP帧,如果在硬件中启用了TCP校验和验证,即EthCtrlEnableOffloadChecksumTCP被设置为TRUE
- 对于UDP帧,如果在硬件中启用了UDP校验和验证,即EthCtrlEnableOffloadChecksumUDP被设置为TRUE。
在所有其他情况下,TcpIp模块应根据相关协议规范处理校验和不匹配的帧。
【规范】对于接收,TcpIp模块应接受仅在相应配置的套接字上包含零校验和的UDP数据报(即在调用TcpIp_ChangeParameter()时,TCPIP_PARAMID_UDP_CHECKSUM设置为false)。
【规范】如果测量数据被启用(参见TcpIpGetAndReset测量数据aapi),当丢弃接收到的数据报时,TcpIp将增加相应的测量数据。
4.7 消息发送
【规范】如果数据使用绑定到IPv4单播本地地址(TcpIpAddrId)的套接字传输,则TcpIp应使用分配给本地地址(TcpIpAddrId)作为IP数据报头中的源IP地址。IP数据报应使用本地地址(TcpIpAddrId)映射到的伦理EthIfCtrl进行传输。
【规范】如果数据使用通配符“ANY”使用IPv4套接字绑定到本地地址(TcpIpAddrId)传输,则TcpIp应使用已配置的本地地址(TcpIpIddrId)的IP地址,其类型为IPv4单播并分配给相同的EthIfCtrl,作为绑定本地地址(TcpIpAddrId)作为IP数据报头中的源IP地址。
【规范】如果数据传输使用IPv4插座绑定到TCPIP_LOCALADDRID_ANY,那么TcpIp应使用的IP地址配置的本地地址(TcpIpIddrId),类型IPv4单播和分配给IthIfCtrl在同一子网的目标IPv4地址源IP地址的IP数据报头。如果没有找到匹配的子网,则选择EthIfCtrl = 0的IPv4单播本地地址(TcpIpAddrId)。
【规范】如果数据使用绑定的IPv4 UDP本地地址(TcpIpIDdRId)传输,则TcpIp应使用配置的本地地址(TcpIpId)的IP地址,IPv4单播,分配给同一IthIfCtrl,作为绑定本地地址(TcpIpIDdrId)作为IP数据报头中的源IP地址。
【规范】如果数据使用绑定到IPv4IDP为广播类型的本地地址(TcpIpAddrId)传输,则TcpIp应使用已配置的本地地址(TcpIpIdId)的IP地址,该类型为IPv4单播并分配给相同的EthIfITRl,作为绑定本地地址(TcpIpIddrId)作为IP数据报头中的源IP地址。
【规范】如果数据传输使用未绑定的IPv4 UDP套接字,那么TcpIp使用配置的本地地址(TcpIpIddrId),这是IPv4单播类型,分配给If子网的目标IPv4地址作为IP数据报头中的源IP地址。如果没有找到匹配的子网,则选择EthIfCtrl = 0的IPv4单播本地地址(TcpIpAddrId)。
【规范】如果数据使用绑定到IPv6单播本地地址(TcpIpAddrId)的套接字传输,则TcpIp应使用分配给本地地址(TcpIpAddrId)作为IP数据报头中的源IP地址。IP数据报使用EthIfCtrl进行传输,即所映射的本地地址(TcpIpAddrId)。
【规范】TcpIp应根据IETF RFC 1122,第3.3.1.1节,为其发送的每个数据报选择正确的下一跳。(IPv4)和IETF RFC4861第5.2节。概念性发送算法(IPv6)。
【规范】如果参数TcpIpArpPacketQueueEnabled设置为TRUE,IPv4包发送到远程主机,但ARP表中不存在相关链路层地址,则TcpIp应根据IETF RFC 1122第2.3.2.2节启动地址解析并分组,并接受E_OK的传输请求。
【规范】如果参数TcpIpArpPacketQueueEnabled设置为FALSE,并将IPv4数据包发送到远程主机,但ARP表中不存在相关的链路层地址,则TcpIp应启动地址解析,但用E_NOT_OK拒绝传输请求。
【规范】通过ECUC_TcpIp_00069配置的最大重试后,计时器根据
- 如果TCPIP_PARAMID_TCP_RETRANSMIT_TIMEOUT如果提供的TcpIp_ChangeParameter()或
- 如果TCPIP_PARAMID_TCP_RETRANSMIT_TIMEOUT不是由TcpIp_ChangeParameter()提供的,则为TcpIpTcpRetransmissionTimeout
应在TCP连接关闭前的最后一次时重新启动。
【规范】对于传输,TcpIp模块应跳过协议校验和的计算,并根据以下列表填写关于以太网控制器配置的帧值0:
- 对于IPv4帧,如果在硬件中启用IPv4校验和计算,即EthCtrlEnableOffloadChecksumIPv4设置为TRUE
- 如果未分段的ICMP校验和计算启用硬件ICMP帧,EthCtrlEnableOffloadChecksumICMP设置为TRUE
- 对于TCP帧,如果在硬件中启用了TCP校验和计算,则EthCtrlEnableOffloadChecksumTCP被设置为TRUE
- 对于非碎片化UDP帧,如果启用了硬件中的UDP校验和计算,EthCtrlEnableOffloadChecksumUDP将设置为TRUE。
在所有其他情况下,TcpIp模块应根据相关协议规范计算校验和。
【规范】对于传输,TcpIp模块应跳过UDP协议校验和的计算,使用相应配置的套接字(即TCPIP_PARAMID_UDP_CHECKSUM设置为false)。
【规范】在默认情况下,如果参数Id设置为TCPIP_PARAMID_PATHMTU_ENABLE且值设置为TRUE,则来自该套接字的出站数据报的最大大小应由路径MTU发现确定。
【规范】如果已为套接字调用了参数Id设置为TCPIP_PARAMID_PATHMTU_ENABLE且值设置为FALSE的TcpIp_ChangeParameter(),则从该套接字获得的出站数据报的最大大小由静态配置决定。
【规范】如果请求从上层传输到TCP,并且连接被配置为TLS,但握手尚未启动或完成,则消息传输请求应返回E_NOT_OK。
【规范】如果已经配置了IPSec,TcpIp发送的每个IP数据报应映射到安全策略条目,并按如下方式处理:
- TCPIP_IPSEC_POLICY_PROTECT:根据IETF RFC 4302规定的认证头应插入到IP头后。
- TCPIP_IPSEC_POLICY_BYPASS:IP数据报不需要任何IPSec处理。
- TCPIP_IPSEC_POLICY_DISCARD:应删除IP数据报。
【规范】如果调用了TcpIp_IsConnectionReady(),并配置了一个安全关联,则该模块应:
- 检查套接字是否存在,并已绑定到指定的本地地址。
- 检查所提供的远程地址是否有相应的物理地址。
- 检查是否为此套接字建立了安全关联。
如果所有检查都成功,则该函数应返回TCPIP_E_OK。
【规范】如果调用了TcpIp_IsConnectionReady(),且未配置了安全关联,则该模块应:
- 检查套接字是否存在,并已绑定到指定的本地地址。
- 检查所提供的远程地址是否有相应的物理地址。
如果所有检查都成功,则该函数应返回TCPIP_E_OK。
【规范】如果调用了TcpIp_IsConnectionReady(),并且套接字没有绑定到指定的本地地址,则该函数将返回TCPIP_E_NOT_OK。
【规范】如果调用了TcpIp_IsConnectionReady(),而所提供的远程地址没有相应的物理地址,则TcpIp应启动地址解析(如果尚未启动)并返回TCPIP_E_PENDING。
【规范】如果调用了TcpIp_IsConnectionReady(),并且为套接字配置了一个安全关联,但没有建立:
- 如果正在建立安全协会,TcpIp应返回TCPIP_E_PENDING。
- 如果安全关联建立未启动,且安全关联允许启动安全连接,则TcpIp应启动建立并返回TCPIP_E_PENDING。
- 如果安全关联建立未启动,且安全关联不允许启动安全连接,则TcpIp应返回TCPIP_E_NOT_OK。
4.8 TCP/IP协议栈状态处理
【规范】TcpIp模块应为TcpIp模块使用的每个EthIf控制器保持一个单独的状态,存储最新的状态请求,并至少区分以下状态: TCPIP_STATE_OFFLINE、TCPIP_STATE_STARTUP、TCPIP_STATE_ONLINE、TCPIP_STATE_ONHOLD和TCPIP_STATE_SHUTDOWN。
【规范】如果存储的状态请求不是活动状态,TcpIp模块应根据动作启动以达到请求的状态。
【规范】每次转换后,TcpIp模块应通过EthSM_TcpIpModeIndication()向EthSM报告新的状态。
【规范】如果为一个EthIf控制器请求TCPIP_STATE_ONLINE,且该EthIf控制器的当前状态为TCPIP_STATE_OFFLINE,则TcpIp模块应为TCPIP_STATE_OFFLINE
- 根据该EthIf控制器配置的分配方法和触发器(TcpIp分配触发器)启用所有IP地址分配。(注意:如果分配触发器配置为TCPIP_MANUAL,不实际执行分配,但由上层启用启动)和
- 输入EthIf控制器的状态TCPIP_STATE_STARTUP。
【规范】如果配置了多个IP地址分配方法,并且来自具有较高优先级(1为最高)的分配方法的新地址可用,则TcpIp应使用新的IP地址,并释放以前由具有较低优先级的分配方法分配的IP地址。
【规范】如果EthIf控制器请求TCPIP_STATE_OFFLINE,并且该EthIf控制器的当前状态为TCPIP_STATE_STARTUP,TcpIp模块
- 应中止所有正在进行的IP地址分配操作,
- 为EthIf控制器输入状态TCPIP_STATE_OFFLINE。
【规范】如果至少有一个IP地址已成功分配给一个EthIf控制器,并且该EthIf控制器的当前状态为TCPIP_STATE_STARTUP,则TcpIp模块应进入EthIf控制器的状态TCPIP_STATE_ONLINE。
【规范】如果为一个EthIf控制器请求TCPIP_STATE_ONHOLD,且该EthIf控制器的当前状态为TCPIP_STATE_ONLINE,则TcpIp模块应为TCPIP_STATE_ONLINE
- 通过Up_LocalIpAddrAssignmentChg()和State TCPIP_IPADDR_STATE_ONHOLD通知上层相关EthIf控制器的所有分配IP地址,
- 停用相关EthIf控制器的TcpIp模块内的通信,
- 输入EthIf控制器的状态TCPIP_STATE_ONHOLD。
【规范】如果为一个EthIf控制器请求TCPIP_STATE_ONLINE,且该EthIf控制器的当前状态为TCPIP_STATE_ONHOLD,则TcpIp模块应为TCPIP_STATE_ONHOLD
- 重新激活相关EthIf控制器的TcpIp模块内的通信,
- 为相关EthIf控制器的所有IP地址进行Up_LocalIpAddrAssignmentChg()TCPIP_IPADDR_STATE_ASSIGNED,
- 输入EthIf控制器的状态TCPIP_STATE_ONLINE。
【规范】如果请求TCPIP_STATE_OFFLINE或已释放该If控制器的所有分配IP地址,且该If控制器的当前状态为TCPIP_STATE_ONLINE或TCPIP_STATE_ONHOLD,则TcpIp模块应
- 对相关的EthIf控制器的所有已分配的IP地址,用状态TCPIP_IPADDR_STATE_UNASSIGNED调用Up_LocalIpAddrAssignmentChg(),
- 停用相关EthIf控制器的TcpIp模块内的通信,
- 释放相关资源,即应关闭使用EthIf控制器的任何套接字,然后应取消分配给EthIf控制器的任何IP地址,
- 如果不再分配EthIf控制器,所有未绑定的插座也应被释放,并且
- 输入EthIf控制器的状态TCPIP_STATE_SHUTDOWN。
【规范】如果EthIf控制器的当前状态为TCPIP_STATE_SHUTDOWN,且所有相关资源均已释放,则TcpIp模块应进入EthIf控制器的状态TCPIP_STATE_OFFLINE。
【规范】只有当相关的EthIf控制器处于TCPIP_STATE_ONLINE状态时,TcpIp模块才应接受新的TCP连接。
【规范】TcpIp模块应使用Up_TcpIpEvent API指示与上层模块的套接字相关的事件,以及以下事件: TCPIP_TCP_RESET、TCPIP_TCP_CLOSED、TCPIP_TCP_FIN_RECEIVED和TCPIP_UDP_CLOSED。
4.9 安全事件
【规范】如果已经为TcpIp模块启用了安全事件报告(TcpIpEnableSecurityEventReporting=为真),则相应的安全事件应通过AUTOSAR_SWS_BSWGeneral中定义的接口报告给IdsM。
4.10 错误分类
4.10.1 开发错误
4.10.2 运行错误
【规范】如果适用以下条件之一,TcpIp应通过调用Det_ReportRuntimeError(TCPIP_E_TIMEDOUT)来报告运行时错误:
- TcpIp模块已经发送了一个SYN来建立一个连接,但没有收到任何响应。
- 已建立的空闲TCP连接被关闭,因为对等连接不再存在,即根据IETF RFC 1122第4.2.3.6章,保持活动计时器耗尽,对等连接不响应保持活动探测。
- 一个已建立的TCP连接被关闭,因为对等点没有响应,即根据[SWS_TCPIP_00202],在没有确认的情况下发送了最大数量的重传。
【规范】如果适用以下条件之一,TcpIp应通过调用Det_ReportRuntimeError(TCPIP_E_CONNREFUSED)报告运行时错误:
- 收到ICMP消息目标不可达/协议不可达,因为对等点没有按照请求的协议提供服务。
- 收到一条ICMP关于目标不可达/端口不可达的消息,因为对等点没有在请求的端口上提供服务。
【规范】如果存在以下条件之一,TcpIp应通过调用Det_ReportRuntimeError(TCPIP_E_HOSTUNREACH)报告运行时错误:
- 由于网络或主机无法到达目的地或没有到目的地的路由。
【规范】如果适用以下条件之一,TcpIp应通过调用Det_ReportRuntimeError(TCPIP_E_PACKETTOBIG)来报告运行时错误:
- 需要一个ICMP消息目标不可到达/碎片化,但接收了DF位集,因为网络无法转发一个超大的帧,因为DF(不碎片化)标志被设置。
【规范】如果存在以下条件之一,TcpIp应通过调用Det_ReportRuntimeError(TCPIP_E_DADCONFLICT)报告运行时错误:
- 重复地址检测(DAD)算法发现重复IP地址。
五、API说明
5.1 通用接口
- TcpIp_Init
- TcpIp_GetVersionInfo
5.2 核心通信控制
- TcpIp_Close
- TcpIp_Bind
- TcpIp_TcpConnect
- TcpIp_TcpListen
- TcpIp_TcpReceived
- TcpIp_RequestComMode
5.3 扩展的通信控制和信息
- TcpIp_RequestIpAddrAssignment
- TcpIp_ReleaseIpAddrAssignment
- TcpIp_ResetIpAssignment
- TcpIp_IcmpTransmit
- TcpIp_IcmpV6Transmit
- TcpIp_DhcpReadOption
- TcpIp_DhcpV6ReadOption
- TcpIp_DhcpWriteOption
- TcpIp_DhcpV6WriteOption
- TcpIp_ChangeParameter
- TcpIp_GetIpAddr
- TcpIp_GetPhysAddr
- TcpIp_GetRemotePhysAddr
- TcpIp_GetCtrlIdx
- TcpIp_GetArpCacheEntries
- TcpIp_GetNdpCacheEntries
- TcpIp_GetAndResetMeasurementData
- TcpIp_IsConnectionReady
5.4 发送
- TcpIp_UdpTransmit
- TcpIp_TcpTransmit
5.5 回调接口
- TcpIp_RxIndication
5.6 调度接口
- TcpIp_MainFunction