Fixed spgw.p4 decapping GTP packets not meant to be decapped

Also reduces the number of tables used for downlink processing.

Change-Id: I09a67cfac335b805d80e90cf5bb69fbab931e80b
This commit is contained in:
Carmelo Cascone 2018-08-14 01:43:57 -07:00
parent 6ac9035267
commit 9b0171bc34
14 changed files with 2805 additions and 3145 deletions

View File

@ -33,8 +33,6 @@ public final class FabricConstants {
} }
// Header field IDs // Header field IDs
public static final PiMatchFieldId SPGW_META_S1U_SGW_ADDR =
PiMatchFieldId.of("spgw_meta.s1u_sgw_addr");
public static final PiMatchFieldId HDR_VLAN_TAG_VLAN_ID = public static final PiMatchFieldId HDR_VLAN_TAG_VLAN_ID =
PiMatchFieldId.of("hdr.vlan_tag.vlan_id"); PiMatchFieldId.of("hdr.vlan_tag.vlan_id");
public static final PiMatchFieldId HDR_MPLS_LABEL = public static final PiMatchFieldId HDR_MPLS_LABEL =
@ -63,6 +61,8 @@ public final class FabricConstants {
PiMatchFieldId.of("fabric_metadata.l4_dst_port"); PiMatchFieldId.of("fabric_metadata.l4_dst_port");
public static final PiMatchFieldId STANDARD_METADATA_EGRESS_SPEC = public static final PiMatchFieldId STANDARD_METADATA_EGRESS_SPEC =
PiMatchFieldId.of("standard_metadata.egress_spec"); PiMatchFieldId.of("standard_metadata.egress_spec");
public static final PiMatchFieldId GTPU_IPV4_DST_ADDR =
PiMatchFieldId.of("gtpu_ipv4.dst_addr");
public static final PiMatchFieldId FABRIC_METADATA_IP_PROTO = public static final PiMatchFieldId FABRIC_METADATA_IP_PROTO =
PiMatchFieldId.of("fabric_metadata.ip_proto"); PiMatchFieldId.of("fabric_metadata.ip_proto");
public static final PiMatchFieldId FABRIC_METADATA_NEXT_ID = public static final PiMatchFieldId FABRIC_METADATA_NEXT_ID =
@ -122,12 +122,8 @@ public final class FabricConstants {
PiTableId.of("FabricEgress.egress_next.egress_vlan"); PiTableId.of("FabricEgress.egress_next.egress_vlan");
public static final PiTableId FABRIC_INGRESS_PROCESS_SET_SOURCE_SINK_TB_SET_SINK = public static final PiTableId FABRIC_INGRESS_PROCESS_SET_SOURCE_SINK_TB_SET_SINK =
PiTableId.of("FabricIngress.process_set_source_sink.tb_set_sink"); PiTableId.of("FabricIngress.process_set_source_sink.tb_set_sink");
public static final PiTableId FABRIC_INGRESS_SPGW_INGRESS_UE_CDR_TABLE =
PiTableId.of("FabricIngress.spgw_ingress.ue_cdr_table");
public static final PiTableId FABRIC_INGRESS_PROCESS_SET_SOURCE_SINK_TB_SET_SOURCE = public static final PiTableId FABRIC_INGRESS_PROCESS_SET_SOURCE_SINK_TB_SET_SOURCE =
PiTableId.of("FabricIngress.process_set_source_sink.tb_set_source"); PiTableId.of("FabricIngress.process_set_source_sink.tb_set_source");
public static final PiTableId FABRIC_INGRESS_SPGW_INGRESS_UE_FILTER_TABLE =
PiTableId.of("FabricIngress.spgw_ingress.ue_filter_table");
// Indirect Counter IDs // Indirect Counter IDs
public static final PiCounterId FABRIC_INGRESS_PORT_COUNTERS_CONTROL_EGRESS_PORT_COUNTER = public static final PiCounterId FABRIC_INGRESS_PORT_COUNTERS_CONTROL_EGRESS_PORT_COUNTER =
PiCounterId.of("FabricIngress.port_counters_control.egress_port_counter"); PiCounterId.of("FabricIngress.port_counters_control.egress_port_counter");
@ -179,8 +175,8 @@ public final class FabricConstants {
// Action IDs // Action IDs
public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0003_I14 = public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0003_I14 =
PiActionId.of("FabricEgress.process_int_transit.int_set_header_0003_i14"); PiActionId.of("FabricEgress.process_int_transit.int_set_header_0003_i14");
public static final PiActionId FABRIC_INGRESS_SPGW_INGRESS_UPDATE_UE_CDR = public static final PiActionId FABRIC_INGRESS_FORWARDING_PUNT_TO_CPU =
PiActionId.of("FabricIngress.spgw_ingress.update_ue_cdr"); PiActionId.of("FabricIngress.forwarding.punt_to_cpu");
public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0003_I12 = public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0003_I12 =
PiActionId.of("FabricEgress.process_int_transit.int_set_header_0003_i12"); PiActionId.of("FabricEgress.process_int_transit.int_set_header_0003_i12");
public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0003_I13 = public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0003_I13 =
@ -197,8 +193,8 @@ public final class FabricConstants {
PiActionId.of("FabricEgress.process_int_transit.int_set_header_0407_i14"); PiActionId.of("FabricEgress.process_int_transit.int_set_header_0407_i14");
public static final PiActionId FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_BRIDGING = public static final PiActionId FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_BRIDGING =
PiActionId.of("FabricIngress.forwarding.set_next_id_bridging"); PiActionId.of("FabricIngress.forwarding.set_next_id_bridging");
public static final PiActionId FABRIC_INGRESS_FORWARDING_PUNT_TO_CPU = public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0003_I15 =
PiActionId.of("FabricIngress.forwarding.punt_to_cpu"); PiActionId.of("FabricEgress.process_int_transit.int_set_header_0003_i15");
public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0407_I2 = public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0407_I2 =
PiActionId.of("FabricEgress.process_int_transit.int_set_header_0407_i2"); PiActionId.of("FabricEgress.process_int_transit.int_set_header_0407_i2");
public static final PiActionId FABRIC_EGRESS_PROCESS_INT_OUTER_ENCAP_INT_UPDATE_IPV4 = public static final PiActionId FABRIC_EGRESS_PROCESS_INT_OUTER_ENCAP_INT_UPDATE_IPV4 =
@ -322,8 +318,6 @@ public final class FabricConstants {
PiActionId.of("FabricEgress.process_int_transit.int_set_header_0003_i5"); PiActionId.of("FabricEgress.process_int_transit.int_set_header_0003_i5");
public static final PiActionId FABRIC_INGRESS_NEXT_L3_ROUTING_VLAN = public static final PiActionId FABRIC_INGRESS_NEXT_L3_ROUTING_VLAN =
PiActionId.of("FabricIngress.next.l3_routing_vlan"); PiActionId.of("FabricIngress.next.l3_routing_vlan");
public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0003_I15 =
PiActionId.of("FabricEgress.process_int_transit.int_set_header_0003_i15");
public static final PiActionId FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_ACL = public static final PiActionId FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_ACL =
PiActionId.of("FabricIngress.forwarding.set_next_id_acl"); PiActionId.of("FabricIngress.forwarding.set_next_id_acl");
public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0407_I6 = public static final PiActionId FABRIC_EGRESS_PROCESS_INT_TRANSIT_INT_SET_HEADER_0407_I6 =
@ -367,4 +361,4 @@ public final class FabricConstants {
PiControlMetadataId.of("ingress_port"); PiControlMetadataId.of("ingress_port");
public static final PiControlMetadataId EGRESS_PORT = public static final PiControlMetadataId EGRESS_PORT =
PiControlMetadataId.of("egress_port"); PiControlMetadataId.of("egress_port");
} }

View File

@ -48,6 +48,10 @@ inout standard_metadata_t standard_metadata) {
PortCountersControl() port_counters_control; PortCountersControl() port_counters_control;
apply { apply {
#ifdef WITH_SPGW
spgw_normalizer.apply(hdr.gtpu.isValid(), hdr.gtpu_ipv4, hdr.gtpu_udp,
hdr.ipv4, hdr.udp, hdr.inner_ipv4, hdr.inner_udp);
#endif // WITH_SPGW
packet_io_ingress.apply(hdr, fabric_metadata, standard_metadata); packet_io_ingress.apply(hdr, fabric_metadata, standard_metadata);
#ifdef WITH_SPGW #ifdef WITH_SPGW
#ifdef WITH_SPGW_PCC_GATING #ifdef WITH_SPGW_PCC_GATING

View File

@ -72,9 +72,6 @@ control FabricVerifyChecksum(inout parsed_headers_t hdr,
hdr.ipv4.hdr_checksum, hdr.ipv4.hdr_checksum,
HashAlgorithm.csum16 HashAlgorithm.csum16
); );
#ifdef WITH_SPGW
verify_gtpu_checksum.apply(hdr.gtpu_ipv4);
#endif // WITH_SPGW
} }
} }

View File

@ -68,6 +68,21 @@ typedef bit<9> port_num_t;
typedef bit<48> mac_addr_t; typedef bit<48> mac_addr_t;
typedef bit<16> group_id_t; typedef bit<16> group_id_t;
typedef bit<12> vlan_id_t; typedef bit<12> vlan_id_t;
typedef bit<48> timestamp_t;
typedef bit<32> switch_id_t;
typedef bit<32> ipv4_addr_t;
typedef bit<16> l4_port_t;
// SPGW types
typedef bit<2> direction_t;
typedef bit pcc_gate_status_t;
typedef bit<32> sdf_rule_id_t;
typedef bit<32> pcc_rule_id_t;
// spgw.p4 expects uplink packets with IP dst on this subnet
// 140.0.0.0/8
const ipv4_addr_t S1U_SGW_PREFIX = 2348810240;
#define S1U_SGW_PREFIX_LEN 8
const bit<16> ETHERTYPE_QINQ = 0x88A8; const bit<16> ETHERTYPE_QINQ = 0x88A8;
const bit<16> ETHERTYPE_QINQ_NON_STD = 0x9100; const bit<16> ETHERTYPE_QINQ_NON_STD = 0x9100;
@ -95,28 +110,17 @@ const fwd_type_t FWD_IPV6_MULTICAST = 5;
const bit<8> DEFAULT_MPLS_TTL = 64; const bit<8> DEFAULT_MPLS_TTL = 64;
const bit<8> DEFAULT_IPV4_TTL = 64; const bit<8> DEFAULT_IPV4_TTL = 64;
typedef bit direction_t;
typedef bit pcc_gate_status_t;
typedef bit<32> sdf_rule_id_t;
typedef bit<32> pcc_rule_id_t;
const sdf_rule_id_t DEFAULT_SDF_RULE_ID = 0; const sdf_rule_id_t DEFAULT_SDF_RULE_ID = 0;
const pcc_rule_id_t DEFAULT_PCC_RULE_ID = 0; const pcc_rule_id_t DEFAULT_PCC_RULE_ID = 0;
const direction_t SPGW_DIR_UNKNOWN = 2w0;
const direction_t DIR_UPLINK = 1w0; const direction_t SPGW_DIR_UPLINK = 2w1;
const direction_t DIR_DOWNLINK = 1w1; const direction_t SPGW_DIR_DOWNLINK = 2w2;
const pcc_gate_status_t PCC_GATE_OPEN = 1w0; const pcc_gate_status_t PCC_GATE_OPEN = 1w0;
const pcc_gate_status_t PCC_GATE_CLOSED = 1w1; const pcc_gate_status_t PCC_GATE_CLOSED = 1w1;
/* indicate INT at LSB of DSCP */ /* indicate INT at LSB of DSCP */
const bit<6> INT_DSCP = 0x1; const bit<6> INT_DSCP = 0x1;
typedef bit<48> timestamp_t;
typedef bit<32> switch_id_t;
typedef bit<32> ip_address_t;
typedef bit<16> l4_port_t;
const bit<8> INT_HEADER_LEN_WORD = 4; const bit<8> INT_HEADER_LEN_WORD = 4;
const bit<8> CPU_MIRROR_SESSION_ID = 250; const bit<8> CPU_MIRROR_SESSION_ID = 250;

View File

@ -132,7 +132,6 @@ header gtpu_t {
} }
struct spgw_meta_t { struct spgw_meta_t {
_BOOL do_spgw;
direction_t direction; direction_t direction;
bit<16> ipv4_len; bit<16> ipv4_len;
bit<32> teid; bit<32> teid;
@ -291,6 +290,8 @@ struct parsed_headers_t {
ipv4_t gtpu_ipv4; ipv4_t gtpu_ipv4;
udp_t gtpu_udp; udp_t gtpu_udp;
gtpu_t gtpu; gtpu_t gtpu;
ipv4_t inner_ipv4;
udp_t inner_udp;
#endif // WITH_SPGW #endif // WITH_SPGW
ipv4_t ipv4; ipv4_t ipv4;
#ifdef WITH_IPV6 #ifdef WITH_IPV6

View File

@ -44,8 +44,8 @@ control process_int_report (
(bit<32>) standard_metadata.enq_timestamp; (bit<32>) standard_metadata.enq_timestamp;
} }
action do_report_encapsulation(mac_addr_t src_mac, mac_addr_t mon_mac, ip_address_t src_ip, action do_report_encapsulation(mac_addr_t src_mac, mac_addr_t mon_mac, ipv4_addr_t src_ip,
ip_address_t mon_ip, l4_port_t mon_port) { ipv4_addr_t mon_ip, l4_port_t mon_port) {
//Report Ethernet Header //Report Ethernet Header
hdr.report_ethernet.setValid(); hdr.report_ethernet.setValid();
hdr.report_ethernet.dst_addr = mon_mac; hdr.report_ethernet.dst_addr = mon_mac;

View File

@ -179,24 +179,35 @@ inout standard_metadata_t standard_metadata) {
#ifdef WITH_SPGW #ifdef WITH_SPGW
state parse_gtpu { state parse_gtpu {
packet.extract(hdr.gtpu); transition select(hdr.ipv4.dst_addr[31:32-S1U_SGW_PREFIX_LEN]) {
transition parse_ipv4_inner; // Avoid parsing GTP and inner headers if we know this GTP packet
// is not to be processed by this switch.
// FIXME: use parser value sets when support is ready in ONOS.
// To set the S1U_SGW_PREFIX value at runtime.
S1U_SGW_PREFIX[31:32-S1U_SGW_PREFIX_LEN]: do_parse_gtpu;
default: accept;
}
} }
state parse_ipv4_inner { state do_parse_gtpu {
packet.extract(hdr.gtpu_ipv4); packet.extract(hdr.gtpu);
transition select(hdr.gtpu_ipv4.protocol) { transition parse_inner_ipv4;
}
state parse_inner_ipv4 {
packet.extract(hdr.inner_ipv4);
transition select(hdr.inner_ipv4.protocol) {
PROTO_TCP: parse_tcp; PROTO_TCP: parse_tcp;
PROTO_UDP: parse_udp_inner; PROTO_UDP: parse_inner_udp;
PROTO_ICMP: parse_icmp; PROTO_ICMP: parse_icmp;
default: accept; default: accept;
} }
} }
state parse_udp_inner { state parse_inner_udp {
packet.extract(hdr.gtpu_udp); packet.extract(hdr.inner_udp);
fabric_metadata.l4_src_port = hdr.gtpu_udp.src_port; fabric_metadata.l4_src_port = hdr.inner_udp.src_port;
fabric_metadata.l4_dst_port = hdr.gtpu_udp.dst_port; fabric_metadata.l4_dst_port = hdr.inner_udp.dst_port;
#ifdef WITH_INT #ifdef WITH_INT
transition select(hdr.ipv4.isValid() && (hdr.ipv4.dscp & INT_DSCP) == INT_DSCP) { transition select(hdr.ipv4.isValid() && (hdr.ipv4.dscp & INT_DSCP) == INT_DSCP) {
true: parse_intl4_shim; true: parse_intl4_shim;

View File

@ -17,6 +17,27 @@
#ifndef __SPGW__ #ifndef __SPGW__
#define __SPGW__ #define __SPGW__
control spgw_normalizer(
in bool is_gtpu_encapped,
out ipv4_t gtpu_ipv4,
out udp_t gtpu_udp,
inout ipv4_t ipv4,
inout udp_t udp,
in ipv4_t inner_ipv4,
in udp_t inner_udp
) {
apply {
if (! is_gtpu_encapped) return;
gtpu_ipv4 = ipv4;
ipv4 = inner_ipv4;
gtpu_udp = udp;
if (inner_udp.isValid()) {
udp = inner_udp;
} else {
udp.setInvalid();
}
}
}
control spgw_ingress( control spgw_ingress(
inout ipv4_t gtpu_ipv4, inout ipv4_t gtpu_ipv4,
@ -41,26 +62,24 @@ control spgw_ingress(
spgw_meta.teid = teid; spgw_meta.teid = teid;
spgw_meta.s1u_enb_addr = s1u_enb_addr; spgw_meta.s1u_enb_addr = s1u_enb_addr;
spgw_meta.s1u_sgw_addr = s1u_sgw_addr; spgw_meta.s1u_sgw_addr = s1u_sgw_addr;
}
action update_ue_cdr() {
ue_counter.count(); ue_counter.count();
} }
table ue_filter_table { table dl_sess_lookup {
key = { key = {
// IP prefixes of the UEs managed by this switch (when downlink) // UE addr for downlink
ipv4.dst_addr : lpm; ipv4.dst_addr : exact;
} }
actions = { actions = {
NoAction(); set_dl_sess_info();
} }
counters = ue_counter;
} }
table s1u_filter_table { table s1u_filter_table {
key = { key = {
// IP addresses of the S1U interfaces embodied by this switch. // IP addresses of the S1U interfaces of this SPGW-U instance (when uplink)
spgw_meta.s1u_sgw_addr : exact; gtpu_ipv4.dst_addr : exact;
} }
actions = { actions = {
NoAction(); NoAction();
@ -116,56 +135,22 @@ control spgw_ingress(
} }
#endif // WITH_SPGW_PCC_GATING #endif // WITH_SPGW_PCC_GATING
table dl_sess_lookup {
key = {
// UE addr for downlink
ipv4.dst_addr : exact;
}
actions = {
set_dl_sess_info();
}
}
table ue_cdr_table {
key = {
// UE addr for downlink
ipv4.dst_addr : exact;
}
actions = {
update_ue_cdr();
}
counters = ue_counter;
}
apply { apply {
spgw_meta.do_spgw = _FALSE;
if (gtpu.isValid()) { if (gtpu.isValid()) {
// If here, the parsed ipv4 header is the outer GTP one, but // If here, pkt has outer IP dst on
// fabric needs to forward on the inner one, i.e. this. // S1U_SGW_PREFIX/S1U_SGW_PREFIX_LEN subnet.
// We store the outer values we need in the metadata, then replace // TODO: check also that gtpu.msgtype == GTP_GPDU
// the ipv4 header extracted before with this one. if (!s1u_filter_table.apply().hit) {
spgw_meta.s1u_enb_addr = ipv4.src_addr; drop_now();
spgw_meta.s1u_sgw_addr = ipv4.dst_addr;
ipv4 = gtpu_ipv4;
udp = gtpu_udp;
if (s1u_filter_table.apply().hit) {
// TODO: check also that gtpu.msgtype == GTP_GPDU
spgw_meta.do_spgw = _TRUE;
spgw_meta.direction = DIR_UPLINK;
} }
} else if (ue_filter_table.apply().hit) { spgw_meta.direction = SPGW_DIR_UPLINK;
spgw_meta.do_spgw = _TRUE;
spgw_meta.direction = DIR_DOWNLINK;
}
if (spgw_meta.do_spgw == _FALSE) {
// Exit this control block.
return;
}
if (spgw_meta.direction == DIR_UPLINK) {
gtpu_decap(); gtpu_decap();
} else if (dl_sess_lookup.apply().hit) {
spgw_meta.direction = SPGW_DIR_DOWNLINK;
} else {
spgw_meta.direction = SPGW_DIR_UNKNOWN;
// No SPGW processing needed.
return;
} }
#ifdef WITH_SPGW_PCC_GATING #ifdef WITH_SPGW_PCC_GATING
@ -181,15 +166,6 @@ control spgw_ingress(
} }
#endif // WITH_SPGW_PCC_GATING #endif // WITH_SPGW_PCC_GATING
if (spgw_meta.direction == DIR_DOWNLINK) {
if (!dl_sess_lookup.apply().hit) {
// We have no other choice than drop, as we miss the session
// info necessary to properly GTPU encap the packet.
drop_now();
}
ue_cdr_table.apply();
}
// Don't ask why... we'll need this later. // Don't ask why... we'll need this later.
spgw_meta.ipv4_len = ipv4.total_len; spgw_meta.ipv4_len = ipv4.total_len;
} }
@ -197,12 +173,12 @@ control spgw_ingress(
control spgw_egress( control spgw_egress(
in ipv4_t ipv4, in ipv4_t ipv4,
out ipv4_t gtpu_ipv4, inout ipv4_t gtpu_ipv4,
out udp_t gtpu_udp, inout udp_t gtpu_udp,
out gtpu_t gtpu, inout gtpu_t gtpu,
in spgw_meta_t spgw_meta, in spgw_meta_t spgw_meta,
in standard_metadata_t std_meta in standard_metadata_t std_meta
) { ) {
action gtpu_encap() { action gtpu_encap() {
@ -211,7 +187,7 @@ control spgw_egress(
gtpu_ipv4.ihl = IPV4_MIN_IHL; gtpu_ipv4.ihl = IPV4_MIN_IHL;
gtpu_ipv4.dscp = 0; gtpu_ipv4.dscp = 0;
gtpu_ipv4.ecn = 0; gtpu_ipv4.ecn = 0;
gtpu_ipv4.total_len = spgw_meta.ipv4_len gtpu_ipv4.total_len = ipv4.total_len
+ (IPV4_HDR_SIZE + UDP_HDR_SIZE + GTP_HDR_SIZE); + (IPV4_HDR_SIZE + UDP_HDR_SIZE + GTP_HDR_SIZE);
gtpu_ipv4.identification = 0x1513; /* From NGIC */ gtpu_ipv4.identification = 0x1513; /* From NGIC */
gtpu_ipv4.flags = 0; gtpu_ipv4.flags = 0;
@ -242,44 +218,13 @@ control spgw_egress(
} }
apply { apply {
if (spgw_meta.do_spgw == _TRUE && spgw_meta.direction == DIR_DOWNLINK) { if (spgw_meta.direction == SPGW_DIR_DOWNLINK) {
gtpu_encap(); gtpu_encap();
} }
} }
} }
control verify_gtpu_checksum(
inout ipv4_t gtpu_ipv4
) {
apply {
// TODO: re-enable gtpu_ipv4 verification
// with the current parser logic, gtpu_ip4 contains values of
// the inner header, which is already verified by include/checksum.p4.
// We need to modify the parser to copy the outer header somewhere
// else, and verify that here.
// verify_checksum(gtpu_ipv4.isValid(),
// {
// gtpu_ipv4.version,
// gtpu_ipv4.ihl,
// gtpu_ipv4.diffserv,
// gtpu_ipv4.total_len,
// gtpu_ipv4.identification,
// gtpu_ipv4.flags,
// gtpu_ipv4.frag_offset,
// gtpu_ipv4.ttl,
// gtpu_ipv4.protocol,
// gtpu_ipv4.src_addr,
// gtpu_ipv4.dst_addr
// },
// gtpu_ipv4.hdr_checksum,
// HashAlgorithm.csum16
// );
}
}
control update_gtpu_checksum( control update_gtpu_checksum(
inout ipv4_t gtpu_ipv4, inout ipv4_t gtpu_ipv4,
inout udp_t gtpu_udp, inout udp_t gtpu_udp,

View File

@ -1,39 +1,3 @@
tables {
preamble {
id: 33618733
name: "FabricIngress.spgw_ingress.ue_filter_table"
alias: "ue_filter_table"
}
match_fields {
id: 1
name: "ipv4.dst_addr"
bitwidth: 32
match_type: LPM
}
action_refs {
id: 16800567
}
size: 1024
idle_timeout_behavior: NO_TIMEOUT
}
tables {
preamble {
id: 33615906
name: "FabricIngress.spgw_ingress.s1u_filter_table"
alias: "s1u_filter_table"
}
match_fields {
id: 1
name: "spgw_meta.s1u_sgw_addr"
bitwidth: 32
match_type: EXACT
}
action_refs {
id: 16800567
}
size: 1024
idle_timeout_behavior: NO_TIMEOUT
}
tables { tables {
preamble { preamble {
id: 33582731 id: 33582731
@ -53,29 +17,25 @@ tables {
id: 16800567 id: 16800567
annotations: "@defaultonly()" annotations: "@defaultonly()"
} }
direct_resource_ids: 318781522
size: 1024 size: 1024
idle_timeout_behavior: NO_TIMEOUT idle_timeout_behavior: NO_TIMEOUT
} }
tables { tables {
preamble { preamble {
id: 33611263 id: 33615906
name: "FabricIngress.spgw_ingress.ue_cdr_table" name: "FabricIngress.spgw_ingress.s1u_filter_table"
alias: "ue_cdr_table" alias: "s1u_filter_table"
} }
match_fields { match_fields {
id: 1 id: 1
name: "ipv4.dst_addr" name: "gtpu_ipv4.dst_addr"
bitwidth: 32 bitwidth: 32
match_type: EXACT match_type: EXACT
} }
action_refs {
id: 16818129
}
action_refs { action_refs {
id: 16800567 id: 16800567
annotations: "@defaultonly()"
} }
direct_resource_ids: 318781522
size: 1024 size: 1024
idle_timeout_behavior: NO_TIMEOUT idle_timeout_behavior: NO_TIMEOUT
} }
@ -857,13 +817,6 @@ actions {
bitwidth: 32 bitwidth: 32
} }
} }
actions {
preamble {
id: 16818129
name: "FabricIngress.spgw_ingress.update_ue_cdr"
alias: "update_ue_cdr"
}
}
actions { actions {
preamble { preamble {
id: 16778827 id: 16778827
@ -1657,7 +1610,7 @@ direct_counters {
spec { spec {
unit: BOTH unit: BOTH
} }
direct_table_id: 33611263 direct_table_id: 33582731
} }
direct_counters { direct_counters {
preamble { preamble {

View File

@ -1340,7 +1340,7 @@
"id" : 0, "id" : 0,
"source_info" : { "source_info" : {
"filename" : "include/parser.p4", "filename" : "include/parser.p4",
"line" : 212, "line" : 222,
"column" : 8, "column" : 8,
"source_fragment" : "FabricDeparser" "source_fragment" : "FabricDeparser"
}, },
@ -1865,7 +1865,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 74, "line" : 89,
"column" : 31, "column" : 31,
"source_fragment" : "0x8100; ..." "source_fragment" : "0x8100; ..."
} }
@ -2480,7 +2480,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 75, "line" : 90,
"column" : 31, "column" : 31,
"source_fragment" : "0x8847; ..." "source_fragment" : "0x8847; ..."
} }
@ -2556,7 +2556,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 95, "line" : 110,
"column" : 32, "column" : 32,
"source_fragment" : "64; ..." "source_fragment" : "64; ..."
} }
@ -2671,7 +2671,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 75, "line" : 90,
"column" : 31, "column" : 31,
"source_fragment" : "0x8847; ..." "source_fragment" : "0x8847; ..."
} }
@ -2747,7 +2747,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 95, "line" : 110,
"column" : 32, "column" : 32,
"source_fragment" : "64; ..." "source_fragment" : "64; ..."
} }
@ -3039,7 +3039,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 75, "line" : 90,
"column" : 31, "column" : 31,
"source_fragment" : "0x8847; ..." "source_fragment" : "0x8847; ..."
} }
@ -3115,7 +3115,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 95, "line" : 110,
"column" : 32, "column" : 32,
"source_fragment" : "64; ..." "source_fragment" : "64; ..."
} }
@ -3230,7 +3230,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 75, "line" : 90,
"column" : 31, "column" : 31,
"source_fragment" : "0x8847; ..." "source_fragment" : "0x8847; ..."
} }
@ -3306,7 +3306,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 95, "line" : 110,
"column" : 32, "column" : 32,
"source_fragment" : "64; ..." "source_fragment" : "64; ..."
} }
@ -3433,7 +3433,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 77, "line" : 92,
"column" : 31, "column" : 31,
"source_fragment" : "0x0800; ..." "source_fragment" : "0x0800; ..."
} }
@ -4031,7 +4031,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 120, "line" : 124,
"column" : 35, "column" : 35,
"source_fragment" : "4; ..." "source_fragment" : "4; ..."
} }
@ -4462,7 +4462,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 113, "line" : 122,
"column" : 24, "column" : 24,
"source_fragment" : "0x1; ..." "source_fragment" : "0x1; ..."
} }
@ -8201,7 +8201,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 77, "line" : 92,
"column" : 31, "column" : 31,
"source_fragment" : "0x0800; ..." "source_fragment" : "0x0800; ..."
} }
@ -8429,7 +8429,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 83, "line" : 98,
"column" : 25, "column" : 25,
"source_fragment" : "17; ..." "source_fragment" : "17; ..."
} }
@ -8644,7 +8644,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 125, "line" : 129,
"column" : 31, "column" : 31,
"source_fragment" : "0; ..." "source_fragment" : "0; ..."
} }
@ -8739,7 +8739,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 129, "line" : 133,
"column" : 21, "column" : 21,
"source_fragment" : "1; ..." "source_fragment" : "1; ..."
} }
@ -10529,7 +10529,7 @@
"id" : 12, "id" : 12,
"source_info" : { "source_info" : {
"filename" : "fabric.p4", "filename" : "fabric.p4",
"line" : 66, "line" : 70,
"column" : 11, "column" : 11,
"source_fragment" : "fabric_metadata.int_meta.sink == 1" "source_fragment" : "fabric_metadata.int_meta.sink == 1"
}, },
@ -10557,7 +10557,7 @@
"id" : 1, "id" : 1,
"source_info" : { "source_info" : {
"filename" : "fabric.p4", "filename" : "fabric.p4",
"line" : 76, "line" : 80,
"column" : 8, "column" : 8,
"source_fragment" : "FabricEgress" "source_fragment" : "FabricEgress"
}, },
@ -11252,7 +11252,7 @@
"id" : 17, "id" : 17,
"source_info" : { "source_info" : {
"filename" : "fabric.p4", "filename" : "fabric.p4",
"line" : 90, "line" : 100,
"column" : 12, "column" : 12,
"source_fragment" : "standard_metadata.ingress_port != 255 && ..." "source_fragment" : "standard_metadata.ingress_port != 255 && ..."
}, },
@ -11332,7 +11332,7 @@
"id" : 18, "id" : 18,
"source_info" : { "source_info" : {
"filename" : "fabric.p4", "filename" : "fabric.p4",
"line" : 93, "line" : 103,
"column" : 16, "column" : 16,
"source_fragment" : "fabric_metadata.int_meta.source == 1" "source_fragment" : "fabric_metadata.int_meta.source == 1"
}, },
@ -11358,7 +11358,7 @@
"id" : 19, "id" : 19,
"source_info" : { "source_info" : {
"filename" : "fabric.p4", "filename" : "fabric.p4",
"line" : 96, "line" : 106,
"column" : 15, "column" : 15,
"source_fragment" : "hdr.int_header.isValid()" "source_fragment" : "hdr.int_header.isValid()"
}, },
@ -11450,7 +11450,7 @@
"id" : 23, "id" : 23,
"source_info" : { "source_info" : {
"filename" : "fabric.p4", "filename" : "fabric.p4",
"line" : 100, "line" : 110,
"column" : 20, "column" : 20,
"source_fragment" : "standard_metadata.instance_type == 1" "source_fragment" : "standard_metadata.instance_type == 1"
}, },
@ -11476,7 +11476,7 @@
"id" : 24, "id" : 24,
"source_info" : { "source_info" : {
"filename" : "fabric.p4", "filename" : "fabric.p4",
"line" : 104, "line" : 114,
"column" : 20, "column" : 20,
"source_fragment" : "fabric_metadata.int_meta.sink == 1" "source_fragment" : "fabric_metadata.int_meta.sink == 1"
}, },

