Skip to content

Commit 91fd910

Browse files
Neale Rannsdmarion
authored andcommitted
geneve: Fix the byte swapping for the VNI
Type: fix - swipe away the vomit indent left last time. - add tests for VNIs > 16bit Change-Id: I2d1f591bfb9d7a18996c38969365a509168d4193 Signed-off-by: Neale Ranns <[email protected]>
1 parent ae9c459 commit 91fd910

File tree

10 files changed

+66
-80
lines changed

10 files changed

+66
-80
lines changed

src/plugins/gtpu/test/test_gtpu.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def test_encap(self):
187187
# Pick first received frame and check if it's correctly encapsulated.
188188
out = self.pg0.get_capture(1)
189189
pkt = out[0]
190-
self.check_encapsulation(pkt, self.single_tunnel_bd)
190+
self.check_encapsulation(pkt, self.single_tunnel_vni)
191191

192192
# payload = self.decapsulate(pkt)
193193
# self.assert_eq_pkts(payload, self.frame_reply)
@@ -343,13 +343,14 @@ def setUpClass(cls):
343343
# Create GTPU VTEP on VPP pg0, and put gtpu_tunnel0 and pg1
344344
# into BD.
345345
cls.single_tunnel_bd = 11
346+
cls.single_tunnel_vni = 11
346347
r = cls.vapi.gtpu_add_del_tunnel(
347348
is_add=True,
348349
mcast_sw_if_index=0xFFFFFFFF,
349350
decap_next_index=0xFFFFFFFF,
350351
src_address=cls.pg0.local_ip4,
351352
dst_address=cls.pg0.remote_ip4,
352-
teid=cls.single_tunnel_bd)
353+
teid=cls.single_tunnel_vni)
353354
cls.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=r.sw_if_index,
354355
bd_id=cls.single_tunnel_bd)
355356
cls.vapi.sw_interface_set_l2_bridge(

src/vnet/geneve/decap.c

Lines changed: 31 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ geneve_input (vlib_main_t * vm,
213213
if (is_ip4)
214214
{
215215
key4_0.remote = ip4_0->src_address.as_u32;
216-
key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
216+
key4_0.vni = vnet_get_geneve_vni_network_order (geneve0);
217217

218218
/* Make sure GENEVE tunnel exist according to packet SIP and VNI */
219219
if (PREDICT_FALSE (key4_0.as_u64 != last_key4.as_u64))
@@ -248,7 +248,7 @@ geneve_input (vlib_main_t * vm,
248248
(ip4_address_is_multicast (&ip4_0->dst_address)))
249249
{
250250
key4_0.remote = ip4_0->dst_address.as_u32;
251-
key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
251+
key4_0.vni = vnet_get_geneve_vni_network_order (geneve0);
252252
/* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
253253
p0 = hash_get (vxm->geneve4_tunnel_by_key, key4_0.as_u64);
254254
if (PREDICT_TRUE (p0 != NULL))
@@ -266,7 +266,7 @@ geneve_input (vlib_main_t * vm,
266266
{
267267
key6_0.remote.as_u64[0] = ip6_0->src_address.as_u64[0];
268268
key6_0.remote.as_u64[1] = ip6_0->src_address.as_u64[1];
269-
key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
269+
key6_0.vni = vnet_get_geneve_vni_network_order (geneve0);
270270

271271
/* Make sure GENEVE tunnel exist according to packet SIP and VNI */
272272
if (PREDICT_FALSE
@@ -303,7 +303,7 @@ geneve_input (vlib_main_t * vm,
303303
{
304304
key6_0.remote.as_u64[0] = ip6_0->dst_address.as_u64[0];
305305
key6_0.remote.as_u64[1] = ip6_0->dst_address.as_u64[1];
306-
key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
306+
key6_0.vni = vnet_get_geneve_vni_network_order (geneve0);
307307
p0 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_0);
308308
if (PREDICT_TRUE (p0 != NULL))
309309
{
@@ -380,7 +380,7 @@ geneve_input (vlib_main_t * vm,
380380
if (is_ip4)
381381
{
382382
key4_1.remote = ip4_1->src_address.as_u32;
383-
key4_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
383+
key4_1.vni = vnet_get_geneve_vni_network_order (geneve1);
384384

385385
/* Make sure unicast GENEVE tunnel exist by packet SIP and VNI */
386386
if (PREDICT_FALSE (key4_1.as_u64 != last_key4.as_u64))
@@ -415,7 +415,7 @@ geneve_input (vlib_main_t * vm,
415415
(ip4_address_is_multicast (&ip4_1->dst_address)))
416416
{
417417
key4_1.remote = ip4_1->dst_address.as_u32;
418-
key4_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
418+
key4_1.vni = vnet_get_geneve_vni_network_order (geneve1);
419419
/* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
420420
p1 = hash_get (vxm->geneve4_tunnel_by_key, key4_1.as_u64);
421421
if (PREDICT_TRUE (p1 != NULL))
@@ -433,7 +433,7 @@ geneve_input (vlib_main_t * vm,
433433
{
434434
key6_1.remote.as_u64[0] = ip6_1->src_address.as_u64[0];
435435
key6_1.remote.as_u64[1] = ip6_1->src_address.as_u64[1];
436-
key6_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
436+
key6_1.vni = vnet_get_geneve_vni_network_order (geneve1);
437437

438438
/* Make sure GENEVE tunnel exist according to packet SIP and VNI */
439439
if (PREDICT_FALSE
@@ -472,7 +472,7 @@ geneve_input (vlib_main_t * vm,
472472
{
473473
key6_1.remote.as_u64[0] = ip6_1->dst_address.as_u64[0];
474474
key6_1.remote.as_u64[1] = ip6_1->dst_address.as_u64[1];
475-
key6_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
475+
key6_1.vni = vnet_get_geneve_vni_network_order (geneve1);
476476
p1 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_1);
477477
if (PREDICT_TRUE (p1 != NULL))
478478
{
@@ -618,7 +618,7 @@ geneve_input (vlib_main_t * vm,
618618
if (is_ip4)
619619
{
620620
key4_0.remote = ip4_0->src_address.as_u32;
621-
key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
621+
key4_0.vni = vnet_get_geneve_vni_network_order (geneve0);
622622

623623
/* Make sure unicast GENEVE tunnel exist by packet SIP and VNI */
624624
if (PREDICT_FALSE (key4_0.as_u64 != last_key4.as_u64))
@@ -653,7 +653,7 @@ geneve_input (vlib_main_t * vm,
653653
(ip4_address_is_multicast (&ip4_0->dst_address)))
654654
{
655655
key4_0.remote = ip4_0->dst_address.as_u32;
656-
key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
656+
key4_0.vni = vnet_get_geneve_vni_network_order (geneve0);
657657
/* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
658658
p0 = hash_get (vxm->geneve4_tunnel_by_key, key4_0.as_u64);
659659
if (PREDICT_TRUE (p0 != NULL))
@@ -671,7 +671,7 @@ geneve_input (vlib_main_t * vm,
671671
{
672672
key6_0.remote.as_u64[0] = ip6_0->src_address.as_u64[0];
673673
key6_0.remote.as_u64[1] = ip6_0->src_address.as_u64[1];
674-
key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
674+
key6_0.vni = vnet_get_geneve_vni_network_order (geneve0);
675675

676676
/* Make sure GENEVE tunnel exist according to packet SIP and VNI */
677677
if (PREDICT_FALSE
@@ -708,7 +708,7 @@ geneve_input (vlib_main_t * vm,
708708
{
709709
key6_0.remote.as_u64[0] = ip6_0->dst_address.as_u64[0];
710710
key6_0.remote.as_u64[1] = ip6_0->dst_address.as_u64[1];
711-
key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
711+
key6_0.vni = vnet_get_geneve_vni_network_order (geneve0);
712712
p0 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_0);
713713
if (PREDICT_TRUE (p0 != NULL))
714714
{
@@ -1240,24 +1240,17 @@ VLIB_NODE_FN (ip4_geneve_bypass_node) (vlib_main_t * vm,
12401240
/* *INDENT-OFF* */
12411241
VLIB_REGISTER_NODE (ip4_geneve_bypass_node) =
12421242
{
1243-
.name = "ip4-geneve-bypass",.vector_size =
1244-
sizeof (u32),.n_next_nodes = IP_GENEVE_BYPASS_N_NEXT,.next_nodes =
1243+
.name = "ip4-geneve-bypass",
1244+
.vector_size = sizeof (u32),
1245+
.n_next_nodes = IP_GENEVE_BYPASS_N_NEXT,.next_nodes =
12451246
{
1246-
[IP_GENEVE_BYPASS_NEXT_DROP] = "error-drop",
1247-
[IP_GENEVE_BYPASS_NEXT_GENEVE] = "geneve4-input",}
1248-
,.format_buffer = format_ip4_header,.format_trace =
1249-
format_ip4_forward_next_trace,};
1250-
1251-
#ifndef CLIB_MARCH_VARIANT
1252-
/* Dummy init function to get us linked in. */
1253-
clib_error_t *ip4_geneve_bypass_init (vlib_main_t * vm)
1254-
{
1255-
return 0;
1256-
}
1257-
1258-
VLIB_INIT_FUNCTION (ip4_geneve_bypass_init);
1247+
[IP_GENEVE_BYPASS_NEXT_DROP] = "error-drop",
1248+
[IP_GENEVE_BYPASS_NEXT_GENEVE] = "geneve4-input",
1249+
},
1250+
.format_buffer = format_ip4_header,
1251+
.format_trace = format_ip4_forward_next_trace,
1252+
};
12591253
/* *INDENT-ON* */
1260-
#endif /* CLIB_MARCH_VARIANT */
12611254

12621255
VLIB_NODE_FN (ip6_geneve_bypass_node) (vlib_main_t * vm,
12631256
vlib_node_runtime_t * node,
@@ -1269,26 +1262,19 @@ VLIB_NODE_FN (ip6_geneve_bypass_node) (vlib_main_t * vm,
12691262
/* *INDENT-OFF* */
12701263
VLIB_REGISTER_NODE (ip6_geneve_bypass_node) =
12711264
{
1272-
.name = "ip6-geneve-bypass",.vector_size =
1273-
sizeof (u32),.n_next_nodes = IP_GENEVE_BYPASS_N_NEXT,.next_nodes =
1265+
.name = "ip6-geneve-bypass",
1266+
.vector_size = sizeof (u32),
1267+
.n_next_nodes = IP_GENEVE_BYPASS_N_NEXT,
1268+
.next_nodes =
12741269
{
1275-
[IP_GENEVE_BYPASS_NEXT_DROP] = "error-drop",
1276-
[IP_GENEVE_BYPASS_NEXT_GENEVE] = "geneve6-input",}
1277-
,.format_buffer = format_ip6_header,.format_trace =
1278-
format_ip6_forward_next_trace,};
1270+
[IP_GENEVE_BYPASS_NEXT_DROP] = "error-drop",
1271+
[IP_GENEVE_BYPASS_NEXT_GENEVE] = "geneve6-input",
1272+
},
1273+
.format_buffer = format_ip6_header,
1274+
.format_trace = format_ip6_forward_next_trace,
1275+
};
12791276
/* *INDENT-ON* */
12801277

1281-
#ifndef CLIB_MARCH_VARIANT
1282-
/* Dummy init function to get us linked in. */
1283-
clib_error_t *
1284-
ip6_geneve_bypass_init (vlib_main_t * vm)
1285-
{
1286-
return 0;
1287-
}
1288-
1289-
VLIB_INIT_FUNCTION (ip6_geneve_bypass_init);
1290-
#endif /* CLIB_MARCH_VARIANT */
1291-
12921278
/*
12931279
* fd.io coding-style-patch-verification: ON
12941280
*

src/vnet/geneve/geneve.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -292,14 +292,15 @@ geneve_decap_next_is_valid (geneve_main_t * vxm, u32 is_ip6,
292292
return decap_next_index < r->n_next_nodes;
293293
}
294294

295-
typedef CLIB_PACKED (union
296-
{
297-
struct
298-
{
299-
fib_node_index_t mfib_entry_index;
300-
adj_index_t mcast_adj_index;
301-
}; u64 as_u64;
302-
}) mcast_shared_t;
295+
typedef union
296+
{
297+
struct
298+
{
299+
fib_node_index_t mfib_entry_index;
300+
adj_index_t mcast_adj_index;
301+
};
302+
u64 as_u64;
303+
} __clib_packed mcast_shared_t;
303304

304305
static inline mcast_shared_t
305306
mcast_shared_get (ip46_address_t * ip)
@@ -352,15 +353,13 @@ int vnet_geneve_add_del_tunnel
352353
if (!is_ip6)
353354
{
354355
key4.remote = a->remote.ip4.as_u32;
355-
key4.vni =
356-
clib_host_to_net_u32 ((a->vni << GENEVE_VNI_SHIFT) & GENEVE_VNI_MASK);
356+
key4.vni = clib_host_to_net_u32 (a->vni << GENEVE_VNI_SHIFT);
357357
p = hash_get (vxm->geneve4_tunnel_by_key, key4.as_u64);
358358
}
359359
else
360360
{
361361
key6.remote = a->remote.ip6;
362-
key6.vni =
363-
clib_host_to_net_u32 ((a->vni << GENEVE_VNI_SHIFT) & GENEVE_VNI_MASK);
362+
key6.vni = clib_host_to_net_u32 (a->vni << GENEVE_VNI_SHIFT);
364363
p = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6);
365364
}
366365

src/vnet/geneve/geneve_packet.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -137,21 +137,14 @@ typedef struct
137137
static inline u32
138138
vnet_get_geneve_vni (geneve_header_t * h)
139139
{
140-
return (clib_net_to_host_u32 (h->vni_rsvd & GENEVE_VNI_MASK) >>
140+
return ((clib_net_to_host_u32 (h->vni_rsvd) & GENEVE_VNI_MASK) >>
141141
GENEVE_VNI_SHIFT);
142142
}
143143

144-
/*
145-
* Return the VNI in network-byte order
146-
*
147-
* To be used in the DECAP phase to create the lookup key (IP + VNI)
148-
*/
149144
static inline u32
150-
vnet_get_geneve_vni_bigendian (geneve_header_t * h)
145+
vnet_get_geneve_vni_network_order (geneve_header_t * h)
151146
{
152-
u32 vni_host = vnet_get_geneve_vni (h);
153-
return clib_host_to_net_u32 ((vni_host << GENEVE_VNI_SHIFT) &
154-
GENEVE_VNI_MASK);
147+
return (h->vni_rsvd & clib_net_to_host_u32 (GENEVE_VNI_MASK));
155148
}
156149

157150
static inline void

test/template_bd.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def test_decap(self):
7474
"""
7575

7676
encapsulated_pkt = self.encapsulate(self.frame_request,
77-
self.single_tunnel_bd)
77+
self.single_tunnel_vni)
7878

7979
self.pg0.add_stream([encapsulated_pkt, ])
8080

@@ -102,7 +102,7 @@ def test_encap(self):
102102
# Pick first received frame and check if it's correctly encapsulated.
103103
out = self.pg0.get_capture(1)
104104
pkt = out[0]
105-
self.check_encapsulation(pkt, self.single_tunnel_bd)
105+
self.check_encapsulation(pkt, self.single_tunnel_vni)
106106

107107
payload = self.decapsulate(pkt)
108108
self.assert_eq_pkts(payload, self.frame_reply)

test/test_geneve.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,11 @@ def setUpClass(cls):
182182

183183
# Create GENEVE VTEP on VPP pg0, and put geneve_tunnel0 and pg1
184184
# into BD.
185+
cls.single_tunnel_vni = 0xabcde
185186
cls.single_tunnel_bd = 1
186187
r = cls.vapi.geneve_add_del_tunnel(
187188
local_address=cls.pg0.local_ip4,
188-
remote_address=cls.pg0.remote_ip4, vni=cls.single_tunnel_bd)
189+
remote_address=cls.pg0.remote_ip4, vni=cls.single_tunnel_vni)
189190
cls.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=r.sw_if_index,
190191
bd_id=cls.single_tunnel_bd)
191192
cls.vapi.sw_interface_set_l2_bridge(

test/test_vxlan.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,11 @@ def setUp(self):
200200
super(TestVxlan, self).setUp()
201201
# Create VXLAN VTEP on VPP pg0, and put vxlan_tunnel0 and pg1
202202
# into BD.
203+
self.single_tunnel_vni = 0x12345
203204
self.single_tunnel_bd = 1
204205
r = VppVxlanTunnel(self, src=self.pg0.local_ip4,
205-
dst=self.pg0.remote_ip4, vni=self.single_tunnel_bd)
206+
dst=self.pg0.remote_ip4,
207+
vni=self.single_tunnel_vni)
206208
r.add_vpp_config()
207209
self.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=r.sw_if_index,
208210
bd_id=self.single_tunnel_bd)
@@ -264,7 +266,7 @@ def test_encap_big_packet(self):
264266
ether = out[0]
265267
pkt = reassemble4(out)
266268
pkt = ether / pkt
267-
self.check_encapsulation(pkt, self.single_tunnel_bd)
269+
self.check_encapsulation(pkt, self.single_tunnel_vni)
268270

269271
payload = self.decapsulate(pkt)
270272
# TODO: Scapy bug?

test/test_vxlan6.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,11 @@ def setUp(self):
147147
super(TestVxlan6, self).setUp()
148148
# Create VXLAN VTEP on VPP pg0, and put vxlan_tunnel0 and pg1
149149
# into BD.
150+
self.single_tunnel_vni = 0x12345
150151
self.single_tunnel_bd = 1
151152
r = VppVxlanTunnel(self, src=self.pg0.local_ip6,
152-
dst=self.pg0.remote_ip6, vni=self.single_tunnel_bd)
153+
dst=self.pg0.remote_ip6,
154+
vni=self.single_tunnel_vni)
153155
r.add_vpp_config()
154156
self.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=r.sw_if_index,
155157
bd_id=self.single_tunnel_bd)

test/test_vxlan_gbp.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,12 @@ def setUpClass(cls):
145145
# Create VXLAN GBP VTEP on VPP pg0, and put vxlan_gbp_tunnel0 and
146146
# pg1 into BD.
147147
cls.single_tunnel_bd = 1
148+
cls.single_tunnel_vni = 0xabcde
148149
r = cls.vapi.vxlan_gbp_tunnel_add_del(
149150
tunnel={
150151
'src': cls.pg0.local_ip4,
151152
'dst': cls.pg0.remote_ip4,
152-
'vni': cls.single_tunnel_bd,
153+
'vni': cls.single_tunnel_vni,
153154
'instance': INVALID_INDEX,
154155
'mcast_sw_if_index': INVALID_INDEX,
155156
'mode': 1,
@@ -197,7 +198,7 @@ def test_decap(self):
197198
Verify receipt of decapsulated frames on pg1
198199
"""
199200
encapsulated_pkt = self.encapsulate(self.frame_request,
200-
self.single_tunnel_bd)
201+
self.single_tunnel_vni)
201202

202203
self.pg0.add_stream([encapsulated_pkt, ])
203204

@@ -225,7 +226,7 @@ def test_encap(self):
225226
# Pick first received frame and check if it's correctly encapsulated.
226227
out = self.pg0.get_capture(1)
227228
pkt = out[0]
228-
self.check_encapsulation(pkt, self.single_tunnel_bd)
229+
self.check_encapsulation(pkt, self.single_tunnel_vni)
229230

230231
payload = self.decapsulate(pkt)
231232
self.assert_eq_pkts(payload, self.frame_reply)
@@ -269,7 +270,7 @@ def test_encap_big_packet(self):
269270
# Pick first received frame and check if it's correctly encapsulated.
270271
out = self.pg0.get_capture(2)
271272
pkt = reassemble4_ether(out)
272-
self.check_encapsulation(pkt, self.single_tunnel_bd)
273+
self.check_encapsulation(pkt, self.single_tunnel_vni)
273274

274275
payload = self.decapsulate(pkt)
275276
self.assert_eq_pkts(payload, frame)

test/test_vxlan_gpe.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,12 @@ def setUpClass(cls):
190190

191191
# Create VXLAN-GPE VTEP on VPP pg0, and put vxlan_gpe_tunnel0
192192
# and pg1 into BD.
193+
cls.single_tunnel_vni = 0xabcde
193194
cls.single_tunnel_bd = 11
194195
r = cls.vapi.vxlan_gpe_add_del_tunnel(
195196
src_addr=cls.pg0.local_ip4n,
196197
dst_addr=cls.pg0.remote_ip4n,
197-
vni=cls.single_tunnel_bd)
198+
vni=cls.single_tunnel_vni)
198199
cls.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=r.sw_if_index,
199200
bd_id=cls.single_tunnel_bd)
200201
cls.vapi.sw_interface_set_l2_bridge(

0 commit comments

Comments
 (0)