Skip to content

Commit 687af88

Browse files
tagrawal03facebook-github-bot
authored andcommitted
Use PacketBuilder for udp flow migration test cases
Summary: - Vm tests doesn't won;t with parameterized test, using TEST_F now. - Added some more tests (missing) in KatranUdpFlowInvalidationTest.cpp - some more katran configurations + udp flow migration tests - Using new PAcketBuilderAPI now. Reviewed By: nikhildl12 Differential Revision: D79263473 fbshipit-source-id: 3b685b688a34b6d1f864320750ab260632d85374
1 parent 4223e0f commit 687af88

2 files changed

Lines changed: 156 additions & 54 deletions

File tree

katran/lib/testing/fixtures/KatranUdpFlowMigrationTestFixtures.h

Lines changed: 120 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,113 +19,179 @@
1919
#pragma once
2020
#include <vector>
2121
#include "katran/lib/testing/tools/PacketAttributes.h"
22+
#include "katran/lib/testing/tools/PacketBuilder.h"
2223

2324
namespace katran {
2425
namespace testing {
2526
/**
26-
* Input packets have been generated with scapy. Above each of them you can find
27-
* a command which has been used to do so.
27+
* Test fixtures for UDP Flow Migration functionality.
28+
*
29+
* Each test case is generated using PacketBuilder and contains:
30+
* - inputPacketBuilder: PacketBuilder object for input packet
31+
* - expectedOutputPacketBuilder: PacketBuilder object for expected output packet
32+
* - description: Test case description
33+
* - expectedReturnValue: Expected BPF program return code (XDP_TX, XDP_DROP, XDP_PASS)
2834
*
29-
* Format of the input data: <string, string>; 1st string is a base64 encoded
30-
* packet. 2nd string is test's description
35+
* PacketBuilder Usage:
36+
* PacketBuilder::newPacket()
37+
* .Eth("01:00:00:00:00:00", "02:00:00:00:00:00")
38+
* .IPv4("192.168.1.1", "10.200.1.1")
39+
* .UDP(31337, 80)
40+
* .payload("katran test pkt")
3141
*
32-
* Format of the output data: <string, string>; 1st string is a base64 encoded
33-
* packet which we are expecting to see after bpf program's run.
34-
* 2nd string = bpf's program return code.
35-
*
36-
* To create pcap w/ scapy:
37-
* 1) create packets
38-
* 2) pckts = [ <created packets from above> ]
39-
* 3) wrpcap(<path_to_file>, pckts)
40-
* To get base64 packet string: base64.b64encode(raw(packet))
41-
* To get packet from base64 string: Ether(base64.b64decode(b"..."))
42-
*
43-
* Note: The test packets below need to be generated with the correct hex values.
44-
* The comments show the scapy commands that would generate similar packets,
45-
* but the actual base64 strings need to be filled in with real packet captures.
42+
* For UDP Flow Migration:
43+
* PacketBuilder::newPacket()
44+
* .Eth("0x1", "0x2")
45+
* .IPv4("10.0.0.1", "10.200.1.1")
46+
* .UDP(31337, 80)
47+
* .payload("katran test pkt")
4648
*/
4749
const std::vector<::katran::PacketAttributes> udpFlowMigrationTestFirstFixtures = {
4850
// 1. UDP packet to a VIP with flow migration enabled
4951
{
50-
// Ether(src="0x1", dst="0x2")/IP(src="10.0.0.1", dst="10.200.1.1")/UDP(sport=31337, dport=80)/"katran test pkt"
51-
.inputPacket = "AgAAAAAAAQAAAAAACABFAAArAAEAAEARZPgKAAABCsgBAXppAFAAF0+Ha2F0cmFuIHRlc3QgcGt0",
5252
.description = "UDP packet to a VIP with flow migration enabled",
5353
.expectedReturnValue = "XDP_TX",
54-
// Ether(dst='00:00:de:ad:be:af', src='02:00:00:00:00:00', type=2048)/IP(version=4, ihl=5, tos=0, len=71, id=0, flags=0, frag=0, ttl=64, proto=17, chksum=22912, src='10.0.13.37', dst='10.0.0.2')/UDP(sport=27003, dport=9886, len=51, chksum=25658)/Raw(load=b'E\\x00\\x00+\\x00\\x01\\x00\\x00@\\x11d\\xf8\\n\\x00\\x00\\x01\\n\\xc8\\x01\\x01zi\\x00P\\x00\\x17O\\x87katran test pkt')
55-
.expectedOutputPacket = "AADerb6vAgAAAAAACABFAABHAAAAAEARWYAKAA0lCgAAAml7Jp4AM2Q6RQAAKwABAABAEWT4CgAAAQrIAQF6aQBQABdPh2thdHJhbiB0ZXN0IHBrdA=="
54+
.inputPacketBuilder = katran::testing::PacketBuilder::newPacket()
55+
.Eth("0x1", "0x2")
56+
.IPv4("10.0.0.1", "10.200.1.1")
57+
.UDP(31337, 80)
58+
.payload("katran test pkt"),
59+
.expectedOutputPacketBuilder = katran::testing::PacketBuilder::newPacket()
60+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
61+
.IPv4("10.0.13.37", "10.0.0.2", 64, 0, 0) // Set ID to 0
62+
.UDP(27003, 9886)
63+
.IPv4("10.0.0.1", "10.200.1.1")
64+
.UDP(31337, 80)
65+
.payload("katran test pkt")
5666
},
5767

58-
// 2. UDP packet to a udp stable routing VIP with flow migration enabled
68+
// 2. UDP packet to a udp stable routing VIP with flow migration enabled
5969
{
60-
// Ether(src="0x1", dst="0x2")/IP(src="10.0.0.1", dst="10.200.1.2")/UDP(sport=31337, dport=80)/"katran test pkt"
61-
.inputPacket = "AgAAAAAAAQAAAAAACABFAAArAAEAAEARZPcKAAABCsgBAnppAFAAF0+Ga2F0cmFuIHRlc3QgcGt0",
62-
.description = "UDP packet to a udp stable routing VIP with flow migration enabled",
70+
.description = "UDP packet to a udp stable routing VIP with flow migration enabled",
6371
.expectedReturnValue = "XDP_TX",
64-
// Ether(dst='00:00:de:ad:be:af', src='02:00:00:00:00:00', type=2048)/IP(version=4, ihl=5, tos=0, len=71, id=0, flags=0, frag=0, ttl=64, proto=17, chksum=22912, src='10.0.13.37', dst='10.0.0.2')/UDP(sport=27003, dport=9886, len=51, chksum=25659)/Raw(load=b'E\\x00\\x00+\\x00\\x01\\x00\\x00@\\x11d\\xf7\\n\\x00\\x00\\x01\\n\\xc8\\x01\\x02zi\\x00P\\x00\\x17O\\x86katran test pkt')
65-
.expectedOutputPacket = "AADerb6vAgAAAAAACABFAABHAAAAAEARWYAKAA0lCgAAAml7Jp4AM2Q7RQAAKwABAABAEWT3CgAAAQrIAQJ6aQBQABdPhmthdHJhbiB0ZXN0IHBrdA=="
72+
.inputPacketBuilder = katran::testing::PacketBuilder::newPacket()
73+
.Eth("0x1", "0x2")
74+
.IPv4("10.0.0.1", "10.200.1.2")
75+
.UDP(31337, 80)
76+
.payload("katran test pkt"),
77+
.expectedOutputPacketBuilder = katran::testing::PacketBuilder::newPacket()
78+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
79+
.IPv4("10.0.13.37", "10.0.0.2", 64, 0, 0) // Set ID to 0
80+
.UDP(27003, 9886)
81+
.IPv4("10.0.0.1", "10.200.1.2")
82+
.UDP(31337, 80)
83+
.payload("katran test pkt")
6684
},
6785

6886
// 3. UDP packet to a UDP VIP no flow migration
6987
{
70-
// Ether(src="0x1", dst="0x2")/IP(src="10.0.0.1", dst="10.200.1.3")/UDP(sport=31337, dport=80)/"katran test pkt"
71-
.inputPacket = "AgAAAAAAAQAAAAAACABFAAArAAEAAEARZPYKAAABCsgBA3ppAFAAF0+Fa2F0cmFuIHRlc3QgcGt0",
7288
.description = "UDP packet to a UDP VIP no flow migration",
7389
.expectedReturnValue = "XDP_TX",
74-
// Ether(dst='00:00:de:ad:be:af', src='02:00:00:00:00:00', type=2048)/IP(version=4, ihl=5, tos=0, len=71, id=0, flags=0, frag=0, ttl=64, proto=17, chksum=22912, src='10.0.13.37', dst='10.0.0.2')/UDP(sport=27003, dport=9886, len=51, chksum=25660)/Raw(load=b'E\\x00\\x00+\\x00\\x01\\x00\\x00@\\x11d\\xf6\\n\\x00\\x00\\x01\\n\\xc8\\x01\\x03zi\\x00P\\x00\\x17O\\x85katran test pkt')
75-
.expectedOutputPacket = "AADerb6vAgAAAAAACABFAABHAAAAAEARWYAKAA0lCgAAAml7Jp4AM2Q8RQAAKwABAABAEWT2CgAAAQrIAQN6aQBQABdPhWthdHJhbiB0ZXN0IHBrdA=="
90+
.inputPacketBuilder = katran::testing::PacketBuilder::newPacket()
91+
.Eth("0x1", "0x2")
92+
.IPv4("10.0.0.1", "10.200.1.3")
93+
.UDP(31337, 80)
94+
.payload("katran test pkt"),
95+
.expectedOutputPacketBuilder = katran::testing::PacketBuilder::newPacket()
96+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
97+
.IPv4("10.0.13.37", "10.0.0.2", 64, 0, 0)
98+
.UDP(27003, 9886)
99+
.IPv4("10.0.0.1", "10.200.1.3")
100+
.UDP(31337, 80)
101+
.payload("katran test pkt")
76102
},
77103

78104
// 4. TCP packet to a TCP vip
79105
{
80-
// Ether(src="0x1", dst="0x2")/IP(src="10.0.0.1", dst="10.200.1.4")/TCP(sport=31337, dport=80)/"katran test pkt"
81-
.inputPacket = "AgAAAAAAAQAAAAAACABFAAA3AAEAAEAGZPQKAAABCsgBBHppAFAAAAAAAAAAAFACIADflwAAa2F0cmFuIHRlc3QgcGt0",
82106
.description = "TCP packet to a TCP vip",
83107
.expectedReturnValue = "XDP_TX",
84-
// Ether(dst='00:00:de:ad:be:af', src='02:00:00:00:00:00', type=2048)/IP(version=4, ihl=5, tos=0, len=83, id=0, flags=0, frag=0, ttl=64, proto=17, chksum=22900, src='10.0.13.37', dst='10.0.0.2')/UDP(sport=27003, dport=9886, len=63, chksum=25638)/Raw(load=b'E\\x00\\x007\\x00\\x01\\x00\\x00@\\x06d\\xf4\\n\\x00\\x00\\x01\\n\\xc8\\x01\\x04zi\\x00P\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00P\\x02 \\x00\\xdf\\x97\\x00\\x00katran test pkt')
85-
.expectedOutputPacket = "AADerb6vAgAAAAAACABFAABTAAAAAEARWXQKAA0lCgAAAml7Jp4AP2QmRQAANwABAABABmT0CgAAAQrIAQR6aQBQAAAAAAAAAABQAiAA35cAAGthdHJhbiB0ZXN0IHBrdA=="
108+
.inputPacketBuilder = katran::testing::PacketBuilder::newPacket()
109+
.Eth("0x1", "0x2")
110+
.IPv4("10.0.0.1", "10.200.1.4")
111+
.TCP(31337, 80)
112+
.payload("katran test pkt"),
113+
.expectedOutputPacketBuilder = katran::testing::PacketBuilder::newPacket()
114+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
115+
.IPv4("10.0.13.37", "10.0.0.2", 64, 0, 0)
116+
.UDP(27003, 9886)
117+
.IPv4("10.0.0.1", "10.200.1.4")
118+
.TCP(31337, 80)
119+
.payload("katran test pkt")
86120
},
87121

88122
};
89123

90124
const std::vector<::katran::PacketAttributes> udpFlowMigrationTestSecondFixtures = {
91125
// 1. UDP packet to a VIP with flow migration enabled
92126
{
93-
// Ether(src="0x1", dst="0x2")/IP(src="10.0.0.1", dst="10.200.1.1")/UDP(sport=31337, dport=80)/"katran test pkt"
94-
.inputPacket = "AgAAAAAAAQAAAAAACABFAAArAAEAAEARZPgKAAABCsgBAXppAFAAF0+Ha2F0cmFuIHRlc3QgcGt0",
95127
.description = "UDP packet to a VIP with flow migration enabled - new backend as it was redirected",
96128
.expectedReturnValue = "XDP_TX",
97-
// Ether(dst='00:00:de:ad:be:af', src='02:00:00:00:00:00', type=34525)/IPv6(version=6, tc=0, fl=0, plen=51, nh=17, hlim=64, src='fc00:2307::1337', dst='fc00::2')/UDP(sport=31336, dport=9886, len=51, chksum=17970)/Raw(load=b'E\\x00\\x00+\\x00\\x01\\x00\\x00@\\x11d\\xf8\\n\\x00\\x00\\x01\\n\\xc8\\x01\\x01zi\\x00P\\x00\\x17O\\x87katran test pkt')
98-
.expectedOutputPacket = "AADerb6vAgAAAAAAht1gAAAAADMRQPwAIwcAAAAAAAAAAAAAEzf8AAAAAAAAAAAAAAAAAAACemgmngAzRjJFAAArAAEAAEARZPgKAAABCsgBAXppAFAAF0+Ha2F0cmFuIHRlc3QgcGt0"
129+
.inputPacketBuilder = katran::testing::PacketBuilder::newPacket()
130+
.Eth("0x1", "0x2")
131+
.IPv4("10.0.0.1", "10.200.1.1")
132+
.UDP(31337, 80)
133+
.payload("katran test pkt"),
134+
.expectedOutputPacketBuilder = katran::testing::PacketBuilder::newPacket()
135+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
136+
.IPv6("fc00:2307::1337", "fc00::2", 64, 0, 0)
137+
.UDP(31336, 9886)
138+
.IPv4("10.0.0.1", "10.200.1.1", 64, 0, 1)
139+
.UDP(31337, 80)
140+
.payload("katran test pkt")
99141
},
100142

101-
// 2. UDP packet to a udp stable routing VIP with flow migration enabled
143+
// 2. UDP packet to a udp stable routing VIP with flow migration enabled
102144
{
103-
// Ether(src="0x1", dst="0x2")/IP(src="10.0.0.1", dst="10.200.1.2")/UDP(sport=31337, dport=80)/"katran test pkt"
104-
.inputPacket = "AgAAAAAAAQAAAAAACABFAAArAAEAAEARZPcKAAABCsgBAnppAFAAF0+Ga2F0cmFuIHRlc3QgcGt0",
105-
.description = "UDP packet to a udp stable routing VIP with flow migration enabled - new backend as it was redirected",
145+
.description = "UDP packet to a udp stable routing VIP with flow migration enabled - new backend as it was redirected",
106146
.expectedReturnValue = "XDP_TX",
107-
// Ether(dst='00:00:de:ad:be:af', src='02:00:00:00:00:00', type=34525)/IPv6(version=6, tc=0, fl=0, plen=51, nh=17, hlim=64, src='fc00:2307::1337', dst='fc00::2')/UDP(sport=31336, dport=9886, len=51, chksum=17971)/Raw(load=b'E\\x00\\x00+\\x00\\x01\\x00\\x00@\\x11d\\xf7\\n\\x00\\x00\\x01\\n\\xc8\\x01\\x02zi\\x00P\\x00\\x17O\\x86katran test pkt')
108-
.expectedOutputPacket = "AADerb6vAgAAAAAAht1gAAAAADMRQPwAIwcAAAAAAAAAAAAAEzf8AAAAAAAAAAAAAAAAAAACemgmngAzRjNFAAArAAEAAEARZPcKAAABCsgBAnppAFAAF0+Ga2F0cmFuIHRlc3QgcGt0"
147+
.inputPacketBuilder = katran::testing::PacketBuilder::newPacket()
148+
.Eth("0x1", "0x2")
149+
.IPv4("10.0.0.1", "10.200.1.2")
150+
.UDP(31337, 80)
151+
.payload("katran test pkt"),
152+
.expectedOutputPacketBuilder = katran::testing::PacketBuilder::newPacket()
153+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
154+
.IPv6("fc00:2307::1337", "fc00::2", 64, 0, 0)
155+
.UDP(31336, 9886)
156+
.IPv4("10.0.0.1", "10.200.1.2")
157+
.UDP(31337, 80)
158+
.payload("katran test pkt")
109159
},
110160

111161
// 3. UDP packet to a UDP VIP no flow migration
112162
{
113-
// Ether(src="0x1", dst="0x2")/IP(src="10.0.0.1", dst="10.200.1.3")/UDP(sport=31337, dport=80)/"katran test pkt"
114-
.inputPacket = "AgAAAAAAAQAAAAAACABFAAArAAEAAEARZPYKAAABCsgBA3ppAFAAF0+Fa2F0cmFuIHRlc3QgcGt0",
115163
.description = "UDP packet to a UDP VIP no flow migration",
116164
.expectedReturnValue = "XDP_TX",
117-
// Ether(dst='00:00:de:ad:be:af', src='02:00:00:00:00:00', type=2048)/IP(version=4, ihl=5, tos=0, len=71, id=0, flags=0, frag=0, ttl=64, proto=17, chksum=22912, src='10.0.13.37', dst='10.0.0.2')/UDP(sport=27003, dport=9886, len=51, chksum=25660)/Raw(load=b'E\\x00\\x00+\\x00\\x01\\x00\\x00@\\x11d\\xf6\\n\\x00\\x00\\x01\\n\\xc8\\x01\\x03zi\\x00P\\x00\\x17O\\x85katran test pkt')
118-
.expectedOutputPacket = "AADerb6vAgAAAAAACABFAABHAAAAAEARWYAKAA0lCgAAAml7Jp4AM2Q8RQAAKwABAABAEWT2CgAAAQrIAQN6aQBQABdPhWthdHJhbiB0ZXN0IHBrdA=="
165+
.inputPacketBuilder = katran::testing::PacketBuilder::newPacket()
166+
.Eth("0x1", "0x2")
167+
.IPv4("10.0.0.1", "10.200.1.3")
168+
.UDP(31337, 80)
169+
.payload("katran test pkt"),
170+
.expectedOutputPacketBuilder = katran::testing::PacketBuilder::newPacket()
171+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
172+
.IPv4("10.0.13.37", "10.0.0.2", 64, 0, 0)
173+
.UDP(27003, 9886)
174+
.IPv4("10.0.0.1", "10.200.1.3")
175+
.UDP(31337, 80)
176+
.payload("katran test pkt")
119177
},
120178

121179
// 4. TCP packet to a TCP vip
122180
{
123-
// Ether(src="0x1", dst="0x2")/IP(src="10.0.0.1", dst="10.200.1.4")/TCP(sport=31337, dport=80)/"katran test pkt"
124-
.inputPacket = "AgAAAAAAAQAAAAAACABFAAA3AAEAAEAGZPQKAAABCsgBBHppAFAAAAAAAAAAAFACIADflwAAa2F0cmFuIHRlc3QgcGt0",
125181
.description = "TCP packet to a TCP vip",
126182
.expectedReturnValue = "XDP_TX",
127-
// Ether(dst='00:00:de:ad:be:af', src='02:00:00:00:00:00', type=2048)/IP(version=4, ihl=5, tos=0, len=83, id=0, flags=0, frag=0, ttl=64, proto=17, chksum=22900, src='10.0.13.37', dst='10.0.0.2')/UDP(sport=27003, dport=9886, len=63, chksum=25638)/Raw(load=b'E\\x00\\x007\\x00\\x01\\x00\\x00@\\x06d\\xf4\\n\\x00\\x00\\x01\\n\\xc8\\x01\\x04zi\\x00P\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00P\\x02 \\x00\\xdf\\x97\\x00\\x00katran test pkt')
128-
.expectedOutputPacket = "AADerb6vAgAAAAAACABFAABTAAAAAEARWXQKAA0lCgAAAml7Jp4AP2QmRQAANwABAABABmT0CgAAAQrIAQR6aQBQAAAAAAAAAABQAiAA35cAAGthdHJhbiB0ZXN0IHBrdA=="
183+
.inputPacketBuilder = katran::testing::PacketBuilder::newPacket()
184+
.Eth("0x1", "0x2")
185+
.IPv4("10.0.0.1", "10.200.1.4")
186+
.TCP(31337, 80)
187+
.payload("katran test pkt"),
188+
.expectedOutputPacketBuilder = katran::testing::PacketBuilder::newPacket()
189+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
190+
.IPv4("10.0.13.37", "10.0.0.2", 64, 0, 0)
191+
.UDP(27003, 9886)
192+
.IPv4("10.0.0.1", "10.200.1.4")
193+
.TCP(31337, 80)
194+
.payload("katran test pkt")
129195
},
130196

131197
};

katran/lib/testing/tools/PacketBuilderTest.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,3 +560,39 @@ TEST_F(PacketBuilderTest, LargeNumberOfNOPs) {
560560
// words
561561
EXPECT_EQ(dataOffset, 10);
562562
}
563+
564+
// UDP Flow Invalidation Tests
565+
566+
TEST_F(PacketBuilderTest, UdpFlowInvalidationBasicPacket) {
567+
auto packet = PacketBuilder::newPacket()
568+
.Eth("0x1", "0x2")
569+
.IPv4("10.0.0.1", "10.200.1.1")
570+
.UDP(31337, 80)
571+
.payload("katran test pkt")
572+
.build();
573+
574+
EXPECT_EQ(
575+
packet.base64Packet,
576+
"AgAAAAAAAQAAAAAACABFAAArAAEAAEARZPgKAAABCsgBAXppAFAAF0+Ha2F0cmFuIHRlc3QgcGt0");
577+
EXPECT_EQ(
578+
packet.scapyCommand,
579+
"Ether(src='01:00:00:00:00:00', dst='02:00:00:00:00:00')/IP(src='10.0.0.1', dst='10.200.1.1')/UDP(sport=31337, dport=80)/'katran test pkt'");
580+
}
581+
582+
TEST_F(PacketBuilderTest, UdpFlowInvalidationEncapsulatedPacket) {
583+
auto packet = PacketBuilder::newPacket()
584+
.Eth("02:00:00:00:00:00", "00:00:de:ad:be:af")
585+
.IPv4("10.0.13.37", "10.0.0.2", 64, 0, 0) // Set ID to 0
586+
.UDP(27003, 9886)
587+
.IPv4("10.0.0.1", "10.200.1.1")
588+
.UDP(31337, 80)
589+
.payload("katran test pkt")
590+
.build();
591+
592+
EXPECT_EQ(
593+
packet.base64Packet,
594+
"AADerb6vAgAAAAAACABFAABHAAAAAEARWYAKAA0lCgAAAml7Jp4AM2Q6RQAAKwABAABAEWT4CgAAAQrIAQF6aQBQABdPh2thdHJhbiB0ZXN0IHBrdA==");
595+
EXPECT_EQ(
596+
packet.scapyCommand,
597+
"Ether(src='02:00:00:00:00:00', dst='00:00:de:ad:be:af')/IP(src='10.0.13.37', dst='10.0.0.2')/UDP(sport=27003, dport=9886)/IP(src='10.0.0.1', dst='10.200.1.1')/UDP(sport=31337, dport=80)/'katran test pkt'");
598+
}

0 commit comments

Comments
 (0)