|
| 1 | +% IOAM unit test |
| 2 | + |
| 3 | +# |
| 4 | +# execute test: |
| 5 | +# > test/run_tests -P "load_contrib('ioam')" -t test/contrib/ioam.uts |
| 6 | +# |
| 7 | + |
| 8 | ++ IOAM testsuit |
| 9 | + |
| 10 | + |
| 11 | += Build & Dissect, IOAM Over IPv4 |
| 12 | + |
| 13 | +def check_ioam(pkt:Packet): |
| 14 | + protocols = [0, socket.IPPROTO_UDP, socket.IPPROTO_TCP] |
| 15 | + assert pkt[IOAM].flow_id == 100 |
| 16 | + assert pkt[IOAM].color_val == 1 |
| 17 | + assert pkt[IOAM].delay_en == 0 |
| 18 | + assert pkt[IOAM].color_en == 1 |
| 19 | + assert (((not (pkt.haslayer(UDP) or pkt.haslayer(UDP))) and (pkt[IOAM].next_protocol == 0)) or |
| 20 | + (pkt.haslayer(HBHOptIOAM) and (pkt[IOAM].next_protocol == 0)) or |
| 21 | + (pkt.haslayer(UDP) and (pkt[IOAM].next_protocol == socket.IPPROTO_UDP)) or |
| 22 | + (pkt.haslayer(TCP) and (pkt[IOAM].next_protocol == socket.IPPROTO_TCP))) |
| 23 | + |
| 24 | +ioam = IOAM(flow_id=100, color_val=1, delay_en=0, color_en=1) |
| 25 | +o_eth = Ether(src="b6:18:00:11:11:00", dst="b6:18:00:22:22:00") |
| 26 | +o_ip4 = IP(src="198.1.1.17", dst="198.1.2.18", ttl=63) |
| 27 | +o_ip6 = IPv6(src="2000::1", dst="5000::2", hlim=63) |
| 28 | +o_udp = UDP(sport=4196, dport=9028) |
| 29 | +o_tcp = TCP(sport=4196, dport=9028) |
| 30 | +o_vxlan = VXLAN(vni=5000) |
| 31 | +i_eth = Ether(dst='b6:18:00:88:88:00', src='b6:18:00:99:99:00') |
| 32 | +i_ip4 = IP(src='192.168.1.5', dst='192.168.6.9', ttl=128) |
| 33 | +i_tcp = TCP(sport=6677, dport=8899) |
| 34 | +payload = Raw('a'*64) |
| 35 | + |
| 36 | +pkt=o_eth/o_ip4/ioam/payload |
| 37 | +pkt=Ether(raw(pkt)) |
| 38 | +# pkt.show2() |
| 39 | +assert pkt[IP].proto == IPPROTO_IOAM |
| 40 | +assert pkt[IP].chksum == 0xebc5 |
| 41 | +check_ioam(pkt) |
| 42 | + |
| 43 | + |
| 44 | += Build & Dissect, IOAM Over IPv4 UDP |
| 45 | + |
| 46 | +pkt=o_eth/o_ip4/ioam/o_udp/payload |
| 47 | +pkt=Ether(raw(pkt)) |
| 48 | +# pkt.show2() |
| 49 | +assert pkt[IP].proto == IPPROTO_IOAM |
| 50 | +assert pkt[IP].chksum == 0xebbd |
| 51 | +check_ioam(pkt) |
| 52 | +assert pkt[UDP].sport == 4196 |
| 53 | +assert pkt[UDP].dport == 9028 |
| 54 | +assert pkt[UDP].chksum == 0x1064 |
| 55 | + |
| 56 | + |
| 57 | += Build & Dissect, IOAM Over IPv4 TCP |
| 58 | + |
| 59 | +pkt=o_eth/o_ip4/ioam/o_tcp/payload |
| 60 | +pkt=Ether(raw(pkt)) |
| 61 | +# pkt.show2() |
| 62 | +assert pkt[IP].proto == IPPROTO_IOAM |
| 63 | +assert pkt[IP].chksum == 0xebb1 |
| 64 | +check_ioam(pkt) |
| 65 | +assert pkt[TCP].sport == 4196 |
| 66 | +assert pkt[TCP].dport == 9028 |
| 67 | +assert pkt[TCP].chksum == 0xa0a8 |
| 68 | + |
| 69 | + |
| 70 | += Build & Dissect, IOAM Over IPv4 VXLAN |
| 71 | + |
| 72 | +pkt=o_eth/o_ip4/ioam/UDP(sport=4196, dport=4789)/o_vxlan/i_eth/i_ip4/i_tcp/payload |
| 73 | +pkt=Ether(raw(pkt)) |
| 74 | +# pkt.show2() |
| 75 | +assert pkt[IP].proto == IPPROTO_IOAM |
| 76 | +assert pkt[IP].chksum == 0xeb7f |
| 77 | +check_ioam(pkt) |
| 78 | +assert pkt[UDP].sport == 4196 |
| 79 | +assert pkt[UDP].dport == 4789 |
| 80 | +assert pkt[UDP].chksum == 0xaaf2 |
| 81 | +assert pkt[VXLAN].vni == 5000 |
| 82 | + |
| 83 | + |
| 84 | += Build & Dissect, IOAM Over IPv6 |
| 85 | + |
| 86 | +pkt=o_eth/o_ip6/IPv6ExtHdrHopByHop(nh=59, options=[HBHOptIOAM(ioam=ioam)])/payload |
| 87 | +pkt=Ether(raw(pkt)) |
| 88 | +# pkt.show2() |
| 89 | +assert pkt[IPv6].nh == 0 |
| 90 | +assert pkt[IPv6ExtHdrHopByHop].nh == 59 |
| 91 | +assert pkt[HBHOptIOAM].otype == 0x11 |
| 92 | +assert pkt[HBHOptIOAM].optlen == 4 |
| 93 | +check_ioam(pkt) |
| 94 | + |
| 95 | + |
| 96 | += Build & Dissect, IOAM Over IPv6 UDP |
| 97 | + |
| 98 | +pkt=o_eth/o_ip6/IPv6ExtHdrHopByHop(nh=socket.IPPROTO_UDP, options=[HBHOptIOAM(ioam=ioam)])/o_udp/payload |
| 99 | +pkt=Ether(raw(pkt)) |
| 100 | +# pkt.show2() |
| 101 | +assert pkt[IPv6].nh == 0 |
| 102 | +assert pkt[IPv6ExtHdrHopByHop].nh == socket.IPPROTO_UDP |
| 103 | +assert pkt[HBHOptIOAM].otype == 0x11 |
| 104 | +assert pkt[HBHOptIOAM].optlen == 4 |
| 105 | +check_ioam(pkt) |
| 106 | +assert pkt[UDP].sport == 4196 |
| 107 | +assert pkt[UDP].dport == 9028 |
| 108 | +assert pkt[UDP].chksum == 0x2f87 |
| 109 | + |
| 110 | + |
| 111 | += Build & Dissect, IOAM Over IPv6 TCP |
| 112 | + |
| 113 | +pkt=o_eth/o_ip6/IPv6ExtHdrHopByHop(nh=socket.IPPROTO_TCP, options=[HBHOptIOAM(ioam=ioam)])/o_tcp/payload |
| 114 | +pkt=Ether(raw(pkt)) |
| 115 | +# pkt.show2() |
| 116 | +assert pkt[IPv6].nh == 0 |
| 117 | +assert pkt[IPv6ExtHdrHopByHop].nh == socket.IPPROTO_TCP |
| 118 | +assert pkt[HBHOptIOAM].otype == 0x11 |
| 119 | +assert pkt[HBHOptIOAM].optlen == 4 |
| 120 | +check_ioam(pkt) |
| 121 | +assert pkt[TCP].sport == 4196 |
| 122 | +assert pkt[TCP].dport == 9028 |
| 123 | +assert pkt[TCP].chksum == 0xbfcb |
| 124 | + |
| 125 | + |
| 126 | += Build & Dissect, IOAM Over IPv6 VXLAN |
| 127 | + |
| 128 | +pkt=o_eth/o_ip6/IPv6ExtHdrHopByHop(nh=socket.IPPROTO_UDP, options=[HBHOptIOAM(ioam=ioam)])/UDP(sport=4196, dport=4789)/o_vxlan/i_eth/i_ip4/i_tcp/payload |
| 129 | +pkt=Ether(raw(pkt)) |
| 130 | +# pkt.show2() |
| 131 | +assert pkt[IPv6].nh == 0 |
| 132 | +assert pkt[IPv6ExtHdrHopByHop].nh == socket.IPPROTO_UDP |
| 133 | +assert pkt[HBHOptIOAM].otype == 0x11 |
| 134 | +assert pkt[HBHOptIOAM].optlen == 4 |
| 135 | +check_ioam(pkt) |
| 136 | +assert pkt[UDP].sport == 4196 |
| 137 | +assert pkt[UDP].dport == 4789 |
| 138 | +assert pkt[UDP].chksum == 0xca15 |
| 139 | +assert pkt[VXLAN].vni == 5000 |
0 commit comments