Skip to content

Commit

Permalink
Add ST route type
Browse files Browse the repository at this point in the history
Signed-off-by: Marian Pritsak <[email protected]>
  • Loading branch information
marian-pritsak committed Dec 30, 2022
1 parent f3f335e commit a54cbe7
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 0 deletions.
18 changes: 18 additions & 0 deletions dash-pipeline/bmv2/dash_headers.p4
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,17 @@ header vxlan_t {

const bit<16> VXLAN_HDR_SIZE=64/8;

header nvgre_t {
bit<4> flags;
bit<9> reserved;
bit<3> version;
bit<16> protocol_type;
bit<24> vsid;
bit<8> flow_id;
}

const bit<16> NVGRE_HDR_SIZE=64/8;

header tcp_t {
bit<16> src_port;
bit<16> dst_port;
Expand Down Expand Up @@ -90,11 +101,18 @@ struct headers_t {
udp_t udp;
tcp_t tcp;
vxlan_t vxlan;
nvgre_t nvgre;
ethernet_t inner_ethernet;
ipv4_t inner_ipv4;
ipv6_t inner_ipv6;
udp_t inner_udp;
tcp_t inner_tcp;
}

enum bit<16> dash_encapsulation_t {
INVALID = 0,
VXLAN = 1,
NVGRE = 2
}

#endif /* _SIRIUS_HEADERS_P4_ */
2 changes: 2 additions & 0 deletions dash-pipeline/bmv2/dash_metadata.p4
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ struct encap_data_t {
EthernetAddress underlay_smac;
EthernetAddress underlay_dmac;
EthernetAddress overlay_dmac;
dash_encapsulation_t encap_type;
bit<24> service_tunnel_id;
}

enum bit<16> direction_t {
Expand Down
60 changes: 60 additions & 0 deletions dash-pipeline/bmv2/dash_nvgre.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#ifndef _DASH_NVGRE_P4_
#define _DASH_NVGRE_P4_

#include "dash_headers.p4"

action nvgre_encap(inout headers_t hdr,
in EthernetAddress underlay_dmac,
in EthernetAddress underlay_smac,
in IPv4Address underlay_dip,
in IPv4Address underlay_sip,
in EthernetAddress overlay_dmac,
in bit<24> vsid) {
hdr.inner_ethernet = hdr.ethernet;
hdr.inner_ethernet.dst_addr = overlay_dmac;
hdr.ethernet.setInvalid();

hdr.inner_ipv4 = hdr.ipv4;
hdr.ipv4.setInvalid();
hdr.inner_ipv6 = hdr.ipv6;
hdr.ipv6.setInvalid();
hdr.inner_tcp = hdr.tcp;
hdr.tcp.setInvalid();
hdr.inner_udp = hdr.udp;
hdr.udp.setInvalid();

hdr.ethernet.setValid();
hdr.ethernet.dst_addr = underlay_dmac;
hdr.ethernet.src_addr = underlay_smac;
hdr.ethernet.ether_type = IPV4_ETHTYPE;

hdr.ipv4.setValid();
hdr.ipv4.version = 4;
hdr.ipv4.ihl = 5;
hdr.ipv4.diffserv = 0;
hdr.ipv4.total_len = hdr.inner_ipv4.total_len*(bit<16>)(bit<1>)hdr.inner_ipv4.isValid() + \
hdr.inner_ipv6.payload_length*(bit<16>)(bit<1>)hdr.inner_ipv6.isValid() + \
IPV6_HDR_SIZE*(bit<16>)(bit<1>)hdr.inner_ipv6.isValid() + \
ETHER_HDR_SIZE + \
IPV4_HDR_SIZE + \
NVGRE_HDR_SIZE;
hdr.ipv4.identification = 1;
hdr.ipv4.flags = 0;
hdr.ipv4.frag_offset = 0;
hdr.ipv4.ttl = 64;
hdr.ipv4.protocol = NVGRE_PROTO;
hdr.ipv4.dst_addr = underlay_dip;
hdr.ipv4.src_addr = underlay_sip;
hdr.ipv4.hdr_checksum = 0;

hdr.nvgre.setValid();
hdr.nvgre.flags = 4;
hdr.nvgre.reserved = 0;
hdr.nvgre.version = 0;
hdr.nvgre.protocol_type = 0x6558;
hdr.nvgre.vsid = vsid;
hdr.nvgre.flow_id = 0;

}

#endif /* _DASH_NVGRE_P4_ */
49 changes: 49 additions & 0 deletions dash-pipeline/bmv2/dash_outbound.p4
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "dash_headers.p4"
#include "dash_acl.p4"
#include "dash_conntrack.p4"
#include "dash_service_tunnel.p4"

control outbound(inout headers_t hdr,
inout metadata_t meta,
Expand All @@ -29,6 +30,32 @@ control outbound(inout headers_t hdr,
meta.dropped = true;
}

action route_service_tunnel(bit<1> is_overlay_dip_v4_or_v6,
IPv4ORv6Address overlay_dip,
bit<1> is_overlay_sip_v4_or_v6,
IPv4ORv6Address overlay_sip,
bit<1> is_underlay_dip_v4_or_v6,
IPv4ORv6Address underlay_dip,
bit<1> is_underlay_sip_v4_or_v6,
IPv4ORv6Address underlay_sip,
dash_encapsulation_t encap_type,
bit<24> tunnel_id) {
/* Assume the overlay addresses provided are always IPv6 and the original are IPv4 */
assert(is_overlay_dip_v4_or_v6 == 1 && is_overlay_sip_v4_or_v6 == 1);
assert(is_underlay_dip_v4_or_v6 != 1 && is_underlay_sip_v4_or_v6 != 1);
IPv4Address original_overly_dip = hdr.ipv4.src_addr;
IPv4Address original_overly_sip = hdr.ipv4.dst_addr;

service_tunnel_encode(hdr, overlay_dip, overlay_sip);

/* encapsulation will be done in apply block based on encap_type */
meta.encap_data.underlay_dip = underlay_dip == 0 ? original_overly_dip : (IPv4Address)underlay_dip;
meta.encap_data.underlay_sip = underlay_sip == 0 ? original_overly_sip : (IPv4Address)underlay_sip;
meta.encap_data.overlay_dmac = hdr.ethernet.dst_addr;
meta.encap_data.encap_type = encap_type;
meta.encap_data.service_tunnel_id = tunnel_id;
}

direct_counter(CounterType.packets_and_bytes) routing_counter;

@name("outbound_routing|dash_outbound_routing")
Expand All @@ -43,6 +70,7 @@ control outbound(inout headers_t hdr,
route_vnet; /* for expressroute - ecmp of overlay */
route_vnet_direct;
route_direct;
route_service_tunnel;
drop;
}
const default_action = drop;
Expand Down Expand Up @@ -133,6 +161,27 @@ control outbound(inout headers_t hdr,
meta.encap_data.overlay_dmac,
meta.encap_data.vni);
}
route_service_tunnel: {
if (meta.encap_data.encap_type == dash_encapsulation_t.VXLAN) {
vxlan_encap(hdr,
meta.encap_data.underlay_dmac,
meta.encap_data.underlay_smac,
meta.encap_data.underlay_dip,
meta.encap_data.underlay_sip,
meta.encap_data.overlay_dmac,
meta.encap_data.service_tunnel_id);
} else if (meta.encap_data.encap_type == dash_encapsulation_t.NVGRE) {
nvgre_encap(hdr,
meta.encap_data.underlay_dmac,
meta.encap_data.underlay_smac,
meta.encap_data.underlay_dip,
meta.encap_data.underlay_sip,
meta.encap_data.overlay_dmac,
meta.encap_data.service_tunnel_id);
} else {
drop();
}
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions dash-pipeline/bmv2/dash_parser.p4
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ error {
#define UDP_PORT_VXLAN 4789
#define UDP_PROTO 17
#define TCP_PROTO 6
#define NVGRE_PROTO 0x2f
#define IPV4_ETHTYPE 0x0800
#define IPV6_ETHTYPE 0x86dd

Expand Down Expand Up @@ -131,6 +132,7 @@ control dash_deparser(packet_out packet,
packet.emit(hdr.udp);
packet.emit(hdr.tcp);
packet.emit(hdr.vxlan);
packet.emit(hdr.nvgre);
packet.emit(hdr.inner_ethernet);
packet.emit(hdr.inner_ipv4);
packet.emit(hdr.inner_ipv6);
Expand Down
1 change: 1 addition & 0 deletions dash-pipeline/bmv2/dash_pipeline.p4
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "dash_metadata.p4"
#include "dash_parser.p4"
#include "dash_vxlan.p4"
#include "dash_nvgre.p4"
#include "dash_outbound.p4"
#include "dash_inbound.p4"
#include "dash_conntrack.p4"
Expand Down

0 comments on commit a54cbe7

Please sign in to comment.