View File

@ -1,39 +1,3 @@
tables {
preamble {
id: 33618733
name: "FabricIngress.spgw_ingress.ue_filter_table"
alias: "ue_filter_table"
}
match_fields {
id: 1
name: "ipv4.dst_addr"
bitwidth: 32
match_type: LPM
}
action_refs {
id: 16800567
}
size: 1024
idle_timeout_behavior: NO_TIMEOUT
}
tables {
preamble {
id: 33615906
name: "FabricIngress.spgw_ingress.s1u_filter_table"
alias: "s1u_filter_table"
}
match_fields {
id: 1
name: "spgw_meta.s1u_sgw_addr"
bitwidth: 32
match_type: EXACT
}
action_refs {
id: 16800567
}
size: 1024
idle_timeout_behavior: NO_TIMEOUT
}
tables { tables {
preamble { preamble {
id: 33582731 id: 33582731
@ -53,29 +17,25 @@ tables {
id: 16800567 id: 16800567
annotations: "@defaultonly()" annotations: "@defaultonly()"
} }
direct_resource_ids: 318781522
size: 1024 size: 1024
idle_timeout_behavior: NO_TIMEOUT idle_timeout_behavior: NO_TIMEOUT
} }
tables { tables {
preamble { preamble {
id: 33611263 id: 33615906
name: "FabricIngress.spgw_ingress.ue_cdr_table" name: "FabricIngress.spgw_ingress.s1u_filter_table"
alias: "ue_cdr_table" alias: "s1u_filter_table"
} }
match_fields { match_fields {
id: 1 id: 1
name: "ipv4.dst_addr" name: "gtpu_ipv4.dst_addr"
bitwidth: 32 bitwidth: 32
match_type: EXACT match_type: EXACT
} }
action_refs {
id: 16818129
}
action_refs { action_refs {
id: 16800567 id: 16800567
annotations: "@defaultonly()"
} }
direct_resource_ids: 318781522
size: 1024 size: 1024
idle_timeout_behavior: NO_TIMEOUT idle_timeout_behavior: NO_TIMEOUT
} }
@ -520,13 +480,6 @@ actions {
bitwidth: 32 bitwidth: 32
} }
} }
actions {
preamble {
id: 16818129
name: "FabricIngress.spgw_ingress.update_ue_cdr"
alias: "update_ue_cdr"
}
}
actions { actions {
preamble { preamble {
id: 16798734 id: 16798734
@ -933,7 +886,7 @@ direct_counters {
spec { spec {
unit: BOTH unit: BOTH
} }
direct_table_id: 33611263 direct_table_id: 33582731
} }
direct_counters { direct_counters {
preamble { preamble {

View File

@ -668,7 +668,7 @@
"id" : 0, "id" : 0,
"source_info" : { "source_info" : {
"filename" : "include/parser.p4", "filename" : "include/parser.p4",
"line" : 212, "line" : 222,
"column" : 8, "column" : 8,
"source_fragment" : "FabricDeparser" "source_fragment" : "FabricDeparser"
}, },
@ -1093,7 +1093,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 74, "line" : 89,
"column" : 31, "column" : 31,
"source_fragment" : "0x8100; ..." "source_fragment" : "0x8100; ..."
} }
@ -1708,7 +1708,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 75, "line" : 90,
"column" : 31, "column" : 31,
"source_fragment" : "0x8847; ..." "source_fragment" : "0x8847; ..."
} }
@ -1784,7 +1784,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 95, "line" : 110,
"column" : 32, "column" : 32,
"source_fragment" : "64; ..." "source_fragment" : "64; ..."
} }
@ -1899,7 +1899,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 75, "line" : 90,
"column" : 31, "column" : 31,
"source_fragment" : "0x8847; ..." "source_fragment" : "0x8847; ..."
} }
@ -1975,7 +1975,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 95, "line" : 110,
"column" : 32, "column" : 32,
"source_fragment" : "64; ..." "source_fragment" : "64; ..."
} }
@ -2267,7 +2267,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 75, "line" : 90,
"column" : 31, "column" : 31,
"source_fragment" : "0x8847; ..." "source_fragment" : "0x8847; ..."
} }
@ -2343,7 +2343,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 95, "line" : 110,
"column" : 32, "column" : 32,
"source_fragment" : "64; ..." "source_fragment" : "64; ..."
} }
@ -2458,7 +2458,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 75, "line" : 90,
"column" : 31, "column" : 31,
"source_fragment" : "0x8847; ..." "source_fragment" : "0x8847; ..."
} }
@ -2534,7 +2534,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 95, "line" : 110,
"column" : 32, "column" : 32,
"source_fragment" : "64; ..." "source_fragment" : "64; ..."
} }
@ -2661,7 +2661,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "include/control/../define.p4", "filename" : "include/control/../define.p4",
"line" : 77, "line" : 92,
"column" : 31, "column" : 31,
"source_fragment" : "0x0800; ..." "source_fragment" : "0x0800; ..."
} }
@ -4400,7 +4400,7 @@
"id" : 1, "id" : 1,
"source_info" : { "source_info" : {
"filename" : "fabric.p4", "filename" : "fabric.p4",
"line" : 76, "line" : 80,
"column" : 8, "column" : 8,
"source_fragment" : "FabricEgress" "source_fragment" : "FabricEgress"
}, },