- u8 *rw = 0;
- ip4_header_t * ip0;
- ip4_vxlan_header_t * h0;
- int len = sizeof (*h0);
-
- vec_validate_aligned (rw, len-1, CLIB_CACHE_LINE_BYTES);
-
- h0 = (ip4_vxlan_header_t *) rw;
-
- /* Fixed portion of the (outer) ip4 header */
- ip0 = &h0->ip4;
- ip0->ip_version_and_header_length = 0x45;
- ip0->ttl = 254;
- ip0->protocol = IP_PROTOCOL_UDP;
-
- /* we fix up the ip4 header length and checksum after-the-fact */
- ip0->src_address.as_u32 = t->src.ip4.as_u32;
- ip0->dst_address.as_u32 = t->dst.ip4.as_u32;
- ip0->checksum = ip4_header_checksum (ip0);
-
- /* UDP header, randomize src port on something, maybe? */
- h0->udp.src_port = clib_host_to_net_u16 (4789);
- h0->udp.dst_port = clib_host_to_net_u16 (UDP_DST_PORT_vxlan);
-
- /* VXLAN header */
- vnet_set_vni_and_flags(&h0->vxlan, t->vni);
-
- t->rewrite = rw;
- return (0);
-}
-
-static int vxlan6_rewrite (vxlan_tunnel_t * t)
-{
- u8 *rw = 0;
- ip6_header_t * ip0;
- ip6_vxlan_header_t * h0;
- int len = sizeof (*h0);
-
- vec_validate_aligned (rw, len-1, CLIB_CACHE_LINE_BYTES);
-
- h0 = (ip6_vxlan_header_t *) rw;
-
- /* Fixed portion of the (outer) ip6 header */
- ip0 = &h0->ip6;
- ip0->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32(6 << 28);
- ip0->hop_limit = 255;
- ip0->protocol = IP_PROTOCOL_UDP;
-
- ip0->src_address = t->src.ip6;
- ip0->dst_address = t->dst.ip6;
+ union {
+ ip4_vxlan_header_t * h4;
+ ip6_vxlan_header_t * h6;
+ u8 *rw;
+ } r = { .rw = 0 };
+ int len = is_ip6 ? sizeof *r.h6 : sizeof *r.h4;
+
+ vec_validate_aligned (r.rw, len-1, CLIB_CACHE_LINE_BYTES);
+
+ udp_header_t * udp;
+ vxlan_header_t * vxlan;
+ /* Fixed portion of the (outer) ip header */
+ if (!is_ip6)
+ {
+ ip4_header_t * ip = &r.h4->ip4;
+ udp = &r.h4->udp, vxlan = &r.h4->vxlan;
+ ip->ip_version_and_header_length = 0x45;
+ ip->ttl = 254;
+ ip->protocol = IP_PROTOCOL_UDP;
+
+ ip->src_address = t->src.ip4;
+ ip->dst_address = t->dst.ip4;
+
+ /* we fix up the ip4 header length and checksum after-the-fact */
+ ip->checksum = ip4_header_checksum (ip);
+ }
+ else
+ {
+ ip6_header_t * ip = &r.h6->ip6;
+ udp = &r.h6->udp, vxlan = &r.h6->vxlan;
+ ip->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32(6 << 28);
+ ip->hop_limit = 255;
+ ip->protocol = IP_PROTOCOL_UDP;
+
+ ip->src_address = t->src.ip6;
+ ip->dst_address = t->dst.ip6;
+ }