CheckSum Method Validations
测试目标
验证 IUT(被测设备)的 ICMPv4 Echo Reply(Ping 回复)计算的 IP 和 ICMP 校验和是否正确
开发思路
1.发送 Ping 请求(ICMPv4 Echo Request)
- 构造并发送 ICMPv4 Echo Request
- 设置 源 MAC / 目标 MAC
- 填充 IPv4 头部 并 正确计算 IP 头部校验和
- 填充 ICMPv4 头部 并 正确计算 ICMP 校验和
- 发送 ICMPv4 Echo Request
2.监听 IUT 发送的 Ping 回复(ICMPv4 Echo Reply)
- 检查 IUT 是否有正确的 ICMPv4 Echo Reply
- 确保 IUT 发送了 Echo Reply
- 检查 IP 头部校验和 是否正确
- 检查 ICMP 头部校验和 是否正确
- 确保 ICMP 负载数据完整(不能丢失或被篡改)
3.判断测试结果
-
通过:IUT 正确回复 Echo Reply,并且IP 校验和正确,并且CMP 校验和正确
-
失败:IUT 没有回复 Echo Reply(超时)。
-
IP 头部校验和错误:
-
ICMP 头部校验和错误
-
数据负载不一致
-
4.代码实现与关键点
sendICMPEchoRequest()
—— 发送 ICMPv4 Echo Request,并确保校验和正确。on ethernetPacket
—— 监听 IUT 回复的 ICMPv4 Echo Reply,并校验 IP 和 ICMP 头部。on timer testTimer
—— 处理超时情况,如果 IUT 没有回复,则测试失败。
5.测试用例设计简要
步骤 | 操作 | 预期结果 |
---|---|---|
1 | 发送 ICMPv4 Echo Request | IUT 接收请求 |
2 | IUT 回复 ICMPv4 Echo Reply | Tester 接收回复 |
3 | 校验 IP 头部校验和 | 计算正确 |
4 | 校验 ICMP 头部校验和 | 计算正确 |
5 | 校验 ICMP 数据负载 | 数据完整 |
6 | 输出测试结果 | PASS 或 FAIL |
CAPL代码展示
/*@!Encoding:65001*/variables{ const dword iutIP = 0xC0A8B239; // IUT IP: 192.168.178.57const dword testerIP = 0xC0A8B201; // Tester IP: 192.168.178.1ethernetPacket txPacket; dword gLastSequenceNumber; dword SPECIAL_IDENTIFIER = 0x1234; timer testTimer; byte testFailed = 0; }on start{write("Starting ATS_IPv4_00374 Checksum Validation Test...");testFailed = 0; // Reset test statussendICMPEchoRequest();setTimer(testTimer, 5000); }void sendICMPEchoRequest(){ethernetPacket txPacket; txPacket.msgChannel = 1; txPacket.source = EthGetMacAddressAsNumber("00:11:22:33:44:55"); // Tester MACtxPacket.destination = EthGetMacAddressAsNumber("AA:BB:CC:DD:00:39"); // IUT MACtxPacket.type = 0x0800; // IPv4// Init IPv4 headertxPacket.IPv4.Init();txPacket.IPv4.Source = testerIP;txPacket.IPv4.Destination = iutIP;txPacket.IPv4.Protocol = 0x01; // ICMP// txPacket.IPv4.ComputeChecksum();txPacket.ipv4.checksum;// Init ICMPv4 Echo RequesttxPacket.ICMPv4.Init();txPacket.ICMPv4.Echo.Init();gLastSequenceNumber++;txPacket.ICMPv4.Echo.Identifier = SPECIAL_IDENTIFIER;txPacket.ICMPv4.Echo.Sequence = gLastSequenceNumber;txPacket.ICMPv4.checksum;// Send packettxPacket.CompletePacket();output(txPacket);write("Sent ICMPv4 Echo Request to IUT.");}// Listen for ICMP Echo Replyon ethernetPacket msgChannel1.*{if(this.type == 0x0800 && this.Length >= 28) // IPv4 Packet{if(this.Byte(9) == 0x01 && this.Byte(34) == 0x00) // ICMP Echo Reply{if(this.source == EthGetMacAddressAsNumber("AA:BB:CC:DD:00:39")) // From IUT{write("ICMPv4 Echo Reply received from IUT.");// Validate IP header checksumif(this.IPv4.Checksum != 0x0000){write("Test Failed: Incorrect IP header checksum.");testFailed = 1;}// Validate ICMP checksumif(this.ICMPv4.Checksum != 0x0000){write("Test Failed: Incorrect ICMP checksum.");testFailed = 1;}cancelTimer(testTimer);if (testFailed == 0){write("Test Passed: Correct ICMP and IP checksums.");}}}}}on timer testTimer{write("Test Failed: No ICMPv4 Echo Reply received from IUT.");}
总结
-
本质就是测试 Ping(ICMPv4 Echo Request/Reply)是否正确。
-
关键点是校验 IP 和 ICMP 头部的校验和是否符合协议标准。
-
如果 IUT 计算错误的校验和,或者数据丢失/损坏,测试就失败。
-
超时无响应也是失败的情况。