1# RoCE unit tests 2# run with: 3# test/run_tests -P "load_contrib('roce')" -t test/contrib/roce.uts -F 4 5% Regression tests for the RoCE layer 6 7################ 8##### RoCE ##### 9################ 10 11+ RoCE tests 12 13= RoCE layer 14 15# an example UC packet 16pkt = Ether(dst='24:8a:07:a8:fa:22', src='24:8a:07:a8:fa:22')/ \ 17 IP(version=4, ihl=5, tos=0x1, id=1144, flags='DF', frag=0, \ 18 ttl=64, src='192.168.0.7', dst='192.168.0.7', len=64)/ \ 19 UDP(sport=49152, dport=4791, len=44)/ \ 20 BTH(opcode='UC_SEND_ONLY', migreq=1, padcount=2, pkey=0xffff, dqpn=211, psn=13571856)/ \ 21 Raw(b'F0\x81\x8b\xe2\x895\xd9\x0e\x9a\x95PT\x01\xbe\x88^P\x00\x00') 22 23# include ICRC placeholder 24pkt = Ether(pkt.build() + b'\x00' * 4) 25 26assert IP in pkt.layers() 27print(hex(pkt[IP].chksum)) 28assert pkt[IP].chksum == 0xb4d5 29assert UDP in pkt.layers() 30print(hex(pkt[UDP].chksum)) 31assert pkt[UDP].chksum == 0xaca2 32assert BTH in pkt.layers() 33assert pkt[BTH].icrc == 0x78f353f3 34 35= RoCE CNP packet 36 37# based on this example packet: 38# https://community.mellanox.com/s/article/rocev2-cnp-packet-format-example 39 40pkt = Ether()/IP(src='22.22.22.8', dst='22.22.22.7', id=0x98c6, flags='DF', 41 ttl=0x20, tos=0x89)/ \ 42 UDP(sport=56238, dport=4791, chksum=0)/ \ 43 cnp(dqpn=0xd2) 44pkt = Ether(pkt.build()) 45 46assert pkt[IP].len == 60 47assert pkt[UDP].len == 40 48assert pkt[BTH].opcode == 0x81 49assert pkt[BTH].becn 50assert not pkt[BTH].fecn 51assert pkt[BTH].resv6 == 0 52assert pkt[BTH].resv7 == 0 53assert pkt[BTH].dqpn == 0xd2 54assert pkt[BTH].version == 0 55assert not pkt[BTH].solicited 56assert not pkt[BTH].migreq 57assert pkt[BTH].padcount == 0 58assert pkt[BTH].pkey == 0xffff 59assert not pkt[BTH].ackreq 60assert pkt[BTH].psn == 0 61assert pkt[CNPPadding].reserved1 == 0 62assert pkt[CNPPadding].reserved2 == 0 63# assert pkt[BTH].icrc == 0xe42dad81 TODO - does not match example 64 65= RoCE CNP captured on ConnectX-4 Lx 66 67pkt = Ether(import_hexcap('''0x0000: e41d 2dab 2bc2 7cfe 9064 3b32 0800 45c2 680x0010: 003c 718c 4000 4011 9161 0a00 1101 0a00 690x0020: 1201 0000 12b7 0028 0000 8100 ffff 4000 700x0030: 0118 0000 0000 0000 0000 0000 0000 0000 710x0040: 0000 0000 0000 82fd 002a 72''')) 73 74assert BTH in pkt.layers() 75assert pkt.opcode == CNP_OPCODE 76del pkt.icrc 77pkt = Ether(pkt.build()) 78assert pkt.icrc == 0x82fd002a 79 80= RoCE v1 RC RDMA WRITE ONLY 81 82pkt = Ether(import_hexcap('''\ 830x0000 7c fe 90 75 3c d8 7c fe 90 75 3c d8 89 15 60 20 840x0010 00 00 00 28 1b 40 00 00 00 00 00 00 00 00 00 00 850x0020 ff ff 0f 00 00 02 00 00 00 00 00 00 00 00 00 00 860x0030 ff ff 0f 00 00 02 0a 70 ff ff 00 00 01 0a 80 a7 870x0040 88 bc 00 00 55 d4 c0 72 60 00 00 00 47 b3 00 00 880x0050 00 05 00 00 00 00 01 00 00 00 e3 d8 56 bb 89''')) 90 91assert GRH in pkt.layers() 92assert BTH in pkt.layers() 93assert pkt[GRH].ipver == 6 94assert pkt[GRH].tclass == 2 95assert pkt[GRH].flowlabel == 0 96assert pkt[GRH].paylen == 40 97assert pkt[BTH].opcode == 0xa 98assert pkt[BTH].padcount == 3 99assert pkt[BTH].dqpn == 0x10a 100assert pkt[BTH].ackreq 101assert pkt.icrc == 0xe3d856bb 102 103= RoCE v1 RC ACKNOWLEDGE 104 105pkt = Ether(import_hexcap('''\ 1060000 7c fe 90 75 3c d8 7c fe 90 75 3c d8 89 15 60 20 1070010 00 00 00 14 1b 40 00 00 00 00 00 00 00 00 00 00 1080020 ff ff 0f 00 00 02 00 00 00 00 00 00 00 00 00 00 1090030 ff ff 0f 00 00 02 11 40 ff ff 00 00 01 09 00 a7 1100040 88 c0 00 00 00 05 25 f0 c0 38 111''')) 112 113assert GRH in pkt.layers() 114assert BTH in pkt.layers() 115assert AETH in pkt.layers() 116assert pkt[GRH].ipver == 6 117assert pkt[GRH].tclass == 2 118assert pkt[GRH].flowlabel == 0 119assert pkt[GRH].paylen == 20 120assert pkt[BTH].opcode == 0x11 121assert pkt[BTH].padcount == 0 122assert pkt[BTH].dqpn == 0x109 123assert not pkt[BTH].ackreq 124assert pkt[AETH].syndrome == 0 125assert pkt[AETH].msn == 5 126assert pkt.icrc == 0x25f0c038 127 128= RoCE over IPv6 129 130# an example UC packet 131pkt = Ether(dst='24:8a:07:a8:fa:22', src='24:8a:07:a8:fa:22')/ \ 132 IPv6(nh=17,src='2022::1023', dst='2023::1024', \ 133 version=6,hlim=255,plen=44,fl=0x1face,tc=226)/ \ 134 UDP(sport=49152, dport=4791, len=44)/ \ 135 BTH(opcode='UC_SEND_ONLY', migreq=1, padcount=2, pkey=0xffff, dqpn=211, psn=13571856)/ \ 136 Raw(b'F0\x81\x8b\xe2\x895\xd9\x0e\x9a\x95PT\x01\xbe\x88^P\x00\x00') 137 138# include ICRC placeholder 139pkt = Ether(pkt.build() + b'\x00' * 4) 140 141assert IPv6 in pkt.layers() 142assert UDP in pkt.layers() 143print(hex(pkt[UDP].chksum)) 144assert pkt[UDP].chksum == 0xe7c5 145assert BTH in pkt.layers() 146print(hex(pkt[BTH].icrc)) 147assert pkt[BTH].icrc == 0x3e5b743b 148