diff --git a/dash-pipeline/bmv2/dash_metadata.p4 b/dash-pipeline/bmv2/dash_metadata.p4 index 48f01561c..630dc1def 100644 --- a/dash-pipeline/bmv2/dash_metadata.p4 +++ b/dash-pipeline/bmv2/dash_metadata.p4 @@ -69,7 +69,8 @@ struct flow_table_data_t { } enum bit<32> dash_flow_action_t { - NONE = 0 + ENCAP = (1 << 0), + OVERLAY_REWRITE = (1 << 1) } struct flow_key_t { diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index 0113ec195..65f79f010 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -10,6 +10,7 @@ #include "dash_inbound.p4" #include "dash_conntrack.p4" #include "stages/conntrack_lookup.p4" +#include "stages/flow_action_apply.p4" #include "stages/direction_lookup.p4" #include "stages/eni_lookup.p4" #include "stages/ha.p4" @@ -340,6 +341,8 @@ control dash_ingress( conntrack_lookup_stage.apply(hdr, meta); + flow_action_apply.apply(hdr, meta); + UPDATE_ENI_COUNTER(eni_rx); if (meta.is_fast_path_icmp_flow_redirection_packet) { UPDATE_ENI_COUNTER(eni_lb_fast_path_icmp_in); diff --git a/dash-pipeline/bmv2/flow_actions/flow_action_encap.p4 b/dash-pipeline/bmv2/flow_actions/flow_action_encap.p4 new file mode 100644 index 000000000..d9eefe4c6 --- /dev/null +++ b/dash-pipeline/bmv2/flow_actions/flow_action_encap.p4 @@ -0,0 +1,82 @@ +#ifndef _DASH_FLOW_ACTION_ENCAP_P4_ +#define _DASH_FLOW_ACTION_ENCAP_P4_ + +control do_action_encap( + inout headers_t hdr, + inout metadata_t meta) +{ + apply { + if (meta.conntrack_data.flow_data.actions & dash_flow_action_t.ENCAP == 0) { + return; + } + + if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { + push_vxlan_tunnel_u0(hdr, + meta.overlay_data.dmac, + meta.encap_data.underlay_dmac, + meta.encap_data.underlay_smac, + meta.encap_data.underlay_dip, + meta.encap_data.underlay_sip, + meta.encap_data.vni); + + meta.tunnel_pointer = meta.tunnel_pointer + 1; + + if (meta.tunnel_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { + push_vxlan_tunnel_u1(hdr, + meta.encap_data.underlay_dmac, + meta.tunnel_data.underlay_dmac, + meta.tunnel_data.underlay_smac, + meta.tunnel_data.underlay_dip, + meta.tunnel_data.underlay_sip, + meta.tunnel_data.vni); + meta.tunnel_pointer = meta.tunnel_pointer + 1; + } + else if (meta.tunnel_data.dash_encapsulation == dash_encapsulation_t.NVGRE){ + push_vxlan_tunnel_u1(hdr, + meta.encap_data.underlay_dmac, + meta.tunnel_data.underlay_dmac, + meta.tunnel_data.underlay_smac, + meta.tunnel_data.underlay_dip, + meta.tunnel_data.underlay_sip, + meta.tunnel_data.vni); + meta.tunnel_pointer = meta.tunnel_pointer + 1; + } + } + else if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.NVGRE) { + push_vxlan_tunnel_u0(hdr, + meta.overlay_data.dmac, + meta.encap_data.underlay_dmac, + meta.encap_data.underlay_smac, + meta.encap_data.underlay_dip, + meta.encap_data.underlay_sip, + meta.encap_data.vni); + + meta.tunnel_pointer = meta.tunnel_pointer + 1; + + if (meta.tunnel_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { + push_vxlan_tunnel_u1(hdr, + meta.encap_data.underlay_dmac, + meta.tunnel_data.underlay_dmac, + meta.tunnel_data.underlay_smac, + meta.tunnel_data.underlay_dip, + meta.tunnel_data.underlay_sip, + meta.tunnel_data.vni); + meta.tunnel_pointer = meta.tunnel_pointer + 1; + } + else if (meta.tunnel_data.dash_encapsulation == dash_encapsulation_t.NVGRE){ + push_vxlan_tunnel_u1(hdr, + meta.encap_data.underlay_dmac, + meta.tunnel_data.underlay_dmac, + meta.tunnel_data.underlay_smac, + meta.tunnel_data.underlay_dip, + meta.tunnel_data.underlay_sip, + meta.tunnel_data.vni); + meta.tunnel_pointer = meta.tunnel_pointer + 1; + } + } + + } +} + + +#endif /* _DASH_FLOW_ACTION_ENCAP_P4_ */ diff --git a/dash-pipeline/bmv2/flow_actions/flow_action_overlay_rewrite.p4 b/dash-pipeline/bmv2/flow_actions/flow_action_overlay_rewrite.p4 new file mode 100644 index 000000000..dd9deb54c --- /dev/null +++ b/dash-pipeline/bmv2/flow_actions/flow_action_overlay_rewrite.p4 @@ -0,0 +1,24 @@ +#ifndef _DASH_FLOW_ACTION_OVERLAY_REWRITE_P4_ +#define _DASH_FLOW_ACTION_OVERLAY_REWRITE_P4_ + +control do_action_overlay_rewrite( + inout headers_t hdr, + inout metadata_t meta) +{ + apply { + if (meta.conntrack_data.flow_data.actions & dash_flow_action_t.OVERLAY_REWRITE == 0) { + return; + } + + REQUIRES(meta.overlay_data.is_ipv6 == false); + + // hdr.customer_ipv4.setValid(); + + hdr.customer_ipv4.dst_addr = (IPv4Address)((IPv6Address)meta.overlay_data.dip & meta.overlay_data.dip_mask); + hdr.customer_ipv4.src_addr = (IPv4Address)((IPv6Address)meta.overlay_data.sip & meta.overlay_data.sip_mask); + hdr.customer_ethernet.dst_addr = meta.overlay_data.dmac; + hdr.customer_ethernet.ether_type = IPV4_ETHTYPE; + } +} + +#endif /* _DASH_FLOW_ACTION_OVERLAY_REWRITE_P4_ */ \ No newline at end of file diff --git a/dash-pipeline/bmv2/flow_actions/flow_actions.p4 b/dash-pipeline/bmv2/flow_actions/flow_actions.p4 new file mode 100644 index 000000000..9d365eb2a --- /dev/null +++ b/dash-pipeline/bmv2/flow_actions/flow_actions.p4 @@ -0,0 +1,7 @@ +#ifndef _DASH_FLOW_ACTIONS_P4_ +#define _DASH_FLOW_ACTIONS_P4_ + +#include "flow_action_overlay_rewrite.p4" +#include "flow_action_encap.p4" + +#endif /* _DASH_FLOW_ACTIONS_P4_ */ \ No newline at end of file diff --git a/dash-pipeline/bmv2/stages/flow_action_apply.p4 b/dash-pipeline/bmv2/stages/flow_action_apply.p4 new file mode 100644 index 000000000..3882e3fb2 --- /dev/null +++ b/dash-pipeline/bmv2/stages/flow_action_apply.p4 @@ -0,0 +1,16 @@ +#ifndef _DASH_STAGE_FLOW_ACTION_APPLY_P4_ +#define _DASH_STAGE_FLOW_ACTION_APPLY_P4_ + +#include "../flow_actions/flow_actions.p4" + +control flow_action_apply( + inout headers_t hdr, + inout metadata_t meta) +{ + apply { + do_action_encap.apply(hdr, meta); + do_action_overlay_rewrite.apply(hdr, meta); + } +} + +#endif /* _DASH_STAGE_ACTION_APPLY_P4_ */ \ No newline at end of file