• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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