Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DO NOT MERGE] Add TNA multipipe #148

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ all: fabric
fabric:
@${p4-build} fabric "-DWITH_DOUBLE_VLAN_TERMINATION"

p4i:
docker run -d --rm --name p4i -v${curr_dir}:${curr_dir} -w ${curr_dir} -p 3000:3000/tcp opennetworking/bf-sde:9.2.0 p4i

p4i-stop:
docker kill p4i

# Profiles which are not completed yet.
# fabric-simple:
# @${p4-build} fabric-simple "-DWITH_SIMPLE_NEXT"
Expand Down
27 changes: 20 additions & 7 deletions p4src/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ function do_p4c() {
echo "*** Output in ${P4C_OUT}/${pltf}"
pp_flags="-DCPU_PORT=${cpu_port}"
p4c_flags="--auto-init-metadata"
mkdir -p ${P4C_OUT}/${pltf}
rm -rf ${P4C_OUT}/${pltf}
mkdir ${P4C_OUT}/${pltf}
(
$P4C_CMD --arch tna -g --create-graphs --verbose 2 \
-o ${P4C_OUT}/${pltf} -I ${P4_SRC_DIR} \
Expand All @@ -54,22 +55,34 @@ function do_p4c() {
)

# Copy only the relevant files to the pipeconf resources.
mkdir -p "${DEST_DIR}/stratum_bf/${pltf}/pipe"
mkdir -p "${DEST_DIR}/stratum_bf/${pltf}/pipeline_profile_a"
mkdir -p "${DEST_DIR}/stratum_bf/${pltf}/pipeline_profile_b"
cp "${P4C_OUT}/${pltf}/fabric_tna.conf" "${DEST_DIR}/stratum_bf/${pltf}"
cp "${P4C_OUT}/${pltf}/p4info.txt" "${DEST_DIR}/stratum_bf/${pltf}"
cp "${P4C_OUT}/${pltf}/bfrt.json" "${DEST_DIR}/stratum_bf/${pltf}"
cp "${P4C_OUT}/${pltf}/fabric_tna.conf" "${DEST_DIR}/stratum_bf/${pltf}"
cp "${P4C_OUT}/${pltf}/pipe/context.json" "${DEST_DIR}/stratum_bf/${pltf}/pipe"
cp "${P4C_OUT}/${pltf}/pipe/tofino.bin" "${DEST_DIR}/stratum_bf/${pltf}/pipe"
cp "${P4C_OUT}/${pltf}/pipeline_profile_a/context.json" "${DEST_DIR}/stratum_bf/${pltf}/pipeline_profile_a/"
cp "${P4C_OUT}/${pltf}/pipeline_profile_b/context.json" "${DEST_DIR}/stratum_bf/${pltf}/pipeline_profile_b/"
cp "${P4C_OUT}/${pltf}/pipeline_profile_a/tofino.bin" "${DEST_DIR}/stratum_bf/${pltf}/pipeline_profile_a/"
cp "${P4C_OUT}/${pltf}/pipeline_profile_b/tofino.bin" "${DEST_DIR}/stratum_bf/${pltf}/pipeline_profile_b/"
echo "${cpu_port}" > "${DEST_DIR}/stratum_bf/${pltf}/cpu_port.txt"

# New pipeline format which uses tar bal
# New pipeline format which uses tar ball
rm -rf "${DEST_DIR}/stratum_bfrt/${pltf}"
mkdir -p "${DEST_DIR}/stratum_bfrt/${pltf}"
tar cf "pipeline.tar.bz2" -C "${DEST_DIR}/stratum_bf/${pltf}" .
mv "pipeline.tar.bz2" "${DEST_DIR}/stratum_bfrt/${pltf}/"
# FIXME: instrument tm entrypoint to untar pipeline.tar.bz2
# Instead of copying the same content next to it
cp "${P4C_OUT}/${pltf}/p4info.txt" "${DEST_DIR}/stratum_bfrt/${pltf}/"
cp "${P4C_OUT}/${pltf}/bfrt.json" "${DEST_DIR}/stratum_bfrt/${pltf}/"
mkdir "${DEST_DIR}/stratum_bfrt/${pltf}/pipeline_profile_a"
mkdir "${DEST_DIR}/stratum_bfrt/${pltf}/pipeline_profile_b"
cp "${P4C_OUT}/${pltf}/pipeline_profile_a/context.json" "${DEST_DIR}/stratum_bfrt/${pltf}/pipeline_profile_a/"
cp "${P4C_OUT}/${pltf}/pipeline_profile_a/tofino.bin" "${DEST_DIR}/stratum_bfrt/${pltf}/pipeline_profile_a/"
cp "${P4C_OUT}/${pltf}/pipeline_profile_b/context.json" "${DEST_DIR}/stratum_bfrt/${pltf}/pipeline_profile_b/"
cp "${P4C_OUT}/${pltf}/pipeline_profile_b/tofino.bin" "${DEST_DIR}/stratum_bfrt/${pltf}/pipeline_profile_b/"
echo "${cpu_port}" > "${DEST_DIR}/stratum_bfrt/${pltf}/cpu_port.txt"

echo
}

do_p4c "montara" "${MONTARA_CPU_PORT}"
Expand Down
86 changes: 77 additions & 9 deletions p4src/fabric_tna.p4
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,16 @@ control FabricIngress (

PacketIoIngress() pkt_io_ingress;
Filtering() filtering;
Forwarding() forwarding;
Acl() acl;
Next() next;

apply {
pkt_io_ingress.apply(hdr, fabric_md, ig_tm_md);
filtering.apply(hdr, fabric_md, ig_intr_md);
if (!fabric_md.skip_forwarding) {
forwarding.apply(hdr, fabric_md);
}
acl.apply(hdr, fabric_md, ig_intr_md, ig_dprsr_md, ig_tm_md);
if (!fabric_md.skip_next) {
next.apply(hdr, fabric_md, ig_intr_md, ig_tm_md);

// Send to loopback port of odd pipe (0->1, 2->3).
if (ig_dprsr_md.drop_ctl != 1 && ig_tm_md.ucast_egress_port != CPU_PORT) {
ig_tm_md.ucast_egress_port = 0x80 | ig_intr_md.ingress_port;
}

if (ig_tm_md.bypass_egress == 1w0) {
Expand All @@ -50,6 +47,9 @@ control FabricIngress (
hdr.bridge_md.mpls_label = fabric_md.mpls_label;
hdr.bridge_md.mpls_ttl = fabric_md.mpls_ttl;
hdr.bridge_md.vlan_id = fabric_md.vlan_id;
hdr.bridge_md.skip_forwarding = fabric_md.skip_forwarding;
hdr.bridge_md.skip_next = fabric_md.skip_next;
hdr.bridge_md.fwd_type = fabric_md.fwd_type;
#ifdef WITH_DOUBLE_VLAN_TERMINATION
hdr.bridge_md.push_double_vlan = fabric_md.push_double_vlan;
hdr.bridge_md.inner_vlan_id = fabric_md.inner_vlan_id;
Expand All @@ -58,6 +58,52 @@ control FabricIngress (
}
}

control FabricEgressB(
/* Fabric.p4 */
inout parsed_headers_t hdr,
inout fabric_egress_metadata_t fabric_md,
/* TNA */
in egress_intrinsic_metadata_t eg_intr_md,
in egress_intrinsic_metadata_from_parser_t eg_prsr_md,
inout egress_intrinsic_metadata_for_deparser_t eg_dprsr_md,
inout egress_intrinsic_metadata_for_output_port_t eg_oport_md) {
apply {}
}

control FabricIngressB(
/* Fabric.p4 */
inout parsed_headers_t hdr,
inout fabric_ingress_metadata_t fabric_md,
/* TNA */
in ingress_intrinsic_metadata_t ig_intr_md,
in ingress_intrinsic_metadata_from_parser_t ig_prsr_md,
inout ingress_intrinsic_metadata_for_deparser_t ig_dprsr_md,
inout ingress_intrinsic_metadata_for_tm_t ig_tm_md) {

Forwarding() forwarding;
Next() next;

apply {
if (!fabric_md.skip_forwarding) {
forwarding.apply(hdr, ig_dprsr_md, fabric_md);
}
if (!fabric_md.skip_next) {
next.apply(hdr, fabric_md, ig_intr_md, ig_tm_md);
}

if (ig_tm_md.bypass_egress == 1w0) {
hdr.bridge_md.setValid();
hdr.bridge_md.is_multicast = fabric_md.is_multicast;
hdr.bridge_md.ingress_port = fabric_md.ingress_port;
hdr.bridge_md.ip_eth_type = fabric_md.ip_eth_type;
hdr.bridge_md.ip_proto = fabric_md.ip_proto;
hdr.bridge_md.mpls_label = fabric_md.mpls_label;
hdr.bridge_md.mpls_ttl = fabric_md.mpls_ttl;
hdr.bridge_md.vlan_id = fabric_md.vlan_id;
}
}
}

control FabricEgress (
/* Fabric.p4 */
inout parsed_headers_t hdr,
Expand All @@ -77,13 +123,35 @@ control FabricEgress (
}
}

// Packet comes into ingress profile_a. The packet travels to egress profile_b, then to
// ingress profile_b and finally to egress profile_a.

// Packet flow: -> ingress_a --TM--> egress_b --+ (loopback)
// <- egress_a <--TM-- ingress_b <-+

// For tofino model:
// --int-port-loop=<pipe_bitmap> (0xA)

Pipeline(
// ingress_a
FabricIngressParser(),
FabricIngress(),
FabricIngressDeparser(),
// egress_a
FabricEgressParser(),
FabricEgress(),
FabricEgressDeparser()
) pipe;
) pipeline_profile_a;

Pipeline(
// ingress_b
FabricIngressParserB(),
FabricIngressB(),
FabricIngressDeparser(),
// egress_b (empty)
FabricEgressParserB(),
FabricEgressB(),
FabricEgressDeparserB()
) pipeline_profile_b;

Switch(pipe) main;
Switch(pipeline_profile_a, pipeline_profile_b) main;
12 changes: 10 additions & 2 deletions p4src/include/control/forwarding.p4
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,19 @@


control Forwarding (inout parsed_headers_t hdr,
inout ingress_intrinsic_metadata_for_deparser_t ig_intr_md_for_dprsr,
inout fabric_ingress_metadata_t fabric_md) {

@hidden
action set_next_id(next_id_t next_id) {
fabric_md.next_id = next_id;
}

action drop() {
ig_intr_md_for_dprsr.drop_ctl = 1;
fabric_md.skip_next = true;
}

/*
* Bridging Table.
*/
Expand All @@ -36,9 +42,9 @@ control Forwarding (inout parsed_headers_t hdr,
}
actions = {
set_next_id_bridging;
@defaultonly nop;
@defaultonly drop;
}
const default_action = nop();
const default_action = drop();
counters = bridging_counter;
size = BRIDGING_TABLE_SIZE;
}
Expand Down Expand Up @@ -91,6 +97,8 @@ control Forwarding (inout parsed_headers_t hdr,
#ifdef _ROUTING_V4_TABLE_ANNOT
_ROUTING_V4_TABLE_ANNOT
#endif
@alpm(1)
@alpm_partitions(4096)
table routing_v4 {
key = {
hdr.ipv4.dst_addr: lpm @name("ipv4_dst");
Expand Down
2 changes: 1 addition & 1 deletion p4src/include/control/next.p4
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ control Next (inout parsed_headers_t hdr,

/*
* Multicast
* Maps next IDs to PRE multicat group IDs.
* Maps next IDs to PRE multicast group IDs.
*/
DirectCounter<bit<64>>(CounterType_t.PACKETS_AND_BYTES) multicast_counter;

Expand Down
5 changes: 5 additions & 0 deletions p4src/include/header.p4
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ header icmp_t {
@flexible
@pa_auto_init_metadata
struct fabric_ingress_metadata_t {
PortId_t ingress_port; // Original ingress port from ingress_a
vlan_id_t vlan_id;
bit<3> vlan_pri;
bit<1> vlan_cfi;
Expand Down Expand Up @@ -165,6 +166,10 @@ header bridge_metadata_t {
#endif // WITH_DOUBLE_VLAN_TERMINATION
bit<16> ip_eth_type;
bit<8> ip_proto;
bool skip_forwarding;
bool skip_next;
next_id_t next_id;
fwd_type_t fwd_type;
}

struct parsed_headers_t {
Expand Down
Loading