diff --git a/dash-pipeline/bmv2/dash_metadata.p4 b/dash-pipeline/bmv2/dash_metadata.p4 index 9425b3854..b3cd19a72 100644 --- a/dash-pipeline/bmv2/dash_metadata.p4 +++ b/dash-pipeline/bmv2/dash_metadata.p4 @@ -145,6 +145,31 @@ struct ha_data_t { dash_flow_state_t ha_flow_state; } +#ifdef TARGET_DPDK_PNA +// redefine encap_data_t -> meta_encap_data_t +// redefine overlay_rewrite_data_t -> meta_overlay_rewrite_data_t +// header in struct is not well supported for target dpdk-pna +struct meta_encap_data_t { + bit<24> vni; + bit<24> dest_vnet_vni; + IPv4Address underlay_sip; + IPv4Address underlay_dip; + EthernetAddress underlay_smac; + EthernetAddress underlay_dmac; + dash_encapsulation_t dash_encapsulation; +} + +struct meta_overlay_rewrite_data_t { + EthernetAddress dmac; + IPv4ORv6Address sip; + IPv4ORv6Address dip; + IPv6Address sip_mask; + IPv6Address dip_mask; + bit<7> reserved; + bit<1> is_ipv6; +} +#endif // TARGET_DPDK_PNA + struct metadata_t { // Packet type dash_packet_source_t packet_source; // TODO: Parse packet source in parser. @@ -154,7 +179,11 @@ struct metadata_t { dash_direction_t direction; dash_eni_mac_type_t eni_mac_type; dash_eni_mac_override_type_t eni_mac_override_type; +#ifdef TARGET_DPDK_PNA + meta_encap_data_t rx_encap; +#else encap_data_t rx_encap; +#endif // TARGET_DPDK_PNA EthernetAddress eni_addr; bit<16> vnet_id; bit<16> dst_vnet_id; @@ -200,11 +229,19 @@ struct metadata_t { // Action data bool dropped; +#ifdef TARGET_DPDK_PNA + // encap_data is for underlay + meta_encap_data_t encap_data; + // tunnel_data is used by dash_tunnel_id + meta_encap_data_t tunnel_data; + meta_overlay_rewrite_data_t overlay_data; +#else // encap_data is for underlay encap_data_t encap_data; // tunnel_data is used by dash_tunnel_id encap_data_t tunnel_data; overlay_rewrite_data_t overlay_data; +#endif // TARGET_DPDK_PNA bit<16> dash_tunnel_id; bit<32> meter_class; bit<8> local_region_id; diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index 32dece5ca..d1de27d3d 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -230,10 +230,12 @@ control dash_ingress( apply { meta.flow_enabled = false; +#ifndef TARGET_DPDK_PNA meta.rx_encap.setValid(); meta.encap_data.setValid(); meta.tunnel_data.setValid(); meta.overlay_data.setValid(); +#endif // TARGET_DPDK_PNA #ifdef TARGET_DPDK_PNA #ifdef DPDK_PNA_SEND_TO_PORT_FIX_MERGED diff --git a/dash-pipeline/bmv2/stages/conntrack_lookup.p4 b/dash-pipeline/bmv2/stages/conntrack_lookup.p4 index f53e77591..c46bb2ba6 100644 --- a/dash-pipeline/bmv2/stages/conntrack_lookup.p4 +++ b/dash-pipeline/bmv2/stages/conntrack_lookup.p4 @@ -12,13 +12,42 @@ action conntrack_set_meta_from_dash_header(in headers_t hdr, out metadata_t meta meta.meter_class = hdr.flow_data.meter_class; /* encapsulation metadata */ +#ifdef TARGET_DPDK_PNA + meta.encap_data.vni = hdr.flow_encap_data.vni; + meta.encap_data.dest_vnet_vni = hdr.flow_encap_data.dest_vnet_vni; + meta.encap_data.underlay_sip = hdr.flow_encap_data.underlay_sip; + meta.encap_data.underlay_dip = hdr.flow_encap_data.underlay_dip; + meta.encap_data.underlay_smac = hdr.flow_encap_data.underlay_smac; + meta.encap_data.underlay_dmac = hdr.flow_encap_data.underlay_dmac; + meta.encap_data.dash_encapsulation = hdr.flow_encap_data.dash_encapsulation; +#else meta.encap_data = hdr.flow_encap_data; +#endif // TARGET_DPDK_PNA /* tunnel metadata */ +#ifdef TARGET_DPDK_PNA + meta.tunnel_data.vni = hdr.flow_tunnel_data.vni; + meta.tunnel_data.dest_vnet_vni = hdr.flow_tunnel_data.dest_vnet_vni; + meta.tunnel_data.underlay_sip = hdr.flow_tunnel_data.underlay_sip; + meta.tunnel_data.underlay_dip = hdr.flow_tunnel_data.underlay_dip; + meta.tunnel_data.underlay_smac = hdr.flow_tunnel_data.underlay_smac; + meta.tunnel_data.underlay_dmac = hdr.flow_tunnel_data.underlay_dmac; + meta.tunnel_data.dash_encapsulation = hdr.flow_tunnel_data.dash_encapsulation; +#else meta.tunnel_data = hdr.flow_tunnel_data; +#endif // TARGET_DPDK_PNA /* overlay rewrite metadata */ +#ifdef TARGET_DPDK_PNA + meta.overlay_data.dmac = hdr.flow_overlay_data.dmac; + meta.overlay_data.sip = hdr.flow_overlay_data.sip; + meta.overlay_data.dip = hdr.flow_overlay_data.dip; + meta.overlay_data.sip_mask = hdr.flow_overlay_data.sip_mask; + meta.overlay_data.dip_mask = hdr.flow_overlay_data.dip_mask; + meta.overlay_data.is_ipv6 = hdr.flow_overlay_data.is_ipv6; +#else meta.overlay_data = hdr.flow_overlay_data; +#endif // TARGET_DPDK_PNA } action conntrack_strip_dash_header(inout headers_t hdr) @@ -48,17 +77,49 @@ control conntrack_build_dash_header(inout headers_t hdr, in metadata_t meta, length = length + FLOW_DATA_HDR_SIZE; if (meta.routing_actions & dash_routing_actions_t.STATIC_ENCAP != 0) { +#ifdef TARGET_DPDK_PNA + hdr.flow_encap_data.setValid(); + hdr.flow_encap_data.vni = meta.encap_data.vni; + hdr.flow_encap_data.dest_vnet_vni = meta.encap_data.dest_vnet_vni; + hdr.flow_encap_data.underlay_sip = meta.encap_data.underlay_sip; + hdr.flow_encap_data.underlay_dip = meta.encap_data.underlay_dip; + hdr.flow_encap_data.underlay_smac = meta.encap_data.underlay_smac; + hdr.flow_encap_data.underlay_dmac = meta.encap_data.underlay_dmac; + hdr.flow_encap_data.dash_encapsulation = meta.encap_data.dash_encapsulation; +#else hdr.flow_encap_data= meta.encap_data; +#endif // TARGET_DPDK_PNA length = length + ENCAP_DATA_HDR_SIZE; } if (meta.dash_tunnel_id != 0) { +#ifdef TARGET_DPDK_PNA + hdr.flow_tunnel_data.setValid(); + hdr.flow_tunnel_data.vni = meta.tunnel_data.vni; + hdr.flow_tunnel_data.dest_vnet_vni = meta.tunnel_data.dest_vnet_vni; + hdr.flow_tunnel_data.underlay_sip = meta.tunnel_data.underlay_sip; + hdr.flow_tunnel_data.underlay_dip = meta.tunnel_data.underlay_dip; + hdr.flow_tunnel_data.underlay_smac = meta.tunnel_data.underlay_smac; + hdr.flow_tunnel_data.underlay_dmac = meta.tunnel_data.underlay_dmac; + hdr.flow_tunnel_data.dash_encapsulation = meta.tunnel_data.dash_encapsulation; +#else hdr.flow_tunnel_data= meta.tunnel_data; +#endif // TARGET_DPDK_PNA length = length + ENCAP_DATA_HDR_SIZE; } if (meta.routing_actions != 0) { +#ifdef TARGET_DPDK_PNA + hdr.flow_overlay_data.setValid(); + hdr.flow_overlay_data.dmac = meta.overlay_data.dmac; + hdr.flow_overlay_data.sip = meta.overlay_data.sip; + hdr.flow_overlay_data.dip = meta.overlay_data.dip; + hdr.flow_overlay_data.sip_mask = meta.overlay_data.sip_mask; + hdr.flow_overlay_data.dip_mask = meta.overlay_data.dip_mask; + hdr.flow_overlay_data.is_ipv6 = meta.overlay_data.is_ipv6; +#else hdr.flow_overlay_data= meta.overlay_data; +#endif // TARGET_DPDK_PNA length = length + OVERLAY_REWRITE_DATA_HDR_SIZE; }