From a11287933c595a9ee2955c30aea2fe65bad6f62c Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Fri, 11 Sep 2020 00:52:11 -0400 Subject: [PATCH 01/24] Work on getting p4benchmark generating what we need... --- synthesis/bin/Main.ml | 93 +++++++ synthesis/lib/Benchmark.ml | 30 ++ synthesis/lib/OneBigTable.ml | 2 +- synthesis/lib/Runtime.ml | 10 +- synthesis/whippersnapper/bench.py | 53 ++++ synthesis/whippersnapper/empty_assume.txt | 0 synthesis/whippersnapper/empty_edits.txt | 0 synthesis/whippersnapper/p4includes/core.p4 | 81 ++++++ .../whippersnapper/p4includes/v1model.p4 | 261 ++++++++++++++++++ 9 files changed, 527 insertions(+), 3 deletions(-) create mode 100644 synthesis/whippersnapper/bench.py create mode 100644 synthesis/whippersnapper/empty_assume.txt create mode 100644 synthesis/whippersnapper/empty_edits.txt create mode 100644 synthesis/whippersnapper/p4includes/core.p4 create mode 100644 synthesis/whippersnapper/p4includes/v1model.p4 diff --git a/synthesis/bin/Main.ml b/synthesis/bin/Main.ml index bf9c023e..d5006118 100644 --- a/synthesis/bin/Main.ml +++ b/synthesis/bin/Main.ml @@ -509,6 +509,98 @@ let onf_real : Command.t = ONFReal.spec ONFReal.run +module ToOBT = struct + let spec = Command.Spec.( + empty + +> flag "-DEBUG" no_arg ~doc:"print debugging statements" + +> flag "--thrift" no_arg ~doc:"parse & write bmv2/thrift commands" + +> flag "-i" no_arg ~doc:"interactive mode" + +> flag "-data" (required string) ~doc:"the input log" + +> flag "-p" no_arg ~doc:"show_result_at_end" + +> anon ("p4file" %: string) + +> anon ("edits" %: string) + +> anon ("fvs" %: string) + +> anon ("assume" %: string) + +> flag "-I" (listed string) ~doc:" add directory to include search path for file" + ++ opt_flags) + +let run debug thrift_mode interactive data print + p4file edits fvs assume inc + widening + do_slice + edits_depth + search_width + monotonic + injection + fastcx + vcache + ecache + shortening + above + minimize + hints + only_holes + allow_annotations + nlp + unique_edits + domain + restrict_mask + no_defaults + no_deletes + use_all_cexs + reach_restrict + reach_filter + () = + let res = Benchmark.to_obt + Parameters.({ + widening; + do_slice; + edits_depth; + search_width; + debug; + thrift_mode; + monotonic; + interactive; + injection; + fastcx; + vcache; + ecache; + shortening; + above; + minimize; + hints = Option.is_some hints; + hint_type = Option.value hints ~default:"exact"; + only_holes; + allow_annotations; + nlp; + unique_edits; + domain; + restrict_mask; + no_defaults; + no_deletes; + use_all_cexs; + reach_restrict; + reach_filter; + timeout = None}) + data p4file edits fvs assume inc + in + match res with + | None -> Core.Printf.printf "no example could be found\n" + | Some r when print -> + List.iter r ~f:(fun edit -> + Tables.Edit.to_string edit + |> Core.Printf.printf "%s\n%!" + ) + | Some _ -> () + +end + +let to_obt : Command.t = + Command.basic_spec + ~summary: "Run the onf benchmark on the real p4 programs" + ToOBT.spec + ToOBT.run + module Equality = struct let spec = Command.Spec.( empty @@ -1375,6 +1467,7 @@ let main : Command.t = ; ("onf-real", onf_real) ; ("obt", obt) ; ("obt-real", obt_real) + ; ("to-obt", to_obt) ; ("eq", equality) ; ("eq-real", equality_real) ; ("wp", wp_cmd)] diff --git a/synthesis/lib/Benchmark.ml b/synthesis/lib/Benchmark.ml index f023bded..a2845cab 100644 --- a/synthesis/lib/Benchmark.ml +++ b/synthesis/lib/Benchmark.ml @@ -217,6 +217,36 @@ let rec basic_onf_ipv4_real params data_file log_p4 phys_p4 log_edits_file phys_ assert (implements params (ProfData.zero ()) (problem) = `Yes); measure params None problem (onos_to_edits var_mapping data_file "routing_v6" "hdr.ipv6.dst_addr") +and to_obt params data_file p4_file edits_file fvs_file _ inc = + let var_mapping = parse_fvs fvs_file in + let fvs = List.map var_mapping ~f:snd in + let assume = Skip (* parse_file assume_file *) in + + (* let print_fvs = printf "fvs = %s" (Sexp.to_string ([%sexp_of: (string * int) list] fvs)) in *) + + let log = (assume %:% Encode.encode_from_p4 inc p4_file false) + |> Encode.unify_names var_mapping |> zero_init fvs |> drop_handle fvs in + + let phys = OneBigTable.mk_one_big_table log + (* |> CompilerOpts.optimize fvs *) + in + + (* let maxN n = Bigint.(of_int_exn n ** of_int_exn 2 - one) in *) + (* let fvs = parse_fvs fvs in *) + let log_edits = Runtime.parse_whippersnapper log edits_file in + let phys_edits = [] in + + let problem = + Problem.make + ~log ~phys ~fvs + ~log_inst:Instance.(update_list params empty log_edits) + ~phys_inst:Instance.(update_list params empty phys_edits) + ~log_edits:[] () + in + assert (implements params (ProfData.zero ()) (problem) = `Yes); + measure params None problem (List.map (Runtime.parse_whippersnapper log data_file) ~f:(fun r -> [r])) + + and zero_init fvs cmd = let fvs = StringSet.of_list @@ fsts @@ fvs in let vs = free_of_cmd `Var cmd diff --git a/synthesis/lib/OneBigTable.ml b/synthesis/lib/OneBigTable.ml index 1c088bbc..0556d5a9 100644 --- a/synthesis/lib/OneBigTable.ml +++ b/synthesis/lib/OneBigTable.ml @@ -35,7 +35,7 @@ let rec mk_one_big_table' (tbl : only_apply) c = { tbl with actions = List.map tbl.actions ~f:(fun (n, p, act) -> (n, p, act %:% c)); default = tbl.default %:% c } - | Assume _ -> failwith "Assume not handled" + | Assume _ -> tbl (*failwith "Assume not handled" *) | Seq(c1, c2) -> mk_one_big_table' (mk_one_big_table' tbl c1) c2 | Select(_, tcl) -> let free = List.map tcl diff --git a/synthesis/lib/Runtime.ml b/synthesis/lib/Runtime.ml index a7c58b07..abf2d145 100644 --- a/synthesis/lib/Runtime.ml +++ b/synthesis/lib/Runtime.ml @@ -87,8 +87,13 @@ let matches_of_string ?sep:(sep=';') (keys : (string * int) list) (data_str : st String.lsplit2 match_str ~on:'#' |> Option.value ~default:(match_str, Printf.sprintf "%d" sz) in + let value_str' = if String.contains value_str ':' + then value_str + |> String.substr_replace_all ~pattern:":" ~with_:"" + |> Printf.sprintf "0x%s" + else value_str in let size = int_of_string size_str in - let value = Bigint.of_string value_str in + let value = Bigint.of_string value_str' in Match.exact_ key (Int(value, size)) end ) @@ -123,7 +128,6 @@ let parse program filename : Edit.t list = edits - let parse_bmv2_entry cmd string : Edit.t = match String.split string ~on:' ' with | "table_add" :: tbl_name :: action_name :: cont -> @@ -166,3 +170,5 @@ let parse_bmv2_entry cmd string : Edit.t = let parse_bmv2 cmd filename : Edit.t list = In_channel.read_lines filename |> List.map ~f:(parse_bmv2_entry cmd) + +let parse_whippersnapper = parse_bmv2 diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py new file mode 100644 index 00000000..34f47de4 --- /dev/null +++ b/synthesis/whippersnapper/bench.py @@ -0,0 +1,53 @@ +#!/usr/bin/python + +import os +import shutil +import subprocess +import sys + +def rules_for_obt(fn): + edits_file = "whippersnapper/empty_edits.txt"; + fvs_file = "output/fvs.txt"; + assume_file = "whippersnapper/empty_assume.txt"; + commands_file = "output/commands.txt"; + commands_no_def_file = "output/commands_no_def.txt" + + with open(fvs_file, 'w') as fvs: + fvs.write("standard_metadata.egress_spec,standard_metadata.egress_spec,9") + + with open(commands_file, 'r') as cmds: + with open(commands_no_def_file, 'w') as cmdnd: + for line in cmds: + if not line.startswith("table_set_default"): + cmdnd.write(line); + + + subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-I", "whippersnapper/p4includes"]); + +def run_whippersnapper(mx): + if not os.path.isdir("whippersnapper/pipelines"): + os.mkdir("whippersnapper/pipelines") + + for i in list(range(1, int(mx))): + print(str(i)); + subprocess.run(["p4benchmark", "--feature", "pipeline", "--tables", str(i), "--table-size", "16"]); + subprocess.run(["p4test", "--p4v", "14", "--pp", "output/main16.p4", "output/main.p4"]); + rules_for_obt("output"); + + shutil.move("output", "whippersnapper/pipelines/output_" + str(i)); + +def run_avenir(): + mx = 1; + while os.path.isdir("whippersnapper/pipelines/output_" + str(mx)): + mx += 1; + + for i in list(range(1, int(mx))): + print(str(i)); + +cmd = sys.argv[1]; + +if cmd == "generate": + mx = sys.argv[2]; + run_whippersnapper(mx); +elif cmd == "eval": + run_avenir(); diff --git a/synthesis/whippersnapper/empty_assume.txt b/synthesis/whippersnapper/empty_assume.txt new file mode 100644 index 00000000..e69de29b diff --git a/synthesis/whippersnapper/empty_edits.txt b/synthesis/whippersnapper/empty_edits.txt new file mode 100644 index 00000000..e69de29b diff --git a/synthesis/whippersnapper/p4includes/core.p4 b/synthesis/whippersnapper/p4includes/core.p4 new file mode 100644 index 00000000..03576ae4 --- /dev/null +++ b/synthesis/whippersnapper/p4includes/core.p4 @@ -0,0 +1,81 @@ +/* +Copyright 2013-present Barefoot Networks, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* This is the P4-16 core library, which declares some built-in P4 constructs using P4 */ + +#ifndef _CORE_P4_ +#define _CORE_P4_ + +/// Standard error codes. New error codes can be declared by users. +error { + NoError, /// No error. + PacketTooShort, /// Not enough bits in packet for 'extract'. + NoMatch, /// 'select' expression has no matches. + StackOutOfBounds, /// Reference to invalid element of a header stack. + HeaderTooShort, /// Extracting too many bits into a varbit field. + ParserTimeout /// Parser execution time limit exceeded. +} + +extern packet_in { + /// Read a header from the packet into a fixed-sized header @hdr and advance the cursor. + /// May trigger error PacketTooShort or StackOutOfBounds. + /// @T must be a fixed-size header type + void extract(out T hdr); + /// Read bits from the packet into a variable-sized header @variableSizeHeader + /// and advance the cursor. + /// @T must be a header containing exactly 1 varbit field. + /// May trigger errors PacketTooShort, StackOutOfBounds, or HeaderTooShort. + void extract(out T variableSizeHeader, + in bit<32> variableFieldSizeInBits); + /// Read bits from the packet without advancing the cursor. + /// @returns: the bits read from the packet. + /// T may be an arbitrary fixed-size type. + T lookahead(); + /// Advance the packet cursor by the specified number of bits. + void advance(in bit<32> sizeInBits); + /// @return packet length in bytes. This method may be unavailable on + /// some target architectures. + bit<32> length(); +} + +extern packet_out { + /// Write @hdr into the output packet, advancing cursor. + /// @T can be a header type, a header stack, a header_union, or a struct + /// containing fields with such types. + void emit(in T hdr); +} + +// TODO: remove from this file, convert to built-in +/// Check a predicate @check in the parser; if the predicate is true do nothing, +/// otherwise set the parser error to @toSignal, and transition to the `reject` state. +extern void verify(in bool check, in error toSignal); + +/// Built-in action that does nothing. +action NoAction() {} + +/// Standard match kinds for table key fields. +/// Some architectures may not support all these match kinds. +/// Architectures can declare additional match kinds. +match_kind { + /// Match bits exactly. + exact, + /// Ternary match, using a mask. + ternary, + /// Longest-prefix match. + lpm +} + +#endif /* _CORE_P4_ */ diff --git a/synthesis/whippersnapper/p4includes/v1model.p4 b/synthesis/whippersnapper/p4includes/v1model.p4 new file mode 100644 index 00000000..c10d2d79 --- /dev/null +++ b/synthesis/whippersnapper/p4includes/v1model.p4 @@ -0,0 +1,261 @@ +/* +Copyright 2013-present Barefoot Networks, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* P4-16 declaration of the P4 v1.0 switch model */ + +#ifndef _V1_MODEL_P4_ +#define _V1_MODEL_P4_ + +#include "core.p4" + +match_kind { + range, + // Used for implementing dynamic_action_selection + selector +} + +// Are these correct? +@metadata @name("standard_metadata") +struct standard_metadata_t { + bit<9> ingress_port; + bit<9> egress_spec; + bit<9> egress_port; + bit<32> clone_spec; + bit<32> instance_type; + // The drop and recirculate_port fields are not used at all by the + // behavioral-model simple_switch software switch as of September + // 2018, and perhaps never was. They may be considered + // deprecated, at least for that P4 target device. simple_switch + // uses the value of the egress_spec field to determine whether a + // packet is dropped or not, and it is recommended to use the + // P4_14 drop() primitive action, or the P4_16 + v1model + // mark_to_drop() primitive action, to cause that field to be + // changed so the packet will be dropped. + bit<1> drop; + bit<16> recirculate_port; + bit<32> packet_length; + // + // @alias is used to generate the field_alias section of the BMV2 JSON. + // Field alias creates a mapping from the metadata name in P4 program to + // the behavioral model's internal metadata name. Here we use it to + // expose all metadata supported by simple switch to the user through + // standard_metadata_t. + // + // flattening fields that exist in bmv2-ss + // queueing metadata + @alias("queueing_metadata.enq_timestamp") bit<32> enq_timestamp; + @alias("queueing_metadata.enq_qdepth") bit<19> enq_qdepth; + @alias("queueing_metadata.deq_timedelta") bit<32> deq_timedelta; + @alias("queueing_metadata.deq_qdepth") bit<19> deq_qdepth; + // intrinsic metadata + @alias("intrinsic_metadata.ingress_global_timestamp") bit<48> ingress_global_timestamp; + @alias("intrinsic_metadata.egress_global_timestamp") bit<48> egress_global_timestamp; + @alias("intrinsic_metadata.lf_field_list") bit<32> lf_field_list; + @alias("intrinsic_metadata.mcast_grp") bit<16> mcast_grp; + @alias("intrinsic_metadata.resubmit_flag") bit<32> resubmit_flag; + @alias("intrinsic_metadata.egress_rid") bit<16> egress_rid; + /// Indicates that a verify_checksum() method has failed. + // 1 if a checksum error was found, otherwise 0. + bit<1> checksum_error; + @alias("intrinsic_metadata.recirculate_flag") bit<32> recirculate_flag; + /// Error produced by parsing + error parser_error; +} + +enum CounterType { + packets, + bytes, + packets_and_bytes +} + +enum MeterType { + packets, + bytes +} + +extern counter { + counter(bit<32> size, CounterType type); + void count(in bit<32> index); +} + +extern direct_counter { + direct_counter(CounterType type); + void count(); +} + +extern meter { + meter(bit<32> size, MeterType type); + void execute_meter(in bit<32> index, out T result); +} + +extern direct_meter { + direct_meter(MeterType type); + void read(out T result); +} + +extern register { + register(bit<32> size); + void read(out T result, in bit<32> index); + void write(in bit<32> index, in T value); +} + +// used as table implementation attribute +extern action_profile { + action_profile(bit<32> size); +} + +// Get a random number in the range lo..hi +extern void random(out T result, in T lo, in T hi); +// If the type T is a named struct, the name is used +// to generate the control-plane API. +extern void digest(in bit<32> receiver, in T data); + +enum HashAlgorithm { + crc32, + crc32_custom, + crc16, + crc16_custom, + random, + identity, + csum16, + xor16 +} + +extern void mark_to_drop(); +extern void hash(out O result, in HashAlgorithm algo, in T base, in D data, in M max); + +extern action_selector { + action_selector(HashAlgorithm algorithm, bit<32> size, bit<32> outputWidth); +} + +enum CloneType { + I2E, + E2E +} + +@deprecated("Please use verify_checksum/update_checksum instead.") +extern Checksum16 { + Checksum16(); + bit<16> get(in D data); +} + +/** +Verifies the checksum of the supplied data. +If this method detects that a checksum of the data is not correct it +sets the standard_metadata checksum_error bit. +@param T Must be a tuple type where all the fields are bit-fields or varbits. + The total dynamic length of the fields is a multiple of the output size. +@param O Checksum type; must be bit type. +@param condition If 'false' the verification always succeeds. +@param data Data whose checksum is verified. +@param checksum Expected checksum of the data; note that is must be a left-value. +@param algo Algorithm to use for checksum (not all algorithms may be supported). + Must be a compile-time constant. +*/ +extern void verify_checksum(in bool condition, in T data, inout O checksum, HashAlgorithm algo); +/** +Computes the checksum of the supplied data. +@param T Must be a tuple type where all the fields are bit-fields or varbits. + The total dynamic length of the fields is a multiple of the output size. +@param O Output type; must be bit type. +@param condition If 'false' the checksum is not changed +@param data Data whose checksum is computed. +@param checksum Checksum of the data. +@param algo Algorithm to use for checksum (not all algorithms may be supported). + Must be a compile-time constant. +*/ +extern void update_checksum(in bool condition, in T data, inout O checksum, HashAlgorithm algo); + +/** +Verifies the checksum of the supplied data including the payload. +The payload is defined as "all bytes of the packet which were not parsed by the parser". +If this method detects that a checksum of the data is not correct it +sets the standard_metadata checksum_error bit. +@param T Must be a tuple type where all the fields are bit-fields or varbits. + The total dynamic length of the fields is a multiple of the output size. +@param O Checksum type; must be bit type. +@param condition If 'false' the verification always succeeds. +@param data Data whose checksum is verified. +@param checksum Expected checksum of the data; note that is must be a left-value. +@param algo Algorithm to use for checksum (not all algorithms may be supported). + Must be a compile-time constant. +*/ +extern void verify_checksum_with_payload(in bool condition, in T data, inout O checksum, HashAlgorithm algo); +/** +Computes the checksum of the supplied data including the payload. +The payload is defined as "all bytes of the packet which were not parsed by the parser". +@param T Must be a tuple type where all the fields are bit-fields or varbits. + The total dynamic length of the fields is a multiple of the output size. +@param O Output type; must be bit type. +@param condition If 'false' the checksum is not changed +@param data Data whose checksum is computed. +@param checksum Checksum of the data. +@param algo Algorithm to use for checksum (not all algorithms may be supported). + Must be a compile-time constant. +*/ +extern void update_checksum_with_payload(in bool condition, in T data, inout O checksum, HashAlgorithm algo); + +extern void resubmit(in T data); +extern void recirculate(in T data); +extern void clone(in CloneType type, in bit<32> session); +extern void clone3(in CloneType type, in bit<32> session, in T data); + +extern void truncate(in bit<32> length); + +// The name 'standard_metadata' is reserved + +// Architecture. +// M should be a struct of structs +// H should be a struct of headers or stacks + +parser Parser(packet_in b, + out H parsedHdr, + inout M meta, + inout standard_metadata_t standard_metadata); + +/* The only legal statements in the implementation of the +VerifyChecksum control are: block statements, calls to the +verify_checksum and verify_checksum_with_payload methods, +and return statements. */ +control VerifyChecksum(inout H hdr, + inout M meta); +@pipeline +control Ingress(inout H hdr, + inout M meta, + inout standard_metadata_t standard_metadata); +@pipeline +control Egress(inout H hdr, + inout M meta, + inout standard_metadata_t standard_metadata); + +/* The only legal statements in the implementation of the +ComputeChecksum control are: block statements, calls to the +update_checksum and update_checksum_with_payload methods, +and return statements. */ +control ComputeChecksum(inout H hdr, + inout M meta); +@deparser +control Deparser(packet_out b, in H hdr); + +package V1Switch(Parser p, + VerifyChecksum vr, + Ingress ig, + Egress eg, + ComputeChecksum ck, + Deparser dep + ); + +#endif /* _V1_MODEL_P4_ */ From f753d6760de70adb6473de6aa595d4b6765948b1 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Fri, 11 Sep 2020 11:29:27 -0400 Subject: [PATCH 02/24] thrift --- synthesis/whippersnapper/bench.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 34f47de4..006930f2 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -22,7 +22,7 @@ def rules_for_obt(fn): cmdnd.write(line); - subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-I", "whippersnapper/p4includes"]); + subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-I", "whippersnapper/p4includes", "--thrift",]); def run_whippersnapper(mx): if not os.path.isdir("whippersnapper/pipelines"): From 34e50ffaca1ea72e786c763f3a03ca81989ea92b Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Fri, 11 Sep 2020 14:45:58 -0400 Subject: [PATCH 03/24] Generating OBT commands from whippersnapper generated files --- synthesis/bin/Main.ml | 1 + synthesis/lib/OneBigTable.ml | 10 +++++++--- synthesis/whippersnapper/bench.py | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/synthesis/bin/Main.ml b/synthesis/bin/Main.ml index d5006118..67abad73 100644 --- a/synthesis/bin/Main.ml +++ b/synthesis/bin/Main.ml @@ -587,6 +587,7 @@ let run debug thrift_mode interactive data print match res with | None -> Core.Printf.printf "no example could be found\n" | Some r when print -> + Core.Printf.printf "Edits\n"; List.iter r ~f:(fun edit -> Tables.Edit.to_string edit |> Core.Printf.printf "%s\n%!" diff --git a/synthesis/lib/OneBigTable.ml b/synthesis/lib/OneBigTable.ml index 0556d5a9..1c4c190e 100644 --- a/synthesis/lib/OneBigTable.ml +++ b/synthesis/lib/OneBigTable.ml @@ -31,11 +31,11 @@ type only_apply = {keys:(string * size * value option) list; let rec mk_one_big_table' (tbl : only_apply) c = match c with | Skip -> tbl - | Assign _ -> + | Assign _ + | Assume _ -> { tbl with actions = List.map tbl.actions ~f:(fun (n, p, act) -> (n, p, act %:% c)); default = tbl.default %:% c } - | Assume _ -> tbl (*failwith "Assume not handled" *) | Seq(c1, c2) -> mk_one_big_table' (mk_one_big_table' tbl c1) c2 | Select(_, tcl) -> let free = List.map tcl @@ -43,7 +43,11 @@ let rec mk_one_big_table' (tbl : only_apply) c = let es = List.map tcl ~f:snd in let tbl_keys = {tbl with keys = dedup (tbl.keys @ free)} in - List.fold es ~init:tbl_keys ~f:mk_one_big_table' + let acts = tbl_keys.actions in + let new_acts = List.concat_map acts ~f:(fun (n, k, a) -> List.map es ~f:(fun e -> (n, k, a %:% e))) in + { tbl_keys with actions = new_acts; + default = tbl_keys.default %:% c } + (* List.fold es ~init:tbl_keys ~f:mk_one_big_table' *) | Apply app_t -> let cross_actions = List.map (cross tbl.actions app_t.actions |> List.concat) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 006930f2..9606c28c 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -13,6 +13,7 @@ def rules_for_obt(fn): commands_no_def_file = "output/commands_no_def.txt" with open(fvs_file, 'w') as fvs: + fvs.write("hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48\n"); fvs.write("standard_metadata.egress_spec,standard_metadata.egress_spec,9") with open(commands_file, 'r') as cmds: @@ -22,7 +23,7 @@ def rules_for_obt(fn): cmdnd.write(line); - subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-I", "whippersnapper/p4includes", "--thrift",]); + subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes",]); def run_whippersnapper(mx): if not os.path.isdir("whippersnapper/pipelines"): From d95ce58e5080daeb03063eadff35bca6918eee4a Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Fri, 11 Sep 2020 17:37:59 -0400 Subject: [PATCH 04/24] Adjusting OBT converions to eliminate tables in select statements --- synthesis/lib/Benchmark.ml | 2 +- synthesis/lib/Manip.ml | 2 +- synthesis/lib/OneBigTable.ml | 33 +++++++++++++++++++++++++++---- synthesis/whippersnapper/bench.py | 11 ++++++++++- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/synthesis/lib/Benchmark.ml b/synthesis/lib/Benchmark.ml index a2845cab..bb9897d5 100644 --- a/synthesis/lib/Benchmark.ml +++ b/synthesis/lib/Benchmark.ml @@ -230,7 +230,6 @@ and to_obt params data_file p4_file edits_file fvs_file _ inc = let phys = OneBigTable.mk_one_big_table log (* |> CompilerOpts.optimize fvs *) in - (* let maxN n = Bigint.(of_int_exn n ** of_int_exn 2 - one) in *) (* let fvs = parse_fvs fvs in *) let log_edits = Runtime.parse_whippersnapper log edits_file in @@ -243,6 +242,7 @@ and to_obt params data_file p4_file edits_file fvs_file _ inc = ~phys_inst:Instance.(update_list params empty phys_edits) ~log_edits:[] () in + Core.Printf.printf "\n\n------------\n%s\n----------\n" (Problem.to_string params problem); assert (implements params (ProfData.zero ()) (problem) = `Yes); measure params None problem (List.map (Runtime.parse_whippersnapper log data_file) ~f:(fun r -> [r])) diff --git a/synthesis/lib/Manip.ml b/synthesis/lib/Manip.ml index c0c33105..d0141160 100644 --- a/synthesis/lib/Manip.ml +++ b/synthesis/lib/Manip.ml @@ -249,7 +249,7 @@ let rec passify_aux sub c : ((int * int) StringMap.t * cmd) = (merged_subst, mkSelect typ ss') | Apply _ -> - failwith "Cannot passify (yet) table applications" + failwith ("Cannot passify (yet) table applications "^(string_of_cmd c ~depth:0)) let passify fvs c = let init_sub = diff --git a/synthesis/lib/OneBigTable.ml b/synthesis/lib/OneBigTable.ml index 1c4c190e..06cbe69f 100644 --- a/synthesis/lib/OneBigTable.ml +++ b/synthesis/lib/OneBigTable.ml @@ -24,10 +24,26 @@ let combine_actions (act1 : string * (string * size) list * cmd) (act2 : string let new_p2' = List.map new_p2 ~f:(fun (_, v, w) -> v, w) in n1 ^ "_" ^ n2, new_p1' @ new_p2', new_c1 %:% new_c2 +let combine_all_actions actions1 actions2 = + List.map + (cross actions1 actions2 |> List.concat) + ~f:(fun (x, y) -> combine_actions x y) + type only_apply = {keys:(string * size * value option) list; actions: ((string * (string * size) list * cmd) list); default: cmd} +let rec replace_apply_with_def c = + match c with + | Skip + | Assign _ + | Assume _ -> c + | Seq(c1, c2) -> Seq(replace_apply_with_def c1, replace_apply_with_def c2) + | Select(st, tc) -> Select(st, List.map tc ~f:(fun (t, c) -> (t, replace_apply_with_def c))) + | Apply a -> a.default + +let empty_only_apply = {keys = []; actions = []; default = Skip} + let rec mk_one_big_table' (tbl : only_apply) c = match c with | Skip -> tbl @@ -40,13 +56,22 @@ let rec mk_one_big_table' (tbl : only_apply) c = | Select(_, tcl) -> let free = List.map tcl ~f:(fun (t, _) -> List.map (free_vars_of_test t) ~f:(fun(f, s) -> (f, s, None))) |> List.concat in - let es = List.map tcl ~f:snd in + let es_tbl = List.map tcl ~f:snd |> List.map ~f:(mk_one_big_table' empty_only_apply) in let tbl_keys = {tbl with keys = dedup (tbl.keys @ free)} in - let acts = tbl_keys.actions in - let new_acts = List.concat_map acts ~f:(fun (n, k, a) -> List.map es ~f:(fun e -> (n, k, a %:% e))) in + let acts = ("DEFAULT", [], tbl_keys.default) :: tbl_keys.actions in + let es_tbl_acts = (List.map es_tbl ~f:(fun t -> "DEFAULT", [], t.default)) + @ List.concat_map es_tbl ~f:(fun est -> est.actions) in + let new_acts = combine_all_actions acts es_tbl_acts in + (*let new_acts = List.concat_map acts + ~f:(fun (n1, p1, a1) -> + List.concat_map es_tbl + ~f:(fun et -> List.map et.actions + ~f:(fun (n1, p2, a2) -> + let p' = dedup (p @ p') in + (n1^n2, p', a1 %:% a2)) )) in*) { tbl_keys with actions = new_acts; - default = tbl_keys.default %:% c } + default = tbl_keys.default %:% replace_apply_with_def c } (* List.fold es ~init:tbl_keys ~f:mk_one_big_table' *) | Apply app_t -> let cross_actions = List.map diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 9606c28c..d1203c1f 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -23,7 +23,16 @@ def rules_for_obt(fn): cmdnd.write(line); - subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes",]); + res = subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); + + obt_commands = "output/obt_commands.txt"; + try: + cmds = res.stdout.decode('utf-8'); + cmds = cmds.split("Edits\n")[1]; + with open(obt_commands, 'w') as f: + f.write(cmds); + except: + print("no commands written"); def run_whippersnapper(mx): if not os.path.isdir("whippersnapper/pipelines"): From 1ea62c425b17032dafacc675aff3736031aad374 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Sat, 12 Sep 2020 18:27:28 -0400 Subject: [PATCH 05/24] minor --- synthesis/lib/OneBigTable.ml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/synthesis/lib/OneBigTable.ml b/synthesis/lib/OneBigTable.ml index 06cbe69f..68e4eadf 100644 --- a/synthesis/lib/OneBigTable.ml +++ b/synthesis/lib/OneBigTable.ml @@ -42,6 +42,15 @@ let rec replace_apply_with_def c = | Select(st, tc) -> Select(st, List.map tc ~f:(fun (t, c) -> (t, replace_apply_with_def c))) | Apply a -> a.default +let rec has_apply c = + match c with + | Skip + | Assign _ + | Assume _ -> false + | Seq(c1, c2) -> has_apply c1 || has_apply c2 + | Select(_, tc) -> List.fold (List.map tc ~f:(fun (_, c) -> has_apply c)) ~init:false ~f:(||) + | Apply _ -> true + let empty_only_apply = {keys = []; actions = []; default = Skip} let rec mk_one_big_table' (tbl : only_apply) c = @@ -53,7 +62,7 @@ let rec mk_one_big_table' (tbl : only_apply) c = actions = List.map tbl.actions ~f:(fun (n, p, act) -> (n, p, act %:% c)); default = tbl.default %:% c } | Seq(c1, c2) -> mk_one_big_table' (mk_one_big_table' tbl c1) c2 - | Select(_, tcl) -> + | Select(_, tcl) when has_apply c -> let free = List.map tcl ~f:(fun (t, _) -> List.map (free_vars_of_test t) ~f:(fun(f, s) -> (f, s, None))) |> List.concat in let es_tbl = List.map tcl ~f:snd |> List.map ~f:(mk_one_big_table' empty_only_apply) in @@ -63,20 +72,14 @@ let rec mk_one_big_table' (tbl : only_apply) c = let es_tbl_acts = (List.map es_tbl ~f:(fun t -> "DEFAULT", [], t.default)) @ List.concat_map es_tbl ~f:(fun est -> est.actions) in let new_acts = combine_all_actions acts es_tbl_acts in - (*let new_acts = List.concat_map acts - ~f:(fun (n1, p1, a1) -> - List.concat_map es_tbl - ~f:(fun et -> List.map et.actions - ~f:(fun (n1, p2, a2) -> - let p' = dedup (p @ p') in - (n1^n2, p', a1 %:% a2)) )) in*) { tbl_keys with actions = new_acts; default = tbl_keys.default %:% replace_apply_with_def c } - (* List.fold es ~init:tbl_keys ~f:mk_one_big_table' *) + | Select _ -> (* We can assume no Apply in the Select, given the previous case *) + { tbl with + actions = List.map tbl.actions ~f:(fun (n, p, act) -> (n, p, act %:% c)); + default = tbl.default %:% c } | Apply app_t -> - let cross_actions = List.map - (cross tbl.actions app_t.actions |> List.concat) - ~f:(fun (x, y) -> combine_actions x y) in + let cross_actions = combine_all_actions tbl.actions app_t.actions in let def_tbl_to_app_t = List.map app_t.actions ~f:(combine_actions ("DEFAULT", [], tbl.default)) in let tbl_to_def_app_t = List.map tbl.actions ~f:(fun t -> combine_actions t ("DEFAULT", [], app_t.default)) in { keys = dedup (tbl.keys @ app_t.keys); From 21d81476979607b7d62c45444a9292d3e72825e4 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Sun, 13 Sep 2020 00:10:10 -0400 Subject: [PATCH 06/24] Isolated error --- synthesis/bin/Main.ml | 7 +- synthesis/lib/Benchmark.ml | 6 +- synthesis/whippersnapper/bad/commands.txt | 5 + .../whippersnapper/bad/commands_no_def.txt | 1 + .../whippersnapper/bad/commands_phys.txt | 2 + synthesis/whippersnapper/bad/fvs.txt | 1 + synthesis/whippersnapper/bad/main.p4 | 126 ++++++++++++ synthesis/whippersnapper/bad/main16.p4 | 122 +++++++++++ synthesis/whippersnapper/bad/pisces_rules.txt | 27 +++ synthesis/whippersnapper/bad/run_switch.sh | 35 ++++ synthesis/whippersnapper/bad/run_test.py | 192 ++++++++++++++++++ synthesis/whippersnapper/bad/test.pcap | Bin 0 -> 296 bytes 12 files changed, 518 insertions(+), 6 deletions(-) create mode 100644 synthesis/whippersnapper/bad/commands.txt create mode 100644 synthesis/whippersnapper/bad/commands_no_def.txt create mode 100644 synthesis/whippersnapper/bad/commands_phys.txt create mode 100644 synthesis/whippersnapper/bad/fvs.txt create mode 100644 synthesis/whippersnapper/bad/main.p4 create mode 100644 synthesis/whippersnapper/bad/main16.p4 create mode 100644 synthesis/whippersnapper/bad/pisces_rules.txt create mode 100755 synthesis/whippersnapper/bad/run_switch.sh create mode 100755 synthesis/whippersnapper/bad/run_test.py create mode 100644 synthesis/whippersnapper/bad/test.pcap diff --git a/synthesis/bin/Main.ml b/synthesis/bin/Main.ml index 67abad73..e1faa1f5 100644 --- a/synthesis/bin/Main.ml +++ b/synthesis/bin/Main.ml @@ -518,14 +518,15 @@ module ToOBT = struct +> flag "-data" (required string) ~doc:"the input log" +> flag "-p" no_arg ~doc:"show_result_at_end" +> anon ("p4file" %: string) - +> anon ("edits" %: string) + +> anon ("log-edits" %: string) + +> anon ("phys-edits" %: string) +> anon ("fvs" %: string) +> anon ("assume" %: string) +> flag "-I" (listed string) ~doc:" add directory to include search path for file" ++ opt_flags) let run debug thrift_mode interactive data print - p4file edits fvs assume inc + p4file log_edits phys_edits fvs assume inc widening do_slice edits_depth @@ -582,7 +583,7 @@ let run debug thrift_mode interactive data print reach_restrict; reach_filter; timeout = None}) - data p4file edits fvs assume inc + data p4file log_edits phys_edits fvs assume inc in match res with | None -> Core.Printf.printf "no example could be found\n" diff --git a/synthesis/lib/Benchmark.ml b/synthesis/lib/Benchmark.ml index bb9897d5..5d74d2a7 100644 --- a/synthesis/lib/Benchmark.ml +++ b/synthesis/lib/Benchmark.ml @@ -217,7 +217,7 @@ let rec basic_onf_ipv4_real params data_file log_p4 phys_p4 log_edits_file phys_ assert (implements params (ProfData.zero ()) (problem) = `Yes); measure params None problem (onos_to_edits var_mapping data_file "routing_v6" "hdr.ipv6.dst_addr") -and to_obt params data_file p4_file edits_file fvs_file _ inc = +and to_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ inc = let var_mapping = parse_fvs fvs_file in let fvs = List.map var_mapping ~f:snd in let assume = Skip (* parse_file assume_file *) in @@ -232,8 +232,8 @@ and to_obt params data_file p4_file edits_file fvs_file _ inc = in (* let maxN n = Bigint.(of_int_exn n ** of_int_exn 2 - one) in *) (* let fvs = parse_fvs fvs in *) - let log_edits = Runtime.parse_whippersnapper log edits_file in - let phys_edits = [] in + let log_edits = Runtime.parse_whippersnapper log log_edits_file in + let phys_edits = Runtime.parse phys phys_edits_file in let problem = Problem.make diff --git a/synthesis/whippersnapper/bad/commands.txt b/synthesis/whippersnapper/bad/commands.txt new file mode 100644 index 00000000..80386dc1 --- /dev/null +++ b/synthesis/whippersnapper/bad/commands.txt @@ -0,0 +1,5 @@ +table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 +table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/bad/commands_no_def.txt b/synthesis/whippersnapper/bad/commands_no_def.txt new file mode 100644 index 00000000..83fad2e2 --- /dev/null +++ b/synthesis/whippersnapper/bad/commands_no_def.txt @@ -0,0 +1 @@ +table_add forward_table forward 0C:C4:7A:A3:25:35 => diff --git a/synthesis/whippersnapper/bad/commands_phys.txt b/synthesis/whippersnapper/bad/commands_phys.txt new file mode 100644 index 00000000..c3800d5a --- /dev/null +++ b/synthesis/whippersnapper/bad/commands_phys.txt @@ -0,0 +1,2 @@ +ADD,OneBigTable,0C:C4:7A:A3:25:35;0,,9 +ADD,OneBigTable,0C:C4:7A:A3:25:35;1,,9 diff --git a/synthesis/whippersnapper/bad/fvs.txt b/synthesis/whippersnapper/bad/fvs.txt new file mode 100644 index 00000000..3f6ca706 --- /dev/null +++ b/synthesis/whippersnapper/bad/fvs.txt @@ -0,0 +1 @@ +hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 diff --git a/synthesis/whippersnapper/bad/main.p4 b/synthesis/whippersnapper/bad/main.p4 new file mode 100644 index 00000000..67c339c1 --- /dev/null +++ b/synthesis/whippersnapper/bad/main.p4 @@ -0,0 +1,126 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header ethernet_t ethernet; + +parser start { + return parse_ethernet; +} + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_IPV4 : parse_ipv4; + default : ingress; + } +} +header_type ipv4_t { + fields { + version : 4; + ihl : 4; + diffserv : 8; + totalLen : 16; + identification : 16; + flags : 3; + fragOffset : 13; + ttl : 8; + protocol : 8; + hdrChecksum : 16; + srcAddr : 32; + dstAddr : 32; + } +} +header ipv4_t ipv4; + +parser parse_ipv4 { + extract(ipv4); + return select(latest.protocol) { + TCP_PROTOCOL : parse_tcp; + UDP_PROTOCOL : parse_udp; + default : ingress; + } +} +header_type tcp_t { + fields { + srcPort : 16; + dstPort : 16; + seqNo : 32; + ackNo : 32; + dataOffset : 4; + res : 3; + ecn : 3; + ctrl : 6; + window : 16; + checksum : 16; + urgentPtr : 16; + } +} +header tcp_t tcp; + +parser parse_tcp { + extract(tcp); + return ingress; +} +header_type udp_t { + fields { + srcPort : 16; + dstPort : 16; + length_ : 16; + checksum : 16; + } +} +header udp_t udp; + +parser parse_udp { + extract(udp); + return select(latest.dstPort) { + default : ingress; + + } +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action _nop() { + +} +action forward1(_port) { +modify_field(standard_metadata.egress_spec, _port); +} +table table_1 { + reads { + ethernet.dstAddr : exact; + } actions { + forward1; + } + size : 16; +} +control ingress { + apply(forward_table); + apply(table_1); + +} diff --git a/synthesis/whippersnapper/bad/main16.p4 b/synthesis/whippersnapper/bad/main16.p4 new file mode 100644 index 00000000..105ef641 --- /dev/null +++ b/synthesis/whippersnapper/bad/main16.p4 @@ -0,0 +1,122 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header ipv4_t { +} + +header tcp_t { +} + +header udp_t { +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".ipv4") + ipv4_t ipv4; + @name(".tcp") + tcp_t tcp; + @name(".udp") + udp_t udp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + default: accept; + } + } + @name(".parse_ipv4") state parse_ipv4 { + packet.extract(hdr.ipv4); + transition select(hdr.ipv4.protocol) { + 8w0x6: parse_tcp; + 8w0x11: parse_udp; + default: accept; + } + } + @name(".parse_tcp") state parse_tcp { + packet.extract(hdr.tcp); + transition accept; + } + @name(".parse_udp") state parse_udp { + packet.extract(hdr.udp); + transition select(hdr.udp.dstPort) { + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward() { + standard_metadata.egress_spec = 1; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name(".forward1") action forward1() { + } + @name(".forward_table") table forward_table { + actions = { + forward; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + @name(".table_1") table table_1 { + actions = { + forward1; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 16; + } + apply { + forward_table.apply(); + table_1.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ipv4); + packet.emit(hdr.udp); + packet.emit(hdr.tcp); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/bad/pisces_rules.txt b/synthesis/whippersnapper/bad/pisces_rules.txt new file mode 100644 index 00000000..fcf185af --- /dev/null +++ b/synthesis/whippersnapper/bad/pisces_rules.txt @@ -0,0 +1,27 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/bad/run_switch.sh b/synthesis/whippersnapper/bad/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/bad/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/bad/run_test.py b/synthesis/whippersnapper/bad/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/bad/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/bad/test.pcap b/synthesis/whippersnapper/bad/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..768a48cd7c98ead47f4f8e6c9f2e8025ee24395c GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2}=Y#AFLvzima0SfROsamXR3MNfB7+e_`K7o`u2qwSc XVqoIuVqjqUcizT>;oe%Hmf;8h-PRKU literal 0 HcmV?d00001 From 0746e3cdfa7882e7ce54bf90926f9d3e49765cef Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Sun, 13 Sep 2020 16:07:09 -0400 Subject: [PATCH 07/24] Zero initalizing OBT --- synthesis/lib/Benchmark.ml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/synthesis/lib/Benchmark.ml b/synthesis/lib/Benchmark.ml index 5d74d2a7..b9cd81d2 100644 --- a/synthesis/lib/Benchmark.ml +++ b/synthesis/lib/Benchmark.ml @@ -227,9 +227,8 @@ and to_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ in let log = (assume %:% Encode.encode_from_p4 inc p4_file false) |> Encode.unify_names var_mapping |> zero_init fvs |> drop_handle fvs in - let phys = OneBigTable.mk_one_big_table log + let phys = OneBigTable.mk_one_big_table log |> zero_init fvs |> drop_handle fvs in (* |> CompilerOpts.optimize fvs *) - in (* let maxN n = Bigint.(of_int_exn n ** of_int_exn 2 - one) in *) (* let fvs = parse_fvs fvs in *) let log_edits = Runtime.parse_whippersnapper log log_edits_file in From 6f8ac2f3e9f49c8871fdeae363940106c76d0612 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Sun, 13 Sep 2020 18:16:14 -0400 Subject: [PATCH 08/24] Generating correct files (at least in simple cases) to synthesize from OBT to original program --- synthesis/bin/Main.ml | 95 +++++++++++++++++++++++++++++++ synthesis/lib/Benchmark.ml | 28 +++++++++ synthesis/whippersnapper/bench.py | 41 ++++++++++--- 3 files changed, 156 insertions(+), 8 deletions(-) diff --git a/synthesis/bin/Main.ml b/synthesis/bin/Main.ml index e1faa1f5..e8eb1cee 100644 --- a/synthesis/bin/Main.ml +++ b/synthesis/bin/Main.ml @@ -603,6 +603,100 @@ let to_obt : Command.t = ToOBT.spec ToOBT.run +module FromOBT = struct + let spec = Command.Spec.( + empty + +> flag "-DEBUG" no_arg ~doc:"print debugging statements" + +> flag "--thrift" no_arg ~doc:"parse & write bmv2/thrift commands" + +> flag "-i" no_arg ~doc:"interactive mode" + +> flag "-data" (required string) ~doc:"the input log" + +> flag "-p" no_arg ~doc:"show_result_at_end" + +> anon ("p4file" %: string) + +> anon ("log-edits" %: string) + +> anon ("phys-edits" %: string) + +> anon ("fvs" %: string) + +> anon ("assume" %: string) + +> flag "-I" (listed string) ~doc:" add directory to include search path for file" + ++ opt_flags) + +let run debug thrift_mode interactive data print + p4file log_edits phys_edits fvs assume inc + widening + do_slice + edits_depth + search_width + monotonic + injection + fastcx + vcache + ecache + shortening + above + minimize + hints + only_holes + allow_annotations + nlp + unique_edits + domain + restrict_mask + no_defaults + no_deletes + use_all_cexs + reach_restrict + reach_filter + () = + let res = Benchmark.from_obt + Parameters.({ + widening; + do_slice; + edits_depth; + search_width; + debug; + thrift_mode; + monotonic; + interactive; + injection; + fastcx; + vcache; + ecache; + shortening; + above; + minimize; + hints = Option.is_some hints; + hint_type = Option.value hints ~default:"exact"; + only_holes; + allow_annotations; + nlp; + unique_edits; + domain; + restrict_mask; + no_defaults; + no_deletes; + use_all_cexs; + reach_restrict; + reach_filter; + timeout = None}) + data p4file log_edits phys_edits fvs assume inc + in + match res with + | None -> Core.Printf.printf "no example could be found\n" + | Some r when print -> + Core.Printf.printf "Edits\n"; + List.iter r ~f:(fun edit -> + Tables.Edit.to_string edit + |> Core.Printf.printf "%s\n%!" + ) + | Some _ -> () + +end + +let from_obt : Command.t = + Command.basic_spec + ~summary: "Run the onf benchmark on the real p4 programs" + FromOBT.spec + FromOBT.run + module Equality = struct let spec = Command.Spec.( empty @@ -1470,6 +1564,7 @@ let main : Command.t = ; ("obt", obt) ; ("obt-real", obt_real) ; ("to-obt", to_obt) + ; ("from-obt", from_obt) ; ("eq", equality) ; ("eq-real", equality_real) ; ("wp", wp_cmd)] diff --git a/synthesis/lib/Benchmark.ml b/synthesis/lib/Benchmark.ml index b9cd81d2..70c6f14c 100644 --- a/synthesis/lib/Benchmark.ml +++ b/synthesis/lib/Benchmark.ml @@ -245,6 +245,34 @@ and to_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ in assert (implements params (ProfData.zero ()) (problem) = `Yes); measure params None problem (List.map (Runtime.parse_whippersnapper log data_file) ~f:(fun r -> [r])) +and from_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ inc = + let var_mapping = parse_fvs fvs_file in + let fvs = List.map var_mapping ~f:snd in + let assume = Skip (* parse_file assume_file *) in + + (* let print_fvs = printf "fvs = %s" (Sexp.to_string ([%sexp_of: (string * int) list] fvs)) in *) + + let phys = (assume %:% Encode.encode_from_p4 inc p4_file false) + |> Encode.unify_names var_mapping |> zero_init fvs |> drop_handle fvs in + + let log = OneBigTable.mk_one_big_table phys |> zero_init fvs |> drop_handle fvs in + (* |> CompilerOpts.optimize fvs *) + (* let maxN n = Bigint.(of_int_exn n ** of_int_exn 2 - one) in *) + (* let fvs = parse_fvs fvs in *) + let log_edits = Runtime.parse_whippersnapper log log_edits_file in + let phys_edits = Runtime.parse phys phys_edits_file in + + let problem = + Problem.make + ~log ~phys ~fvs + ~log_inst:Instance.(update_list params empty log_edits) + ~phys_inst:Instance.(update_list params empty phys_edits) + ~log_edits:[] () + in + Core.Printf.printf "\n\n------------\n%s\n----------\n" (Problem.to_string params problem); + assert (implements params (ProfData.zero ()) (problem) = `Yes); + measure params None problem (List.map (Runtime.parse log data_file) ~f:(fun r -> [r])) + and zero_init fvs cmd = let fvs = StringSet.of_list @@ fsts @@ fvs in diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index d1203c1f..330e1791 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -5,6 +5,29 @@ import subprocess import sys +# generate the OBT, and the corresponding rules +def rewrite_cmd(cmd): + try: + pieces = cmd.split(","); + params = pieces[2]; + fparams = params.split(" ")[2::3]; + fparams = ";".join(fparams); + pieces[2] = fparams; + #pieces = list(map(lambda s : s[s.find("0x"):] if s.find("0x") != -1 else s, pieces)); + print("pieces" + str(pieces)); + fcmd = ",".join(pieces); + print(fcmd) + return fcmd; + except: + return cmd; + +def rewrite_cmds(cmds): + print("cmds\n" + cmds + "\n"); + fcmds = list(map(rewrite_cmd, cmds.split("\n"))); + fmcds = "\n".join(fcmds); + print("fcmds = " + str(fcmds)); + return fmcds; + def rules_for_obt(fn): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; @@ -23,16 +46,16 @@ def rules_for_obt(fn): cmdnd.write(line); - res = subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); + res = subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); obt_commands = "output/obt_commands.txt"; - try: - cmds = res.stdout.decode('utf-8'); - cmds = cmds.split("Edits\n")[1]; - with open(obt_commands, 'w') as f: - f.write(cmds); - except: - print("no commands written"); + + cmds = res.stdout.decode('utf-8'); + cmds = cmds.split("Edits\n")[1]; + with open(obt_commands, 'w') as f: + f.write(rewrite_cmds(cmds)); + #except: + # print("no commands written"); def run_whippersnapper(mx): if not os.path.isdir("whippersnapper/pipelines"): @@ -46,6 +69,8 @@ def run_whippersnapper(mx): shutil.move("output", "whippersnapper/pipelines/output_" + str(i)); +# run the actual evaluation, using OBT as the logical program + def run_avenir(): mx = 1; while os.path.isdir("whippersnapper/pipelines/output_" + str(mx)): From 773b65c7426e9d30f9a48f751e38649107edce80 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Sun, 13 Sep 2020 19:02:37 -0400 Subject: [PATCH 09/24] Script to go from OBT to physical --- synthesis/whippersnapper/bench.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 330e1791..8d94bd38 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -77,7 +77,13 @@ def run_avenir(): mx += 1; for i in list(range(1, int(mx))): - print(str(i)); + output = "whippersnapper/pipelines/output_" + str(i) +"/"; + commands_file = output + "obt_commands.txt"; + edits_file = "whippersnapper/empty_edits.txt"; + assume_file = "whippersnapper/empty_assume.txt"; + fvs_file = output + "fvs.txt"; + res = subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); + print(res); cmd = sys.argv[1]; From bfc4a7eba9ba9891f52ab00a886b9b8b0e6f8bb2 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Sun, 13 Sep 2020 22:09:36 -0400 Subject: [PATCH 10/24] generating multiple files --- synthesis/whippersnapper/bench.py | 53 ++-- synthesis/whippersnapper/p4includes2/core.p4 | 81 ++++++ .../whippersnapper/p4includes2/v1model.p4 | 261 ++++++++++++++++++ .../pipeline/output_1/commands.txt | 3 + .../pipeline/output_1/commands_no_def.txt | 2 + .../whippersnapper/pipeline/output_1/fvs.txt | 2 + .../whippersnapper/pipeline/output_1/main.p4 | 114 ++++++++ .../pipeline/output_1/main16.p4 | 139 ++++++++++ .../pipeline/output_1/obt_commands.txt | 2 + .../pipeline/output_1/pisces_rules.txt | 11 + .../pipeline/output_1/run_switch.sh | 35 +++ .../pipeline/output_1/run_test.py | 192 +++++++++++++ .../pipeline/output_1/test.pcap | Bin 0 -> 296 bytes .../pipeline/output_2/commands.txt | 5 + .../pipeline/output_2/commands_no_def.txt | 4 + .../whippersnapper/pipeline/output_2/fvs.txt | 2 + .../whippersnapper/pipeline/output_2/main.p4 | 126 +++++++++ .../pipeline/output_2/main16.p4 | 152 ++++++++++ .../pipeline/output_2/obt_commands.txt | 2 + .../pipeline/output_2/pisces_rules.txt | 27 ++ .../pipeline/output_2/run_switch.sh | 35 +++ .../pipeline/output_2/run_test.py | 192 +++++++++++++ .../pipeline/output_2/test.pcap | Bin 0 -> 296 bytes .../pipeline/output_3/commands.txt | 7 + .../pipeline/output_3/commands_no_def.txt | 6 + .../whippersnapper/pipeline/output_3/fvs.txt | 2 + .../whippersnapper/pipeline/output_3/main.p4 | 138 +++++++++ .../pipeline/output_3/main16.p4 | 165 +++++++++++ .../pipeline/output_3/obt_commands.txt | 2 + .../pipeline/output_3/pisces_rules.txt | 43 +++ .../pipeline/output_3/run_switch.sh | 35 +++ .../pipeline/output_3/run_test.py | 192 +++++++++++++ .../pipeline/output_3/test.pcap | Bin 0 -> 296 bytes .../pipeline/output_4/commands.txt | 9 + .../pipeline/output_4/commands_no_def.txt | 8 + .../whippersnapper/pipeline/output_4/fvs.txt | 2 + .../whippersnapper/pipeline/output_4/main.p4 | 150 ++++++++++ .../pipeline/output_4/main16.p4 | 178 ++++++++++++ .../pipeline/output_4/obt_commands.txt | 2 + .../pipeline/output_4/pisces_rules.txt | 59 ++++ .../pipeline/output_4/run_switch.sh | 35 +++ .../pipeline/output_4/run_test.py | 192 +++++++++++++ .../pipeline/output_4/test.pcap | Bin 0 -> 296 bytes .../set-field/output_1/commands.txt | 5 + .../set-field/output_1/commands_no_def.txt | 2 + .../whippersnapper/set-field/output_1/fvs.txt | 2 + .../whippersnapper/set-field/output_1/main.p4 | 106 +++++++ .../set-field/output_1/main16.p4 | 133 +++++++++ .../set-field/output_1/obt_commands.txt | 0 .../set-field/output_1/pisces_rules.txt | 11 + .../set-field/output_1/run_switch.sh | 35 +++ .../set-field/output_1/run_test.py | 192 +++++++++++++ .../set-field/output_1/test.pcap | Bin 0 -> 296 bytes .../set-field/output_2/commands.txt | 5 + .../set-field/output_2/commands_no_def.txt | 2 + .../whippersnapper/set-field/output_2/fvs.txt | 3 + .../whippersnapper/set-field/output_2/main.p4 | 108 ++++++++ .../set-field/output_2/main16.p4 | 135 +++++++++ .../set-field/output_2/obt_commands.txt | 0 .../set-field/output_2/pisces_rules.txt | 11 + .../set-field/output_2/run_switch.sh | 35 +++ .../set-field/output_2/run_test.py | 192 +++++++++++++ .../set-field/output_2/test.pcap | Bin 0 -> 296 bytes .../set-field/output_3/commands | 0 .../set-field/output_3/commands.txt | 5 + .../set-field/output_3/commands_no_def.txt | 2 + .../whippersnapper/set-field/output_3/fvs.txt | 4 + .../whippersnapper/set-field/output_3/main.p4 | 110 ++++++++ .../set-field/output_3/main16.p4 | 137 +++++++++ .../set-field/output_3/obt_commands.txt | 0 .../set-field/output_3/pisces_rules.txt | 11 + .../set-field/output_3/run_switch.sh | 35 +++ .../set-field/output_3/run_test.py | 192 +++++++++++++ .../set-field/output_3/test.pcap | Bin 0 -> 296 bytes .../set-field/output_4/commands.txt | 5 + .../set-field/output_4/commands_no_def.txt | 2 + .../whippersnapper/set-field/output_4/fvs.txt | 5 + .../whippersnapper/set-field/output_4/main.p4 | 112 ++++++++ .../set-field/output_4/main16.p4 | 139 ++++++++++ .../set-field/output_4/obt_commands.txt | 0 .../set-field/output_4/pisces_rules.txt | 11 + .../set-field/output_4/run_switch.sh | 35 +++ .../set-field/output_4/run_test.py | 192 +++++++++++++ .../set-field/output_4/test.pcap | Bin 0 -> 296 bytes 84 files changed, 4619 insertions(+), 20 deletions(-) create mode 100644 synthesis/whippersnapper/p4includes2/core.p4 create mode 100644 synthesis/whippersnapper/p4includes2/v1model.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_1/commands.txt create mode 100644 synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt create mode 100644 synthesis/whippersnapper/pipeline/output_1/fvs.txt create mode 100644 synthesis/whippersnapper/pipeline/output_1/main.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_1/main16.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_1/obt_commands.txt create mode 100644 synthesis/whippersnapper/pipeline/output_1/pisces_rules.txt create mode 100755 synthesis/whippersnapper/pipeline/output_1/run_switch.sh create mode 100755 synthesis/whippersnapper/pipeline/output_1/run_test.py create mode 100644 synthesis/whippersnapper/pipeline/output_1/test.pcap create mode 100644 synthesis/whippersnapper/pipeline/output_2/commands.txt create mode 100644 synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt create mode 100644 synthesis/whippersnapper/pipeline/output_2/fvs.txt create mode 100644 synthesis/whippersnapper/pipeline/output_2/main.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_2/main16.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_2/obt_commands.txt create mode 100644 synthesis/whippersnapper/pipeline/output_2/pisces_rules.txt create mode 100755 synthesis/whippersnapper/pipeline/output_2/run_switch.sh create mode 100755 synthesis/whippersnapper/pipeline/output_2/run_test.py create mode 100644 synthesis/whippersnapper/pipeline/output_2/test.pcap create mode 100644 synthesis/whippersnapper/pipeline/output_3/commands.txt create mode 100644 synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt create mode 100644 synthesis/whippersnapper/pipeline/output_3/fvs.txt create mode 100644 synthesis/whippersnapper/pipeline/output_3/main.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_3/main16.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_3/obt_commands.txt create mode 100644 synthesis/whippersnapper/pipeline/output_3/pisces_rules.txt create mode 100755 synthesis/whippersnapper/pipeline/output_3/run_switch.sh create mode 100755 synthesis/whippersnapper/pipeline/output_3/run_test.py create mode 100644 synthesis/whippersnapper/pipeline/output_3/test.pcap create mode 100644 synthesis/whippersnapper/pipeline/output_4/commands.txt create mode 100644 synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt create mode 100644 synthesis/whippersnapper/pipeline/output_4/fvs.txt create mode 100644 synthesis/whippersnapper/pipeline/output_4/main.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_4/main16.p4 create mode 100644 synthesis/whippersnapper/pipeline/output_4/obt_commands.txt create mode 100644 synthesis/whippersnapper/pipeline/output_4/pisces_rules.txt create mode 100755 synthesis/whippersnapper/pipeline/output_4/run_switch.sh create mode 100755 synthesis/whippersnapper/pipeline/output_4/run_test.py create mode 100644 synthesis/whippersnapper/pipeline/output_4/test.pcap create mode 100644 synthesis/whippersnapper/set-field/output_1/commands.txt create mode 100644 synthesis/whippersnapper/set-field/output_1/commands_no_def.txt create mode 100644 synthesis/whippersnapper/set-field/output_1/fvs.txt create mode 100644 synthesis/whippersnapper/set-field/output_1/main.p4 create mode 100644 synthesis/whippersnapper/set-field/output_1/main16.p4 create mode 100644 synthesis/whippersnapper/set-field/output_1/obt_commands.txt create mode 100644 synthesis/whippersnapper/set-field/output_1/pisces_rules.txt create mode 100755 synthesis/whippersnapper/set-field/output_1/run_switch.sh create mode 100755 synthesis/whippersnapper/set-field/output_1/run_test.py create mode 100644 synthesis/whippersnapper/set-field/output_1/test.pcap create mode 100644 synthesis/whippersnapper/set-field/output_2/commands.txt create mode 100644 synthesis/whippersnapper/set-field/output_2/commands_no_def.txt create mode 100644 synthesis/whippersnapper/set-field/output_2/fvs.txt create mode 100644 synthesis/whippersnapper/set-field/output_2/main.p4 create mode 100644 synthesis/whippersnapper/set-field/output_2/main16.p4 create mode 100644 synthesis/whippersnapper/set-field/output_2/obt_commands.txt create mode 100644 synthesis/whippersnapper/set-field/output_2/pisces_rules.txt create mode 100755 synthesis/whippersnapper/set-field/output_2/run_switch.sh create mode 100755 synthesis/whippersnapper/set-field/output_2/run_test.py create mode 100644 synthesis/whippersnapper/set-field/output_2/test.pcap create mode 100644 synthesis/whippersnapper/set-field/output_3/commands create mode 100644 synthesis/whippersnapper/set-field/output_3/commands.txt create mode 100644 synthesis/whippersnapper/set-field/output_3/commands_no_def.txt create mode 100644 synthesis/whippersnapper/set-field/output_3/fvs.txt create mode 100644 synthesis/whippersnapper/set-field/output_3/main.p4 create mode 100644 synthesis/whippersnapper/set-field/output_3/main16.p4 create mode 100644 synthesis/whippersnapper/set-field/output_3/obt_commands.txt create mode 100644 synthesis/whippersnapper/set-field/output_3/pisces_rules.txt create mode 100755 synthesis/whippersnapper/set-field/output_3/run_switch.sh create mode 100755 synthesis/whippersnapper/set-field/output_3/run_test.py create mode 100644 synthesis/whippersnapper/set-field/output_3/test.pcap create mode 100644 synthesis/whippersnapper/set-field/output_4/commands.txt create mode 100644 synthesis/whippersnapper/set-field/output_4/commands_no_def.txt create mode 100644 synthesis/whippersnapper/set-field/output_4/fvs.txt create mode 100644 synthesis/whippersnapper/set-field/output_4/main.p4 create mode 100644 synthesis/whippersnapper/set-field/output_4/main16.p4 create mode 100644 synthesis/whippersnapper/set-field/output_4/obt_commands.txt create mode 100644 synthesis/whippersnapper/set-field/output_4/pisces_rules.txt create mode 100755 synthesis/whippersnapper/set-field/output_4/run_switch.sh create mode 100755 synthesis/whippersnapper/set-field/output_4/run_test.py create mode 100644 synthesis/whippersnapper/set-field/output_4/test.pcap diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 8d94bd38..0b389ceb 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -5,6 +5,22 @@ import subprocess import sys +# fvs gen + +def pipeline_fvs(i): + return "hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48\nstandard_metadata.egress_spec,standard_metadata.egress_spec,9" + +def set_field_fvs(mx): + fvs = "hdr.ptp.reserved2,hdr.ptp.reserved2,8\n"; + for i in list(range(0, mx)): + fvs += "hdr.header_0.field_" + str(i) + ",hdr.header_0.field_" + str(i) + ",16\n" + return fvs; + +# whippersnapper commands +def whippersnapper_cmds(): + return { "set-field" : (["--operations"], [], set_field_fvs) + , "pipeline" : (["--tables"], ["--table-size", "16"], pipeline_fvs) } + # generate the OBT, and the corresponding rules def rewrite_cmd(cmd): try: @@ -14,30 +30,25 @@ def rewrite_cmd(cmd): fparams = ";".join(fparams); pieces[2] = fparams; #pieces = list(map(lambda s : s[s.find("0x"):] if s.find("0x") != -1 else s, pieces)); - print("pieces" + str(pieces)); fcmd = ",".join(pieces); - print(fcmd) return fcmd; except: return cmd; def rewrite_cmds(cmds): - print("cmds\n" + cmds + "\n"); fcmds = list(map(rewrite_cmd, cmds.split("\n"))); fmcds = "\n".join(fcmds); - print("fcmds = " + str(fcmds)); return fmcds; -def rules_for_obt(fn): +def rules_for_obt(fn, fvs): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; assume_file = "whippersnapper/empty_assume.txt"; commands_file = "output/commands.txt"; commands_no_def_file = "output/commands_no_def.txt" - with open(fvs_file, 'w') as fvs: - fvs.write("hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48\n"); - fvs.write("standard_metadata.egress_spec,standard_metadata.egress_spec,9") + with open(fvs_file, 'w') as fvsf: + fvsf.write(fvs); with open(commands_file, 'r') as cmds: with open(commands_no_def_file, 'w') as cmdnd: @@ -57,27 +68,28 @@ def rules_for_obt(fn): #except: # print("no commands written"); -def run_whippersnapper(mx): - if not os.path.isdir("whippersnapper/pipelines"): - os.mkdir("whippersnapper/pipelines") +def run_whippersnapper(ws_cmd, mx): + if not os.path.isdir("whippersnapper/" + ws_cmd): + os.mkdir("whippersnapper/" + ws_cmd) for i in list(range(1, int(mx))): print(str(i)); - subprocess.run(["p4benchmark", "--feature", "pipeline", "--tables", str(i), "--table-size", "16"]); + (cmd_line1, cmd_line2, fvs) = whippersnapper_cmds()[ws_cmd]; + subprocess.run(["p4benchmark", "--feature", ws_cmd] + cmd_line1 + [str(i)] + cmd_line2); subprocess.run(["p4test", "--p4v", "14", "--pp", "output/main16.p4", "output/main.p4"]); - rules_for_obt("output"); + rules_for_obt("output", fvs(i)); - shutil.move("output", "whippersnapper/pipelines/output_" + str(i)); + shutil.move("output", "whippersnapper/" + ws_cmd + "/output_" + str(i)); # run the actual evaluation, using OBT as the logical program -def run_avenir(): +def run_avenir(ws_cmd): mx = 1; - while os.path.isdir("whippersnapper/pipelines/output_" + str(mx)): + while os.path.isdir("whippersnapper/" + ws_cmd + "/output_" + str(mx)): mx += 1; for i in list(range(1, int(mx))): - output = "whippersnapper/pipelines/output_" + str(i) +"/"; + output = "whippersnapper/" + ws_cmd + "/output_" + str(i) +"/"; commands_file = output + "obt_commands.txt"; edits_file = "whippersnapper/empty_edits.txt"; assume_file = "whippersnapper/empty_assume.txt"; @@ -86,9 +98,10 @@ def run_avenir(): print(res); cmd = sys.argv[1]; +ws_cmd = sys.argv[2]; if cmd == "generate": - mx = sys.argv[2]; - run_whippersnapper(mx); + mx = sys.argv[3]; + run_whippersnapper(ws_cmd, mx); elif cmd == "eval": - run_avenir(); + run_avenir(ws_cmd); diff --git a/synthesis/whippersnapper/p4includes2/core.p4 b/synthesis/whippersnapper/p4includes2/core.p4 new file mode 100644 index 00000000..03576ae4 --- /dev/null +++ b/synthesis/whippersnapper/p4includes2/core.p4 @@ -0,0 +1,81 @@ +/* +Copyright 2013-present Barefoot Networks, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* This is the P4-16 core library, which declares some built-in P4 constructs using P4 */ + +#ifndef _CORE_P4_ +#define _CORE_P4_ + +/// Standard error codes. New error codes can be declared by users. +error { + NoError, /// No error. + PacketTooShort, /// Not enough bits in packet for 'extract'. + NoMatch, /// 'select' expression has no matches. + StackOutOfBounds, /// Reference to invalid element of a header stack. + HeaderTooShort, /// Extracting too many bits into a varbit field. + ParserTimeout /// Parser execution time limit exceeded. +} + +extern packet_in { + /// Read a header from the packet into a fixed-sized header @hdr and advance the cursor. + /// May trigger error PacketTooShort or StackOutOfBounds. + /// @T must be a fixed-size header type + void extract(out T hdr); + /// Read bits from the packet into a variable-sized header @variableSizeHeader + /// and advance the cursor. + /// @T must be a header containing exactly 1 varbit field. + /// May trigger errors PacketTooShort, StackOutOfBounds, or HeaderTooShort. + void extract(out T variableSizeHeader, + in bit<32> variableFieldSizeInBits); + /// Read bits from the packet without advancing the cursor. + /// @returns: the bits read from the packet. + /// T may be an arbitrary fixed-size type. + T lookahead(); + /// Advance the packet cursor by the specified number of bits. + void advance(in bit<32> sizeInBits); + /// @return packet length in bytes. This method may be unavailable on + /// some target architectures. + bit<32> length(); +} + +extern packet_out { + /// Write @hdr into the output packet, advancing cursor. + /// @T can be a header type, a header stack, a header_union, or a struct + /// containing fields with such types. + void emit(in T hdr); +} + +// TODO: remove from this file, convert to built-in +/// Check a predicate @check in the parser; if the predicate is true do nothing, +/// otherwise set the parser error to @toSignal, and transition to the `reject` state. +extern void verify(in bool check, in error toSignal); + +/// Built-in action that does nothing. +action NoAction() {} + +/// Standard match kinds for table key fields. +/// Some architectures may not support all these match kinds. +/// Architectures can declare additional match kinds. +match_kind { + /// Match bits exactly. + exact, + /// Ternary match, using a mask. + ternary, + /// Longest-prefix match. + lpm +} + +#endif /* _CORE_P4_ */ diff --git a/synthesis/whippersnapper/p4includes2/v1model.p4 b/synthesis/whippersnapper/p4includes2/v1model.p4 new file mode 100644 index 00000000..c10d2d79 --- /dev/null +++ b/synthesis/whippersnapper/p4includes2/v1model.p4 @@ -0,0 +1,261 @@ +/* +Copyright 2013-present Barefoot Networks, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* P4-16 declaration of the P4 v1.0 switch model */ + +#ifndef _V1_MODEL_P4_ +#define _V1_MODEL_P4_ + +#include "core.p4" + +match_kind { + range, + // Used for implementing dynamic_action_selection + selector +} + +// Are these correct? +@metadata @name("standard_metadata") +struct standard_metadata_t { + bit<9> ingress_port; + bit<9> egress_spec; + bit<9> egress_port; + bit<32> clone_spec; + bit<32> instance_type; + // The drop and recirculate_port fields are not used at all by the + // behavioral-model simple_switch software switch as of September + // 2018, and perhaps never was. They may be considered + // deprecated, at least for that P4 target device. simple_switch + // uses the value of the egress_spec field to determine whether a + // packet is dropped or not, and it is recommended to use the + // P4_14 drop() primitive action, or the P4_16 + v1model + // mark_to_drop() primitive action, to cause that field to be + // changed so the packet will be dropped. + bit<1> drop; + bit<16> recirculate_port; + bit<32> packet_length; + // + // @alias is used to generate the field_alias section of the BMV2 JSON. + // Field alias creates a mapping from the metadata name in P4 program to + // the behavioral model's internal metadata name. Here we use it to + // expose all metadata supported by simple switch to the user through + // standard_metadata_t. + // + // flattening fields that exist in bmv2-ss + // queueing metadata + @alias("queueing_metadata.enq_timestamp") bit<32> enq_timestamp; + @alias("queueing_metadata.enq_qdepth") bit<19> enq_qdepth; + @alias("queueing_metadata.deq_timedelta") bit<32> deq_timedelta; + @alias("queueing_metadata.deq_qdepth") bit<19> deq_qdepth; + // intrinsic metadata + @alias("intrinsic_metadata.ingress_global_timestamp") bit<48> ingress_global_timestamp; + @alias("intrinsic_metadata.egress_global_timestamp") bit<48> egress_global_timestamp; + @alias("intrinsic_metadata.lf_field_list") bit<32> lf_field_list; + @alias("intrinsic_metadata.mcast_grp") bit<16> mcast_grp; + @alias("intrinsic_metadata.resubmit_flag") bit<32> resubmit_flag; + @alias("intrinsic_metadata.egress_rid") bit<16> egress_rid; + /// Indicates that a verify_checksum() method has failed. + // 1 if a checksum error was found, otherwise 0. + bit<1> checksum_error; + @alias("intrinsic_metadata.recirculate_flag") bit<32> recirculate_flag; + /// Error produced by parsing + error parser_error; +} + +enum CounterType { + packets, + bytes, + packets_and_bytes +} + +enum MeterType { + packets, + bytes +} + +extern counter { + counter(bit<32> size, CounterType type); + void count(in bit<32> index); +} + +extern direct_counter { + direct_counter(CounterType type); + void count(); +} + +extern meter { + meter(bit<32> size, MeterType type); + void execute_meter(in bit<32> index, out T result); +} + +extern direct_meter { + direct_meter(MeterType type); + void read(out T result); +} + +extern register { + register(bit<32> size); + void read(out T result, in bit<32> index); + void write(in bit<32> index, in T value); +} + +// used as table implementation attribute +extern action_profile { + action_profile(bit<32> size); +} + +// Get a random number in the range lo..hi +extern void random(out T result, in T lo, in T hi); +// If the type T is a named struct, the name is used +// to generate the control-plane API. +extern void digest(in bit<32> receiver, in T data); + +enum HashAlgorithm { + crc32, + crc32_custom, + crc16, + crc16_custom, + random, + identity, + csum16, + xor16 +} + +extern void mark_to_drop(); +extern void hash(out O result, in HashAlgorithm algo, in T base, in D data, in M max); + +extern action_selector { + action_selector(HashAlgorithm algorithm, bit<32> size, bit<32> outputWidth); +} + +enum CloneType { + I2E, + E2E +} + +@deprecated("Please use verify_checksum/update_checksum instead.") +extern Checksum16 { + Checksum16(); + bit<16> get(in D data); +} + +/** +Verifies the checksum of the supplied data. +If this method detects that a checksum of the data is not correct it +sets the standard_metadata checksum_error bit. +@param T Must be a tuple type where all the fields are bit-fields or varbits. + The total dynamic length of the fields is a multiple of the output size. +@param O Checksum type; must be bit type. +@param condition If 'false' the verification always succeeds. +@param data Data whose checksum is verified. +@param checksum Expected checksum of the data; note that is must be a left-value. +@param algo Algorithm to use for checksum (not all algorithms may be supported). + Must be a compile-time constant. +*/ +extern void verify_checksum(in bool condition, in T data, inout O checksum, HashAlgorithm algo); +/** +Computes the checksum of the supplied data. +@param T Must be a tuple type where all the fields are bit-fields or varbits. + The total dynamic length of the fields is a multiple of the output size. +@param O Output type; must be bit type. +@param condition If 'false' the checksum is not changed +@param data Data whose checksum is computed. +@param checksum Checksum of the data. +@param algo Algorithm to use for checksum (not all algorithms may be supported). + Must be a compile-time constant. +*/ +extern void update_checksum(in bool condition, in T data, inout O checksum, HashAlgorithm algo); + +/** +Verifies the checksum of the supplied data including the payload. +The payload is defined as "all bytes of the packet which were not parsed by the parser". +If this method detects that a checksum of the data is not correct it +sets the standard_metadata checksum_error bit. +@param T Must be a tuple type where all the fields are bit-fields or varbits. + The total dynamic length of the fields is a multiple of the output size. +@param O Checksum type; must be bit type. +@param condition If 'false' the verification always succeeds. +@param data Data whose checksum is verified. +@param checksum Expected checksum of the data; note that is must be a left-value. +@param algo Algorithm to use for checksum (not all algorithms may be supported). + Must be a compile-time constant. +*/ +extern void verify_checksum_with_payload(in bool condition, in T data, inout O checksum, HashAlgorithm algo); +/** +Computes the checksum of the supplied data including the payload. +The payload is defined as "all bytes of the packet which were not parsed by the parser". +@param T Must be a tuple type where all the fields are bit-fields or varbits. + The total dynamic length of the fields is a multiple of the output size. +@param O Output type; must be bit type. +@param condition If 'false' the checksum is not changed +@param data Data whose checksum is computed. +@param checksum Checksum of the data. +@param algo Algorithm to use for checksum (not all algorithms may be supported). + Must be a compile-time constant. +*/ +extern void update_checksum_with_payload(in bool condition, in T data, inout O checksum, HashAlgorithm algo); + +extern void resubmit(in T data); +extern void recirculate(in T data); +extern void clone(in CloneType type, in bit<32> session); +extern void clone3(in CloneType type, in bit<32> session, in T data); + +extern void truncate(in bit<32> length); + +// The name 'standard_metadata' is reserved + +// Architecture. +// M should be a struct of structs +// H should be a struct of headers or stacks + +parser Parser(packet_in b, + out H parsedHdr, + inout M meta, + inout standard_metadata_t standard_metadata); + +/* The only legal statements in the implementation of the +VerifyChecksum control are: block statements, calls to the +verify_checksum and verify_checksum_with_payload methods, +and return statements. */ +control VerifyChecksum(inout H hdr, + inout M meta); +@pipeline +control Ingress(inout H hdr, + inout M meta, + inout standard_metadata_t standard_metadata); +@pipeline +control Egress(inout H hdr, + inout M meta, + inout standard_metadata_t standard_metadata); + +/* The only legal statements in the implementation of the +ComputeChecksum control are: block statements, calls to the +update_checksum and update_checksum_with_payload methods, +and return statements. */ +control ComputeChecksum(inout H hdr, + inout M meta); +@deparser +control Deparser(packet_out b, in H hdr); + +package V1Switch(Parser p, + VerifyChecksum vr, + Ingress ig, + Egress eg, + ComputeChecksum ck, + Deparser dep + ); + +#endif /* _V1_MODEL_P4_ */ diff --git a/synthesis/whippersnapper/pipeline/output_1/commands.txt b/synthesis/whippersnapper/pipeline/output_1/commands.txt new file mode 100644 index 00000000..e946a6c4 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/commands.txt @@ -0,0 +1,3 @@ +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt new file mode 100644 index 00000000..43009c21 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt @@ -0,0 +1,2 @@ +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_1/fvs.txt b/synthesis/whippersnapper/pipeline/output_1/fvs.txt new file mode 100644 index 00000000..6ae05b3c --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/fvs.txt @@ -0,0 +1,2 @@ +hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 +standard_metadata.egress_spec,standard_metadata.egress_spec,9 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_1/main.p4 b/synthesis/whippersnapper/pipeline/output_1/main.p4 new file mode 100644 index 00000000..be33cb88 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/main.p4 @@ -0,0 +1,114 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header ethernet_t ethernet; + +parser start { + return parse_ethernet; +} + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_IPV4 : parse_ipv4; + default : ingress; + } +} +header_type ipv4_t { + fields { + version : 4; + ihl : 4; + diffserv : 8; + totalLen : 16; + identification : 16; + flags : 3; + fragOffset : 13; + ttl : 8; + protocol : 8; + hdrChecksum : 16; + srcAddr : 32; + dstAddr : 32; + } +} +header ipv4_t ipv4; + +parser parse_ipv4 { + extract(ipv4); + return select(latest.protocol) { + TCP_PROTOCOL : parse_tcp; + UDP_PROTOCOL : parse_udp; + default : ingress; + } +} +header_type tcp_t { + fields { + srcPort : 16; + dstPort : 16; + seqNo : 32; + ackNo : 32; + dataOffset : 4; + res : 3; + ecn : 3; + ctrl : 6; + window : 16; + checksum : 16; + urgentPtr : 16; + } +} +header tcp_t tcp; + +parser parse_tcp { + extract(tcp); + return ingress; +} +header_type udp_t { + fields { + srcPort : 16; + dstPort : 16; + length_ : 16; + checksum : 16; + } +} +header udp_t udp; + +parser parse_udp { + extract(udp); + return select(latest.dstPort) { + default : ingress; + + } +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action _nop() { + +} +control ingress { + apply(forward_table); + +} diff --git a/synthesis/whippersnapper/pipeline/output_1/main16.p4 b/synthesis/whippersnapper/pipeline/output_1/main16.p4 new file mode 100644 index 00000000..a54427ea --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/main16.p4 @@ -0,0 +1,139 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<8> diffserv; + bit<16> totalLen; + bit<16> identification; + bit<3> flags; + bit<13> fragOffset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdrChecksum; + bit<32> srcAddr; + bit<32> dstAddr; +} + +header tcp_t { + bit<16> srcPort; + bit<16> dstPort; + bit<32> seqNo; + bit<32> ackNo; + bit<4> dataOffset; + bit<3> res; + bit<3> ecn; + bit<6> ctrl; + bit<16> window; + bit<16> checksum; + bit<16> urgentPtr; +} + +header udp_t { + bit<16> srcPort; + bit<16> dstPort; + bit<16> length_; + bit<16> checksum; +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".ipv4") + ipv4_t ipv4; + @name(".tcp") + tcp_t tcp; + @name(".udp") + udp_t udp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x800: parse_ipv4; + default: accept; + } + } + @name(".parse_ipv4") state parse_ipv4 { + packet.extract(hdr.ipv4); + transition select(hdr.ipv4.protocol) { + 8w0x6: parse_tcp; + 8w0x11: parse_udp; + default: accept; + } + } + @name(".parse_tcp") state parse_tcp { + packet.extract(hdr.tcp); + transition accept; + } + @name(".parse_udp") state parse_udp { + packet.extract(hdr.udp); + transition select(hdr.udp.dstPort) { + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward(bit<9> port) { + standard_metadata.egress_spec = port; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name(".forward_table") table forward_table { + actions = { + forward; + _drop; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + apply { + forward_table.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ipv4); + packet.emit(hdr.udp); + packet.emit(hdr.tcp); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt new file mode 100644 index 00000000..361653ed --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt @@ -0,0 +1,2 @@ +ADD,OneBigTable,0xcc47aa32534#48,0x1#9,0 +ADD,OneBigTable,0xcc47aa32535#48,0x2#9,0 diff --git a/synthesis/whippersnapper/pipeline/output_1/pisces_rules.txt b/synthesis/whippersnapper/pipeline/output_1/pisces_rules.txt new file mode 100644 index 00000000..dad6805b --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/pisces_rules.txt @@ -0,0 +1,11 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/pipeline/output_1/run_switch.sh b/synthesis/whippersnapper/pipeline/output_1/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_1/run_test.py b/synthesis/whippersnapper/pipeline/output_1/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_1/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/pipeline/output_1/test.pcap b/synthesis/whippersnapper/pipeline/output_1/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..4cc27d5b11995423b883ca8898365c392e10ae34 GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2}YKN}YxHir|!0SfROsamXR3MNfB7+e_`K7o`u2qwSc XVqoIuVqjqUcizT>;oe%Hmf;8h6!H@_ literal 0 HcmV?d00001 diff --git a/synthesis/whippersnapper/pipeline/output_2/commands.txt b/synthesis/whippersnapper/pipeline/output_2/commands.txt new file mode 100644 index 00000000..80386dc1 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/commands.txt @@ -0,0 +1,5 @@ +table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 +table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt new file mode 100644 index 00000000..94a35c37 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt @@ -0,0 +1,4 @@ +table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 +table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_2/fvs.txt b/synthesis/whippersnapper/pipeline/output_2/fvs.txt new file mode 100644 index 00000000..6ae05b3c --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/fvs.txt @@ -0,0 +1,2 @@ +hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 +standard_metadata.egress_spec,standard_metadata.egress_spec,9 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_2/main.p4 b/synthesis/whippersnapper/pipeline/output_2/main.p4 new file mode 100644 index 00000000..67c339c1 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/main.p4 @@ -0,0 +1,126 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header ethernet_t ethernet; + +parser start { + return parse_ethernet; +} + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_IPV4 : parse_ipv4; + default : ingress; + } +} +header_type ipv4_t { + fields { + version : 4; + ihl : 4; + diffserv : 8; + totalLen : 16; + identification : 16; + flags : 3; + fragOffset : 13; + ttl : 8; + protocol : 8; + hdrChecksum : 16; + srcAddr : 32; + dstAddr : 32; + } +} +header ipv4_t ipv4; + +parser parse_ipv4 { + extract(ipv4); + return select(latest.protocol) { + TCP_PROTOCOL : parse_tcp; + UDP_PROTOCOL : parse_udp; + default : ingress; + } +} +header_type tcp_t { + fields { + srcPort : 16; + dstPort : 16; + seqNo : 32; + ackNo : 32; + dataOffset : 4; + res : 3; + ecn : 3; + ctrl : 6; + window : 16; + checksum : 16; + urgentPtr : 16; + } +} +header tcp_t tcp; + +parser parse_tcp { + extract(tcp); + return ingress; +} +header_type udp_t { + fields { + srcPort : 16; + dstPort : 16; + length_ : 16; + checksum : 16; + } +} +header udp_t udp; + +parser parse_udp { + extract(udp); + return select(latest.dstPort) { + default : ingress; + + } +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action _nop() { + +} +action forward1(_port) { +modify_field(standard_metadata.egress_spec, _port); +} +table table_1 { + reads { + ethernet.dstAddr : exact; + } actions { + forward1; + } + size : 16; +} +control ingress { + apply(forward_table); + apply(table_1); + +} diff --git a/synthesis/whippersnapper/pipeline/output_2/main16.p4 b/synthesis/whippersnapper/pipeline/output_2/main16.p4 new file mode 100644 index 00000000..c124953b --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/main16.p4 @@ -0,0 +1,152 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<8> diffserv; + bit<16> totalLen; + bit<16> identification; + bit<3> flags; + bit<13> fragOffset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdrChecksum; + bit<32> srcAddr; + bit<32> dstAddr; +} + +header tcp_t { + bit<16> srcPort; + bit<16> dstPort; + bit<32> seqNo; + bit<32> ackNo; + bit<4> dataOffset; + bit<3> res; + bit<3> ecn; + bit<6> ctrl; + bit<16> window; + bit<16> checksum; + bit<16> urgentPtr; +} + +header udp_t { + bit<16> srcPort; + bit<16> dstPort; + bit<16> length_; + bit<16> checksum; +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".ipv4") + ipv4_t ipv4; + @name(".tcp") + tcp_t tcp; + @name(".udp") + udp_t udp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x800: parse_ipv4; + default: accept; + } + } + @name(".parse_ipv4") state parse_ipv4 { + packet.extract(hdr.ipv4); + transition select(hdr.ipv4.protocol) { + 8w0x6: parse_tcp; + 8w0x11: parse_udp; + default: accept; + } + } + @name(".parse_tcp") state parse_tcp { + packet.extract(hdr.tcp); + transition accept; + } + @name(".parse_udp") state parse_udp { + packet.extract(hdr.udp); + transition select(hdr.udp.dstPort) { + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward(bit<9> port) { + standard_metadata.egress_spec = port; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name(".forward1") action forward1(bit<9> _port) { + standard_metadata.egress_spec = _port; + } + @name(".forward_table") table forward_table { + actions = { + forward; + _drop; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + @name(".table_1") table table_1 { + actions = { + forward1; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 16; + } + apply { + forward_table.apply(); + table_1.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ipv4); + packet.emit(hdr.udp); + packet.emit(hdr.tcp); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt new file mode 100644 index 00000000..dee10d9b --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt @@ -0,0 +1,2 @@ +ADD,OneBigTable,0xcc47aa32534#48;0x0#1,0x1#9,6 +ADD,OneBigTable,0xcc47aa32535#48;0x0#1,0x2#9,14 diff --git a/synthesis/whippersnapper/pipeline/output_2/pisces_rules.txt b/synthesis/whippersnapper/pipeline/output_2/pisces_rules.txt new file mode 100644 index 00000000..fcf185af --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/pisces_rules.txt @@ -0,0 +1,27 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/pipeline/output_2/run_switch.sh b/synthesis/whippersnapper/pipeline/output_2/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_2/run_test.py b/synthesis/whippersnapper/pipeline/output_2/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_2/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/pipeline/output_2/test.pcap b/synthesis/whippersnapper/pipeline/output_2/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..3dbc7448eeb7adf0d56e11edc323015bb06be22e GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2~@I2#v#$QURN;s7zvk*dY2reM;9gTa-7;S)&IK`{9h Z7XuSN7Xt&+zw 1 +table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 +table_add table_2 forward2 0C:C4:7A:A3:25:34 => 1 +table_add table_2 forward2 0C:C4:7A:A3:25:35 => 2 +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt new file mode 100644 index 00000000..47bcb238 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt @@ -0,0 +1,6 @@ +table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 +table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 +table_add table_2 forward2 0C:C4:7A:A3:25:34 => 1 +table_add table_2 forward2 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_3/fvs.txt b/synthesis/whippersnapper/pipeline/output_3/fvs.txt new file mode 100644 index 00000000..6ae05b3c --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_3/fvs.txt @@ -0,0 +1,2 @@ +hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 +standard_metadata.egress_spec,standard_metadata.egress_spec,9 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_3/main.p4 b/synthesis/whippersnapper/pipeline/output_3/main.p4 new file mode 100644 index 00000000..20504bb0 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_3/main.p4 @@ -0,0 +1,138 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header ethernet_t ethernet; + +parser start { + return parse_ethernet; +} + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_IPV4 : parse_ipv4; + default : ingress; + } +} +header_type ipv4_t { + fields { + version : 4; + ihl : 4; + diffserv : 8; + totalLen : 16; + identification : 16; + flags : 3; + fragOffset : 13; + ttl : 8; + protocol : 8; + hdrChecksum : 16; + srcAddr : 32; + dstAddr : 32; + } +} +header ipv4_t ipv4; + +parser parse_ipv4 { + extract(ipv4); + return select(latest.protocol) { + TCP_PROTOCOL : parse_tcp; + UDP_PROTOCOL : parse_udp; + default : ingress; + } +} +header_type tcp_t { + fields { + srcPort : 16; + dstPort : 16; + seqNo : 32; + ackNo : 32; + dataOffset : 4; + res : 3; + ecn : 3; + ctrl : 6; + window : 16; + checksum : 16; + urgentPtr : 16; + } +} +header tcp_t tcp; + +parser parse_tcp { + extract(tcp); + return ingress; +} +header_type udp_t { + fields { + srcPort : 16; + dstPort : 16; + length_ : 16; + checksum : 16; + } +} +header udp_t udp; + +parser parse_udp { + extract(udp); + return select(latest.dstPort) { + default : ingress; + + } +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action _nop() { + +} +action forward1(_port) { +modify_field(standard_metadata.egress_spec, _port); +} +table table_1 { + reads { + ethernet.dstAddr : exact; + } actions { + forward1; + } + size : 16; +} +action forward2(_port) { +modify_field(standard_metadata.egress_spec, _port); +} +table table_2 { + reads { + ethernet.dstAddr : exact; + } actions { + forward2; + } + size : 16; +} +control ingress { + apply(forward_table); + apply(table_1); + apply(table_2); + +} diff --git a/synthesis/whippersnapper/pipeline/output_3/main16.p4 b/synthesis/whippersnapper/pipeline/output_3/main16.p4 new file mode 100644 index 00000000..2f350e41 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_3/main16.p4 @@ -0,0 +1,165 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<8> diffserv; + bit<16> totalLen; + bit<16> identification; + bit<3> flags; + bit<13> fragOffset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdrChecksum; + bit<32> srcAddr; + bit<32> dstAddr; +} + +header tcp_t { + bit<16> srcPort; + bit<16> dstPort; + bit<32> seqNo; + bit<32> ackNo; + bit<4> dataOffset; + bit<3> res; + bit<3> ecn; + bit<6> ctrl; + bit<16> window; + bit<16> checksum; + bit<16> urgentPtr; +} + +header udp_t { + bit<16> srcPort; + bit<16> dstPort; + bit<16> length_; + bit<16> checksum; +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".ipv4") + ipv4_t ipv4; + @name(".tcp") + tcp_t tcp; + @name(".udp") + udp_t udp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x800: parse_ipv4; + default: accept; + } + } + @name(".parse_ipv4") state parse_ipv4 { + packet.extract(hdr.ipv4); + transition select(hdr.ipv4.protocol) { + 8w0x6: parse_tcp; + 8w0x11: parse_udp; + default: accept; + } + } + @name(".parse_tcp") state parse_tcp { + packet.extract(hdr.tcp); + transition accept; + } + @name(".parse_udp") state parse_udp { + packet.extract(hdr.udp); + transition select(hdr.udp.dstPort) { + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward(bit<9> port) { + standard_metadata.egress_spec = port; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name(".forward1") action forward1(bit<9> _port) { + standard_metadata.egress_spec = _port; + } + @name(".forward2") action forward2(bit<9> _port) { + standard_metadata.egress_spec = _port; + } + @name(".forward_table") table forward_table { + actions = { + forward; + _drop; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + @name(".table_1") table table_1 { + actions = { + forward1; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 16; + } + @name(".table_2") table table_2 { + actions = { + forward2; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 16; + } + apply { + forward_table.apply(); + table_1.apply(); + table_2.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ipv4); + packet.emit(hdr.udp); + packet.emit(hdr.tcp); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt new file mode 100644 index 00000000..1005089e --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt @@ -0,0 +1,2 @@ +ADD,OneBigTable,0xcc47aa32534#48;0x0#1,0x1#9,4 +ADD,OneBigTable,0xcc47aa32535#48;0x0#1,0x2#9,4 diff --git a/synthesis/whippersnapper/pipeline/output_3/pisces_rules.txt b/synthesis/whippersnapper/pipeline/output_3/pisces_rules.txt new file mode 100644 index 00000000..8f04831c --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_3/pisces_rules.txt @@ -0,0 +1,43 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/pipeline/output_3/run_switch.sh b/synthesis/whippersnapper/pipeline/output_3/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_3/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_3/run_test.py b/synthesis/whippersnapper/pipeline/output_3/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_3/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/pipeline/output_3/test.pcap b/synthesis/whippersnapper/pipeline/output_3/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..8e25bd829cabee58014b4726e219d4044c004ab5 GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2~@I2#w=agh(g0SfROsamXR3MNfB7+e_`K7o`u2qwSc ZVqoIuVqjqUcizT>;oe$Km`THn1^|ZB6QTeB literal 0 HcmV?d00001 diff --git a/synthesis/whippersnapper/pipeline/output_4/commands.txt b/synthesis/whippersnapper/pipeline/output_4/commands.txt new file mode 100644 index 00000000..6d922873 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/commands.txt @@ -0,0 +1,9 @@ +table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 +table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 +table_add table_2 forward2 0C:C4:7A:A3:25:34 => 1 +table_add table_2 forward2 0C:C4:7A:A3:25:35 => 2 +table_add table_3 forward3 0C:C4:7A:A3:25:34 => 1 +table_add table_3 forward3 0C:C4:7A:A3:25:35 => 2 +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt new file mode 100644 index 00000000..c17f785c --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt @@ -0,0 +1,8 @@ +table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 +table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 +table_add table_2 forward2 0C:C4:7A:A3:25:34 => 1 +table_add table_2 forward2 0C:C4:7A:A3:25:35 => 2 +table_add table_3 forward3 0C:C4:7A:A3:25:34 => 1 +table_add table_3 forward3 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_4/fvs.txt b/synthesis/whippersnapper/pipeline/output_4/fvs.txt new file mode 100644 index 00000000..6ae05b3c --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/fvs.txt @@ -0,0 +1,2 @@ +hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 +standard_metadata.egress_spec,standard_metadata.egress_spec,9 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_4/main.p4 b/synthesis/whippersnapper/pipeline/output_4/main.p4 new file mode 100644 index 00000000..39e9d837 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/main.p4 @@ -0,0 +1,150 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header ethernet_t ethernet; + +parser start { + return parse_ethernet; +} + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_IPV4 : parse_ipv4; + default : ingress; + } +} +header_type ipv4_t { + fields { + version : 4; + ihl : 4; + diffserv : 8; + totalLen : 16; + identification : 16; + flags : 3; + fragOffset : 13; + ttl : 8; + protocol : 8; + hdrChecksum : 16; + srcAddr : 32; + dstAddr : 32; + } +} +header ipv4_t ipv4; + +parser parse_ipv4 { + extract(ipv4); + return select(latest.protocol) { + TCP_PROTOCOL : parse_tcp; + UDP_PROTOCOL : parse_udp; + default : ingress; + } +} +header_type tcp_t { + fields { + srcPort : 16; + dstPort : 16; + seqNo : 32; + ackNo : 32; + dataOffset : 4; + res : 3; + ecn : 3; + ctrl : 6; + window : 16; + checksum : 16; + urgentPtr : 16; + } +} +header tcp_t tcp; + +parser parse_tcp { + extract(tcp); + return ingress; +} +header_type udp_t { + fields { + srcPort : 16; + dstPort : 16; + length_ : 16; + checksum : 16; + } +} +header udp_t udp; + +parser parse_udp { + extract(udp); + return select(latest.dstPort) { + default : ingress; + + } +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action _nop() { + +} +action forward1(_port) { +modify_field(standard_metadata.egress_spec, _port); +} +table table_1 { + reads { + ethernet.dstAddr : exact; + } actions { + forward1; + } + size : 16; +} +action forward2(_port) { +modify_field(standard_metadata.egress_spec, _port); +} +table table_2 { + reads { + ethernet.dstAddr : exact; + } actions { + forward2; + } + size : 16; +} +action forward3(_port) { +modify_field(standard_metadata.egress_spec, _port); +} +table table_3 { + reads { + ethernet.dstAddr : exact; + } actions { + forward3; + } + size : 16; +} +control ingress { + apply(forward_table); + apply(table_1); + apply(table_2); + apply(table_3); + +} diff --git a/synthesis/whippersnapper/pipeline/output_4/main16.p4 b/synthesis/whippersnapper/pipeline/output_4/main16.p4 new file mode 100644 index 00000000..ef7a57a7 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/main16.p4 @@ -0,0 +1,178 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<8> diffserv; + bit<16> totalLen; + bit<16> identification; + bit<3> flags; + bit<13> fragOffset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdrChecksum; + bit<32> srcAddr; + bit<32> dstAddr; +} + +header tcp_t { + bit<16> srcPort; + bit<16> dstPort; + bit<32> seqNo; + bit<32> ackNo; + bit<4> dataOffset; + bit<3> res; + bit<3> ecn; + bit<6> ctrl; + bit<16> window; + bit<16> checksum; + bit<16> urgentPtr; +} + +header udp_t { + bit<16> srcPort; + bit<16> dstPort; + bit<16> length_; + bit<16> checksum; +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".ipv4") + ipv4_t ipv4; + @name(".tcp") + tcp_t tcp; + @name(".udp") + udp_t udp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x800: parse_ipv4; + default: accept; + } + } + @name(".parse_ipv4") state parse_ipv4 { + packet.extract(hdr.ipv4); + transition select(hdr.ipv4.protocol) { + 8w0x6: parse_tcp; + 8w0x11: parse_udp; + default: accept; + } + } + @name(".parse_tcp") state parse_tcp { + packet.extract(hdr.tcp); + transition accept; + } + @name(".parse_udp") state parse_udp { + packet.extract(hdr.udp); + transition select(hdr.udp.dstPort) { + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward(bit<9> port) { + standard_metadata.egress_spec = port; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name(".forward1") action forward1(bit<9> _port) { + standard_metadata.egress_spec = _port; + } + @name(".forward2") action forward2(bit<9> _port) { + standard_metadata.egress_spec = _port; + } + @name(".forward3") action forward3(bit<9> _port) { + standard_metadata.egress_spec = _port; + } + @name(".forward_table") table forward_table { + actions = { + forward; + _drop; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + @name(".table_1") table table_1 { + actions = { + forward1; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 16; + } + @name(".table_2") table table_2 { + actions = { + forward2; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 16; + } + @name(".table_3") table table_3 { + actions = { + forward3; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 16; + } + apply { + forward_table.apply(); + table_1.apply(); + table_2.apply(); + table_3.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ipv4); + packet.emit(hdr.udp); + packet.emit(hdr.tcp); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt new file mode 100644 index 00000000..c1d4e5b2 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt @@ -0,0 +1,2 @@ +ADD,OneBigTable,0xcc47aa32534#48;0x0#1,0x1#9,9 +ADD,OneBigTable,0xcc47aa32535#48;0x0#1,0x2#9,4 diff --git a/synthesis/whippersnapper/pipeline/output_4/pisces_rules.txt b/synthesis/whippersnapper/pipeline/output_4/pisces_rules.txt new file mode 100644 index 00000000..cde02d62 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/pisces_rules.txt @@ -0,0 +1,59 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,2)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,3)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,4)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=4,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/pipeline/output_4/run_switch.sh b/synthesis/whippersnapper/pipeline/output_4/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_4/run_test.py b/synthesis/whippersnapper/pipeline/output_4/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/pipeline/output_4/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/pipeline/output_4/test.pcap b/synthesis/whippersnapper/pipeline/output_4/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..5a69286a24a56645bb153d2afb3c0ab23d0f67a0 GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2~@JR2AP$BPfb0SfROsamXR3MNfB7+e_`K7o`u2qwSc ZVqoIuVqjqUcizT>;oe$Km`THn1^{%16OaG^ literal 0 HcmV?d00001 diff --git a/synthesis/whippersnapper/set-field/output_1/commands.txt b/synthesis/whippersnapper/set-field/output_1/commands.txt new file mode 100644 index 00000000..38e7446e --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_1/commands.txt @@ -0,0 +1,5 @@ +table_set_default test_tbl _nop +table_set_default test_tbl mod_headers +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt new file mode 100644 index 00000000..43009c21 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt @@ -0,0 +1,2 @@ +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_1/fvs.txt b/synthesis/whippersnapper/set-field/output_1/fvs.txt new file mode 100644 index 00000000..d6164533 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_1/fvs.txt @@ -0,0 +1,2 @@ +hdr.ptp.reserved2,hdr.ptp.reserved2,8 +hdr.header_0.field_0,hdr.header_0.field_0,16 diff --git a/synthesis/whippersnapper/set-field/output_1/main.p4 b/synthesis/whippersnapper/set-field/output_1/main.p4 new file mode 100644 index 00000000..3b9415ea --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_1/main.p4 @@ -0,0 +1,106 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header_type ptp_t { + fields { + transportSpecific : 4; + messageType : 4; + reserved : 4; + versionPTP : 4; + messageLength : 16; + domainNumber : 8; + reserved2 : 8; + flags : 16; + correction : 64; + reserved3 : 32; + sourcePortIdentity: 80; + sequenceId : 16; + PTPcontrol : 8; + logMessagePeriod : 8; + originTimestamp : 80; + } +} +parser start { return parse_ethernet; } +header ethernet_t ethernet; + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_PTP: parse_ptp; + default : ingress; + + } +} +header ptp_t ptp; + +parser parse_ptp { + extract(ptp); + return select(latest.reserved2) { + 1 : parse_header_0; + default : ingress; + + } +} +header_type header_0_t { + fields { + field_0 : 16; + + } +} +header header_0_t header_0; + +parser parse_header_0 { + extract(header_0); + return select(latest.field_0) { + default : ingress; + + } +} +action _nop() { + +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action mod_headers() { + modify_field(header_0.field_0, 1); + +} +table test_tbl { + reads { + ptp.reserved2 : exact; + } actions { + _nop; + mod_headers; + } + size : 4; +} +control ingress { + apply(forward_table); + apply(test_tbl); + +} diff --git a/synthesis/whippersnapper/set-field/output_1/main16.p4 b/synthesis/whippersnapper/set-field/output_1/main16.p4 new file mode 100644 index 00000000..7c1fcaaf --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_1/main16.p4 @@ -0,0 +1,133 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header header_0_t { + bit<16> field_0; +} + +header ptp_t { + bit<4> transportSpecific; + bit<4> messageType; + bit<4> reserved; + bit<4> versionPTP; + bit<16> messageLength; + bit<8> domainNumber; + bit<8> reserved2; + bit<16> flags; + bit<64> correction; + bit<32> reserved3; + bit<80> sourcePortIdentity; + bit<16> sequenceId; + bit<8> PTPcontrol; + bit<8> logMessagePeriod; + bit<80> originTimestamp; +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".header_0") + header_0_t header_0; + @name(".ptp") + ptp_t ptp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x88f7: parse_ptp; + default: accept; + } + } + @name(".parse_header_0") state parse_header_0 { + packet.extract(hdr.header_0); + transition select(hdr.header_0.field_0) { + default: accept; + } + } + @name(".parse_ptp") state parse_ptp { + packet.extract(hdr.ptp); + transition select(hdr.ptp.reserved2) { + 8w1: parse_header_0; + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward(bit<9> port) { + standard_metadata.egress_spec = port; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name("._nop") action _nop() { + } + @name(".mod_headers") action mod_headers() { + hdr.header_0.field_0 = 16w1; + } + @name(".forward_table") table forward_table { + actions = { + forward; + _drop; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + @name(".test_tbl") table test_tbl { + actions = { + _nop; + mod_headers; + } + key = { + hdr.ptp.reserved2: exact; + } + size = 4; + } + apply { + forward_table.apply(); + test_tbl.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ptp); + packet.emit(hdr.header_0); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/set-field/output_1/obt_commands.txt b/synthesis/whippersnapper/set-field/output_1/obt_commands.txt new file mode 100644 index 00000000..e69de29b diff --git a/synthesis/whippersnapper/set-field/output_1/pisces_rules.txt b/synthesis/whippersnapper/set-field/output_1/pisces_rules.txt new file mode 100644 index 00000000..96e68b3b --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_1/pisces_rules.txt @@ -0,0 +1,11 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ptp_reserved2=0x1 actions=set_field:1->header_0_field_0,deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/set-field/output_1/run_switch.sh b/synthesis/whippersnapper/set-field/output_1/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_1/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_1/run_test.py b/synthesis/whippersnapper/set-field/output_1/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_1/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/set-field/output_1/test.pcap b/synthesis/whippersnapper/set-field/output_1/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..958b62a40892a8c581887698c0eff776f4e592e2 GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2}IJ|7paAixXZ00nrCR4rCD1(PNn-vyKybim4B+8}g8 cGEh6`u6Z7;{0t1P8wCSdihdqMRWek009@e}PXGV_ literal 0 HcmV?d00001 diff --git a/synthesis/whippersnapper/set-field/output_2/commands.txt b/synthesis/whippersnapper/set-field/output_2/commands.txt new file mode 100644 index 00000000..38e7446e --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_2/commands.txt @@ -0,0 +1,5 @@ +table_set_default test_tbl _nop +table_set_default test_tbl mod_headers +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt new file mode 100644 index 00000000..43009c21 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt @@ -0,0 +1,2 @@ +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_2/fvs.txt b/synthesis/whippersnapper/set-field/output_2/fvs.txt new file mode 100644 index 00000000..10a4c8b4 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_2/fvs.txt @@ -0,0 +1,3 @@ +hdr.ptp.reserved2,hdr.ptp.reserved2,8 +hdr.header_0.field_0,hdr.header_0.field_0,16 +hdr.header_0.field_1,hdr.header_0.field_1,16 diff --git a/synthesis/whippersnapper/set-field/output_2/main.p4 b/synthesis/whippersnapper/set-field/output_2/main.p4 new file mode 100644 index 00000000..3d729454 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_2/main.p4 @@ -0,0 +1,108 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header_type ptp_t { + fields { + transportSpecific : 4; + messageType : 4; + reserved : 4; + versionPTP : 4; + messageLength : 16; + domainNumber : 8; + reserved2 : 8; + flags : 16; + correction : 64; + reserved3 : 32; + sourcePortIdentity: 80; + sequenceId : 16; + PTPcontrol : 8; + logMessagePeriod : 8; + originTimestamp : 80; + } +} +parser start { return parse_ethernet; } +header ethernet_t ethernet; + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_PTP: parse_ptp; + default : ingress; + + } +} +header ptp_t ptp; + +parser parse_ptp { + extract(ptp); + return select(latest.reserved2) { + 1 : parse_header_0; + default : ingress; + + } +} +header_type header_0_t { + fields { + field_0 : 16; + field_1 : 16; + + } +} +header header_0_t header_0; + +parser parse_header_0 { + extract(header_0); + return select(latest.field_0) { + default : ingress; + + } +} +action _nop() { + +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action mod_headers() { + modify_field(header_0.field_0, 1); + modify_field(header_0.field_1, header_0.field_0); + +} +table test_tbl { + reads { + ptp.reserved2 : exact; + } actions { + _nop; + mod_headers; + } + size : 4; +} +control ingress { + apply(forward_table); + apply(test_tbl); + +} diff --git a/synthesis/whippersnapper/set-field/output_2/main16.p4 b/synthesis/whippersnapper/set-field/output_2/main16.p4 new file mode 100644 index 00000000..801fe909 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_2/main16.p4 @@ -0,0 +1,135 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header header_0_t { + bit<16> field_0; + bit<16> field_1; +} + +header ptp_t { + bit<4> transportSpecific; + bit<4> messageType; + bit<4> reserved; + bit<4> versionPTP; + bit<16> messageLength; + bit<8> domainNumber; + bit<8> reserved2; + bit<16> flags; + bit<64> correction; + bit<32> reserved3; + bit<80> sourcePortIdentity; + bit<16> sequenceId; + bit<8> PTPcontrol; + bit<8> logMessagePeriod; + bit<80> originTimestamp; +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".header_0") + header_0_t header_0; + @name(".ptp") + ptp_t ptp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x88f7: parse_ptp; + default: accept; + } + } + @name(".parse_header_0") state parse_header_0 { + packet.extract(hdr.header_0); + transition select(hdr.header_0.field_0) { + default: accept; + } + } + @name(".parse_ptp") state parse_ptp { + packet.extract(hdr.ptp); + transition select(hdr.ptp.reserved2) { + 8w1: parse_header_0; + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward(bit<9> port) { + standard_metadata.egress_spec = port; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name("._nop") action _nop() { + } + @name(".mod_headers") action mod_headers() { + hdr.header_0.field_0 = 16w1; + hdr.header_0.field_1 = hdr.header_0.field_0; + } + @name(".forward_table") table forward_table { + actions = { + forward; + _drop; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + @name(".test_tbl") table test_tbl { + actions = { + _nop; + mod_headers; + } + key = { + hdr.ptp.reserved2: exact; + } + size = 4; + } + apply { + forward_table.apply(); + test_tbl.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ptp); + packet.emit(hdr.header_0); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/set-field/output_2/obt_commands.txt b/synthesis/whippersnapper/set-field/output_2/obt_commands.txt new file mode 100644 index 00000000..e69de29b diff --git a/synthesis/whippersnapper/set-field/output_2/pisces_rules.txt b/synthesis/whippersnapper/set-field/output_2/pisces_rules.txt new file mode 100644 index 00000000..9202d9d0 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_2/pisces_rules.txt @@ -0,0 +1,11 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ptp_reserved2=0x1 actions=set_field:1->header_0_field_0,set_field:2->header_0_field_1,deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/set-field/output_2/run_switch.sh b/synthesis/whippersnapper/set-field/output_2/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_2/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_2/run_test.py b/synthesis/whippersnapper/set-field/output_2/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_2/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/set-field/output_2/test.pcap b/synthesis/whippersnapper/set-field/output_2/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..5228b572d8c4e46715a873dfcfc55f5e9eab9150 GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2}IIUg7Qs+kSK0SfROsamXR3MNfDz6&TZ=zx{Mv_a^G cWT1A=UGqFx`572oHwp%_6#YDis${700HPxnh5!Hn literal 0 HcmV?d00001 diff --git a/synthesis/whippersnapper/set-field/output_3/commands b/synthesis/whippersnapper/set-field/output_3/commands new file mode 100644 index 00000000..e69de29b diff --git a/synthesis/whippersnapper/set-field/output_3/commands.txt b/synthesis/whippersnapper/set-field/output_3/commands.txt new file mode 100644 index 00000000..38e7446e --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_3/commands.txt @@ -0,0 +1,5 @@ +table_set_default test_tbl _nop +table_set_default test_tbl mod_headers +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt new file mode 100644 index 00000000..43009c21 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt @@ -0,0 +1,2 @@ +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_3/fvs.txt b/synthesis/whippersnapper/set-field/output_3/fvs.txt new file mode 100644 index 00000000..f3f1ea70 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_3/fvs.txt @@ -0,0 +1,4 @@ +hdr.ptp.reserved2,hdr.ptp.reserved2,8 +hdr.header_0.field_0,hdr.header_0.field_0,16 +hdr.header_0.field_1,hdr.header_0.field_1,16 +hdr.header_0.field_2,hdr.header_0.field_2,16 diff --git a/synthesis/whippersnapper/set-field/output_3/main.p4 b/synthesis/whippersnapper/set-field/output_3/main.p4 new file mode 100644 index 00000000..bd611f84 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_3/main.p4 @@ -0,0 +1,110 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header_type ptp_t { + fields { + transportSpecific : 4; + messageType : 4; + reserved : 4; + versionPTP : 4; + messageLength : 16; + domainNumber : 8; + reserved2 : 8; + flags : 16; + correction : 64; + reserved3 : 32; + sourcePortIdentity: 80; + sequenceId : 16; + PTPcontrol : 8; + logMessagePeriod : 8; + originTimestamp : 80; + } +} +parser start { return parse_ethernet; } +header ethernet_t ethernet; + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_PTP: parse_ptp; + default : ingress; + + } +} +header ptp_t ptp; + +parser parse_ptp { + extract(ptp); + return select(latest.reserved2) { + 1 : parse_header_0; + default : ingress; + + } +} +header_type header_0_t { + fields { + field_0 : 16; + field_1 : 16; + field_2 : 16; + + } +} +header header_0_t header_0; + +parser parse_header_0 { + extract(header_0); + return select(latest.field_0) { + default : ingress; + + } +} +action _nop() { + +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action mod_headers() { + modify_field(header_0.field_0, 1); + modify_field(header_0.field_1, header_0.field_0); + modify_field(header_0.field_2, header_0.field_1); + +} +table test_tbl { + reads { + ptp.reserved2 : exact; + } actions { + _nop; + mod_headers; + } + size : 4; +} +control ingress { + apply(forward_table); + apply(test_tbl); + +} diff --git a/synthesis/whippersnapper/set-field/output_3/main16.p4 b/synthesis/whippersnapper/set-field/output_3/main16.p4 new file mode 100644 index 00000000..74cc264a --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_3/main16.p4 @@ -0,0 +1,137 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header header_0_t { + bit<16> field_0; + bit<16> field_1; + bit<16> field_2; +} + +header ptp_t { + bit<4> transportSpecific; + bit<4> messageType; + bit<4> reserved; + bit<4> versionPTP; + bit<16> messageLength; + bit<8> domainNumber; + bit<8> reserved2; + bit<16> flags; + bit<64> correction; + bit<32> reserved3; + bit<80> sourcePortIdentity; + bit<16> sequenceId; + bit<8> PTPcontrol; + bit<8> logMessagePeriod; + bit<80> originTimestamp; +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".header_0") + header_0_t header_0; + @name(".ptp") + ptp_t ptp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x88f7: parse_ptp; + default: accept; + } + } + @name(".parse_header_0") state parse_header_0 { + packet.extract(hdr.header_0); + transition select(hdr.header_0.field_0) { + default: accept; + } + } + @name(".parse_ptp") state parse_ptp { + packet.extract(hdr.ptp); + transition select(hdr.ptp.reserved2) { + 8w1: parse_header_0; + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward(bit<9> port) { + standard_metadata.egress_spec = port; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name("._nop") action _nop() { + } + @name(".mod_headers") action mod_headers() { + hdr.header_0.field_0 = 16w1; + hdr.header_0.field_1 = hdr.header_0.field_0; + hdr.header_0.field_2 = hdr.header_0.field_1; + } + @name(".forward_table") table forward_table { + actions = { + forward; + _drop; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + @name(".test_tbl") table test_tbl { + actions = { + _nop; + mod_headers; + } + key = { + hdr.ptp.reserved2: exact; + } + size = 4; + } + apply { + forward_table.apply(); + test_tbl.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ptp); + packet.emit(hdr.header_0); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/set-field/output_3/obt_commands.txt b/synthesis/whippersnapper/set-field/output_3/obt_commands.txt new file mode 100644 index 00000000..e69de29b diff --git a/synthesis/whippersnapper/set-field/output_3/pisces_rules.txt b/synthesis/whippersnapper/set-field/output_3/pisces_rules.txt new file mode 100644 index 00000000..ccca741e --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_3/pisces_rules.txt @@ -0,0 +1,11 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ptp_reserved2=0x1 actions=set_field:1->header_0_field_0,set_field:2->header_0_field_1,set_field:3->header_0_field_2,deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/set-field/output_3/run_switch.sh b/synthesis/whippersnapper/set-field/output_3/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_3/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_3/run_test.py b/synthesis/whippersnapper/set-field/output_3/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_3/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/set-field/output_3/test.pcap b/synthesis/whippersnapper/set-field/output_3/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..5733fa96ad6f0f70d22a36e3af51d1836c7a6aac GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2}IIUg5q&Cd_v00nrCR4rCD1(PNn-vyKybim4B+8}g8 bGEh6`u6Z7;K#i^&1p`@%ejY?sGE{j0dp;Fx literal 0 HcmV?d00001 diff --git a/synthesis/whippersnapper/set-field/output_4/commands.txt b/synthesis/whippersnapper/set-field/output_4/commands.txt new file mode 100644 index 00000000..38e7446e --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_4/commands.txt @@ -0,0 +1,5 @@ +table_set_default test_tbl _nop +table_set_default test_tbl mod_headers +table_set_default forward_table _drop +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt new file mode 100644 index 00000000..43009c21 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt @@ -0,0 +1,2 @@ +table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 +table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_4/fvs.txt b/synthesis/whippersnapper/set-field/output_4/fvs.txt new file mode 100644 index 00000000..1670c9da --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_4/fvs.txt @@ -0,0 +1,5 @@ +hdr.ptp.reserved2,hdr.ptp.reserved2,8 +hdr.header_0.field_0,hdr.header_0.field_0,16 +hdr.header_0.field_1,hdr.header_0.field_1,16 +hdr.header_0.field_2,hdr.header_0.field_2,16 +hdr.header_0.field_3,hdr.header_0.field_3,16 diff --git a/synthesis/whippersnapper/set-field/output_4/main.p4 b/synthesis/whippersnapper/set-field/output_4/main.p4 new file mode 100644 index 00000000..1409b63e --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_4/main.p4 @@ -0,0 +1,112 @@ +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_PTP 0x088F7 + +#define TCP_PROTOCOL 0x06 +#define UDP_PROTOCOL 0x11 +#define GENERIC_PROTOCOL 0x9091 +header_type ethernet_t { + fields { + dstAddr : 48; + srcAddr : 48; + etherType : 16; + } +} +header_type ptp_t { + fields { + transportSpecific : 4; + messageType : 4; + reserved : 4; + versionPTP : 4; + messageLength : 16; + domainNumber : 8; + reserved2 : 8; + flags : 16; + correction : 64; + reserved3 : 32; + sourcePortIdentity: 80; + sequenceId : 16; + PTPcontrol : 8; + logMessagePeriod : 8; + originTimestamp : 80; + } +} +parser start { return parse_ethernet; } +header ethernet_t ethernet; + +parser parse_ethernet { + extract(ethernet); + return select(latest.etherType) { + ETHERTYPE_PTP: parse_ptp; + default : ingress; + + } +} +header ptp_t ptp; + +parser parse_ptp { + extract(ptp); + return select(latest.reserved2) { + 1 : parse_header_0; + default : ingress; + + } +} +header_type header_0_t { + fields { + field_0 : 16; + field_1 : 16; + field_2 : 16; + field_3 : 16; + + } +} +header header_0_t header_0; + +parser parse_header_0 { + extract(header_0); + return select(latest.field_0) { + default : ingress; + + } +} +action _nop() { + +} +action _drop() { + drop(); +} + +action forward(port) { + modify_field(standard_metadata.egress_spec, port); +} + +table forward_table { + reads { + ethernet.dstAddr : exact; + } actions { + forward; + _drop; + } + size : 4; +} +action mod_headers() { + modify_field(header_0.field_0, 1); + modify_field(header_0.field_1, header_0.field_0); + modify_field(header_0.field_2, header_0.field_1); + modify_field(header_0.field_3, header_0.field_2); + +} +table test_tbl { + reads { + ptp.reserved2 : exact; + } actions { + _nop; + mod_headers; + } + size : 4; +} +control ingress { + apply(forward_table); + apply(test_tbl); + +} diff --git a/synthesis/whippersnapper/set-field/output_4/main16.p4 b/synthesis/whippersnapper/set-field/output_4/main16.p4 new file mode 100644 index 00000000..70eb7baa --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_4/main16.p4 @@ -0,0 +1,139 @@ +#include +#define V1MODEL_VERSION 20200408 +#include + +header ethernet_t { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header header_0_t { + bit<16> field_0; + bit<16> field_1; + bit<16> field_2; + bit<16> field_3; +} + +header ptp_t { + bit<4> transportSpecific; + bit<4> messageType; + bit<4> reserved; + bit<4> versionPTP; + bit<16> messageLength; + bit<8> domainNumber; + bit<8> reserved2; + bit<16> flags; + bit<64> correction; + bit<32> reserved3; + bit<80> sourcePortIdentity; + bit<16> sequenceId; + bit<8> PTPcontrol; + bit<8> logMessagePeriod; + bit<80> originTimestamp; +} + +struct metadata { +} + +struct headers { + @name(".ethernet") + ethernet_t ethernet; + @name(".header_0") + header_0_t header_0; + @name(".ptp") + ptp_t ptp; +} + +parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".parse_ethernet") state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x88f7: parse_ptp; + default: accept; + } + } + @name(".parse_header_0") state parse_header_0 { + packet.extract(hdr.header_0); + transition select(hdr.header_0.field_0) { + default: accept; + } + } + @name(".parse_ptp") state parse_ptp { + packet.extract(hdr.ptp); + transition select(hdr.ptp.reserved2) { + 8w1: parse_header_0; + default: accept; + } + } + @name(".start") state start { + transition parse_ethernet; + } +} + +control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + @name(".forward") action forward(bit<9> port) { + standard_metadata.egress_spec = port; + } + @name("._drop") action _drop() { + mark_to_drop(standard_metadata); + } + @name("._nop") action _nop() { + } + @name(".mod_headers") action mod_headers() { + hdr.header_0.field_0 = 16w1; + hdr.header_0.field_1 = hdr.header_0.field_0; + hdr.header_0.field_2 = hdr.header_0.field_1; + hdr.header_0.field_3 = hdr.header_0.field_2; + } + @name(".forward_table") table forward_table { + actions = { + forward; + _drop; + } + key = { + hdr.ethernet.dstAddr: exact; + } + size = 4; + } + @name(".test_tbl") table test_tbl { + actions = { + _nop; + mod_headers; + } + key = { + hdr.ptp.reserved2: exact; + } + size = 4; + } + apply { + forward_table.apply(); + test_tbl.apply(); + } +} + +control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { + apply { + } +} + +control DeparserImpl(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.ptp); + packet.emit(hdr.header_0); + } +} + +control verifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control computeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; + diff --git a/synthesis/whippersnapper/set-field/output_4/obt_commands.txt b/synthesis/whippersnapper/set-field/output_4/obt_commands.txt new file mode 100644 index 00000000..e69de29b diff --git a/synthesis/whippersnapper/set-field/output_4/pisces_rules.txt b/synthesis/whippersnapper/set-field/output_4/pisces_rules.txt new file mode 100644 index 00000000..3a3898e9 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_4/pisces_rules.txt @@ -0,0 +1,11 @@ +ovs-ofctl --protocols=OpenFlow15 del-flows br0 +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" +ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ptp_reserved2=0x1 actions=set_field:1->header_0_field_0,set_field:2->header_0_field_1,set_field:3->header_0_field_2,set_field:4->header_0_field_3,deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/set-field/output_4/run_switch.sh b/synthesis/whippersnapper/set-field/output_4/run_switch.sh new file mode 100755 index 00000000..714cdc48 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_4/run_switch.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model +P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm +P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py + + +PROG="main" + +set -m +$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json + +if [ $? -ne 0 ]; then +echo "p4 compilation failed" +exit 1 +fi + +SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch + +CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py + +sudo echo "sudo" > /dev/null +sudo $SWITCH_PATH >/dev/null 2>&1 +sudo $SWITCH_PATH $PROG.json \ + -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ + --log-console & + +sleep 2 +echo "**************************************" +echo "Sending commands to switch through CLI" +echo "**************************************" +$CLI_PATH --json $PROG.json < commands.txt +echo "READY!!!" +fg \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_4/run_test.py b/synthesis/whippersnapper/set-field/output_4/run_test.py new file mode 100755 index 00000000..673725f8 --- /dev/null +++ b/synthesis/whippersnapper/set-field/output_4/run_test.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +import time + +P4BENCH_PORT = 0x9091 + +import random +import argparse + +import threading +from scapy.all import sniff, wrpcap, rdpcap +from scapy.all import Ether, IP, IPv6, TCP, UDP +from scapy.all import Packet, ShortField, XBitField, bind_layers + +class PTP(Packet): + """Precision Time Protocol""" + name = "PTP protocol" + fields_desc = [ + XBitField('type_', 0x10, 8), + XBitField('version', 0x02, 8), + ShortField('messageLength', 0x36), + XBitField('subdomain', 0x00, 8), + ShortField('flags', 0), + XBitField('correction', 0x00, 48), + XBitField('clockIdentity', 0x008063FFFF0009BA, 64), + ShortField('sourcePortID', 1), + ShortField('sequenceID', 0x9E48), + XBitField('control', 0x05, 8), + XBitField('logMessagePeriod', 0x0F, 8), + XBitField('originTimestamp', 0x000045B111510472F9C1, 80) + ] + +bind_layers(UDP, PTP, dport=319) +bind_layers(UDP, PTP, dport=320) + + +features = { + 0 : 'PARSER', + 1 : 'STATE', + 2 : 'PIPELINE', + 3 : 'PACKET_ADD', + 4 : 'PACKET_RM', + 5 : 'PACKET_MOD', +} + +class PacketQueue: + def __init__(self): + self.pkts = [] + self.lock = threading.Lock() + self.ifaces = set() + + def add_iface(self, iface): + self.ifaces.add(iface) + + def get(self): + self.lock.acquire() + if not self.pkts: + self.lock.release() + return None, None + pkt = self.pkts.pop(0) + self.lock.release() + return pkt + + def add(self, iface, pkt): + if iface not in self.ifaces: + return + self.lock.acquire() + self.pkts.append( (iface, pkt) ) + self.lock.release() + +queue = PacketQueue() + +def pkt_handler(pkt, iface): + if IPv6 in pkt: + return + pkt.show() + queue.add(iface, pkt) + +class SnifferThread(threading.Thread): + def __init__(self, iface, handler = pkt_handler): + threading.Thread.__init__(self) + self.iface = iface + self.handler = handler + + def run(self): + sniff( + iface = self.iface, + prn = lambda x: self.handler(x, self.iface) + ) + +class PacketDelay: + def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): + self.bsize = bsize + self.bdelay = bdelay + self.imin = imin + self.imax = imax + self.num_pkts = num_pkts + self.current = 1 + + def __iter__(self): + return self + + def next(self): + if self.num_pkts <= 0: + raise StopIteration + self.num_pkts -= 1 + if self.current == self.bsize: + self.current = 1 + return random.randint(self.imin, self.imax) + else: + self.current += 1 + return self.bdelay + +class MemTest(Packet): + name = "P4Bench Message for MemTest" + fields_desc = [ + XBitField("op", 0x1, 4), + XBitField("index", 0x1, 12), + XBitField("data", 0xf1f2f3f4, 32), + ] + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='run_test.py') + parser.add_argument('-n', '--nb-packets', default=10, type=int, + help='Send [n] packets to the switch') + parser.add_argument('-c', '--nb-headers', default=1, type=int, + help='Add [c] P4Bench headers to each packet') + parser.add_argument('--feature', default=0, type=int, + help='P4 benchmark feature') + parser.add_argument('--register-op', default=0, type=int, + help='Register operation type') + parser.add_argument('--register-index', default=0, type=int, + help='Register index') + parser.add_argument('--register-value', default=0, type=int, + help='Register value') + parser.add_argument('-f', '--nb-fields', default=1, type=int, + help='Add [f] fields to each P4Bench header') + parser.add_argument('--random-dport', + help='Use a random TCP dest port for each packet', + action="store_true", default=False) + args = parser.parse_args() + + pkts = rdpcap('test.pcap') + pkt = pkts[0] + + port_map = { + 0: "veth0", + 1: "veth2", + 2: "veth4", + } + + iface_map = {} + for p, i in port_map.items(): + iface_map[i] = p + + queue.add_iface("veth2") + queue.add_iface("veth4") + + for p, iface in port_map.items(): + t = SnifferThread(iface) + t.daemon = True + t.start() + + import socket + + send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, + socket.htons(0x03)) + send_socket.bind((port_map[0], 0)) + + # wait for receiving threads start + time.sleep(1) + + delays = PacketDelay(10, 5, 25, 100, args.nb_packets) + ports = [] + print "Sending", args.nb_packets, "packets ..." + for d in delays: + # pkt.show() + send_socket.send(str(pkt)) + time.sleep(d / 1000.) + + # time.sleep(1) + + iface, pkt = queue.get() + while pkt: + ports.append(iface_map[iface]) + iface, pkt = queue.get() + # print ports + print "DISTRIBUTION..." + for p in port_map: + c = ports.count(p) + print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/set-field/output_4/test.pcap b/synthesis/whippersnapper/set-field/output_4/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..8a8922e7ad8f89e8cb4b088d61f4cbeea2036e59 GIT binary patch literal 296 zcmca|c+)~A1{MYw`2U}Qff2}IJs%g(Sk3|A00nrCR4rCD1(PNn-vyKybim4B+8}g8 cGEh6`u6Z7;{0t1P8wCSdihdqMRWek00HnwjlmGw# literal 0 HcmV?d00001 From dab41177495028dbc7adf0d41c2a8c3c94e8fa7b Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Mon, 14 Sep 2020 01:32:21 -0400 Subject: [PATCH 11/24] timing --- synthesis/whippersnapper/bench.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 0b389ceb..0faa7bbb 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -4,6 +4,7 @@ import shutil import subprocess import sys +import time # fvs gen @@ -88,14 +89,22 @@ def run_avenir(ws_cmd): while os.path.isdir("whippersnapper/" + ws_cmd + "/output_" + str(mx)): mx += 1; + res = "" for i in list(range(1, int(mx))): output = "whippersnapper/" + ws_cmd + "/output_" + str(i) +"/"; commands_file = output + "obt_commands.txt"; edits_file = "whippersnapper/empty_edits.txt"; assume_file = "whippersnapper/empty_assume.txt"; fvs_file = output + "fvs.txt"; - res = subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); - print(res); + + st_time = time.perf_counter(); + subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); + end_time = time.perf_counter(); + elapsed = end_time - st_time; + res += str(i) + "," + str(elapsed) + "\n" + + with open("whippersnapper/" + ws_cmd + "_res.csv", "w") as res_file: + res_file.write(res); cmd = sys.argv[1]; ws_cmd = sys.argv[2]; From b2b24d989810ed633e185a3a47f4b75e6fe0e427 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Mon, 14 Sep 2020 15:46:48 -0400 Subject: [PATCH 12/24] Generating rules for pipeline --- synthesis/whippersnapper/bench.py | 100 ++++++++++++++---- .../pipeline/output_1/commands_no_def.txt | 12 ++- .../pipeline/output_1/obt_commands.txt | 12 ++- .../pipeline/output_1/test.pcap | Bin 296 -> 296 bytes .../pipeline/output_2/commands_no_def.txt | 14 ++- .../pipeline/output_2/obt_commands.txt | 14 ++- .../pipeline/output_2/test.pcap | Bin 296 -> 296 bytes .../pipeline/output_3/commands_no_def.txt | 16 +-- .../pipeline/output_3/obt_commands.txt | 12 ++- .../pipeline/output_3/test.pcap | Bin 296 -> 296 bytes .../pipeline/output_4/commands_no_def.txt | 18 ++-- .../pipeline/output_4/obt_commands.txt | 12 ++- .../pipeline/output_4/test.pcap | Bin 296 -> 296 bytes 13 files changed, 161 insertions(+), 49 deletions(-) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 0faa7bbb..176b4d86 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -1,38 +1,91 @@ #!/usr/bin/python import os +import random import shutil import subprocess import sys import time -# fvs gen + +# generate a rule, generic functions + +# take a list of rule templates (see gen_rule). Generates num rules, using the rule templates as evenly as possible. +def gen_rules(num, rule_temps): + res = [] + for i in list(range(0, num)): + j = i % len(rule_temps); + rt = rule_temps[j]; + r = gen_rule(rt); + res.append(r); + return res; + +# takes a list of strings and ints. Replaces every int n with a hex string of width n, +# concatenates into a single list, and returns +def gen_rule(rule_temp): + rule = map(adj_rule_piece, rule_temp); + return "".join(rule); + +def adj_rule_piece(p): + if isinstance(p, str): + return p; + else: + b = random.getrandbits(p); + b = str(b); #add_colons(str(hex(b))[2:]); + return b; + +def add_colons(s): + s2 = "" + for (i, c) in enumerate(s): + if i != 0 and i % 2 == 0: + s2 += ":" + s2 += c; + return s2; + + +# fvs and rule gen def pipeline_fvs(i): return "hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48\nstandard_metadata.egress_spec,standard_metadata.egress_spec,9" -def set_field_fvs(mx): +def pipeline_rules(ind): + res = [] + for i in list(range(0, ind)): + (tbl_name, act) = ("forward_table", "forward") if i == 0 else ("table_" + str(i), "forward" + str(i)); + res += [["table_add " + tbl_name + " " + act + " ", 48, " => ", 9]]; + return res; + +def set_field_fvs(ind): fvs = "hdr.ptp.reserved2,hdr.ptp.reserved2,8\n"; - for i in list(range(0, mx)): + for i in list(range(0, ind)): fvs += "hdr.header_0.field_" + str(i) + ",hdr.header_0.field_" + str(i) + ",16\n" return fvs; +def set_field_rules(ind): + return []; + + # whippersnapper commands def whippersnapper_cmds(): - return { "set-field" : (["--operations"], [], set_field_fvs) - , "pipeline" : (["--tables"], ["--table-size", "16"], pipeline_fvs) } + return { "set-field" : (["--operations"], [], set_field_fvs, set_field_rules) + , "pipeline" : (["--tables"], ["--table-size", "16"], pipeline_fvs, pipeline_rules) } # generate the OBT, and the corresponding rules def rewrite_cmd(cmd): try: pieces = cmd.split(","); - params = pieces[2]; - fparams = params.split(" ")[2::3]; - fparams = ";".join(fparams); - pieces[2] = fparams; - #pieces = list(map(lambda s : s[s.find("0x"):] if s.find("0x") != -1 else s, pieces)); - fcmd = ",".join(pieces); - return fcmd; + if pieces[0] == "ADD": + params = pieces[2]; + fparams = params.split(" ")[2::3]; + fparams = ";".join(fparams); + pieces[2] = fparams; + #pieces = list(map(lambda s : s[s.find("0x"):] if s.find("0x") != -1 else s, pieces)); + fcmd = ",".join(pieces); + return fcmd; + elif pieces[0] == "DEL": + return cmd; + elif pieces[0] == "": + return ""; except: return cmd; @@ -41,21 +94,26 @@ def rewrite_cmds(cmds): fmcds = "\n".join(fcmds); return fmcds; -def rules_for_obt(fn, fvs): +def rules_for_obt(fn, num, rule_temps, fvs): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; assume_file = "whippersnapper/empty_assume.txt"; - commands_file = "output/commands.txt"; + #commands_file = "output/commands.txt"; commands_no_def_file = "output/commands_no_def.txt" with open(fvs_file, 'w') as fvsf: fvsf.write(fvs); - with open(commands_file, 'r') as cmds: - with open(commands_no_def_file, 'w') as cmdnd: - for line in cmds: - if not line.startswith("table_set_default"): - cmdnd.write(line); + rules = gen_rules(num, rule_temps); + + with open(commands_no_def_file, 'w') as cmdnd: + rules_str = "\n".join(rules); + cmdnd.write(rules_str); + #with open(commands_file, 'r') as cmds: + # with open(commands_no_def_file, 'w') as cmdnd: + # for line in cmds: + # if not line.startswith("table_set_default"): + # cmdnd.write(line); res = subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); @@ -75,10 +133,10 @@ def run_whippersnapper(ws_cmd, mx): for i in list(range(1, int(mx))): print(str(i)); - (cmd_line1, cmd_line2, fvs) = whippersnapper_cmds()[ws_cmd]; + (cmd_line1, cmd_line2, fvs, get_rule_temps) = whippersnapper_cmds()[ws_cmd]; subprocess.run(["p4benchmark", "--feature", ws_cmd] + cmd_line1 + [str(i)] + cmd_line2); subprocess.run(["p4test", "--p4v", "14", "--pp", "output/main16.p4", "output/main.p4"]); - rules_for_obt("output", fvs(i)); + rules_for_obt("output", 10, get_rule_temps(i), fvs(i)); shutil.move("output", "whippersnapper/" + ws_cmd + "/output_" + str(i)); diff --git a/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt index 43009c21..23d3e742 100644 --- a/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt +++ b/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt @@ -1,2 +1,10 @@ -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 232450651038796 => 141 +table_add forward_table forward 276792359776097 => 422 +table_add forward_table forward 145915283282960 => 425 +table_add forward_table forward 278336394630074 => 134 +table_add forward_table forward 215491492381317 => 101 +table_add forward_table forward 128659595199307 => 396 +table_add forward_table forward 14722526092518 => 12 +table_add forward_table forward 247668913491660 => 176 +table_add forward_table forward 262546617834811 => 86 +table_add forward_table forward 15030650420279 => 78 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt index 361653ed..af00bb75 100644 --- a/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt +++ b/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt @@ -1,2 +1,10 @@ -ADD,OneBigTable,0xcc47aa32534#48,0x1#9,0 -ADD,OneBigTable,0xcc47aa32535#48,0x2#9,0 +ADD,OneBigTable,0xd369a27ba44c#48,0x8d#9,0 +ADD,OneBigTable,0xfbbdbe47ef61#48,0x1a6#9,0 +ADD,OneBigTable,0x84b58ca09c10#48,0x1a9#9,0 +ADD,OneBigTable,0xfd253dee13ba#48,0x86#9,0 +ADD,OneBigTable,0xc3fd05db0285#48,0x65#9,0 +ADD,OneBigTable,0x7503e578034b#48,0x18c#9,0 +ADD,OneBigTable,0xd63daf01ce6#48,0xc#9,0 +ADD,OneBigTable,0xe140e99c4ecc#48,0xb0#9,0 +ADD,OneBigTable,0xeec8e5e49d3b#48,0x56#9,0 +ADD,OneBigTable,0xdab98943c37#48,0x4e#9,0 diff --git a/synthesis/whippersnapper/pipeline/output_1/test.pcap b/synthesis/whippersnapper/pipeline/output_1/test.pcap index 4cc27d5b11995423b883ca8898365c392e10ae34..fe060154fc88101d11ad872e52c6da968062f01c 100644 GIT binary patch delta 18 acmZ3%w1R1Z1pA!T@$pJGST@RYG6DcS1qI;% delta 18 ZcmZ3%w1R1Z1iSm$xcIO+oEzmi838)R1*!l5 diff --git a/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt index 94a35c37..274b479e 100644 --- a/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt +++ b/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt @@ -1,4 +1,10 @@ -table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 -table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 58140110824168 => 468 +table_add table_1 forward1 26591111550355 => 106 +table_add forward_table forward 213766505871118 => 20 +table_add table_1 forward1 147221475456242 => 471 +table_add forward_table forward 216400982791630 => 79 +table_add table_1 forward1 240019410756106 => 313 +table_add forward_table forward 182276735270223 => 93 +table_add table_1 forward1 232845400026916 => 479 +table_add forward_table forward 253313800835166 => 28 +table_add table_1 forward1 39503237931740 => 467 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt index dee10d9b..def64f9d 100644 --- a/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt +++ b/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt @@ -1,2 +1,12 @@ -ADD,OneBigTable,0xcc47aa32534#48;0x0#1,0x1#9,6 -ADD,OneBigTable,0xcc47aa32535#48;0x0#1,0x2#9,14 +ADD,OneBigTable,0x34e0cca722e8#48;0x0#1,0x1d4#9,8 +ADD,OneBigTable,0x182f39c21593#48;0x0#1,0x6a#9,6 +ADD,OneBigTable,0xc26b64a5b70e#48;0x0#1,0x14#9,6 +DEL,OneBigTable,2 +ADD,OneBigTable,0x85e5abbf74f2#48;0x0#1,0x1d7#9,14 +ADD,OneBigTable,0xc26b64a5b70e#48;0x0#1,0x14#9,6 +ADD,OneBigTable,0xc4d0c7b555ce#48;0x0#1,0x4f#9,5 +ADD,OneBigTable,0xda4bdfb7a20a#48;0x0#1,0x139#9,14 +ADD,OneBigTable,0xa5c79c0e7d4f#48;0x0#1,0x5d#9,8 +ADD,OneBigTable,0xd3c58b5b2f24#48;0x0#1,0x1df#9,14 +ADD,OneBigTable,0xe663371d905e#48;0x0#1,0x1c#9,14 +ADD,OneBigTable,0x23ed9076e2dc#48;0x0#1,0x1d3#9,6 diff --git a/synthesis/whippersnapper/pipeline/output_2/test.pcap b/synthesis/whippersnapper/pipeline/output_2/test.pcap index 3dbc7448eeb7adf0d56e11edc323015bb06be22e..2452d4c75d41fade937d70200f60e32e17b23c6f 100644 GIT binary patch delta 18 acmZ3%w1R1Z1pD08@$oAanK#OFG6DcRas{yf delta 18 ZcmZ3%w1R1Z1iQ!CxcEcHEF0xH838*s1*rf4 diff --git a/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt index 47bcb238..f26f4e35 100644 --- a/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt +++ b/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt @@ -1,6 +1,10 @@ -table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 -table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 -table_add table_2 forward2 0C:C4:7A:A3:25:34 => 1 -table_add table_2 forward2 0C:C4:7A:A3:25:35 => 2 -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 91617822774558 => 333 +table_add table_1 forward1 155252130734085 => 312 +table_add table_2 forward2 274306869018145 => 27 +table_add forward_table forward 256892919113761 => 487 +table_add table_1 forward1 40899654737514 => 416 +table_add table_2 forward2 245323031151673 => 177 +table_add forward_table forward 115863861947370 => 462 +table_add table_1 forward1 117369492012720 => 382 +table_add table_2 forward2 95839470699883 => 132 +table_add forward_table forward 164007724682836 => 357 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt index 1005089e..ba41d62e 100644 --- a/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt +++ b/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt @@ -1,2 +1,10 @@ -ADD,OneBigTable,0xcc47aa32534#48;0x0#1,0x1#9,4 -ADD,OneBigTable,0xcc47aa32535#48;0x0#1,0x2#9,4 +ADD,OneBigTable,0x53536fc8151e#48;0x0#1,0x14d#9,4 +ADD,OneBigTable,0x8d33741a6005#48;0x0#1,0x138#9,4 +ADD,OneBigTable,0xf97b0b7cbe21#48;0x0#1,0x1b#9,4 +ADD,OneBigTable,0xe9a48b306821#48;0x0#1,0x1e7#9,4 +ADD,OneBigTable,0x2532b1645e6a#48;0x0#1,0x1a0#9,4 +ADD,OneBigTable,0xdf1eb8208439#48;0x0#1,0xb1#9,4 +ADD,OneBigTable,0x6960a8556bea#48;0x0#1,0x1ce#9,4 +ADD,OneBigTable,0x6abf36e0feb0#48;0x0#1,0x17e#9,4 +ADD,OneBigTable,0x572a5d9b456b#48;0x0#1,0x84#9,4 +ADD,OneBigTable,0x952a062b8e54#48;0x0#1,0x165#9,4 diff --git a/synthesis/whippersnapper/pipeline/output_3/test.pcap b/synthesis/whippersnapper/pipeline/output_3/test.pcap index 8e25bd829cabee58014b4726e219d4044c004ab5..60932c637094614f3908b6ff3d38d1d610cfa261 100644 GIT binary patch delta 18 acmZ3%w1R1Z1pBiFC838?p1{VMT diff --git a/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt index c17f785c..8a613f1d 100644 --- a/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt +++ b/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt @@ -1,8 +1,10 @@ -table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 -table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 -table_add table_2 forward2 0C:C4:7A:A3:25:34 => 1 -table_add table_2 forward2 0C:C4:7A:A3:25:35 => 2 -table_add table_3 forward3 0C:C4:7A:A3:25:34 => 1 -table_add table_3 forward3 0C:C4:7A:A3:25:35 => 2 -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 95637572516327 => 502 +table_add table_1 forward1 213231801868936 => 183 +table_add table_2 forward2 257319196357528 => 210 +table_add table_3 forward3 228173519594036 => 73 +table_add forward_table forward 84289786544981 => 224 +table_add table_1 forward1 9994994373731 => 284 +table_add table_2 forward2 48797916300226 => 452 +table_add table_3 forward3 105959170556874 => 181 +table_add forward_table forward 59165357544033 => 236 +table_add table_1 forward1 263498934732380 => 231 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt index c1d4e5b2..3a81b0c7 100644 --- a/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt +++ b/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt @@ -1,2 +1,10 @@ -ADD,OneBigTable,0xcc47aa32534#48;0x0#1,0x1#9,9 -ADD,OneBigTable,0xcc47aa32535#48;0x0#1,0x2#9,4 +ADD,OneBigTable,0x56fb5b8979e7#48;0x0#1,0x1f6#9,9 +ADD,OneBigTable,0xc1eee5ce2288#48;0x0#1,0xb7#9,4 +ADD,OneBigTable,0xea07cb4af398#48;0x0#1,0xd2#9,14 +ADD,OneBigTable,0xcf85c9952234#48;0x0#1,0x49#9,14 +ADD,OneBigTable,0x4ca93ec90355#48;0x0#1,0xe0#9,14 +ADD,OneBigTable,0x9172416d463#48;0x0#1,0x11c#9,353 +ADD,OneBigTable,0x2c61a67783c2#48;0x0#1,0x1c4#9,14 +ADD,OneBigTable,0x605e8ab8c3ca#48;0x0#1,0xb5#9,353 +ADD,OneBigTable,0x35cf821e9261#48;0x0#1,0xec#9,4 +ADD,OneBigTable,0xefa6a067465c#48;0x0#1,0xe7#9,9 diff --git a/synthesis/whippersnapper/pipeline/output_4/test.pcap b/synthesis/whippersnapper/pipeline/output_4/test.pcap index 5a69286a24a56645bb153d2afb3c0ab23d0f67a0..544f3f42a1ae1b27613ceda6025dc0c3f0295407 100644 GIT binary patch delta 17 ZcmZ3%w1R1Z1lxku@$p|mHp+1^0suN<1}*>q delta 17 YcmZ3%w1R1Z1e@pCxcEO_8|And0XQTD_5c6? From 378ed13a20a622c985ed33aac1699f0aa653cd7f Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Tue, 15 Sep 2020 13:46:46 -0400 Subject: [PATCH 13/24] optimizations for whippersnapper --- synthesis/lib/Benchmark.ml | 4 +- synthesis/whippersnapper/bench.py | 37 +++- .../pipeline/output_1/commands.txt | 3 - .../pipeline/output_1/commands_no_def.txt | 10 - .../whippersnapper/pipeline/output_1/fvs.txt | 2 - .../whippersnapper/pipeline/output_1/main.p4 | 114 ----------- .../pipeline/output_1/main16.p4 | 139 ------------- .../pipeline/output_1/obt_commands.txt | 10 - .../pipeline/output_1/pisces_rules.txt | 11 - .../pipeline/output_1/run_switch.sh | 35 ---- .../pipeline/output_1/run_test.py | 192 ------------------ .../pipeline/output_1/test.pcap | Bin 296 -> 0 bytes .../pipeline/output_2/commands.txt | 5 - .../pipeline/output_2/commands_no_def.txt | 10 - .../whippersnapper/pipeline/output_2/fvs.txt | 2 - .../whippersnapper/pipeline/output_2/main.p4 | 126 ------------ .../pipeline/output_2/main16.p4 | 152 -------------- .../pipeline/output_2/obt_commands.txt | 12 -- .../pipeline/output_2/pisces_rules.txt | 27 --- .../pipeline/output_2/run_switch.sh | 35 ---- .../pipeline/output_2/run_test.py | 192 ------------------ .../pipeline/output_2/test.pcap | Bin 296 -> 0 bytes .../pipeline/output_3/commands.txt | 7 - .../pipeline/output_3/commands_no_def.txt | 10 - .../whippersnapper/pipeline/output_3/fvs.txt | 2 - .../whippersnapper/pipeline/output_3/main.p4 | 138 ------------- .../pipeline/output_3/main16.p4 | 165 --------------- .../pipeline/output_3/obt_commands.txt | 10 - .../pipeline/output_3/pisces_rules.txt | 43 ---- .../pipeline/output_3/run_switch.sh | 35 ---- .../pipeline/output_3/run_test.py | 192 ------------------ .../pipeline/output_3/test.pcap | Bin 296 -> 0 bytes .../pipeline/output_4/commands.txt | 9 - .../pipeline/output_4/commands_no_def.txt | 10 - .../whippersnapper/pipeline/output_4/fvs.txt | 2 - .../whippersnapper/pipeline/output_4/main.p4 | 150 -------------- .../pipeline/output_4/main16.p4 | 178 ---------------- .../pipeline/output_4/obt_commands.txt | 10 - .../pipeline/output_4/pisces_rules.txt | 59 ------ .../pipeline/output_4/run_switch.sh | 35 ---- .../pipeline/output_4/run_test.py | 192 ------------------ .../pipeline/output_4/test.pcap | Bin 296 -> 0 bytes .../set-field/output_1/commands_no_def.txt | 102 +++++++++- .../set-field/output_1/test.pcap | Bin 296 -> 296 bytes .../set-field/output_2/commands_no_def.txt | 102 +++++++++- .../set-field/output_2/test.pcap | Bin 296 -> 296 bytes .../set-field/output_3/commands | 0 .../set-field/output_3/commands_no_def.txt | 102 +++++++++- .../set-field/output_3/test.pcap | Bin 296 -> 296 bytes .../set-field/output_4/commands_no_def.txt | 102 +++++++++- .../set-field/output_4/test.pcap | Bin 296 -> 296 bytes 51 files changed, 432 insertions(+), 2341 deletions(-) delete mode 100644 synthesis/whippersnapper/pipeline/output_1/commands.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_1/fvs.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_1/main.p4 delete mode 100644 synthesis/whippersnapper/pipeline/output_1/main16.p4 delete mode 100644 synthesis/whippersnapper/pipeline/output_1/obt_commands.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_1/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/pipeline/output_1/run_switch.sh delete mode 100755 synthesis/whippersnapper/pipeline/output_1/run_test.py delete mode 100644 synthesis/whippersnapper/pipeline/output_1/test.pcap delete mode 100644 synthesis/whippersnapper/pipeline/output_2/commands.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_2/fvs.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_2/main.p4 delete mode 100644 synthesis/whippersnapper/pipeline/output_2/main16.p4 delete mode 100644 synthesis/whippersnapper/pipeline/output_2/obt_commands.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_2/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/pipeline/output_2/run_switch.sh delete mode 100755 synthesis/whippersnapper/pipeline/output_2/run_test.py delete mode 100644 synthesis/whippersnapper/pipeline/output_2/test.pcap delete mode 100644 synthesis/whippersnapper/pipeline/output_3/commands.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_3/fvs.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_3/main.p4 delete mode 100644 synthesis/whippersnapper/pipeline/output_3/main16.p4 delete mode 100644 synthesis/whippersnapper/pipeline/output_3/obt_commands.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_3/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/pipeline/output_3/run_switch.sh delete mode 100755 synthesis/whippersnapper/pipeline/output_3/run_test.py delete mode 100644 synthesis/whippersnapper/pipeline/output_3/test.pcap delete mode 100644 synthesis/whippersnapper/pipeline/output_4/commands.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_4/fvs.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_4/main.p4 delete mode 100644 synthesis/whippersnapper/pipeline/output_4/main16.p4 delete mode 100644 synthesis/whippersnapper/pipeline/output_4/obt_commands.txt delete mode 100644 synthesis/whippersnapper/pipeline/output_4/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/pipeline/output_4/run_switch.sh delete mode 100755 synthesis/whippersnapper/pipeline/output_4/run_test.py delete mode 100644 synthesis/whippersnapper/pipeline/output_4/test.pcap delete mode 100644 synthesis/whippersnapper/set-field/output_3/commands diff --git a/synthesis/lib/Benchmark.ml b/synthesis/lib/Benchmark.ml index 70c6f14c..59176a70 100644 --- a/synthesis/lib/Benchmark.ml +++ b/synthesis/lib/Benchmark.ml @@ -227,7 +227,7 @@ and to_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ in let log = (assume %:% Encode.encode_from_p4 inc p4_file false) |> Encode.unify_names var_mapping |> zero_init fvs |> drop_handle fvs in - let phys = OneBigTable.mk_one_big_table log |> zero_init fvs |> drop_handle fvs in + let phys = OneBigTable.mk_one_big_table (ConstantProp.propogate log) |> zero_init fvs |> drop_handle fvs in (* |> CompilerOpts.optimize fvs *) (* let maxN n = Bigint.(of_int_exn n ** of_int_exn 2 - one) in *) (* let fvs = parse_fvs fvs in *) @@ -255,7 +255,7 @@ and from_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ let phys = (assume %:% Encode.encode_from_p4 inc p4_file false) |> Encode.unify_names var_mapping |> zero_init fvs |> drop_handle fvs in - let log = OneBigTable.mk_one_big_table phys |> zero_init fvs |> drop_handle fvs in + let log = OneBigTable.mk_one_big_table (ConstantProp.propogate phys) |> zero_init fvs |> drop_handle fvs in (* |> CompilerOpts.optimize fvs *) (* let maxN n = Bigint.(of_int_exn n ** of_int_exn 2 - one) in *) (* let fvs = parse_fvs fvs in *) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 176b4d86..924f8e12 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -62,12 +62,29 @@ def set_field_fvs(ind): return fvs; def set_field_rules(ind): - return []; + return [ ["table_add forward_table forward ", 48, " => ", 9] + , ["table_add test_tbl mod_headers ", 8, " =>"]]; + + +def add_header_fvs(ind): + return set_field_fvs(ind); + +def add_header_rules(ind): + return [ ["table_add forward_table forward ", 48, " => ", 9] + , ["table_add test_tbl add_headers ", 8, " =>"]]; +def rm_header_fvs(ind): + return ""; + +def rm_header_rules(ind): + return []; + # whippersnapper commands def whippersnapper_cmds(): return { "set-field" : (["--operations"], [], set_field_fvs, set_field_rules) + , "add-header" : (["--headers"], [], add_header_fvs, add_header_rules) + , "rm-header" : (["--headers"], [], rm_header_fvs, rm_header_rules) , "pipeline" : (["--tables"], ["--table-size", "16"], pipeline_fvs, pipeline_rules) } # generate the OBT, and the corresponding rules @@ -94,6 +111,9 @@ def rewrite_cmds(cmds): fmcds = "\n".join(fcmds); return fmcds; +def avenir_flags(): + return ["--cache-edits", "--cache-queries", "--reach-filter"] + def rules_for_obt(fn, num, rule_temps, fvs): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; @@ -116,7 +136,9 @@ def rules_for_obt(fn, num, rule_temps, fvs): # cmdnd.write(line); - res = subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_no_def_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); + res = subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file + , edits_file, fvs_file, assume_file, "-b", "100", "-data" + , commands_no_def_file, "-e", "100", "-p"] + avenir_flags() + ["-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); obt_commands = "output/obt_commands.txt"; @@ -127,7 +149,7 @@ def rules_for_obt(fn, num, rule_temps, fvs): #except: # print("no commands written"); -def run_whippersnapper(ws_cmd, mx): +def run_whippersnapper(ws_cmd, rule_num, mx): if not os.path.isdir("whippersnapper/" + ws_cmd): os.mkdir("whippersnapper/" + ws_cmd) @@ -136,7 +158,7 @@ def run_whippersnapper(ws_cmd, mx): (cmd_line1, cmd_line2, fvs, get_rule_temps) = whippersnapper_cmds()[ws_cmd]; subprocess.run(["p4benchmark", "--feature", ws_cmd] + cmd_line1 + [str(i)] + cmd_line2); subprocess.run(["p4test", "--p4v", "14", "--pp", "output/main16.p4", "output/main.p4"]); - rules_for_obt("output", 10, get_rule_temps(i), fvs(i)); + rules_for_obt("output", rule_num, get_rule_temps(i), fvs(i)); shutil.move("output", "whippersnapper/" + ws_cmd + "/output_" + str(i)); @@ -156,7 +178,7 @@ def run_avenir(ws_cmd): fvs_file = output + "fvs.txt"; st_time = time.perf_counter(); - subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE); + subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); end_time = time.perf_counter(); elapsed = end_time - st_time; res += str(i) + "," + str(elapsed) + "\n" @@ -168,7 +190,8 @@ def run_avenir(ws_cmd): ws_cmd = sys.argv[2]; if cmd == "generate": - mx = sys.argv[3]; - run_whippersnapper(ws_cmd, mx); + rule_num = int(sys.argv[3]); + mx = sys.argv[4]; + run_whippersnapper(ws_cmd, rule_num, mx); elif cmd == "eval": run_avenir(ws_cmd); diff --git a/synthesis/whippersnapper/pipeline/output_1/commands.txt b/synthesis/whippersnapper/pipeline/output_1/commands.txt deleted file mode 100644 index e946a6c4..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/commands.txt +++ /dev/null @@ -1,3 +0,0 @@ -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt deleted file mode 100644 index 23d3e742..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/commands_no_def.txt +++ /dev/null @@ -1,10 +0,0 @@ -table_add forward_table forward 232450651038796 => 141 -table_add forward_table forward 276792359776097 => 422 -table_add forward_table forward 145915283282960 => 425 -table_add forward_table forward 278336394630074 => 134 -table_add forward_table forward 215491492381317 => 101 -table_add forward_table forward 128659595199307 => 396 -table_add forward_table forward 14722526092518 => 12 -table_add forward_table forward 247668913491660 => 176 -table_add forward_table forward 262546617834811 => 86 -table_add forward_table forward 15030650420279 => 78 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_1/fvs.txt b/synthesis/whippersnapper/pipeline/output_1/fvs.txt deleted file mode 100644 index 6ae05b3c..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/fvs.txt +++ /dev/null @@ -1,2 +0,0 @@ -hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 -standard_metadata.egress_spec,standard_metadata.egress_spec,9 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_1/main.p4 b/synthesis/whippersnapper/pipeline/output_1/main.p4 deleted file mode 100644 index be33cb88..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/main.p4 +++ /dev/null @@ -1,114 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header ethernet_t ethernet; - -parser start { - return parse_ethernet; -} - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_IPV4 : parse_ipv4; - default : ingress; - } -} -header_type ipv4_t { - fields { - version : 4; - ihl : 4; - diffserv : 8; - totalLen : 16; - identification : 16; - flags : 3; - fragOffset : 13; - ttl : 8; - protocol : 8; - hdrChecksum : 16; - srcAddr : 32; - dstAddr : 32; - } -} -header ipv4_t ipv4; - -parser parse_ipv4 { - extract(ipv4); - return select(latest.protocol) { - TCP_PROTOCOL : parse_tcp; - UDP_PROTOCOL : parse_udp; - default : ingress; - } -} -header_type tcp_t { - fields { - srcPort : 16; - dstPort : 16; - seqNo : 32; - ackNo : 32; - dataOffset : 4; - res : 3; - ecn : 3; - ctrl : 6; - window : 16; - checksum : 16; - urgentPtr : 16; - } -} -header tcp_t tcp; - -parser parse_tcp { - extract(tcp); - return ingress; -} -header_type udp_t { - fields { - srcPort : 16; - dstPort : 16; - length_ : 16; - checksum : 16; - } -} -header udp_t udp; - -parser parse_udp { - extract(udp); - return select(latest.dstPort) { - default : ingress; - - } -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action _nop() { - -} -control ingress { - apply(forward_table); - -} diff --git a/synthesis/whippersnapper/pipeline/output_1/main16.p4 b/synthesis/whippersnapper/pipeline/output_1/main16.p4 deleted file mode 100644 index a54427ea..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/main16.p4 +++ /dev/null @@ -1,139 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header ipv4_t { - bit<4> version; - bit<4> ihl; - bit<8> diffserv; - bit<16> totalLen; - bit<16> identification; - bit<3> flags; - bit<13> fragOffset; - bit<8> ttl; - bit<8> protocol; - bit<16> hdrChecksum; - bit<32> srcAddr; - bit<32> dstAddr; -} - -header tcp_t { - bit<16> srcPort; - bit<16> dstPort; - bit<32> seqNo; - bit<32> ackNo; - bit<4> dataOffset; - bit<3> res; - bit<3> ecn; - bit<6> ctrl; - bit<16> window; - bit<16> checksum; - bit<16> urgentPtr; -} - -header udp_t { - bit<16> srcPort; - bit<16> dstPort; - bit<16> length_; - bit<16> checksum; -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".ipv4") - ipv4_t ipv4; - @name(".tcp") - tcp_t tcp; - @name(".udp") - udp_t udp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - 16w0x800: parse_ipv4; - default: accept; - } - } - @name(".parse_ipv4") state parse_ipv4 { - packet.extract(hdr.ipv4); - transition select(hdr.ipv4.protocol) { - 8w0x6: parse_tcp; - 8w0x11: parse_udp; - default: accept; - } - } - @name(".parse_tcp") state parse_tcp { - packet.extract(hdr.tcp); - transition accept; - } - @name(".parse_udp") state parse_udp { - packet.extract(hdr.udp); - transition select(hdr.udp.dstPort) { - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward(bit<9> port) { - standard_metadata.egress_spec = port; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name(".forward_table") table forward_table { - actions = { - forward; - _drop; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - apply { - forward_table.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ipv4); - packet.emit(hdr.udp); - packet.emit(hdr.tcp); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt deleted file mode 100644 index af00bb75..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/obt_commands.txt +++ /dev/null @@ -1,10 +0,0 @@ -ADD,OneBigTable,0xd369a27ba44c#48,0x8d#9,0 -ADD,OneBigTable,0xfbbdbe47ef61#48,0x1a6#9,0 -ADD,OneBigTable,0x84b58ca09c10#48,0x1a9#9,0 -ADD,OneBigTable,0xfd253dee13ba#48,0x86#9,0 -ADD,OneBigTable,0xc3fd05db0285#48,0x65#9,0 -ADD,OneBigTable,0x7503e578034b#48,0x18c#9,0 -ADD,OneBigTable,0xd63daf01ce6#48,0xc#9,0 -ADD,OneBigTable,0xe140e99c4ecc#48,0xb0#9,0 -ADD,OneBigTable,0xeec8e5e49d3b#48,0x56#9,0 -ADD,OneBigTable,0xdab98943c37#48,0x4e#9,0 diff --git a/synthesis/whippersnapper/pipeline/output_1/pisces_rules.txt b/synthesis/whippersnapper/pipeline/output_1/pisces_rules.txt deleted file mode 100644 index dad6805b..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/pisces_rules.txt +++ /dev/null @@ -1,11 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/pipeline/output_1/run_switch.sh b/synthesis/whippersnapper/pipeline/output_1/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_1/run_test.py b/synthesis/whippersnapper/pipeline/output_1/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/pipeline/output_1/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/pipeline/output_1/test.pcap b/synthesis/whippersnapper/pipeline/output_1/test.pcap deleted file mode 100644 index fe060154fc88101d11ad872e52c6da968062f01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}=vpPOr=>||7!~tTSBUOu4O~IrI2ZJjE!zYlagJAM2 ZE(RukE(Qjsf9GvH81Aj*gqbwFXaG+{6Kntg diff --git a/synthesis/whippersnapper/pipeline/output_2/commands.txt b/synthesis/whippersnapper/pipeline/output_2/commands.txt deleted file mode 100644 index 80386dc1..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/commands.txt +++ /dev/null @@ -1,5 +0,0 @@ -table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 -table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt deleted file mode 100644 index 274b479e..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/commands_no_def.txt +++ /dev/null @@ -1,10 +0,0 @@ -table_add forward_table forward 58140110824168 => 468 -table_add table_1 forward1 26591111550355 => 106 -table_add forward_table forward 213766505871118 => 20 -table_add table_1 forward1 147221475456242 => 471 -table_add forward_table forward 216400982791630 => 79 -table_add table_1 forward1 240019410756106 => 313 -table_add forward_table forward 182276735270223 => 93 -table_add table_1 forward1 232845400026916 => 479 -table_add forward_table forward 253313800835166 => 28 -table_add table_1 forward1 39503237931740 => 467 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_2/fvs.txt b/synthesis/whippersnapper/pipeline/output_2/fvs.txt deleted file mode 100644 index 6ae05b3c..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/fvs.txt +++ /dev/null @@ -1,2 +0,0 @@ -hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 -standard_metadata.egress_spec,standard_metadata.egress_spec,9 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_2/main.p4 b/synthesis/whippersnapper/pipeline/output_2/main.p4 deleted file mode 100644 index 67c339c1..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/main.p4 +++ /dev/null @@ -1,126 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header ethernet_t ethernet; - -parser start { - return parse_ethernet; -} - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_IPV4 : parse_ipv4; - default : ingress; - } -} -header_type ipv4_t { - fields { - version : 4; - ihl : 4; - diffserv : 8; - totalLen : 16; - identification : 16; - flags : 3; - fragOffset : 13; - ttl : 8; - protocol : 8; - hdrChecksum : 16; - srcAddr : 32; - dstAddr : 32; - } -} -header ipv4_t ipv4; - -parser parse_ipv4 { - extract(ipv4); - return select(latest.protocol) { - TCP_PROTOCOL : parse_tcp; - UDP_PROTOCOL : parse_udp; - default : ingress; - } -} -header_type tcp_t { - fields { - srcPort : 16; - dstPort : 16; - seqNo : 32; - ackNo : 32; - dataOffset : 4; - res : 3; - ecn : 3; - ctrl : 6; - window : 16; - checksum : 16; - urgentPtr : 16; - } -} -header tcp_t tcp; - -parser parse_tcp { - extract(tcp); - return ingress; -} -header_type udp_t { - fields { - srcPort : 16; - dstPort : 16; - length_ : 16; - checksum : 16; - } -} -header udp_t udp; - -parser parse_udp { - extract(udp); - return select(latest.dstPort) { - default : ingress; - - } -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action _nop() { - -} -action forward1(_port) { -modify_field(standard_metadata.egress_spec, _port); -} -table table_1 { - reads { - ethernet.dstAddr : exact; - } actions { - forward1; - } - size : 16; -} -control ingress { - apply(forward_table); - apply(table_1); - -} diff --git a/synthesis/whippersnapper/pipeline/output_2/main16.p4 b/synthesis/whippersnapper/pipeline/output_2/main16.p4 deleted file mode 100644 index c124953b..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/main16.p4 +++ /dev/null @@ -1,152 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header ipv4_t { - bit<4> version; - bit<4> ihl; - bit<8> diffserv; - bit<16> totalLen; - bit<16> identification; - bit<3> flags; - bit<13> fragOffset; - bit<8> ttl; - bit<8> protocol; - bit<16> hdrChecksum; - bit<32> srcAddr; - bit<32> dstAddr; -} - -header tcp_t { - bit<16> srcPort; - bit<16> dstPort; - bit<32> seqNo; - bit<32> ackNo; - bit<4> dataOffset; - bit<3> res; - bit<3> ecn; - bit<6> ctrl; - bit<16> window; - bit<16> checksum; - bit<16> urgentPtr; -} - -header udp_t { - bit<16> srcPort; - bit<16> dstPort; - bit<16> length_; - bit<16> checksum; -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".ipv4") - ipv4_t ipv4; - @name(".tcp") - tcp_t tcp; - @name(".udp") - udp_t udp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - 16w0x800: parse_ipv4; - default: accept; - } - } - @name(".parse_ipv4") state parse_ipv4 { - packet.extract(hdr.ipv4); - transition select(hdr.ipv4.protocol) { - 8w0x6: parse_tcp; - 8w0x11: parse_udp; - default: accept; - } - } - @name(".parse_tcp") state parse_tcp { - packet.extract(hdr.tcp); - transition accept; - } - @name(".parse_udp") state parse_udp { - packet.extract(hdr.udp); - transition select(hdr.udp.dstPort) { - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward(bit<9> port) { - standard_metadata.egress_spec = port; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name(".forward1") action forward1(bit<9> _port) { - standard_metadata.egress_spec = _port; - } - @name(".forward_table") table forward_table { - actions = { - forward; - _drop; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - @name(".table_1") table table_1 { - actions = { - forward1; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 16; - } - apply { - forward_table.apply(); - table_1.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ipv4); - packet.emit(hdr.udp); - packet.emit(hdr.tcp); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt deleted file mode 100644 index def64f9d..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/obt_commands.txt +++ /dev/null @@ -1,12 +0,0 @@ -ADD,OneBigTable,0x34e0cca722e8#48;0x0#1,0x1d4#9,8 -ADD,OneBigTable,0x182f39c21593#48;0x0#1,0x6a#9,6 -ADD,OneBigTable,0xc26b64a5b70e#48;0x0#1,0x14#9,6 -DEL,OneBigTable,2 -ADD,OneBigTable,0x85e5abbf74f2#48;0x0#1,0x1d7#9,14 -ADD,OneBigTable,0xc26b64a5b70e#48;0x0#1,0x14#9,6 -ADD,OneBigTable,0xc4d0c7b555ce#48;0x0#1,0x4f#9,5 -ADD,OneBigTable,0xda4bdfb7a20a#48;0x0#1,0x139#9,14 -ADD,OneBigTable,0xa5c79c0e7d4f#48;0x0#1,0x5d#9,8 -ADD,OneBigTable,0xd3c58b5b2f24#48;0x0#1,0x1df#9,14 -ADD,OneBigTable,0xe663371d905e#48;0x0#1,0x1c#9,14 -ADD,OneBigTable,0x23ed9076e2dc#48;0x0#1,0x1d3#9,6 diff --git a/synthesis/whippersnapper/pipeline/output_2/pisces_rules.txt b/synthesis/whippersnapper/pipeline/output_2/pisces_rules.txt deleted file mode 100644 index fcf185af..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/pisces_rules.txt +++ /dev/null @@ -1,27 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/pipeline/output_2/run_switch.sh b/synthesis/whippersnapper/pipeline/output_2/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_2/run_test.py b/synthesis/whippersnapper/pipeline/output_2/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/pipeline/output_2/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/pipeline/output_2/test.pcap b/synthesis/whippersnapper/pipeline/output_2/test.pcap deleted file mode 100644 index 2452d4c75d41fade937d70200f60e32e17b23c6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}=yE;C8r6Mzg0~FvnQngss6ik|MFt{=>d;%$R5KMl> Z#lXbR#lXPy@4Sr%!@aefFq4KC4FDa%6FdL_ diff --git a/synthesis/whippersnapper/pipeline/output_3/commands.txt b/synthesis/whippersnapper/pipeline/output_3/commands.txt deleted file mode 100644 index 91e3a8c1..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/commands.txt +++ /dev/null @@ -1,7 +0,0 @@ -table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 -table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 -table_add table_2 forward2 0C:C4:7A:A3:25:34 => 1 -table_add table_2 forward2 0C:C4:7A:A3:25:35 => 2 -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt deleted file mode 100644 index f26f4e35..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/commands_no_def.txt +++ /dev/null @@ -1,10 +0,0 @@ -table_add forward_table forward 91617822774558 => 333 -table_add table_1 forward1 155252130734085 => 312 -table_add table_2 forward2 274306869018145 => 27 -table_add forward_table forward 256892919113761 => 487 -table_add table_1 forward1 40899654737514 => 416 -table_add table_2 forward2 245323031151673 => 177 -table_add forward_table forward 115863861947370 => 462 -table_add table_1 forward1 117369492012720 => 382 -table_add table_2 forward2 95839470699883 => 132 -table_add forward_table forward 164007724682836 => 357 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_3/fvs.txt b/synthesis/whippersnapper/pipeline/output_3/fvs.txt deleted file mode 100644 index 6ae05b3c..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/fvs.txt +++ /dev/null @@ -1,2 +0,0 @@ -hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 -standard_metadata.egress_spec,standard_metadata.egress_spec,9 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_3/main.p4 b/synthesis/whippersnapper/pipeline/output_3/main.p4 deleted file mode 100644 index 20504bb0..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/main.p4 +++ /dev/null @@ -1,138 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header ethernet_t ethernet; - -parser start { - return parse_ethernet; -} - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_IPV4 : parse_ipv4; - default : ingress; - } -} -header_type ipv4_t { - fields { - version : 4; - ihl : 4; - diffserv : 8; - totalLen : 16; - identification : 16; - flags : 3; - fragOffset : 13; - ttl : 8; - protocol : 8; - hdrChecksum : 16; - srcAddr : 32; - dstAddr : 32; - } -} -header ipv4_t ipv4; - -parser parse_ipv4 { - extract(ipv4); - return select(latest.protocol) { - TCP_PROTOCOL : parse_tcp; - UDP_PROTOCOL : parse_udp; - default : ingress; - } -} -header_type tcp_t { - fields { - srcPort : 16; - dstPort : 16; - seqNo : 32; - ackNo : 32; - dataOffset : 4; - res : 3; - ecn : 3; - ctrl : 6; - window : 16; - checksum : 16; - urgentPtr : 16; - } -} -header tcp_t tcp; - -parser parse_tcp { - extract(tcp); - return ingress; -} -header_type udp_t { - fields { - srcPort : 16; - dstPort : 16; - length_ : 16; - checksum : 16; - } -} -header udp_t udp; - -parser parse_udp { - extract(udp); - return select(latest.dstPort) { - default : ingress; - - } -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action _nop() { - -} -action forward1(_port) { -modify_field(standard_metadata.egress_spec, _port); -} -table table_1 { - reads { - ethernet.dstAddr : exact; - } actions { - forward1; - } - size : 16; -} -action forward2(_port) { -modify_field(standard_metadata.egress_spec, _port); -} -table table_2 { - reads { - ethernet.dstAddr : exact; - } actions { - forward2; - } - size : 16; -} -control ingress { - apply(forward_table); - apply(table_1); - apply(table_2); - -} diff --git a/synthesis/whippersnapper/pipeline/output_3/main16.p4 b/synthesis/whippersnapper/pipeline/output_3/main16.p4 deleted file mode 100644 index 2f350e41..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/main16.p4 +++ /dev/null @@ -1,165 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header ipv4_t { - bit<4> version; - bit<4> ihl; - bit<8> diffserv; - bit<16> totalLen; - bit<16> identification; - bit<3> flags; - bit<13> fragOffset; - bit<8> ttl; - bit<8> protocol; - bit<16> hdrChecksum; - bit<32> srcAddr; - bit<32> dstAddr; -} - -header tcp_t { - bit<16> srcPort; - bit<16> dstPort; - bit<32> seqNo; - bit<32> ackNo; - bit<4> dataOffset; - bit<3> res; - bit<3> ecn; - bit<6> ctrl; - bit<16> window; - bit<16> checksum; - bit<16> urgentPtr; -} - -header udp_t { - bit<16> srcPort; - bit<16> dstPort; - bit<16> length_; - bit<16> checksum; -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".ipv4") - ipv4_t ipv4; - @name(".tcp") - tcp_t tcp; - @name(".udp") - udp_t udp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - 16w0x800: parse_ipv4; - default: accept; - } - } - @name(".parse_ipv4") state parse_ipv4 { - packet.extract(hdr.ipv4); - transition select(hdr.ipv4.protocol) { - 8w0x6: parse_tcp; - 8w0x11: parse_udp; - default: accept; - } - } - @name(".parse_tcp") state parse_tcp { - packet.extract(hdr.tcp); - transition accept; - } - @name(".parse_udp") state parse_udp { - packet.extract(hdr.udp); - transition select(hdr.udp.dstPort) { - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward(bit<9> port) { - standard_metadata.egress_spec = port; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name(".forward1") action forward1(bit<9> _port) { - standard_metadata.egress_spec = _port; - } - @name(".forward2") action forward2(bit<9> _port) { - standard_metadata.egress_spec = _port; - } - @name(".forward_table") table forward_table { - actions = { - forward; - _drop; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - @name(".table_1") table table_1 { - actions = { - forward1; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 16; - } - @name(".table_2") table table_2 { - actions = { - forward2; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 16; - } - apply { - forward_table.apply(); - table_1.apply(); - table_2.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ipv4); - packet.emit(hdr.udp); - packet.emit(hdr.tcp); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt deleted file mode 100644 index ba41d62e..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/obt_commands.txt +++ /dev/null @@ -1,10 +0,0 @@ -ADD,OneBigTable,0x53536fc8151e#48;0x0#1,0x14d#9,4 -ADD,OneBigTable,0x8d33741a6005#48;0x0#1,0x138#9,4 -ADD,OneBigTable,0xf97b0b7cbe21#48;0x0#1,0x1b#9,4 -ADD,OneBigTable,0xe9a48b306821#48;0x0#1,0x1e7#9,4 -ADD,OneBigTable,0x2532b1645e6a#48;0x0#1,0x1a0#9,4 -ADD,OneBigTable,0xdf1eb8208439#48;0x0#1,0xb1#9,4 -ADD,OneBigTable,0x6960a8556bea#48;0x0#1,0x1ce#9,4 -ADD,OneBigTable,0x6abf36e0feb0#48;0x0#1,0x17e#9,4 -ADD,OneBigTable,0x572a5d9b456b#48;0x0#1,0x84#9,4 -ADD,OneBigTable,0x952a062b8e54#48;0x0#1,0x165#9,4 diff --git a/synthesis/whippersnapper/pipeline/output_3/pisces_rules.txt b/synthesis/whippersnapper/pipeline/output_3/pisces_rules.txt deleted file mode 100644 index 8f04831c..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/pisces_rules.txt +++ /dev/null @@ -1,43 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/pipeline/output_3/run_switch.sh b/synthesis/whippersnapper/pipeline/output_3/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_3/run_test.py b/synthesis/whippersnapper/pipeline/output_3/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/pipeline/output_3/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/pipeline/output_3/test.pcap b/synthesis/whippersnapper/pipeline/output_3/test.pcap deleted file mode 100644 index 60932c637094614f3908b6ff3d38d1d610cfa261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}=w>mz4PA(gS0~FvnQngss6ik|MFt{=>d;%$R5KMl> Z#lXbR#lXPy@4Sr%!@aefFq4KC4FF@86Mp~z diff --git a/synthesis/whippersnapper/pipeline/output_4/commands.txt b/synthesis/whippersnapper/pipeline/output_4/commands.txt deleted file mode 100644 index 6d922873..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/commands.txt +++ /dev/null @@ -1,9 +0,0 @@ -table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 -table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 -table_add table_2 forward2 0C:C4:7A:A3:25:34 => 1 -table_add table_2 forward2 0C:C4:7A:A3:25:35 => 2 -table_add table_3 forward3 0C:C4:7A:A3:25:34 => 1 -table_add table_3 forward3 0C:C4:7A:A3:25:35 => 2 -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt b/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt deleted file mode 100644 index 8a613f1d..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/commands_no_def.txt +++ /dev/null @@ -1,10 +0,0 @@ -table_add forward_table forward 95637572516327 => 502 -table_add table_1 forward1 213231801868936 => 183 -table_add table_2 forward2 257319196357528 => 210 -table_add table_3 forward3 228173519594036 => 73 -table_add forward_table forward 84289786544981 => 224 -table_add table_1 forward1 9994994373731 => 284 -table_add table_2 forward2 48797916300226 => 452 -table_add table_3 forward3 105959170556874 => 181 -table_add forward_table forward 59165357544033 => 236 -table_add table_1 forward1 263498934732380 => 231 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_4/fvs.txt b/synthesis/whippersnapper/pipeline/output_4/fvs.txt deleted file mode 100644 index 6ae05b3c..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/fvs.txt +++ /dev/null @@ -1,2 +0,0 @@ -hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 -standard_metadata.egress_spec,standard_metadata.egress_spec,9 \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_4/main.p4 b/synthesis/whippersnapper/pipeline/output_4/main.p4 deleted file mode 100644 index 39e9d837..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/main.p4 +++ /dev/null @@ -1,150 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header ethernet_t ethernet; - -parser start { - return parse_ethernet; -} - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_IPV4 : parse_ipv4; - default : ingress; - } -} -header_type ipv4_t { - fields { - version : 4; - ihl : 4; - diffserv : 8; - totalLen : 16; - identification : 16; - flags : 3; - fragOffset : 13; - ttl : 8; - protocol : 8; - hdrChecksum : 16; - srcAddr : 32; - dstAddr : 32; - } -} -header ipv4_t ipv4; - -parser parse_ipv4 { - extract(ipv4); - return select(latest.protocol) { - TCP_PROTOCOL : parse_tcp; - UDP_PROTOCOL : parse_udp; - default : ingress; - } -} -header_type tcp_t { - fields { - srcPort : 16; - dstPort : 16; - seqNo : 32; - ackNo : 32; - dataOffset : 4; - res : 3; - ecn : 3; - ctrl : 6; - window : 16; - checksum : 16; - urgentPtr : 16; - } -} -header tcp_t tcp; - -parser parse_tcp { - extract(tcp); - return ingress; -} -header_type udp_t { - fields { - srcPort : 16; - dstPort : 16; - length_ : 16; - checksum : 16; - } -} -header udp_t udp; - -parser parse_udp { - extract(udp); - return select(latest.dstPort) { - default : ingress; - - } -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action _nop() { - -} -action forward1(_port) { -modify_field(standard_metadata.egress_spec, _port); -} -table table_1 { - reads { - ethernet.dstAddr : exact; - } actions { - forward1; - } - size : 16; -} -action forward2(_port) { -modify_field(standard_metadata.egress_spec, _port); -} -table table_2 { - reads { - ethernet.dstAddr : exact; - } actions { - forward2; - } - size : 16; -} -action forward3(_port) { -modify_field(standard_metadata.egress_spec, _port); -} -table table_3 { - reads { - ethernet.dstAddr : exact; - } actions { - forward3; - } - size : 16; -} -control ingress { - apply(forward_table); - apply(table_1); - apply(table_2); - apply(table_3); - -} diff --git a/synthesis/whippersnapper/pipeline/output_4/main16.p4 b/synthesis/whippersnapper/pipeline/output_4/main16.p4 deleted file mode 100644 index ef7a57a7..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/main16.p4 +++ /dev/null @@ -1,178 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header ipv4_t { - bit<4> version; - bit<4> ihl; - bit<8> diffserv; - bit<16> totalLen; - bit<16> identification; - bit<3> flags; - bit<13> fragOffset; - bit<8> ttl; - bit<8> protocol; - bit<16> hdrChecksum; - bit<32> srcAddr; - bit<32> dstAddr; -} - -header tcp_t { - bit<16> srcPort; - bit<16> dstPort; - bit<32> seqNo; - bit<32> ackNo; - bit<4> dataOffset; - bit<3> res; - bit<3> ecn; - bit<6> ctrl; - bit<16> window; - bit<16> checksum; - bit<16> urgentPtr; -} - -header udp_t { - bit<16> srcPort; - bit<16> dstPort; - bit<16> length_; - bit<16> checksum; -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".ipv4") - ipv4_t ipv4; - @name(".tcp") - tcp_t tcp; - @name(".udp") - udp_t udp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - 16w0x800: parse_ipv4; - default: accept; - } - } - @name(".parse_ipv4") state parse_ipv4 { - packet.extract(hdr.ipv4); - transition select(hdr.ipv4.protocol) { - 8w0x6: parse_tcp; - 8w0x11: parse_udp; - default: accept; - } - } - @name(".parse_tcp") state parse_tcp { - packet.extract(hdr.tcp); - transition accept; - } - @name(".parse_udp") state parse_udp { - packet.extract(hdr.udp); - transition select(hdr.udp.dstPort) { - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward(bit<9> port) { - standard_metadata.egress_spec = port; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name(".forward1") action forward1(bit<9> _port) { - standard_metadata.egress_spec = _port; - } - @name(".forward2") action forward2(bit<9> _port) { - standard_metadata.egress_spec = _port; - } - @name(".forward3") action forward3(bit<9> _port) { - standard_metadata.egress_spec = _port; - } - @name(".forward_table") table forward_table { - actions = { - forward; - _drop; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - @name(".table_1") table table_1 { - actions = { - forward1; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 16; - } - @name(".table_2") table table_2 { - actions = { - forward2; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 16; - } - @name(".table_3") table table_3 { - actions = { - forward3; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 16; - } - apply { - forward_table.apply(); - table_1.apply(); - table_2.apply(); - table_3.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ipv4); - packet.emit(hdr.udp); - packet.emit(hdr.tcp); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt b/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt deleted file mode 100644 index 3a81b0c7..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/obt_commands.txt +++ /dev/null @@ -1,10 +0,0 @@ -ADD,OneBigTable,0x56fb5b8979e7#48;0x0#1,0x1f6#9,9 -ADD,OneBigTable,0xc1eee5ce2288#48;0x0#1,0xb7#9,4 -ADD,OneBigTable,0xea07cb4af398#48;0x0#1,0xd2#9,14 -ADD,OneBigTable,0xcf85c9952234#48;0x0#1,0x49#9,14 -ADD,OneBigTable,0x4ca93ec90355#48;0x0#1,0xe0#9,14 -ADD,OneBigTable,0x9172416d463#48;0x0#1,0x11c#9,353 -ADD,OneBigTable,0x2c61a67783c2#48;0x0#1,0x1c4#9,14 -ADD,OneBigTable,0x605e8ab8c3ca#48;0x0#1,0xb5#9,353 -ADD,OneBigTable,0x35cf821e9261#48;0x0#1,0xec#9,4 -ADD,OneBigTable,0xefa6a067465c#48;0x0#1,0xe7#9,9 diff --git a/synthesis/whippersnapper/pipeline/output_4/pisces_rules.txt b/synthesis/whippersnapper/pipeline/output_4/pisces_rules.txt deleted file mode 100644 index cde02d62..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/pisces_rules.txt +++ /dev/null @@ -1,59 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,3)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=3,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,4)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=4,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/pipeline/output_4/run_switch.sh b/synthesis/whippersnapper/pipeline/output_4/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/pipeline/output_4/run_test.py b/synthesis/whippersnapper/pipeline/output_4/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/pipeline/output_4/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/pipeline/output_4/test.pcap b/synthesis/whippersnapper/pipeline/output_4/test.pcap deleted file mode 100644 index 544f3f42a1ae1b27613ceda6025dc0c3f0295407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}AusS~eO9&r?0~FvnQngss6ik|MFt{=>d;%$R5KMl> Z#lXbR#lXPy@4Sr%!@aefFq4KC4FIqd6UYDn diff --git a/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt index 43009c21..1b2d21ca 100644 --- a/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt +++ b/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt @@ -1,2 +1,100 @@ -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 59241358863483 => 51 +table_add test_tbl mod_headers 11 => +table_add forward_table forward 123570633914062 => 222 +table_add test_tbl mod_headers 178 => +table_add forward_table forward 244929389032945 => 184 +table_add test_tbl mod_headers 212 => +table_add forward_table forward 73643145691298 => 216 +table_add test_tbl mod_headers 189 => +table_add forward_table forward 270012754902246 => 119 +table_add test_tbl mod_headers 12 => +table_add forward_table forward 72386713993901 => 99 +table_add test_tbl mod_headers 93 => +table_add forward_table forward 7498259412764 => 326 +table_add test_tbl mod_headers 184 => +table_add forward_table forward 142657517911471 => 372 +table_add test_tbl mod_headers 133 => +table_add forward_table forward 264814360322709 => 431 +table_add test_tbl mod_headers 238 => +table_add forward_table forward 100550549755270 => 411 +table_add test_tbl mod_headers 114 => +table_add forward_table forward 67897392088725 => 404 +table_add test_tbl mod_headers 115 => +table_add forward_table forward 248766306572562 => 55 +table_add test_tbl mod_headers 41 => +table_add forward_table forward 9734427945530 => 457 +table_add test_tbl mod_headers 224 => +table_add forward_table forward 157732965799661 => 339 +table_add test_tbl mod_headers 185 => +table_add forward_table forward 38626154746980 => 74 +table_add test_tbl mod_headers 11 => +table_add forward_table forward 162966351472154 => 292 +table_add test_tbl mod_headers 105 => +table_add forward_table forward 40560176775372 => 63 +table_add test_tbl mod_headers 6 => +table_add forward_table forward 231701608973730 => 220 +table_add test_tbl mod_headers 40 => +table_add forward_table forward 165535865527805 => 444 +table_add test_tbl mod_headers 114 => +table_add forward_table forward 219671597675327 => 152 +table_add test_tbl mod_headers 145 => +table_add forward_table forward 82595365224955 => 204 +table_add test_tbl mod_headers 60 => +table_add forward_table forward 26082431439160 => 439 +table_add test_tbl mod_headers 195 => +table_add forward_table forward 78446836594321 => 203 +table_add test_tbl mod_headers 134 => +table_add forward_table forward 211921062027606 => 169 +table_add test_tbl mod_headers 35 => +table_add forward_table forward 81123836083862 => 263 +table_add test_tbl mod_headers 84 => +table_add forward_table forward 221240280406748 => 350 +table_add test_tbl mod_headers 217 => +table_add forward_table forward 85787171762367 => 286 +table_add test_tbl mod_headers 126 => +table_add forward_table forward 5741059998089 => 453 +table_add test_tbl mod_headers 130 => +table_add forward_table forward 54292506661765 => 285 +table_add test_tbl mod_headers 201 => +table_add forward_table forward 146327685435083 => 300 +table_add test_tbl mod_headers 233 => +table_add forward_table forward 106106888650127 => 301 +table_add test_tbl mod_headers 90 => +table_add forward_table forward 100880592152665 => 30 +table_add test_tbl mod_headers 130 => +table_add forward_table forward 27818106099119 => 508 +table_add test_tbl mod_headers 163 => +table_add forward_table forward 77352365781819 => 484 +table_add test_tbl mod_headers 163 => +table_add forward_table forward 118779794324315 => 230 +table_add test_tbl mod_headers 88 => +table_add forward_table forward 44360226552935 => 315 +table_add test_tbl mod_headers 67 => +table_add forward_table forward 44063699702009 => 283 +table_add test_tbl mod_headers 194 => +table_add forward_table forward 151592734423501 => 367 +table_add test_tbl mod_headers 128 => +table_add forward_table forward 227513077585723 => 103 +table_add test_tbl mod_headers 86 => +table_add forward_table forward 187320048590810 => 303 +table_add test_tbl mod_headers 248 => +table_add forward_table forward 258931850962413 => 75 +table_add test_tbl mod_headers 124 => +table_add forward_table forward 65384863441698 => 73 +table_add test_tbl mod_headers 105 => +table_add forward_table forward 110312655334568 => 177 +table_add test_tbl mod_headers 176 => +table_add forward_table forward 238740104617937 => 145 +table_add test_tbl mod_headers 254 => +table_add forward_table forward 152188050575583 => 395 +table_add test_tbl mod_headers 195 => +table_add forward_table forward 58302309586181 => 269 +table_add test_tbl mod_headers 89 => +table_add forward_table forward 31228012144040 => 452 +table_add test_tbl mod_headers 191 => +table_add forward_table forward 270845141320098 => 169 +table_add test_tbl mod_headers 87 => +table_add forward_table forward 186393877878922 => 206 +table_add test_tbl mod_headers 43 => +table_add forward_table forward 127086566817741 => 47 +table_add test_tbl mod_headers 204 => \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_1/test.pcap b/synthesis/whippersnapper/set-field/output_1/test.pcap index 958b62a40892a8c581887698c0eff776f4e592e2..902348ef173aa27cd128eb523e877dc952c1efee 100644 GIT binary patch delta 18 ZcmZ3%w1R1Z1pC=*@$m|EY#Ze{838`71>*n! delta 18 ZcmZ3%w1R1Z1UvKjxOfEt-i`8{i~uu01gZc4 diff --git a/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt index 43009c21..d79755b8 100644 --- a/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt +++ b/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt @@ -1,2 +1,100 @@ -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 166276574298180 => 187 +table_add test_tbl mod_headers 57 => +table_add forward_table forward 36726009639380 => 433 +table_add test_tbl mod_headers 180 => +table_add forward_table forward 197465733759116 => 370 +table_add test_tbl mod_headers 182 => +table_add forward_table forward 274820023787800 => 421 +table_add test_tbl mod_headers 21 => +table_add forward_table forward 225424900446222 => 461 +table_add test_tbl mod_headers 128 => +table_add forward_table forward 152944483578549 => 356 +table_add test_tbl mod_headers 227 => +table_add forward_table forward 222297453434687 => 347 +table_add test_tbl mod_headers 165 => +table_add forward_table forward 191822242448449 => 172 +table_add test_tbl mod_headers 237 => +table_add forward_table forward 171324152523538 => 224 +table_add test_tbl mod_headers 32 => +table_add forward_table forward 30734571204525 => 390 +table_add test_tbl mod_headers 108 => +table_add forward_table forward 38698444006327 => 297 +table_add test_tbl mod_headers 7 => +table_add forward_table forward 119856269600665 => 365 +table_add test_tbl mod_headers 200 => +table_add forward_table forward 244736093399010 => 64 +table_add test_tbl mod_headers 34 => +table_add forward_table forward 117066850481030 => 24 +table_add test_tbl mod_headers 188 => +table_add forward_table forward 176551247101353 => 389 +table_add test_tbl mod_headers 198 => +table_add forward_table forward 126911939375044 => 65 +table_add test_tbl mod_headers 119 => +table_add forward_table forward 36721686449263 => 323 +table_add test_tbl mod_headers 66 => +table_add forward_table forward 275815794190469 => 144 +table_add test_tbl mod_headers 142 => +table_add forward_table forward 167967552544352 => 462 +table_add test_tbl mod_headers 229 => +table_add forward_table forward 50201611957881 => 15 +table_add test_tbl mod_headers 164 => +table_add forward_table forward 170651213726615 => 360 +table_add test_tbl mod_headers 85 => +table_add forward_table forward 113193286394253 => 411 +table_add test_tbl mod_headers 154 => +table_add forward_table forward 173487399854300 => 238 +table_add test_tbl mod_headers 121 => +table_add forward_table forward 55682329737722 => 486 +table_add test_tbl mod_headers 184 => +table_add forward_table forward 78523434628782 => 187 +table_add test_tbl mod_headers 95 => +table_add forward_table forward 9431193963958 => 449 +table_add test_tbl mod_headers 93 => +table_add forward_table forward 231374721216465 => 43 +table_add test_tbl mod_headers 182 => +table_add forward_table forward 16010150978069 => 300 +table_add test_tbl mod_headers 47 => +table_add forward_table forward 13542129314667 => 337 +table_add test_tbl mod_headers 58 => +table_add forward_table forward 173586021219667 => 356 +table_add test_tbl mod_headers 189 => +table_add forward_table forward 273291777317622 => 268 +table_add test_tbl mod_headers 242 => +table_add forward_table forward 60102105994247 => 221 +table_add test_tbl mod_headers 54 => +table_add forward_table forward 166386039590292 => 159 +table_add test_tbl mod_headers 30 => +table_add forward_table forward 226157418165056 => 483 +table_add test_tbl mod_headers 53 => +table_add forward_table forward 150959380946784 => 189 +table_add test_tbl mod_headers 214 => +table_add forward_table forward 56490462203741 => 235 +table_add test_tbl mod_headers 76 => +table_add forward_table forward 214352488409912 => 71 +table_add test_tbl mod_headers 27 => +table_add forward_table forward 257596140236716 => 403 +table_add test_tbl mod_headers 117 => +table_add forward_table forward 259982225574063 => 460 +table_add test_tbl mod_headers 215 => +table_add forward_table forward 216550369926160 => 227 +table_add test_tbl mod_headers 26 => +table_add forward_table forward 197717473289595 => 458 +table_add test_tbl mod_headers 39 => +table_add forward_table forward 50209310506203 => 0 +table_add test_tbl mod_headers 111 => +table_add forward_table forward 19133589963657 => 330 +table_add test_tbl mod_headers 60 => +table_add forward_table forward 173202582841491 => 310 +table_add test_tbl mod_headers 125 => +table_add forward_table forward 275539451747639 => 417 +table_add test_tbl mod_headers 83 => +table_add forward_table forward 113145123191011 => 464 +table_add test_tbl mod_headers 213 => +table_add forward_table forward 190079527341233 => 213 +table_add test_tbl mod_headers 136 => +table_add forward_table forward 124307850758816 => 333 +table_add test_tbl mod_headers 106 => +table_add forward_table forward 190040483983040 => 43 +table_add test_tbl mod_headers 47 => +table_add forward_table forward 154238933109350 => 30 +table_add test_tbl mod_headers 238 => \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_2/test.pcap b/synthesis/whippersnapper/set-field/output_2/test.pcap index 5228b572d8c4e46715a873dfcfc55f5e9eab9150..ddb4400e2c93a507d6bb4318abccb8a24a46bb46 100644 GIT binary patch delta 18 ZcmZ3%w1R1Z1pB#b@$u!M+#BUN838~&1{VMT delta 18 ZcmZ3%w1R1Z1Ut+5xcFDiY#Ze{838+B1>pby diff --git a/synthesis/whippersnapper/set-field/output_3/commands b/synthesis/whippersnapper/set-field/output_3/commands deleted file mode 100644 index e69de29b..00000000 diff --git a/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt index 43009c21..94ab2a9b 100644 --- a/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt +++ b/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt @@ -1,2 +1,100 @@ -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 112279879622089 => 253 +table_add test_tbl mod_headers 122 => +table_add forward_table forward 195900334132523 => 89 +table_add test_tbl mod_headers 28 => +table_add forward_table forward 57968068631966 => 23 +table_add test_tbl mod_headers 161 => +table_add forward_table forward 207352962649288 => 313 +table_add test_tbl mod_headers 190 => +table_add forward_table forward 264470628719422 => 25 +table_add test_tbl mod_headers 173 => +table_add forward_table forward 235531775823259 => 25 +table_add test_tbl mod_headers 107 => +table_add forward_table forward 29332718682137 => 40 +table_add test_tbl mod_headers 29 => +table_add forward_table forward 195669660791568 => 87 +table_add test_tbl mod_headers 188 => +table_add forward_table forward 223356765204605 => 260 +table_add test_tbl mod_headers 57 => +table_add forward_table forward 189728367257476 => 392 +table_add test_tbl mod_headers 221 => +table_add forward_table forward 108554140328813 => 275 +table_add test_tbl mod_headers 156 => +table_add forward_table forward 171695613268995 => 162 +table_add test_tbl mod_headers 64 => +table_add forward_table forward 176968480214033 => 388 +table_add test_tbl mod_headers 12 => +table_add forward_table forward 258220961940663 => 268 +table_add test_tbl mod_headers 135 => +table_add forward_table forward 78319247174148 => 205 +table_add test_tbl mod_headers 252 => +table_add forward_table forward 154635300036525 => 307 +table_add test_tbl mod_headers 110 => +table_add forward_table forward 182490769292394 => 343 +table_add test_tbl mod_headers 155 => +table_add forward_table forward 13089397246443 => 126 +table_add test_tbl mod_headers 217 => +table_add forward_table forward 221364084704388 => 253 +table_add test_tbl mod_headers 244 => +table_add forward_table forward 142429262950613 => 60 +table_add test_tbl mod_headers 168 => +table_add forward_table forward 7307449911425 => 459 +table_add test_tbl mod_headers 45 => +table_add forward_table forward 171149989792755 => 429 +table_add test_tbl mod_headers 13 => +table_add forward_table forward 55112464991729 => 264 +table_add test_tbl mod_headers 60 => +table_add forward_table forward 262037997415742 => 253 +table_add test_tbl mod_headers 171 => +table_add forward_table forward 164051310800444 => 184 +table_add test_tbl mod_headers 118 => +table_add forward_table forward 117311110583246 => 306 +table_add test_tbl mod_headers 246 => +table_add forward_table forward 272030505180612 => 252 +table_add test_tbl mod_headers 234 => +table_add forward_table forward 122455931844778 => 463 +table_add test_tbl mod_headers 32 => +table_add forward_table forward 27970249716261 => 55 +table_add test_tbl mod_headers 39 => +table_add forward_table forward 70078178211514 => 158 +table_add test_tbl mod_headers 76 => +table_add forward_table forward 109051101459675 => 173 +table_add test_tbl mod_headers 95 => +table_add forward_table forward 67183859561372 => 323 +table_add test_tbl mod_headers 81 => +table_add forward_table forward 257397376587230 => 162 +table_add test_tbl mod_headers 171 => +table_add forward_table forward 237499743982528 => 385 +table_add test_tbl mod_headers 172 => +table_add forward_table forward 53894299443824 => 477 +table_add test_tbl mod_headers 90 => +table_add forward_table forward 269997018020027 => 229 +table_add test_tbl mod_headers 189 => +table_add forward_table forward 236479910525679 => 20 +table_add test_tbl mod_headers 132 => +table_add forward_table forward 92079543914591 => 223 +table_add test_tbl mod_headers 26 => +table_add forward_table forward 104383624142282 => 389 +table_add test_tbl mod_headers 164 => +table_add forward_table forward 27377722093357 => 143 +table_add test_tbl mod_headers 33 => +table_add forward_table forward 204878698808217 => 140 +table_add test_tbl mod_headers 168 => +table_add forward_table forward 165737774653461 => 194 +table_add test_tbl mod_headers 11 => +table_add forward_table forward 37979236513787 => 444 +table_add test_tbl mod_headers 143 => +table_add forward_table forward 245394623271387 => 263 +table_add test_tbl mod_headers 234 => +table_add forward_table forward 262884300438689 => 357 +table_add test_tbl mod_headers 251 => +table_add forward_table forward 182902320574109 => 407 +table_add test_tbl mod_headers 209 => +table_add forward_table forward 146285748047819 => 334 +table_add test_tbl mod_headers 151 => +table_add forward_table forward 75488005421100 => 296 +table_add test_tbl mod_headers 53 => +table_add forward_table forward 41060324014273 => 430 +table_add test_tbl mod_headers 156 => +table_add forward_table forward 43610330194783 => 144 +table_add test_tbl mod_headers 236 => \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_3/test.pcap b/synthesis/whippersnapper/set-field/output_3/test.pcap index 5733fa96ad6f0f70d22a36e3af51d1836c7a6aac..01a0b18409cd14e31b40d125102c9ead393f9262 100644 GIT binary patch delta 18 acmZ3%w1R1Z1p9?+@$quA88^yvG6DcURt5Y3 delta 18 ZcmZ3%w1R1Z1Ut+5xOi)R{*CgSi~uwY1jhgX diff --git a/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt index 43009c21..bd807270 100644 --- a/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt +++ b/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt @@ -1,2 +1,100 @@ -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 +table_add forward_table forward 166258303231835 => 165 +table_add test_tbl mod_headers 232 => +table_add forward_table forward 275152746947892 => 64 +table_add test_tbl mod_headers 224 => +table_add forward_table forward 64639339388196 => 269 +table_add test_tbl mod_headers 219 => +table_add forward_table forward 94804175934764 => 201 +table_add test_tbl mod_headers 193 => +table_add forward_table forward 33112590968573 => 119 +table_add test_tbl mod_headers 40 => +table_add forward_table forward 132739648760120 => 100 +table_add test_tbl mod_headers 55 => +table_add forward_table forward 65892869867693 => 178 +table_add test_tbl mod_headers 164 => +table_add forward_table forward 150000475571010 => 281 +table_add test_tbl mod_headers 184 => +table_add forward_table forward 160789576834840 => 295 +table_add test_tbl mod_headers 23 => +table_add forward_table forward 189817270578344 => 337 +table_add test_tbl mod_headers 115 => +table_add forward_table forward 80743686112525 => 96 +table_add test_tbl mod_headers 237 => +table_add forward_table forward 231839183496759 => 154 +table_add test_tbl mod_headers 84 => +table_add forward_table forward 116867670566912 => 285 +table_add test_tbl mod_headers 137 => +table_add forward_table forward 215983872137157 => 241 +table_add test_tbl mod_headers 106 => +table_add forward_table forward 90970234298824 => 475 +table_add test_tbl mod_headers 225 => +table_add forward_table forward 226714411620062 => 54 +table_add test_tbl mod_headers 130 => +table_add forward_table forward 74468462375863 => 490 +table_add test_tbl mod_headers 8 => +table_add forward_table forward 133253962229456 => 26 +table_add test_tbl mod_headers 6 => +table_add forward_table forward 238393379760228 => 257 +table_add test_tbl mod_headers 52 => +table_add forward_table forward 89394335017742 => 471 +table_add test_tbl mod_headers 74 => +table_add forward_table forward 40411595097109 => 127 +table_add test_tbl mod_headers 88 => +table_add forward_table forward 196362901914143 => 16 +table_add test_tbl mod_headers 29 => +table_add forward_table forward 126458211357415 => 274 +table_add test_tbl mod_headers 234 => +table_add forward_table forward 14141085815784 => 335 +table_add test_tbl mod_headers 147 => +table_add forward_table forward 198254251881879 => 83 +table_add test_tbl mod_headers 245 => +table_add forward_table forward 267155285949100 => 421 +table_add test_tbl mod_headers 2 => +table_add forward_table forward 183366445857529 => 4 +table_add test_tbl mod_headers 62 => +table_add forward_table forward 107543971442864 => 360 +table_add test_tbl mod_headers 122 => +table_add forward_table forward 11837575775390 => 348 +table_add test_tbl mod_headers 253 => +table_add forward_table forward 76081433481929 => 72 +table_add test_tbl mod_headers 82 => +table_add forward_table forward 169688201003189 => 371 +table_add test_tbl mod_headers 102 => +table_add forward_table forward 49383096652150 => 114 +table_add test_tbl mod_headers 29 => +table_add forward_table forward 263147939339111 => 433 +table_add test_tbl mod_headers 14 => +table_add forward_table forward 17779535301039 => 425 +table_add test_tbl mod_headers 189 => +table_add forward_table forward 22955676850946 => 239 +table_add test_tbl mod_headers 2 => +table_add forward_table forward 141686060547802 => 236 +table_add test_tbl mod_headers 218 => +table_add forward_table forward 206558480699713 => 74 +table_add test_tbl mod_headers 108 => +table_add forward_table forward 100353145397311 => 177 +table_add test_tbl mod_headers 85 => +table_add forward_table forward 111176514697228 => 396 +table_add test_tbl mod_headers 144 => +table_add forward_table forward 258529511922460 => 401 +table_add test_tbl mod_headers 77 => +table_add forward_table forward 268020481048681 => 177 +table_add test_tbl mod_headers 85 => +table_add forward_table forward 55847308800752 => 243 +table_add test_tbl mod_headers 205 => +table_add forward_table forward 121261008807960 => 193 +table_add test_tbl mod_headers 106 => +table_add forward_table forward 237883222656742 => 401 +table_add test_tbl mod_headers 24 => +table_add forward_table forward 124353259990352 => 322 +table_add test_tbl mod_headers 62 => +table_add forward_table forward 269527157841321 => 23 +table_add test_tbl mod_headers 106 => +table_add forward_table forward 100561094202000 => 291 +table_add test_tbl mod_headers 215 => +table_add forward_table forward 189172833178747 => 492 +table_add test_tbl mod_headers 12 => +table_add forward_table forward 209695650999003 => 211 +table_add test_tbl mod_headers 155 => +table_add forward_table forward 103755114728135 => 420 +table_add test_tbl mod_headers 18 => \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_4/test.pcap b/synthesis/whippersnapper/set-field/output_4/test.pcap index 8a8922e7ad8f89e8cb4b088d61f4cbeea2036e59..d75fd3e591c9fc22d62928520c02b52d96beb652 100644 GIT binary patch delta 17 YcmZ3%w1R1Z1lz@H@$pS88|And0XdTe$N&HU delta 17 YcmZ3%w1R1Z1RLx5xOm3$jdEO!05FXN<^TWy From 1636b9e72443d3d5b0abc1ae2f3d33928b70de14 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Tue, 15 Sep 2020 22:54:43 -0400 Subject: [PATCH 14/24] Plotting data --- synthesis/whippersnapper/bad/commands.txt | 5 - .../whippersnapper/bad/commands_no_def.txt | 1 - .../whippersnapper/bad/commands_phys.txt | 2 - synthesis/whippersnapper/bad/fvs.txt | 1 - synthesis/whippersnapper/bad/main.p4 | 126 ------------ synthesis/whippersnapper/bad/main16.p4 | 122 ----------- synthesis/whippersnapper/bad/pisces_rules.txt | 27 --- synthesis/whippersnapper/bad/run_switch.sh | 35 ---- synthesis/whippersnapper/bad/run_test.py | 192 ------------------ synthesis/whippersnapper/bad/test.pcap | Bin 296 -> 0 bytes synthesis/whippersnapper/bench.py | 81 ++++++-- .../set-field/output_1/commands.txt | 5 - .../set-field/output_1/commands_no_def.txt | 30 --- .../whippersnapper/set-field/output_1/fvs.txt | 2 - .../whippersnapper/set-field/output_1/main.p4 | 106 ---------- .../set-field/output_1/main16.p4 | 133 ------------ .../set-field/output_1/obt_commands.txt | 0 .../set-field/output_1/pisces_rules.txt | 11 - .../set-field/output_1/run_switch.sh | 35 ---- .../set-field/output_1/run_test.py | 192 ------------------ .../set-field/output_1/test.pcap | Bin 296 -> 0 bytes .../set-field/output_2/commands.txt | 5 - .../set-field/output_2/commands_no_def.txt | 30 --- .../whippersnapper/set-field/output_2/fvs.txt | 3 - .../whippersnapper/set-field/output_2/main.p4 | 108 ---------- .../set-field/output_2/main16.p4 | 135 ------------ .../set-field/output_2/obt_commands.txt | 0 .../set-field/output_2/pisces_rules.txt | 11 - .../set-field/output_2/run_switch.sh | 35 ---- .../set-field/output_2/run_test.py | 192 ------------------ .../set-field/output_2/test.pcap | Bin 296 -> 0 bytes .../set-field/output_3/commands.txt | 5 - .../set-field/output_3/commands_no_def.txt | 30 --- .../whippersnapper/set-field/output_3/fvs.txt | 4 - .../whippersnapper/set-field/output_3/main.p4 | 110 ---------- .../set-field/output_3/main16.p4 | 137 ------------- .../set-field/output_3/obt_commands.txt | 0 .../set-field/output_3/pisces_rules.txt | 11 - .../set-field/output_3/run_switch.sh | 35 ---- .../set-field/output_3/run_test.py | 192 ------------------ .../set-field/output_3/test.pcap | Bin 296 -> 0 bytes .../set-field/output_4/commands.txt | 5 - .../set-field/output_4/commands_no_def.txt | 30 --- .../whippersnapper/set-field/output_4/fvs.txt | 5 - .../whippersnapper/set-field/output_4/main.p4 | 112 ---------- .../set-field/output_4/main16.p4 | 139 ------------- .../set-field/output_4/obt_commands.txt | 0 .../set-field/output_4/pisces_rules.txt | 11 - .../set-field/output_4/run_switch.sh | 35 ---- .../set-field/output_4/run_test.py | 192 ------------------ .../set-field/output_4/test.pcap | Bin 296 -> 0 bytes 51 files changed, 67 insertions(+), 2611 deletions(-) delete mode 100644 synthesis/whippersnapper/bad/commands.txt delete mode 100644 synthesis/whippersnapper/bad/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/bad/commands_phys.txt delete mode 100644 synthesis/whippersnapper/bad/fvs.txt delete mode 100644 synthesis/whippersnapper/bad/main.p4 delete mode 100644 synthesis/whippersnapper/bad/main16.p4 delete mode 100644 synthesis/whippersnapper/bad/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/bad/run_switch.sh delete mode 100755 synthesis/whippersnapper/bad/run_test.py delete mode 100644 synthesis/whippersnapper/bad/test.pcap delete mode 100644 synthesis/whippersnapper/set-field/output_1/commands.txt delete mode 100644 synthesis/whippersnapper/set-field/output_1/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/set-field/output_1/fvs.txt delete mode 100644 synthesis/whippersnapper/set-field/output_1/main.p4 delete mode 100644 synthesis/whippersnapper/set-field/output_1/main16.p4 delete mode 100644 synthesis/whippersnapper/set-field/output_1/obt_commands.txt delete mode 100644 synthesis/whippersnapper/set-field/output_1/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/set-field/output_1/run_switch.sh delete mode 100755 synthesis/whippersnapper/set-field/output_1/run_test.py delete mode 100644 synthesis/whippersnapper/set-field/output_1/test.pcap delete mode 100644 synthesis/whippersnapper/set-field/output_2/commands.txt delete mode 100644 synthesis/whippersnapper/set-field/output_2/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/set-field/output_2/fvs.txt delete mode 100644 synthesis/whippersnapper/set-field/output_2/main.p4 delete mode 100644 synthesis/whippersnapper/set-field/output_2/main16.p4 delete mode 100644 synthesis/whippersnapper/set-field/output_2/obt_commands.txt delete mode 100644 synthesis/whippersnapper/set-field/output_2/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/set-field/output_2/run_switch.sh delete mode 100755 synthesis/whippersnapper/set-field/output_2/run_test.py delete mode 100644 synthesis/whippersnapper/set-field/output_2/test.pcap delete mode 100644 synthesis/whippersnapper/set-field/output_3/commands.txt delete mode 100644 synthesis/whippersnapper/set-field/output_3/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/set-field/output_3/fvs.txt delete mode 100644 synthesis/whippersnapper/set-field/output_3/main.p4 delete mode 100644 synthesis/whippersnapper/set-field/output_3/main16.p4 delete mode 100644 synthesis/whippersnapper/set-field/output_3/obt_commands.txt delete mode 100644 synthesis/whippersnapper/set-field/output_3/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/set-field/output_3/run_switch.sh delete mode 100755 synthesis/whippersnapper/set-field/output_3/run_test.py delete mode 100644 synthesis/whippersnapper/set-field/output_3/test.pcap delete mode 100644 synthesis/whippersnapper/set-field/output_4/commands.txt delete mode 100644 synthesis/whippersnapper/set-field/output_4/commands_no_def.txt delete mode 100644 synthesis/whippersnapper/set-field/output_4/fvs.txt delete mode 100644 synthesis/whippersnapper/set-field/output_4/main.p4 delete mode 100644 synthesis/whippersnapper/set-field/output_4/main16.p4 delete mode 100644 synthesis/whippersnapper/set-field/output_4/obt_commands.txt delete mode 100644 synthesis/whippersnapper/set-field/output_4/pisces_rules.txt delete mode 100755 synthesis/whippersnapper/set-field/output_4/run_switch.sh delete mode 100755 synthesis/whippersnapper/set-field/output_4/run_test.py delete mode 100644 synthesis/whippersnapper/set-field/output_4/test.pcap diff --git a/synthesis/whippersnapper/bad/commands.txt b/synthesis/whippersnapper/bad/commands.txt deleted file mode 100644 index 80386dc1..00000000 --- a/synthesis/whippersnapper/bad/commands.txt +++ /dev/null @@ -1,5 +0,0 @@ -table_add table_1 forward1 0C:C4:7A:A3:25:34 => 1 -table_add table_1 forward1 0C:C4:7A:A3:25:35 => 2 -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/bad/commands_no_def.txt b/synthesis/whippersnapper/bad/commands_no_def.txt deleted file mode 100644 index 83fad2e2..00000000 --- a/synthesis/whippersnapper/bad/commands_no_def.txt +++ /dev/null @@ -1 +0,0 @@ -table_add forward_table forward 0C:C4:7A:A3:25:35 => diff --git a/synthesis/whippersnapper/bad/commands_phys.txt b/synthesis/whippersnapper/bad/commands_phys.txt deleted file mode 100644 index c3800d5a..00000000 --- a/synthesis/whippersnapper/bad/commands_phys.txt +++ /dev/null @@ -1,2 +0,0 @@ -ADD,OneBigTable,0C:C4:7A:A3:25:35;0,,9 -ADD,OneBigTable,0C:C4:7A:A3:25:35;1,,9 diff --git a/synthesis/whippersnapper/bad/fvs.txt b/synthesis/whippersnapper/bad/fvs.txt deleted file mode 100644 index 3f6ca706..00000000 --- a/synthesis/whippersnapper/bad/fvs.txt +++ /dev/null @@ -1 +0,0 @@ -hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48 diff --git a/synthesis/whippersnapper/bad/main.p4 b/synthesis/whippersnapper/bad/main.p4 deleted file mode 100644 index 67c339c1..00000000 --- a/synthesis/whippersnapper/bad/main.p4 +++ /dev/null @@ -1,126 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header ethernet_t ethernet; - -parser start { - return parse_ethernet; -} - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_IPV4 : parse_ipv4; - default : ingress; - } -} -header_type ipv4_t { - fields { - version : 4; - ihl : 4; - diffserv : 8; - totalLen : 16; - identification : 16; - flags : 3; - fragOffset : 13; - ttl : 8; - protocol : 8; - hdrChecksum : 16; - srcAddr : 32; - dstAddr : 32; - } -} -header ipv4_t ipv4; - -parser parse_ipv4 { - extract(ipv4); - return select(latest.protocol) { - TCP_PROTOCOL : parse_tcp; - UDP_PROTOCOL : parse_udp; - default : ingress; - } -} -header_type tcp_t { - fields { - srcPort : 16; - dstPort : 16; - seqNo : 32; - ackNo : 32; - dataOffset : 4; - res : 3; - ecn : 3; - ctrl : 6; - window : 16; - checksum : 16; - urgentPtr : 16; - } -} -header tcp_t tcp; - -parser parse_tcp { - extract(tcp); - return ingress; -} -header_type udp_t { - fields { - srcPort : 16; - dstPort : 16; - length_ : 16; - checksum : 16; - } -} -header udp_t udp; - -parser parse_udp { - extract(udp); - return select(latest.dstPort) { - default : ingress; - - } -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action _nop() { - -} -action forward1(_port) { -modify_field(standard_metadata.egress_spec, _port); -} -table table_1 { - reads { - ethernet.dstAddr : exact; - } actions { - forward1; - } - size : 16; -} -control ingress { - apply(forward_table); - apply(table_1); - -} diff --git a/synthesis/whippersnapper/bad/main16.p4 b/synthesis/whippersnapper/bad/main16.p4 deleted file mode 100644 index 105ef641..00000000 --- a/synthesis/whippersnapper/bad/main16.p4 +++ /dev/null @@ -1,122 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header ipv4_t { -} - -header tcp_t { -} - -header udp_t { -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".ipv4") - ipv4_t ipv4; - @name(".tcp") - tcp_t tcp; - @name(".udp") - udp_t udp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - default: accept; - } - } - @name(".parse_ipv4") state parse_ipv4 { - packet.extract(hdr.ipv4); - transition select(hdr.ipv4.protocol) { - 8w0x6: parse_tcp; - 8w0x11: parse_udp; - default: accept; - } - } - @name(".parse_tcp") state parse_tcp { - packet.extract(hdr.tcp); - transition accept; - } - @name(".parse_udp") state parse_udp { - packet.extract(hdr.udp); - transition select(hdr.udp.dstPort) { - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward() { - standard_metadata.egress_spec = 1; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name(".forward1") action forward1() { - } - @name(".forward_table") table forward_table { - actions = { - forward; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - @name(".table_1") table table_1 { - actions = { - forward1; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 16; - } - apply { - forward_table.apply(); - table_1.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ipv4); - packet.emit(hdr.udp); - packet.emit(hdr.tcp); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/bad/pisces_rules.txt b/synthesis/whippersnapper/bad/pisces_rules.txt deleted file mode 100644 index fcf185af..00000000 --- a/synthesis/whippersnapper/bad/pisces_rules.txt +++ /dev/null @@ -1,27 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C470A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C471A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C472A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C473A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x04C474A3534 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x05C475A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x06C476A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x07C470A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x08C471A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x09C472A3534 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x00C473A3530 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x01C474A3531 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x02C475A3532 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ethernet_dstAddr=0x03C476A3533 actions=set_field:2->reg0,resubmit(,2)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=2,priority=32768, actions=deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/bad/run_switch.sh b/synthesis/whippersnapper/bad/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/bad/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/bad/run_test.py b/synthesis/whippersnapper/bad/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/bad/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/bad/test.pcap b/synthesis/whippersnapper/bad/test.pcap deleted file mode 100644 index 768a48cd7c98ead47f4f8e6c9f2e8025ee24395c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}=Y#AFLvzima0SfROsamXR3MNfB7+e_`K7o`u2qwSc XVqoIuVqjqUcizT>;oe%Hmf;8h-PRKU diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 55c2ac56..28aafa2a 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -7,6 +7,7 @@ import sys import time +import plotter as pl # generate a rule, generic functions @@ -67,7 +68,8 @@ def set_field_rules(ind): def add_header_fvs(ind): - fvs = "hdr.ptp.reserved2,hdr.ptp.reserved2,8\n"; + fvs = "hdr.ptp.reserved2,hdr.ptp.reserved2,8\nstandard_metadata.egress_spec,standard_metadata.egress_spec,9\n"; + fvs += "hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48\n"; for i in list(range(0, ind)): fvs += "hdr.header_" + str(i) + ".field_0,hdr.header_" + str(i) + ".field_0,16\n" return fvs; @@ -116,10 +118,15 @@ def rewrite_cmds(cmds): fmcds = "\n".join(fcmds); return fmcds; +def non_cache_flags(): + return ["--reach-filter"]; + def avenir_flags(): - return ["--cache-edits", "1", "--cache-queries", "--reach-filter"] + x = ["--cache-edits", "1", "--cache-queries"] + x.extend(non_cache_flags()); + return x; -def rules_for_obt(ws_cmd, i, fn, num, rule_temps, fvs): +def rules_for_obt(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags = avenir_flags()): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; assume_file = "whippersnapper/empty_assume.txt"; @@ -144,7 +151,7 @@ def rules_for_obt(ws_cmd, i, fn, num, rule_temps, fvs): st_time = time.perf_counter(); res = subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file , edits_file, fvs_file, assume_file, "-b", "100", "-data" - , commands_no_def_file, "-e", "100", "-p"] + avenir_flags() + ["-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); + , commands_no_def_file, "-e", "100", "-p"] + flags + ["-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); end_time = time.perf_counter(); elapsed = end_time - st_time; @@ -157,12 +164,15 @@ def rules_for_obt(ws_cmd, i, fn, num, rule_temps, fvs): #except: # print("no commands written"); - with open("whippersnapper/" + ws_cmd + "_orig_to_obt_res.csv", "a") as res_file: + with open("whippersnapper/" + fldr + "/" + ws_cmd + "_orig_to_obt_res.csv", "a") as res_file: res_file.write(str(i) + "," + str(elapsed) + "\n") -def run_whippersnapper(ws_cmd, rule_num, mx): - if not os.path.isdir("whippersnapper/" + ws_cmd): - os.mkdir("whippersnapper/" + ws_cmd) +def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags = avenir_flags()): + if not os.path.isdir("whippersnapper/" + fldr): + os.mkdir("whippersnapper/" + fldr) + + if not os.path.isdir("whippersnapper/"+ fldr + "/" + ws_cmd): + os.mkdir("whippersnapper/" + fldr + "/" + ws_cmd) for i in list(range(1, int(mx))): @@ -170,9 +180,9 @@ def run_whippersnapper(ws_cmd, rule_num, mx): (cmd_line1, cmd_line2, fvs, get_rule_temps) = whippersnapper_cmds()[ws_cmd]; subprocess.run(["p4benchmark", "--feature", ws_cmd] + cmd_line1 + [str(i)] + cmd_line2); subprocess.run(["p4test", "--p4v", "14", "--pp", "output/main16.p4", "output/main.p4"]); - rules_for_obt(ws_cmd, i, "output", rule_num, get_rule_temps(i), fvs(i)); + rules_for_obt(ws_cmd, fldr, i, "output", rule_num, get_rule_temps(i), fvs(i), flags); - shutil.move("output", "whippersnapper/" + ws_cmd + "/output_" + str(i)); + shutil.move("output", "whippersnapper/" + fldr + "/"+ ws_cmd + "/output_" + str(i)); # run the actual evaluation, using OBT as the logical program @@ -199,16 +209,59 @@ def run_avenir(ws_cmd): with open("whippersnapper/" + ws_cmd + "_obt_to_orig_res.csv", "w") as res_file: res_file.write(res); +# plot + +def string_to_data(data_str): + data = {}; + for line in data_str.split("\n"): + if "," in line: + pieces = line.split(","); + data[int(pieces[0])] = float(pieces[1]); + + return data + +def plot(ws_cmd, xlbl): + cache_data_str = "" + with open("whippersnapper/cache/" + ws_cmd + "_orig_to_obt_res.csv") as f: + cache_data_str = f.read(); + + no_cache_data_str = "" + with open("whippersnapper/no_cache/" + ws_cmd + "_orig_to_obt_res.csv") as f: + no_cache_data_str = f.read() + + cache_data = string_to_data(cache_data_str); + no_cache_data = string_to_data(no_cache_data_str); + + pl.plot_series(cache_data, no_cache_data, name = "whippersnapper/" + ws_cmd, xlabel = xlbl, ylabel = "synthesis time (s)"); + cmd = sys.argv[1]; -ws_cmd = sys.argv[2]; +ws_cmd = sys.argv[2] if len(sys.argv) > 2 else None; -if os.path.exists("whippersnapper/" + ws_cmd + "_orig_to_obt_res.csv"): +if cmd == "generate" and os.path.exists("whippersnapper/" + ws_cmd + "_orig_to_obt_res.csv"): print("output file already exists"); sys.exit(); -if cmd == "generate": +if cmd == "gen-all": + run_whippersnapper("pipeline", "cache", 20, 9, avenir_flags()); + run_whippersnapper("pipeline", "no_cache", 20, 9, non_cache_flags()); + + run_whippersnapper("set-field", "cache", 20, 100, avenir_flags()); + run_whippersnapper("set-field", "no_cache", 20, 100, non_cache_flags()); + + plot("pipeline", "# of tables"); + plot("set-field", "# of fields"); + +elif cmd == "generate": rule_num = int(sys.argv[3]); mx = sys.argv[4]; - run_whippersnapper(ws_cmd, rule_num, mx); + flags = non_cache_flags() if "--no-cache" in sys.argv else avenir_flags(); + fldr = "no_cache" if "--no-cache" in sys.argv else "cache"; + run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags); elif cmd == "eval": run_avenir(ws_cmd); +elif cmd == "plot": + if ws_cmd == "pipeline": + xlbl = "# of tables" + else: + xlbl = "# of fields" + plot(ws_cmd, xlbl); diff --git a/synthesis/whippersnapper/set-field/output_1/commands.txt b/synthesis/whippersnapper/set-field/output_1/commands.txt deleted file mode 100644 index 38e7446e..00000000 --- a/synthesis/whippersnapper/set-field/output_1/commands.txt +++ /dev/null @@ -1,5 +0,0 @@ -table_set_default test_tbl _nop -table_set_default test_tbl mod_headers -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt deleted file mode 100644 index 53f9ead5..00000000 --- a/synthesis/whippersnapper/set-field/output_1/commands_no_def.txt +++ /dev/null @@ -1,30 +0,0 @@ -table_add forward_table forward 125971479001161 => 27 -table_add test_tbl mod_headers 119 => -table_add forward_table forward 226413755936740 => 18 -table_add test_tbl mod_headers 106 => -table_add forward_table forward 173593723554481 => 48 -table_add test_tbl mod_headers 65 => -table_add forward_table forward 124970460126562 => 379 -table_add test_tbl mod_headers 251 => -table_add forward_table forward 57042195734582 => 465 -table_add test_tbl mod_headers 42 => -table_add forward_table forward 50773076112797 => 496 -table_add test_tbl mod_headers 47 => -table_add forward_table forward 175553850989192 => 329 -table_add test_tbl mod_headers 15 => -table_add forward_table forward 121678843987279 => 461 -table_add test_tbl mod_headers 156 => -table_add forward_table forward 100205731098692 => 36 -table_add test_tbl mod_headers 218 => -table_add forward_table forward 6777823823899 => 123 -table_add test_tbl mod_headers 24 => -table_add forward_table forward 138177156340627 => 54 -table_add test_tbl mod_headers 171 => -table_add forward_table forward 47330140766324 => 58 -table_add test_tbl mod_headers 149 => -table_add forward_table forward 73344285947411 => 232 -table_add test_tbl mod_headers 140 => -table_add forward_table forward 262449647896471 => 406 -table_add test_tbl mod_headers 100 => -table_add forward_table forward 74010016463173 => 389 -table_add test_tbl mod_headers 6 => \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_1/fvs.txt b/synthesis/whippersnapper/set-field/output_1/fvs.txt deleted file mode 100644 index d6164533..00000000 --- a/synthesis/whippersnapper/set-field/output_1/fvs.txt +++ /dev/null @@ -1,2 +0,0 @@ -hdr.ptp.reserved2,hdr.ptp.reserved2,8 -hdr.header_0.field_0,hdr.header_0.field_0,16 diff --git a/synthesis/whippersnapper/set-field/output_1/main.p4 b/synthesis/whippersnapper/set-field/output_1/main.p4 deleted file mode 100644 index 3b9415ea..00000000 --- a/synthesis/whippersnapper/set-field/output_1/main.p4 +++ /dev/null @@ -1,106 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header_type ptp_t { - fields { - transportSpecific : 4; - messageType : 4; - reserved : 4; - versionPTP : 4; - messageLength : 16; - domainNumber : 8; - reserved2 : 8; - flags : 16; - correction : 64; - reserved3 : 32; - sourcePortIdentity: 80; - sequenceId : 16; - PTPcontrol : 8; - logMessagePeriod : 8; - originTimestamp : 80; - } -} -parser start { return parse_ethernet; } -header ethernet_t ethernet; - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_PTP: parse_ptp; - default : ingress; - - } -} -header ptp_t ptp; - -parser parse_ptp { - extract(ptp); - return select(latest.reserved2) { - 1 : parse_header_0; - default : ingress; - - } -} -header_type header_0_t { - fields { - field_0 : 16; - - } -} -header header_0_t header_0; - -parser parse_header_0 { - extract(header_0); - return select(latest.field_0) { - default : ingress; - - } -} -action _nop() { - -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action mod_headers() { - modify_field(header_0.field_0, 1); - -} -table test_tbl { - reads { - ptp.reserved2 : exact; - } actions { - _nop; - mod_headers; - } - size : 4; -} -control ingress { - apply(forward_table); - apply(test_tbl); - -} diff --git a/synthesis/whippersnapper/set-field/output_1/main16.p4 b/synthesis/whippersnapper/set-field/output_1/main16.p4 deleted file mode 100644 index 7c1fcaaf..00000000 --- a/synthesis/whippersnapper/set-field/output_1/main16.p4 +++ /dev/null @@ -1,133 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header header_0_t { - bit<16> field_0; -} - -header ptp_t { - bit<4> transportSpecific; - bit<4> messageType; - bit<4> reserved; - bit<4> versionPTP; - bit<16> messageLength; - bit<8> domainNumber; - bit<8> reserved2; - bit<16> flags; - bit<64> correction; - bit<32> reserved3; - bit<80> sourcePortIdentity; - bit<16> sequenceId; - bit<8> PTPcontrol; - bit<8> logMessagePeriod; - bit<80> originTimestamp; -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".header_0") - header_0_t header_0; - @name(".ptp") - ptp_t ptp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - 16w0x88f7: parse_ptp; - default: accept; - } - } - @name(".parse_header_0") state parse_header_0 { - packet.extract(hdr.header_0); - transition select(hdr.header_0.field_0) { - default: accept; - } - } - @name(".parse_ptp") state parse_ptp { - packet.extract(hdr.ptp); - transition select(hdr.ptp.reserved2) { - 8w1: parse_header_0; - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward(bit<9> port) { - standard_metadata.egress_spec = port; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name("._nop") action _nop() { - } - @name(".mod_headers") action mod_headers() { - hdr.header_0.field_0 = 16w1; - } - @name(".forward_table") table forward_table { - actions = { - forward; - _drop; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - @name(".test_tbl") table test_tbl { - actions = { - _nop; - mod_headers; - } - key = { - hdr.ptp.reserved2: exact; - } - size = 4; - } - apply { - forward_table.apply(); - test_tbl.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ptp); - packet.emit(hdr.header_0); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/set-field/output_1/obt_commands.txt b/synthesis/whippersnapper/set-field/output_1/obt_commands.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/synthesis/whippersnapper/set-field/output_1/pisces_rules.txt b/synthesis/whippersnapper/set-field/output_1/pisces_rules.txt deleted file mode 100644 index 96e68b3b..00000000 --- a/synthesis/whippersnapper/set-field/output_1/pisces_rules.txt +++ /dev/null @@ -1,11 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ptp_reserved2=0x1 actions=set_field:1->header_0_field_0,deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/set-field/output_1/run_switch.sh b/synthesis/whippersnapper/set-field/output_1/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/set-field/output_1/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_1/run_test.py b/synthesis/whippersnapper/set-field/output_1/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/set-field/output_1/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/set-field/output_1/test.pcap b/synthesis/whippersnapper/set-field/output_1/test.pcap deleted file mode 100644 index 1ae2005cd380b89c8595a6ba1045730d019264a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}Y=1+{DB*+cn00nrCR4rCD1(PNn-vyKybim4B+8}g8 cGEh6`u6Z7;{0t1P8wCSdihdqMRWek008bhfLjV8( diff --git a/synthesis/whippersnapper/set-field/output_2/commands.txt b/synthesis/whippersnapper/set-field/output_2/commands.txt deleted file mode 100644 index 38e7446e..00000000 --- a/synthesis/whippersnapper/set-field/output_2/commands.txt +++ /dev/null @@ -1,5 +0,0 @@ -table_set_default test_tbl _nop -table_set_default test_tbl mod_headers -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt deleted file mode 100644 index 610d3759..00000000 --- a/synthesis/whippersnapper/set-field/output_2/commands_no_def.txt +++ /dev/null @@ -1,30 +0,0 @@ -table_add forward_table forward 257476311468936 => 316 -table_add test_tbl mod_headers 21 => -table_add forward_table forward 73446435802471 => 460 -table_add test_tbl mod_headers 166 => -table_add forward_table forward 87343517598693 => 238 -table_add test_tbl mod_headers 31 => -table_add forward_table forward 109578956403987 => 113 -table_add test_tbl mod_headers 6 => -table_add forward_table forward 85553671418160 => 489 -table_add test_tbl mod_headers 52 => -table_add forward_table forward 247174825298865 => 312 -table_add test_tbl mod_headers 55 => -table_add forward_table forward 198337405799085 => 104 -table_add test_tbl mod_headers 35 => -table_add forward_table forward 220066703557459 => 122 -table_add test_tbl mod_headers 247 => -table_add forward_table forward 53572028441785 => 447 -table_add test_tbl mod_headers 11 => -table_add forward_table forward 215206904971182 => 393 -table_add test_tbl mod_headers 195 => -table_add forward_table forward 109651989465052 => 91 -table_add test_tbl mod_headers 190 => -table_add forward_table forward 90068821523981 => 8 -table_add test_tbl mod_headers 180 => -table_add forward_table forward 179866194089910 => 458 -table_add test_tbl mod_headers 3 => -table_add forward_table forward 102418031956005 => 262 -table_add test_tbl mod_headers 14 => -table_add forward_table forward 204471118890257 => 188 -table_add test_tbl mod_headers 225 => \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_2/fvs.txt b/synthesis/whippersnapper/set-field/output_2/fvs.txt deleted file mode 100644 index 10a4c8b4..00000000 --- a/synthesis/whippersnapper/set-field/output_2/fvs.txt +++ /dev/null @@ -1,3 +0,0 @@ -hdr.ptp.reserved2,hdr.ptp.reserved2,8 -hdr.header_0.field_0,hdr.header_0.field_0,16 -hdr.header_0.field_1,hdr.header_0.field_1,16 diff --git a/synthesis/whippersnapper/set-field/output_2/main.p4 b/synthesis/whippersnapper/set-field/output_2/main.p4 deleted file mode 100644 index 3d729454..00000000 --- a/synthesis/whippersnapper/set-field/output_2/main.p4 +++ /dev/null @@ -1,108 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header_type ptp_t { - fields { - transportSpecific : 4; - messageType : 4; - reserved : 4; - versionPTP : 4; - messageLength : 16; - domainNumber : 8; - reserved2 : 8; - flags : 16; - correction : 64; - reserved3 : 32; - sourcePortIdentity: 80; - sequenceId : 16; - PTPcontrol : 8; - logMessagePeriod : 8; - originTimestamp : 80; - } -} -parser start { return parse_ethernet; } -header ethernet_t ethernet; - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_PTP: parse_ptp; - default : ingress; - - } -} -header ptp_t ptp; - -parser parse_ptp { - extract(ptp); - return select(latest.reserved2) { - 1 : parse_header_0; - default : ingress; - - } -} -header_type header_0_t { - fields { - field_0 : 16; - field_1 : 16; - - } -} -header header_0_t header_0; - -parser parse_header_0 { - extract(header_0); - return select(latest.field_0) { - default : ingress; - - } -} -action _nop() { - -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action mod_headers() { - modify_field(header_0.field_0, 1); - modify_field(header_0.field_1, header_0.field_0); - -} -table test_tbl { - reads { - ptp.reserved2 : exact; - } actions { - _nop; - mod_headers; - } - size : 4; -} -control ingress { - apply(forward_table); - apply(test_tbl); - -} diff --git a/synthesis/whippersnapper/set-field/output_2/main16.p4 b/synthesis/whippersnapper/set-field/output_2/main16.p4 deleted file mode 100644 index 801fe909..00000000 --- a/synthesis/whippersnapper/set-field/output_2/main16.p4 +++ /dev/null @@ -1,135 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header header_0_t { - bit<16> field_0; - bit<16> field_1; -} - -header ptp_t { - bit<4> transportSpecific; - bit<4> messageType; - bit<4> reserved; - bit<4> versionPTP; - bit<16> messageLength; - bit<8> domainNumber; - bit<8> reserved2; - bit<16> flags; - bit<64> correction; - bit<32> reserved3; - bit<80> sourcePortIdentity; - bit<16> sequenceId; - bit<8> PTPcontrol; - bit<8> logMessagePeriod; - bit<80> originTimestamp; -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".header_0") - header_0_t header_0; - @name(".ptp") - ptp_t ptp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - 16w0x88f7: parse_ptp; - default: accept; - } - } - @name(".parse_header_0") state parse_header_0 { - packet.extract(hdr.header_0); - transition select(hdr.header_0.field_0) { - default: accept; - } - } - @name(".parse_ptp") state parse_ptp { - packet.extract(hdr.ptp); - transition select(hdr.ptp.reserved2) { - 8w1: parse_header_0; - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward(bit<9> port) { - standard_metadata.egress_spec = port; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name("._nop") action _nop() { - } - @name(".mod_headers") action mod_headers() { - hdr.header_0.field_0 = 16w1; - hdr.header_0.field_1 = hdr.header_0.field_0; - } - @name(".forward_table") table forward_table { - actions = { - forward; - _drop; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - @name(".test_tbl") table test_tbl { - actions = { - _nop; - mod_headers; - } - key = { - hdr.ptp.reserved2: exact; - } - size = 4; - } - apply { - forward_table.apply(); - test_tbl.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ptp); - packet.emit(hdr.header_0); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/set-field/output_2/obt_commands.txt b/synthesis/whippersnapper/set-field/output_2/obt_commands.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/synthesis/whippersnapper/set-field/output_2/pisces_rules.txt b/synthesis/whippersnapper/set-field/output_2/pisces_rules.txt deleted file mode 100644 index 9202d9d0..00000000 --- a/synthesis/whippersnapper/set-field/output_2/pisces_rules.txt +++ /dev/null @@ -1,11 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ptp_reserved2=0x1 actions=set_field:1->header_0_field_0,set_field:2->header_0_field_1,deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/set-field/output_2/run_switch.sh b/synthesis/whippersnapper/set-field/output_2/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/set-field/output_2/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_2/run_test.py b/synthesis/whippersnapper/set-field/output_2/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/set-field/output_2/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/set-field/output_2/test.pcap b/synthesis/whippersnapper/set-field/output_2/test.pcap deleted file mode 100644 index e247fb9d82ca39e7a707c718404632fb1c8bff90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}Y;ZKau^=E}}fC4;6suru7f=QE(?*d8;I$&imZ4kO4 c8K|9e*E|naeg+2Dje>zJML!RsDjBLg0At)0R{#J2 diff --git a/synthesis/whippersnapper/set-field/output_3/commands.txt b/synthesis/whippersnapper/set-field/output_3/commands.txt deleted file mode 100644 index 38e7446e..00000000 --- a/synthesis/whippersnapper/set-field/output_3/commands.txt +++ /dev/null @@ -1,5 +0,0 @@ -table_set_default test_tbl _nop -table_set_default test_tbl mod_headers -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt deleted file mode 100644 index 0b90f576..00000000 --- a/synthesis/whippersnapper/set-field/output_3/commands_no_def.txt +++ /dev/null @@ -1,30 +0,0 @@ -table_add forward_table forward 60081248805454 => 345 -table_add test_tbl mod_headers 178 => -table_add forward_table forward 127084717863834 => 266 -table_add test_tbl mod_headers 28 => -table_add forward_table forward 129151041187910 => 86 -table_add test_tbl mod_headers 80 => -table_add forward_table forward 106797329600406 => 276 -table_add test_tbl mod_headers 94 => -table_add forward_table forward 82523234464214 => 123 -table_add test_tbl mod_headers 6 => -table_add forward_table forward 91088934169072 => 138 -table_add test_tbl mod_headers 226 => -table_add forward_table forward 23103353642748 => 225 -table_add test_tbl mod_headers 111 => -table_add forward_table forward 3240098032779 => 464 -table_add test_tbl mod_headers 200 => -table_add forward_table forward 277486636183617 => 341 -table_add test_tbl mod_headers 196 => -table_add forward_table forward 82820466883741 => 374 -table_add test_tbl mod_headers 173 => -table_add forward_table forward 252385002567459 => 15 -table_add test_tbl mod_headers 96 => -table_add forward_table forward 202432884087643 => 121 -table_add test_tbl mod_headers 241 => -table_add forward_table forward 6886781636028 => 364 -table_add test_tbl mod_headers 132 => -table_add forward_table forward 8957653845325 => 282 -table_add test_tbl mod_headers 201 => -table_add forward_table forward 172245175868155 => 198 -table_add test_tbl mod_headers 210 => \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_3/fvs.txt b/synthesis/whippersnapper/set-field/output_3/fvs.txt deleted file mode 100644 index f3f1ea70..00000000 --- a/synthesis/whippersnapper/set-field/output_3/fvs.txt +++ /dev/null @@ -1,4 +0,0 @@ -hdr.ptp.reserved2,hdr.ptp.reserved2,8 -hdr.header_0.field_0,hdr.header_0.field_0,16 -hdr.header_0.field_1,hdr.header_0.field_1,16 -hdr.header_0.field_2,hdr.header_0.field_2,16 diff --git a/synthesis/whippersnapper/set-field/output_3/main.p4 b/synthesis/whippersnapper/set-field/output_3/main.p4 deleted file mode 100644 index bd611f84..00000000 --- a/synthesis/whippersnapper/set-field/output_3/main.p4 +++ /dev/null @@ -1,110 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header_type ptp_t { - fields { - transportSpecific : 4; - messageType : 4; - reserved : 4; - versionPTP : 4; - messageLength : 16; - domainNumber : 8; - reserved2 : 8; - flags : 16; - correction : 64; - reserved3 : 32; - sourcePortIdentity: 80; - sequenceId : 16; - PTPcontrol : 8; - logMessagePeriod : 8; - originTimestamp : 80; - } -} -parser start { return parse_ethernet; } -header ethernet_t ethernet; - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_PTP: parse_ptp; - default : ingress; - - } -} -header ptp_t ptp; - -parser parse_ptp { - extract(ptp); - return select(latest.reserved2) { - 1 : parse_header_0; - default : ingress; - - } -} -header_type header_0_t { - fields { - field_0 : 16; - field_1 : 16; - field_2 : 16; - - } -} -header header_0_t header_0; - -parser parse_header_0 { - extract(header_0); - return select(latest.field_0) { - default : ingress; - - } -} -action _nop() { - -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action mod_headers() { - modify_field(header_0.field_0, 1); - modify_field(header_0.field_1, header_0.field_0); - modify_field(header_0.field_2, header_0.field_1); - -} -table test_tbl { - reads { - ptp.reserved2 : exact; - } actions { - _nop; - mod_headers; - } - size : 4; -} -control ingress { - apply(forward_table); - apply(test_tbl); - -} diff --git a/synthesis/whippersnapper/set-field/output_3/main16.p4 b/synthesis/whippersnapper/set-field/output_3/main16.p4 deleted file mode 100644 index 74cc264a..00000000 --- a/synthesis/whippersnapper/set-field/output_3/main16.p4 +++ /dev/null @@ -1,137 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header header_0_t { - bit<16> field_0; - bit<16> field_1; - bit<16> field_2; -} - -header ptp_t { - bit<4> transportSpecific; - bit<4> messageType; - bit<4> reserved; - bit<4> versionPTP; - bit<16> messageLength; - bit<8> domainNumber; - bit<8> reserved2; - bit<16> flags; - bit<64> correction; - bit<32> reserved3; - bit<80> sourcePortIdentity; - bit<16> sequenceId; - bit<8> PTPcontrol; - bit<8> logMessagePeriod; - bit<80> originTimestamp; -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".header_0") - header_0_t header_0; - @name(".ptp") - ptp_t ptp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - 16w0x88f7: parse_ptp; - default: accept; - } - } - @name(".parse_header_0") state parse_header_0 { - packet.extract(hdr.header_0); - transition select(hdr.header_0.field_0) { - default: accept; - } - } - @name(".parse_ptp") state parse_ptp { - packet.extract(hdr.ptp); - transition select(hdr.ptp.reserved2) { - 8w1: parse_header_0; - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward(bit<9> port) { - standard_metadata.egress_spec = port; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name("._nop") action _nop() { - } - @name(".mod_headers") action mod_headers() { - hdr.header_0.field_0 = 16w1; - hdr.header_0.field_1 = hdr.header_0.field_0; - hdr.header_0.field_2 = hdr.header_0.field_1; - } - @name(".forward_table") table forward_table { - actions = { - forward; - _drop; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - @name(".test_tbl") table test_tbl { - actions = { - _nop; - mod_headers; - } - key = { - hdr.ptp.reserved2: exact; - } - size = 4; - } - apply { - forward_table.apply(); - test_tbl.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ptp); - packet.emit(hdr.header_0); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/set-field/output_3/obt_commands.txt b/synthesis/whippersnapper/set-field/output_3/obt_commands.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/synthesis/whippersnapper/set-field/output_3/pisces_rules.txt b/synthesis/whippersnapper/set-field/output_3/pisces_rules.txt deleted file mode 100644 index ccca741e..00000000 --- a/synthesis/whippersnapper/set-field/output_3/pisces_rules.txt +++ /dev/null @@ -1,11 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ptp_reserved2=0x1 actions=set_field:1->header_0_field_0,set_field:2->header_0_field_1,set_field:3->header_0_field_2,deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/set-field/output_3/run_switch.sh b/synthesis/whippersnapper/set-field/output_3/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/set-field/output_3/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_3/run_test.py b/synthesis/whippersnapper/set-field/output_3/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/set-field/output_3/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/set-field/output_3/test.pcap b/synthesis/whippersnapper/set-field/output_3/test.pcap deleted file mode 100644 index 2245e8adf91b39ec375b84c20ed8e1cb0818fd1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}Y;ZKb3U&IID00nrCR4rCD1(PNn-vyKybim4B+8}g8 cGEh6`u6Z7;{0t1P8wCSdihdqMRWek00Owy7)c^nh diff --git a/synthesis/whippersnapper/set-field/output_4/commands.txt b/synthesis/whippersnapper/set-field/output_4/commands.txt deleted file mode 100644 index 38e7446e..00000000 --- a/synthesis/whippersnapper/set-field/output_4/commands.txt +++ /dev/null @@ -1,5 +0,0 @@ -table_set_default test_tbl _nop -table_set_default test_tbl mod_headers -table_set_default forward_table _drop -table_add forward_table forward 0C:C4:7A:A3:25:34 => 1 -table_add forward_table forward 0C:C4:7A:A3:25:35 => 2 diff --git a/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt b/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt deleted file mode 100644 index eb9f97d7..00000000 --- a/synthesis/whippersnapper/set-field/output_4/commands_no_def.txt +++ /dev/null @@ -1,30 +0,0 @@ -table_add forward_table forward 143425799981974 => 37 -table_add test_tbl mod_headers 65 => -table_add forward_table forward 271873972419498 => 462 -table_add test_tbl mod_headers 253 => -table_add forward_table forward 206256637982218 => 460 -table_add test_tbl mod_headers 96 => -table_add forward_table forward 83267547931378 => 448 -table_add test_tbl mod_headers 155 => -table_add forward_table forward 136986529613425 => 39 -table_add test_tbl mod_headers 208 => -table_add forward_table forward 196528102162767 => 260 -table_add test_tbl mod_headers 74 => -table_add forward_table forward 220842551499189 => 451 -table_add test_tbl mod_headers 177 => -table_add forward_table forward 96255581308439 => 341 -table_add test_tbl mod_headers 143 => -table_add forward_table forward 183754761922564 => 96 -table_add test_tbl mod_headers 9 => -table_add forward_table forward 82078341442840 => 503 -table_add test_tbl mod_headers 77 => -table_add forward_table forward 39353532232425 => 200 -table_add test_tbl mod_headers 191 => -table_add forward_table forward 58631838155842 => 263 -table_add test_tbl mod_headers 11 => -table_add forward_table forward 100704137618309 => 14 -table_add test_tbl mod_headers 86 => -table_add forward_table forward 140683539837230 => 70 -table_add test_tbl mod_headers 7 => -table_add forward_table forward 260036613409450 => 252 -table_add test_tbl mod_headers 77 => \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_4/fvs.txt b/synthesis/whippersnapper/set-field/output_4/fvs.txt deleted file mode 100644 index 1670c9da..00000000 --- a/synthesis/whippersnapper/set-field/output_4/fvs.txt +++ /dev/null @@ -1,5 +0,0 @@ -hdr.ptp.reserved2,hdr.ptp.reserved2,8 -hdr.header_0.field_0,hdr.header_0.field_0,16 -hdr.header_0.field_1,hdr.header_0.field_1,16 -hdr.header_0.field_2,hdr.header_0.field_2,16 -hdr.header_0.field_3,hdr.header_0.field_3,16 diff --git a/synthesis/whippersnapper/set-field/output_4/main.p4 b/synthesis/whippersnapper/set-field/output_4/main.p4 deleted file mode 100644 index 1409b63e..00000000 --- a/synthesis/whippersnapper/set-field/output_4/main.p4 +++ /dev/null @@ -1,112 +0,0 @@ -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_PTP 0x088F7 - -#define TCP_PROTOCOL 0x06 -#define UDP_PROTOCOL 0x11 -#define GENERIC_PROTOCOL 0x9091 -header_type ethernet_t { - fields { - dstAddr : 48; - srcAddr : 48; - etherType : 16; - } -} -header_type ptp_t { - fields { - transportSpecific : 4; - messageType : 4; - reserved : 4; - versionPTP : 4; - messageLength : 16; - domainNumber : 8; - reserved2 : 8; - flags : 16; - correction : 64; - reserved3 : 32; - sourcePortIdentity: 80; - sequenceId : 16; - PTPcontrol : 8; - logMessagePeriod : 8; - originTimestamp : 80; - } -} -parser start { return parse_ethernet; } -header ethernet_t ethernet; - -parser parse_ethernet { - extract(ethernet); - return select(latest.etherType) { - ETHERTYPE_PTP: parse_ptp; - default : ingress; - - } -} -header ptp_t ptp; - -parser parse_ptp { - extract(ptp); - return select(latest.reserved2) { - 1 : parse_header_0; - default : ingress; - - } -} -header_type header_0_t { - fields { - field_0 : 16; - field_1 : 16; - field_2 : 16; - field_3 : 16; - - } -} -header header_0_t header_0; - -parser parse_header_0 { - extract(header_0); - return select(latest.field_0) { - default : ingress; - - } -} -action _nop() { - -} -action _drop() { - drop(); -} - -action forward(port) { - modify_field(standard_metadata.egress_spec, port); -} - -table forward_table { - reads { - ethernet.dstAddr : exact; - } actions { - forward; - _drop; - } - size : 4; -} -action mod_headers() { - modify_field(header_0.field_0, 1); - modify_field(header_0.field_1, header_0.field_0); - modify_field(header_0.field_2, header_0.field_1); - modify_field(header_0.field_3, header_0.field_2); - -} -table test_tbl { - reads { - ptp.reserved2 : exact; - } actions { - _nop; - mod_headers; - } - size : 4; -} -control ingress { - apply(forward_table); - apply(test_tbl); - -} diff --git a/synthesis/whippersnapper/set-field/output_4/main16.p4 b/synthesis/whippersnapper/set-field/output_4/main16.p4 deleted file mode 100644 index 70eb7baa..00000000 --- a/synthesis/whippersnapper/set-field/output_4/main16.p4 +++ /dev/null @@ -1,139 +0,0 @@ -#include -#define V1MODEL_VERSION 20200408 -#include - -header ethernet_t { - bit<48> dstAddr; - bit<48> srcAddr; - bit<16> etherType; -} - -header header_0_t { - bit<16> field_0; - bit<16> field_1; - bit<16> field_2; - bit<16> field_3; -} - -header ptp_t { - bit<4> transportSpecific; - bit<4> messageType; - bit<4> reserved; - bit<4> versionPTP; - bit<16> messageLength; - bit<8> domainNumber; - bit<8> reserved2; - bit<16> flags; - bit<64> correction; - bit<32> reserved3; - bit<80> sourcePortIdentity; - bit<16> sequenceId; - bit<8> PTPcontrol; - bit<8> logMessagePeriod; - bit<80> originTimestamp; -} - -struct metadata { -} - -struct headers { - @name(".ethernet") - ethernet_t ethernet; - @name(".header_0") - header_0_t header_0; - @name(".ptp") - ptp_t ptp; -} - -parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".parse_ethernet") state parse_ethernet { - packet.extract(hdr.ethernet); - transition select(hdr.ethernet.etherType) { - 16w0x88f7: parse_ptp; - default: accept; - } - } - @name(".parse_header_0") state parse_header_0 { - packet.extract(hdr.header_0); - transition select(hdr.header_0.field_0) { - default: accept; - } - } - @name(".parse_ptp") state parse_ptp { - packet.extract(hdr.ptp); - transition select(hdr.ptp.reserved2) { - 8w1: parse_header_0; - default: accept; - } - } - @name(".start") state start { - transition parse_ethernet; - } -} - -control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - @name(".forward") action forward(bit<9> port) { - standard_metadata.egress_spec = port; - } - @name("._drop") action _drop() { - mark_to_drop(standard_metadata); - } - @name("._nop") action _nop() { - } - @name(".mod_headers") action mod_headers() { - hdr.header_0.field_0 = 16w1; - hdr.header_0.field_1 = hdr.header_0.field_0; - hdr.header_0.field_2 = hdr.header_0.field_1; - hdr.header_0.field_3 = hdr.header_0.field_2; - } - @name(".forward_table") table forward_table { - actions = { - forward; - _drop; - } - key = { - hdr.ethernet.dstAddr: exact; - } - size = 4; - } - @name(".test_tbl") table test_tbl { - actions = { - _nop; - mod_headers; - } - key = { - hdr.ptp.reserved2: exact; - } - size = 4; - } - apply { - forward_table.apply(); - test_tbl.apply(); - } -} - -control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { - apply { - } -} - -control DeparserImpl(packet_out packet, in headers hdr) { - apply { - packet.emit(hdr.ethernet); - packet.emit(hdr.ptp); - packet.emit(hdr.header_0); - } -} - -control verifyChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -control computeChecksum(inout headers hdr, inout metadata meta) { - apply { - } -} - -V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main; - diff --git a/synthesis/whippersnapper/set-field/output_4/obt_commands.txt b/synthesis/whippersnapper/set-field/output_4/obt_commands.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/synthesis/whippersnapper/set-field/output_4/pisces_rules.txt b/synthesis/whippersnapper/set-field/output_4/pisces_rules.txt deleted file mode 100644 index 3a3898e9..00000000 --- a/synthesis/whippersnapper/set-field/output_4/pisces_rules.txt +++ /dev/null @@ -1,11 +0,0 @@ -ovs-ofctl --protocols=OpenFlow15 del-flows br0 -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47AA32534 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=1,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=2,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:1->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=3,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,in_port=4,ethernet_dstAddr=0x0CC47AA32535 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC008 actions=set_field:3->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0CC47ABAC009 actions=set_field:4->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=0, actions=deparse,output:NXM_NX_REG0[]" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=0,priority=32768,ethernet_dstAddr=0x0708090A0B0C actions=set_field:2->reg0,resubmit(,1)" -ovs-ofctl --protocols=OpenFlow15 add-flow br0 "table=1,priority=32768,ptp_reserved2=0x1 actions=set_field:1->header_0_field_0,set_field:2->header_0_field_1,set_field:3->header_0_field_2,set_field:4->header_0_field_3,deparse,output:NXM_NX_REG0[]" diff --git a/synthesis/whippersnapper/set-field/output_4/run_switch.sh b/synthesis/whippersnapper/set-field/output_4/run_switch.sh deleted file mode 100755 index 714cdc48..00000000 --- a/synthesis/whippersnapper/set-field/output_4/run_switch.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -BMV2_PATH=${P4BENCHMARK_ROOT:?}/behavioral-model -P4C_BM_PATH=$P4BENCHMARK_ROOT/p4c-bm -P4C_BM_SCRIPT=$P4C_BM_PATH/p4c_bm/__main__.py - - -PROG="main" - -set -m -$P4C_BM_SCRIPT $PROG.p4 --json $PROG.json - -if [ $? -ne 0 ]; then -echo "p4 compilation failed" -exit 1 -fi - -SWITCH_PATH=$BMV2_PATH/targets/simple_switch/simple_switch - -CLI_PATH=$BMV2_PATH/tools/runtime_CLI.py - -sudo echo "sudo" > /dev/null -sudo $SWITCH_PATH >/dev/null 2>&1 -sudo $SWITCH_PATH $PROG.json \ - -i 0@veth0 -i 1@veth2 -i 2@veth4 -i 3@veth6 -i 4@veth8 \ - --log-console & - -sleep 2 -echo "**************************************" -echo "Sending commands to switch through CLI" -echo "**************************************" -$CLI_PATH --json $PROG.json < commands.txt -echo "READY!!!" -fg \ No newline at end of file diff --git a/synthesis/whippersnapper/set-field/output_4/run_test.py b/synthesis/whippersnapper/set-field/output_4/run_test.py deleted file mode 100755 index 673725f8..00000000 --- a/synthesis/whippersnapper/set-field/output_4/run_test.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -import time - -P4BENCH_PORT = 0x9091 - -import random -import argparse - -import threading -from scapy.all import sniff, wrpcap, rdpcap -from scapy.all import Ether, IP, IPv6, TCP, UDP -from scapy.all import Packet, ShortField, XBitField, bind_layers - -class PTP(Packet): - """Precision Time Protocol""" - name = "PTP protocol" - fields_desc = [ - XBitField('type_', 0x10, 8), - XBitField('version', 0x02, 8), - ShortField('messageLength', 0x36), - XBitField('subdomain', 0x00, 8), - ShortField('flags', 0), - XBitField('correction', 0x00, 48), - XBitField('clockIdentity', 0x008063FFFF0009BA, 64), - ShortField('sourcePortID', 1), - ShortField('sequenceID', 0x9E48), - XBitField('control', 0x05, 8), - XBitField('logMessagePeriod', 0x0F, 8), - XBitField('originTimestamp', 0x000045B111510472F9C1, 80) - ] - -bind_layers(UDP, PTP, dport=319) -bind_layers(UDP, PTP, dport=320) - - -features = { - 0 : 'PARSER', - 1 : 'STATE', - 2 : 'PIPELINE', - 3 : 'PACKET_ADD', - 4 : 'PACKET_RM', - 5 : 'PACKET_MOD', -} - -class PacketQueue: - def __init__(self): - self.pkts = [] - self.lock = threading.Lock() - self.ifaces = set() - - def add_iface(self, iface): - self.ifaces.add(iface) - - def get(self): - self.lock.acquire() - if not self.pkts: - self.lock.release() - return None, None - pkt = self.pkts.pop(0) - self.lock.release() - return pkt - - def add(self, iface, pkt): - if iface not in self.ifaces: - return - self.lock.acquire() - self.pkts.append( (iface, pkt) ) - self.lock.release() - -queue = PacketQueue() - -def pkt_handler(pkt, iface): - if IPv6 in pkt: - return - pkt.show() - queue.add(iface, pkt) - -class SnifferThread(threading.Thread): - def __init__(self, iface, handler = pkt_handler): - threading.Thread.__init__(self) - self.iface = iface - self.handler = handler - - def run(self): - sniff( - iface = self.iface, - prn = lambda x: self.handler(x, self.iface) - ) - -class PacketDelay: - def __init__(self, bsize, bdelay, imin, imax, num_pkts = 100): - self.bsize = bsize - self.bdelay = bdelay - self.imin = imin - self.imax = imax - self.num_pkts = num_pkts - self.current = 1 - - def __iter__(self): - return self - - def next(self): - if self.num_pkts <= 0: - raise StopIteration - self.num_pkts -= 1 - if self.current == self.bsize: - self.current = 1 - return random.randint(self.imin, self.imax) - else: - self.current += 1 - return self.bdelay - -class MemTest(Packet): - name = "P4Bench Message for MemTest" - fields_desc = [ - XBitField("op", 0x1, 4), - XBitField("index", 0x1, 12), - XBitField("data", 0xf1f2f3f4, 32), - ] - - -if __name__=='__main__': - parser = argparse.ArgumentParser(description='run_test.py') - parser.add_argument('-n', '--nb-packets', default=10, type=int, - help='Send [n] packets to the switch') - parser.add_argument('-c', '--nb-headers', default=1, type=int, - help='Add [c] P4Bench headers to each packet') - parser.add_argument('--feature', default=0, type=int, - help='P4 benchmark feature') - parser.add_argument('--register-op', default=0, type=int, - help='Register operation type') - parser.add_argument('--register-index', default=0, type=int, - help='Register index') - parser.add_argument('--register-value', default=0, type=int, - help='Register value') - parser.add_argument('-f', '--nb-fields', default=1, type=int, - help='Add [f] fields to each P4Bench header') - parser.add_argument('--random-dport', - help='Use a random TCP dest port for each packet', - action="store_true", default=False) - args = parser.parse_args() - - pkts = rdpcap('test.pcap') - pkt = pkts[0] - - port_map = { - 0: "veth0", - 1: "veth2", - 2: "veth4", - } - - iface_map = {} - for p, i in port_map.items(): - iface_map[i] = p - - queue.add_iface("veth2") - queue.add_iface("veth4") - - for p, iface in port_map.items(): - t = SnifferThread(iface) - t.daemon = True - t.start() - - import socket - - send_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, - socket.htons(0x03)) - send_socket.bind((port_map[0], 0)) - - # wait for receiving threads start - time.sleep(1) - - delays = PacketDelay(10, 5, 25, 100, args.nb_packets) - ports = [] - print "Sending", args.nb_packets, "packets ..." - for d in delays: - # pkt.show() - send_socket.send(str(pkt)) - time.sleep(d / 1000.) - - # time.sleep(1) - - iface, pkt = queue.get() - while pkt: - ports.append(iface_map[iface]) - iface, pkt = queue.get() - # print ports - print "DISTRIBUTION..." - for p in port_map: - c = ports.count(p) - print "port {}: {:>3} [ {:>5}% ]".format(p, c, 100. * c / args.nb_packets) diff --git a/synthesis/whippersnapper/set-field/output_4/test.pcap b/synthesis/whippersnapper/set-field/output_4/test.pcap deleted file mode 100644 index 0bee9d611d046d60d5eed4873deddb7a7a1933cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmca|c+)~A1{MYw`2U}Qff2}YE6bxi3`gssl$x!710Q^!F=>Px# From 9f9f7962dc481c3936c310bc2ce3ea62a6584e28 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Tue, 15 Sep 2020 22:55:15 -0400 Subject: [PATCH 15/24] Missing file --- synthesis/whippersnapper/plotter.py | 143 ++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 synthesis/whippersnapper/plotter.py diff --git a/synthesis/whippersnapper/plotter.py b/synthesis/whippersnapper/plotter.py new file mode 100644 index 00000000..13e88c89 --- /dev/null +++ b/synthesis/whippersnapper/plotter.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +import csv +import locale +import time +import matplotlib as mpl +import matplotlib.pyplot as plt +from cycler import cycler +from collections import defaultdict +import numpy as np +import math + +locale.setlocale(locale.LC_ALL, 'en_US.UTF8') +from IPython.display import set_matplotlib_formats +set_matplotlib_formats('pdf') + +onecolsize = (4, 1.5) # Tweak based on figure's appearance in the paper +seaborn_colorblind = cycler('color', ['#0072B2', '#D55E00', '#009E73', '#CC79A7', '#F0E442', '#56B4E9']) +seaborn_muted = cycler('color', ['#4878CF', '#6ACC65', '#D65F5F', '#B47CC7', '#C4AD66', '#77BEDB']) + +def setrcparams(): + # setup matplotlib rcparams + plt.style.use(['seaborn-paper', 'seaborn-colorblind']) + # color cyclers + seaborn_colorblind = cycler('color', ['#0072B2', '#D55E00', '#009E73', '#CC79A7', '#F0E442', '#56B4E9']) + seaborn_muted = cycler('color', ['#4878CF', '#6ACC65', '#D65F5F', '#B47CC7', '#C4AD66', '#77BEDB']) + + plt.rcParams['axes.prop_cycle'] = seaborn_colorblind + cycler(linestyle=['-', '--', '-.', '--', '-.','-']) + + plt.rcParams['axes.axisbelow'] = True + plt.rcParams['axes.edgecolor'] = 'lightgray' + plt.rcParams['axes.facecolor'] = 'white' + plt.rcParams['axes.spines.left'] = False + plt.rcParams['axes.spines.bottom'] = False + plt.rcParams["axes.spines.right"] = False + plt.rcParams["axes.spines.top"] = False + plt.rcParams['axes.grid'] = True + plt.rcParams['axes.linewidth'] = 0.1 + + + plt.rcParams['grid.alpha'] = 0.4 + plt.rcParams['grid.color'] = 'gray' + plt.rcParams['grid.linestyle'] = ':' + plt.rcParams['grid.linewidth'] = 1.0 + + plt.rcParams['hatch.linewidth'] = 1.0 + + plt.rcParams['xtick.bottom'] = False + plt.rcParams['ytick.left'] = False + plt.rcParams['xtick.direction'] = 'in' + plt.rcParams['ytick.direction'] = 'in' + + + plt.rcParams['legend.edgecolor'] = 'none' + plt.rcParams['legend.framealpha'] = 0.4 + plt.rcParams["legend.columnspacing"] = 0.4 + plt.rcParams["legend.handletextpad"] = 0.2 + + plt.rcParams['savefig.bbox'] = 'tight' + plt.rcParams['savefig.format'] = 'pdf' + plt.rcParams['savefig.pad_inches'] = 0 + + plt.rcParams['figure.figsize'] = onecolsize + + plt.rcParams['pdf.fonttype'] = 42 + plt.rcParams['ps.fonttype'] = 42 + plt.rcParams['pdf.compression'] = 9 + # plt.rcParams['text.usetex'] = True + # plt.rcParams['pgf.texsystem']= "pdflatex" + # plt.rcParams["font.sans-serif"] = "Linux Libertine" + # plt.rcParams["text.latex.preamble"] = "\usepackage{libertine},\usepackage[libertine]{newtxmath},\usepackage[T1]{fontenc}" + # plt.rcParams["pgf.preamble"] = "\usepackage{libertine},\usepackage[libertine]{newtxmath},\usepackage[T1]{fontenc}" + # plt.rcParams["font.family"] = "sans-serif" + +# Load the base config +setrcparams() + +# Override some the common rcParams as needed +plt.rcParams['axes.spines.left'] = True +plt.rcParams['axes.spines.bottom'] = True +plt.rcParams["legend.columnspacing"] = 0.8 +plt.rcParams["legend.handletextpad"] = 0.4 + +# Example plot + +def read_data(): + # Parse and extract data + data0 = dict() + data1 = dict() + for key in range(1, 100): + data0[key] = math.sqrt(key) + data1[key] = math.log(key) + + return (data0, data1) + +def plot_series(data0, data1=None, data2=None, data3=None, name = "plot", xlabel = "LABELME", ylabel = "LABELME"): + print("adding data0") + fig = plt.figure(figsize=(3.7,1.0)) # Override fig size based on trial + xs = sorted(data0.keys()) + ys = [data0[x] for x in xs] + plt.plot(xs, ys, c='#DB4437', label='Cache', ls='-', zorder=2) + # plt.axhline(y=5, c='#4285F4', ls=':', label='y=5', zorder=1) + + if data1: + print("adding data1") + xs = sorted(data1.keys()) + ys = [data1[x] for x in xs] + plt.plot(xs, ys, label='No cache', ls='-', zorder=3) + plt.text(75, 1, "text", size="smaller") + + if data2: + print("adding data2") + xs = sorted(data2.keys()) + ys = [data2[x] for x in xs] + plt.plot(xs, ys, label='M', ls='-', zorder=3) + plt.text(75, 1, "text", size="smaller") + + if data3: + print("adding data3") + xs = sorted(data3.keys()) + ys = [data3[x] for x in xs] + plt.plot(xs, ys, label='E', ls='-', zorder=3) + plt.text(75, 1, "text", size="smaller") + + # plt.annotate("annotation", xy=(25, 2.5), xytext=(40, 1), arrowprops=dict(arrowstyle="->")) + + # plt.xlim(0, 10000) + # plt.ylim(0, 100) + print("labelling") + plt.xlabel(xlabel, labelpad=0) + plt.ylabel(ylabel) + plt.legend(loc='upper left', ncol=2, bbox_to_anchor=(0,1.1)) + # plt.xticks(np.arange(0, 101, 25)) + # plt.yticks(np.arange(0, 11, 2)) + print("saving") + fig.savefig("%s.pdf" % name) + print("closing") + plt.close(fig) + print("done") + + +def plot(): + (data0, data1) = read_data() + plot_series(data0, data1) From fbd006cb44c1827054685df0cb4e0b04d5db8042 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Tue, 15 Sep 2020 23:08:11 -0400 Subject: [PATCH 16/24] Minor cleanup --- synthesis/whippersnapper/plotter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesis/whippersnapper/plotter.py b/synthesis/whippersnapper/plotter.py index 13e88c89..34d31d42 100644 --- a/synthesis/whippersnapper/plotter.py +++ b/synthesis/whippersnapper/plotter.py @@ -105,7 +105,7 @@ def plot_series(data0, data1=None, data2=None, data3=None, name = "plot", xlabel xs = sorted(data1.keys()) ys = [data1[x] for x in xs] plt.plot(xs, ys, label='No cache', ls='-', zorder=3) - plt.text(75, 1, "text", size="smaller") + # plt.text(75, 1, "text", size="smaller") if data2: print("adding data2") From 1a96d8250d7024b89c92439177208af8144bbe96 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Wed, 16 Sep 2020 14:03:41 -0400 Subject: [PATCH 17/24] hot cache --- synthesis/bin/Main.ml | 8 +++-- synthesis/lib/Benchmark.ml | 12 +++---- synthesis/whippersnapper/bench.py | 54 ++++++++++++++++++++--------- synthesis/whippersnapper/plotter.py | 8 ++--- 4 files changed, 53 insertions(+), 29 deletions(-) diff --git a/synthesis/bin/Main.ml b/synthesis/bin/Main.ml index 2ed2a8cf..45c5f3f1 100644 --- a/synthesis/bin/Main.ml +++ b/synthesis/bin/Main.ml @@ -570,6 +570,7 @@ let run debug thrift_mode interactive data print use_all_cexs reach_restrict reach_filter + hot_start () = let res = Benchmark.to_obt Parameters.({ @@ -602,7 +603,8 @@ let run debug thrift_mode interactive data print use_all_cexs; reach_restrict; reach_filter; - timeout = None}) + timeout = None; + hot_start}) data p4file log_edits phys_edits fvs assume inc in match res with @@ -666,6 +668,7 @@ let run debug thrift_mode interactive data print use_all_cexs reach_restrict reach_filter + hot_start () = let res = Benchmark.from_obt Parameters.({ @@ -698,7 +701,8 @@ let run debug thrift_mode interactive data print use_all_cexs; reach_restrict; reach_filter; - timeout = None}) + timeout = None; + hot_start}) data p4file log_edits phys_edits fvs assume inc in match res with diff --git a/synthesis/lib/Benchmark.ml b/synthesis/lib/Benchmark.ml index b241ff0f..825b8a66 100644 --- a/synthesis/lib/Benchmark.ml +++ b/synthesis/lib/Benchmark.ml @@ -247,10 +247,10 @@ and to_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ in ~log ~phys ~fvs ~log_inst:Instance.(update_list params empty log_edits) ~phys_inst:Instance.(update_list params empty phys_edits) - ~log_edits:[] () + ~log_edits:[] in - Core.Printf.printf "\n\n------------\n%s\n----------\n" (Problem.to_string params problem); - assert (implements params (ProfData.zero ()) (problem) = `Yes); + (* Core.Printf.printf "\n\n------------\n%s\n----------\n" (Problem.to_string params problem); *) + assert (implements params (ProfData.zero ()) (problem ()) = `Yes); measure params None problem (List.map (Runtime.parse_whippersnapper log data_file) ~f:(fun r -> [r])) and from_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ inc = @@ -275,10 +275,10 @@ and from_obt params data_file p4_file log_edits_file phys_edits_file fvs_file _ ~log ~phys ~fvs ~log_inst:Instance.(update_list params empty log_edits) ~phys_inst:Instance.(update_list params empty phys_edits) - ~log_edits:[] () + ~log_edits:[] in - Core.Printf.printf "\n\n------------\n%s\n----------\n" (Problem.to_string params problem); - assert (implements params (ProfData.zero ()) (problem) = `Yes); + (* Core.Printf.printf "\n\n------------\n%s\n----------\n" (Problem.to_string params problem); *) + assert (implements params (ProfData.zero ()) (problem ()) = `Yes); measure params None problem (List.map (Runtime.parse log data_file) ~f:(fun r -> [r])) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 28aafa2a..2e9c0ff0 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -126,6 +126,11 @@ def avenir_flags(): x.extend(non_cache_flags()); return x; +def hot_start_flags(): + x = ["--hot-start"]; + x.extend(avenir_flags()); + return x; + def rules_for_obt(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags = avenir_flags()): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; @@ -211,6 +216,12 @@ def run_avenir(ws_cmd): # plot +def read_data(fn): + data_str = "" + with open(fn) as f: + data_str = f.read(); + return data_str; + def string_to_data(data_str): data = {}; for line in data_str.split("\n"): @@ -220,19 +231,22 @@ def string_to_data(data_str): return data -def plot(ws_cmd, xlbl): - cache_data_str = "" - with open("whippersnapper/cache/" + ws_cmd + "_orig_to_obt_res.csv") as f: - cache_data_str = f.read(); - - no_cache_data_str = "" - with open("whippersnapper/no_cache/" + ws_cmd + "_orig_to_obt_res.csv") as f: - no_cache_data_str = f.read() +def get_data(f): + s = read_data(f); + return string_to_data(s); + +def adjust_hot(hot, cold): + for k in hot: + hot[k] = hot[k] - cold[k]; + +def plot(rn, ws_cmd, xlbl): + cache_data = get_data("whippersnapper/cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") + hot_data = get_data("whippersnapper/hot_cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") + no_cache_data = get_data ("whippersnapper/no_cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") - cache_data = string_to_data(cache_data_str); - no_cache_data = string_to_data(no_cache_data_str); + adjust_hot(hot_data, cache_data) - pl.plot_series(cache_data, no_cache_data, name = "whippersnapper/" + ws_cmd, xlabel = xlbl, ylabel = "synthesis time (s)"); + pl.plot_series(cache_data, hot_data, no_cache_data, name = "whippersnapper/" + ws_cmd, xlabel = xlbl, ylabel = "synthesis time (s)"); cmd = sys.argv[1]; ws_cmd = sys.argv[2] if len(sys.argv) > 2 else None; @@ -242,14 +256,20 @@ def plot(ws_cmd, xlbl): sys.exit(); if cmd == "gen-all": - run_whippersnapper("pipeline", "cache", 20, 9, avenir_flags()); - run_whippersnapper("pipeline", "no_cache", 20, 9, non_cache_flags()); + rule_num = int(sys.argv[2]); + max_pl = int(sys.argv[3]); + max_sf = int(sys.argv[4]); + + run_whippersnapper("pipeline", "cache_" + str(rule_num) , rule_num, max_pl, avenir_flags()); + run_whippersnapper("pipeline", "hot_cache_" + str(rule_num), rule_num, max_pl, hot_start_flags()); + run_whippersnapper("pipeline", "no_cache_" + str(rule_num), rule_num, max_pl, non_cache_flags()); - run_whippersnapper("set-field", "cache", 20, 100, avenir_flags()); - run_whippersnapper("set-field", "no_cache", 20, 100, non_cache_flags()); + run_whippersnapper("set-field", "cache_" + str(rule_num), rule_num, max_sf, avenir_flags()); + run_whippersnapper("set-field", "hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags()); + run_whippersnapper("set-field", "no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags()); - plot("pipeline", "# of tables"); - plot("set-field", "# of fields"); + plot(rule_num, "pipeline", "# of tables"); + plot(rule_num, "set-field", "# of fields"); elif cmd == "generate": rule_num = int(sys.argv[3]); diff --git a/synthesis/whippersnapper/plotter.py b/synthesis/whippersnapper/plotter.py index 34d31d42..1bba3fb6 100644 --- a/synthesis/whippersnapper/plotter.py +++ b/synthesis/whippersnapper/plotter.py @@ -97,22 +97,22 @@ def plot_series(data0, data1=None, data2=None, data3=None, name = "plot", xlabel fig = plt.figure(figsize=(3.7,1.0)) # Override fig size based on trial xs = sorted(data0.keys()) ys = [data0[x] for x in xs] - plt.plot(xs, ys, c='#DB4437', label='Cache', ls='-', zorder=2) + plt.plot(xs, ys, c='#DB4437', label='Cold cache', ls='-', zorder=2) # plt.axhline(y=5, c='#4285F4', ls=':', label='y=5', zorder=1) if data1: print("adding data1") xs = sorted(data1.keys()) ys = [data1[x] for x in xs] - plt.plot(xs, ys, label='No cache', ls='-', zorder=3) + plt.plot(xs, ys, label='Hot cache', ls='-', zorder=3) # plt.text(75, 1, "text", size="smaller") if data2: print("adding data2") xs = sorted(data2.keys()) ys = [data2[x] for x in xs] - plt.plot(xs, ys, label='M', ls='-', zorder=3) - plt.text(75, 1, "text", size="smaller") + plt.plot(xs, ys, label='No cache', ls='-', zorder=3) + # plt.text(75, 1, "text", size="smaller") if data3: print("adding data3") From fb9e438947fc2439bc7a74f01b9e974819a64a82 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Wed, 16 Sep 2020 14:25:54 -0400 Subject: [PATCH 18/24] Restartable --- synthesis/whippersnapper/bench.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 2e9c0ff0..dffdc088 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -131,6 +131,9 @@ def hot_start_flags(): x.extend(avenir_flags()); return x; +def orig_to_obt(ws_cmd, fldr): + return ("whippersnapper/" + fldr + "/" + ws_cmd + "_orig_to_obt_res.csv"); + def rules_for_obt(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags = avenir_flags()): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; @@ -169,7 +172,7 @@ def rules_for_obt(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags = avenir_flag #except: # print("no commands written"); - with open("whippersnapper/" + fldr + "/" + ws_cmd + "_orig_to_obt_res.csv", "a") as res_file: + with open(orig_to_obt(ws_cmd, fldr), "a") as res_file: res_file.write(str(i) + "," + str(elapsed) + "\n") def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags = avenir_flags()): @@ -179,8 +182,15 @@ def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags = avenir_flags()): if not os.path.isdir("whippersnapper/"+ fldr + "/" + ws_cmd): os.mkdir("whippersnapper/" + fldr + "/" + ws_cmd) + mn = 1; + if os.path.exists(orig_to_obt(ws_cmd, fldr)): + with open(orig_to_obt(ws_cmd, fldr), 'r') as res_file: + res = res_file.read(); + for lne in res.split("\n"): + if ',' in lne: + mn += 1; - for i in list(range(1, int(mx))): + for i in list(range(mn, int(mx))): print(str(i)); (cmd_line1, cmd_line2, fvs, get_rule_temps) = whippersnapper_cmds()[ws_cmd]; subprocess.run(["p4benchmark", "--feature", ws_cmd] + cmd_line1 + [str(i)] + cmd_line2); From 0d783f432c9b48005f654e837c21d927fd0e2137 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Wed, 16 Sep 2020 15:19:07 -0400 Subject: [PATCH 19/24] max settings --- synthesis/whippersnapper/bench.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index dffdc088..41618026 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -241,18 +241,20 @@ def string_to_data(data_str): return data -def get_data(f): +def get_data(mx, f): s = read_data(f); - return string_to_data(s); + data = string_to_data(s); + data = { k: data[k] for k in data.keys() if k < mx }; + return data; def adjust_hot(hot, cold): for k in hot: hot[k] = hot[k] - cold[k]; -def plot(rn, ws_cmd, xlbl): - cache_data = get_data("whippersnapper/cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") - hot_data = get_data("whippersnapper/hot_cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") - no_cache_data = get_data ("whippersnapper/no_cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") +def plot(rn, mx, ws_cmd, xlbl): + cache_data = get_data(mx, "whippersnapper/cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") + hot_data = get_data(mx, "whippersnapper/hot_cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") + no_cache_data = get_data (mx, "whippersnapper/no_cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") adjust_hot(hot_data, cache_data) @@ -278,8 +280,8 @@ def plot(rn, ws_cmd, xlbl): run_whippersnapper("set-field", "hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags()); run_whippersnapper("set-field", "no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags()); - plot(rule_num, "pipeline", "# of tables"); - plot(rule_num, "set-field", "# of fields"); + plot(rule_num, max_pl, "pipeline", "# of tables"); + plot(rule_num, max_sf, "set-field", "# of fields"); elif cmd == "generate": rule_num = int(sys.argv[3]); From aeb01257a82997854d4cc748a3298cf7b1a90a5c Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Wed, 16 Sep 2020 22:07:45 -0400 Subject: [PATCH 20/24] Minor change to reach-restrict --- synthesis/lib/FastCX.ml | 4 +-- synthesis/lib/Runtime.ml | 2 +- synthesis/whippersnapper/bench.py | 50 ++++++++++++++++++++--------- synthesis/whippersnapper/plotter.py | 6 ++-- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/synthesis/lib/FastCX.ml b/synthesis/lib/FastCX.ml index f00cdd27..1425048d 100644 --- a/synthesis/lib/FastCX.ml +++ b/synthesis/lib/FastCX.ml @@ -41,8 +41,8 @@ let is_reachable encode_tag params problem fvs in_pkt tbl_name keys = passive_hoare_triple ~fvs (Packet.to_test in_pkt ~fvs) trunc - (Hole.match_holes_table encode_tag tbl_name keys - %&% Instance.negate_rows phys_inst tbl_name) + (Hole.match_holes_table encode_tag tbl_name keys) + (* %&% Instance.negate_rows phys_inst tbl_name) *) let hits_pred params (_: ProfData.t ref) prog inst edits e : test = diff --git a/synthesis/lib/Runtime.ml b/synthesis/lib/Runtime.ml index abf2d145..f8dbdfc3 100644 --- a/synthesis/lib/Runtime.ml +++ b/synthesis/lib/Runtime.ml @@ -105,7 +105,7 @@ let parse program filename : Edit.t list = match data with | ["ADD"; tbl_nm; matches; action_data; action] -> begin match get_schema_of_table tbl_nm program with - | None -> failwith @@ Printf.sprintf "unrecognized table %s" tbl_nm + | None -> failwith @@ Printf.sprintf "unrecognized table %s in row %s" tbl_nm (List.reduce_exn data ~f:(^)) | Some (keys, _,_) -> let keys = List.map keys ~f:(fun (k,sz,_) -> (k,sz)) in Add (tbl_nm, diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index 41618026..eb7238d0 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -57,7 +57,8 @@ def pipeline_rules(ind): return res; def set_field_fvs(ind): - fvs = "hdr.ptp.reserved2,hdr.ptp.reserved2,8\n"; + fvs = pipeline_fvs(ind); + fvs += "\nhdr.ptp.reserved2,hdr.ptp.reserved2,8\n"; for i in list(range(0, ind)): fvs += "hdr.header_0.field_" + str(i) + ",hdr.header_0.field_" + str(i) + ",16\n" return fvs; @@ -202,26 +203,29 @@ def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags = avenir_flags()): # run the actual evaluation, using OBT as the logical program -def run_avenir(ws_cmd): +def run_avenir(ws_cmd, fldr, rn, ceil_mx, flags): mx = 1; - while os.path.isdir("whippersnapper/" + ws_cmd + "/output_" + str(mx)): + while os.path.isdir("whippersnapper/" + fldr + "/" + ws_cmd + "/output_" + str(mx)): mx += 1; - + + mx = min(mx, ceil_mx); + res = "" for i in list(range(1, int(mx))): - output = "whippersnapper/" + ws_cmd + "/output_" + str(i) +"/"; - commands_file = output + "obt_commands.txt"; + print(ws_cmd + " " + str(i)); + output = "whippersnapper/" + fldr + "/" + ws_cmd + "/output_" + str(i) +"/"; + commands_file = "whippersnapper/cache_" + str(rn) + "/" + ws_cmd + "/output_" + str(i) + "/obt_commands.txt"; edits_file = "whippersnapper/empty_edits.txt"; assume_file = "whippersnapper/empty_assume.txt"; fvs_file = output + "fvs.txt"; st_time = time.perf_counter(); - subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "100", "-p", "-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); + subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "100", "-p"] + flags + ["-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); end_time = time.perf_counter(); elapsed = end_time - st_time; res += str(i) + "," + str(elapsed) + "\n" - with open("whippersnapper/" + ws_cmd + "_obt_to_orig_res.csv", "w") as res_file: + with open("whippersnapper/" + fldr + "/" + ws_cmd + "_obt_to_orig_res.csv", "w") as res_file: res_file.write(res); # plot @@ -251,14 +255,14 @@ def adjust_hot(hot, cold): for k in hot: hot[k] = hot[k] - cold[k]; -def plot(rn, mx, ws_cmd, xlbl): - cache_data = get_data(mx, "whippersnapper/cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") - hot_data = get_data(mx, "whippersnapper/hot_cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") - no_cache_data = get_data (mx, "whippersnapper/no_cache_" + str(rn) + "/" + ws_cmd + "_orig_to_obt_res.csv") +def plot(rn, mx, ws_cmd, direction, xlbl): + cache_data = get_data(mx, "whippersnapper/cache_" + str(rn) + "/" + ws_cmd + "_" + direction + "_res.csv") + hot_data = get_data(mx, "whippersnapper/hot_cache_" + str(rn) + "/" + ws_cmd + "_" + direction + "_res.csv") + no_cache_data = get_data (mx, "whippersnapper/no_cache_" + str(rn) + "/" + ws_cmd + "_" + direction + "_res.csv") adjust_hot(hot_data, cache_data) - pl.plot_series(cache_data, hot_data, no_cache_data, name = "whippersnapper/" + ws_cmd, xlabel = xlbl, ylabel = "synthesis time (s)"); + pl.plot_series(cache_data, hot_data, no_cache_data, name = "whippersnapper/" + ws_cmd + "_" + direction, xlabel = xlbl, ylabel = "synthesis time (s)"); cmd = sys.argv[1]; ws_cmd = sys.argv[2] if len(sys.argv) > 2 else None; @@ -280,8 +284,24 @@ def plot(rn, mx, ws_cmd, xlbl): run_whippersnapper("set-field", "hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags()); run_whippersnapper("set-field", "no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags()); - plot(rule_num, max_pl, "pipeline", "# of tables"); - plot(rule_num, max_sf, "set-field", "# of fields"); + plot(rule_num, max_pl, "pipeline", "orig_to_obt", "# of tables"); + plot(rule_num, max_sf, "set-field", "orig_to_obt", "# of fields"); +elif cmd == "gen-all-rev": + rule_num = int(sys.argv[2]); + max_pl = int(sys.argv[3]); + max_sf = int(sys.argv[4]); + + run_avenir("pipeline", "cache_" + str(rule_num) , rule_num, max_pl, avenir_flags()); + run_avenir("pipeline", "hot_cache_" + str(rule_num), rule_num, max_pl, hot_start_flags()); + run_avenir("pipeline", "no_cache_" + str(rule_num), rule_num, max_pl, non_cache_flags()); + + run_avenir("set-field", "cache_" + str(rule_num), rule_num, max_sf, avenir_flags()); + run_avenir("set-field", "hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags()); + run_avenir("set-field", "no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags()); + + plot(rule_num, max_pl, "pipeline", "obt_to_orig", "# of tables"); + plot(rule_num, max_sf, "set-field", "obt_to_orig", "# of fields"); + elif cmd == "generate": rule_num = int(sys.argv[3]); diff --git a/synthesis/whippersnapper/plotter.py b/synthesis/whippersnapper/plotter.py index 1bba3fb6..3e04acee 100644 --- a/synthesis/whippersnapper/plotter.py +++ b/synthesis/whippersnapper/plotter.py @@ -97,21 +97,21 @@ def plot_series(data0, data1=None, data2=None, data3=None, name = "plot", xlabel fig = plt.figure(figsize=(3.7,1.0)) # Override fig size based on trial xs = sorted(data0.keys()) ys = [data0[x] for x in xs] - plt.plot(xs, ys, c='#DB4437', label='Cold cache', ls='-', zorder=2) + plt.plot(xs, ys, c='#1B68DF', label='Cold cache', ls='-', zorder=2) # plt.axhline(y=5, c='#4285F4', ls=':', label='y=5', zorder=1) if data1: print("adding data1") xs = sorted(data1.keys()) ys = [data1[x] for x in xs] - plt.plot(xs, ys, label='Hot cache', ls='-', zorder=3) + plt.plot(xs, ys, c='#E33613', label='Hot cache', ls='-', zorder=3) # plt.text(75, 1, "text", size="smaller") if data2: print("adding data2") xs = sorted(data2.keys()) ys = [data2[x] for x in xs] - plt.plot(xs, ys, label='No cache', ls='-', zorder=3) + plt.plot(xs, ys, c = '#098837', label='No cache', ls='-', zorder=3) # plt.text(75, 1, "text", size="smaller") if data3: From ae09eef59670935597843640c5166f421c3750a5 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Wed, 16 Sep 2020 23:16:12 -0400 Subject: [PATCH 21/24] opt --- synthesis/whippersnapper/bench.py | 53 +++++++++++++++++++------------ 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index eb7238d0..f10a96ac 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -119,23 +119,36 @@ def rewrite_cmds(cmds): fmcds = "\n".join(fcmds); return fmcds; -def non_cache_flags(): - return ["--reach-filter"]; +def non_cache_flags_pipeline(): + return ["--reach-filter"] -def avenir_flags(): +def non_cache_flags_set_field(): + return ["-w", "--restrict-mask"]; #hints + +def avenir_flags_pipeline(): + x = ["--cache-edits", "1", "--cache-queries"] + x.extend(non_cache_flags_pipeline()); + return x; + +def avenir_flags_set_field(): x = ["--cache-edits", "1", "--cache-queries"] - x.extend(non_cache_flags()); + x.extend(non_cache_flags_set_field()); + return x; + +def hot_start_flags_pipeline(): + x = ["--hot-start"]; + x.extend(avenir_flags_pipeline()); return x; -def hot_start_flags(): +def hot_start_flags_set_field(): x = ["--hot-start"]; - x.extend(avenir_flags()); + x.extend(avenir_flags_set_field()); return x; def orig_to_obt(ws_cmd, fldr): return ("whippersnapper/" + fldr + "/" + ws_cmd + "_orig_to_obt_res.csv"); -def rules_for_obt(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags = avenir_flags()): +def rules_for_obt(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; assume_file = "whippersnapper/empty_assume.txt"; @@ -176,7 +189,7 @@ def rules_for_obt(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags = avenir_flag with open(orig_to_obt(ws_cmd, fldr), "a") as res_file: res_file.write(str(i) + "," + str(elapsed) + "\n") -def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags = avenir_flags()): +def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags): if not os.path.isdir("whippersnapper/" + fldr): os.mkdir("whippersnapper/" + fldr) @@ -276,13 +289,13 @@ def plot(rn, mx, ws_cmd, direction, xlbl): max_pl = int(sys.argv[3]); max_sf = int(sys.argv[4]); - run_whippersnapper("pipeline", "cache_" + str(rule_num) , rule_num, max_pl, avenir_flags()); - run_whippersnapper("pipeline", "hot_cache_" + str(rule_num), rule_num, max_pl, hot_start_flags()); - run_whippersnapper("pipeline", "no_cache_" + str(rule_num), rule_num, max_pl, non_cache_flags()); + run_whippersnapper("pipeline", "cache_" + str(rule_num) , rule_num, max_pl, avenir_flags_pipeline()); + run_whippersnapper("pipeline", "hot_cache_" + str(rule_num), rule_num, max_pl, hot_start_flags_pipeline()); + run_whippersnapper("pipeline", "no_cache_" + str(rule_num), rule_num, max_pl, non_cache_flags_pipeline()); - run_whippersnapper("set-field", "cache_" + str(rule_num), rule_num, max_sf, avenir_flags()); - run_whippersnapper("set-field", "hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags()); - run_whippersnapper("set-field", "no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags()); + run_whippersnapper("set-field", "cache_" + str(rule_num), rule_num, max_sf, avenir_flags_set_field()); + run_whippersnapper("set-field", "hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags_set_field()); + run_whippersnapper("set-field", "no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags_set_field()); plot(rule_num, max_pl, "pipeline", "orig_to_obt", "# of tables"); plot(rule_num, max_sf, "set-field", "orig_to_obt", "# of fields"); @@ -291,13 +304,13 @@ def plot(rn, mx, ws_cmd, direction, xlbl): max_pl = int(sys.argv[3]); max_sf = int(sys.argv[4]); - run_avenir("pipeline", "cache_" + str(rule_num) , rule_num, max_pl, avenir_flags()); - run_avenir("pipeline", "hot_cache_" + str(rule_num), rule_num, max_pl, hot_start_flags()); - run_avenir("pipeline", "no_cache_" + str(rule_num), rule_num, max_pl, non_cache_flags()); + run_avenir("pipeline", "cache_" + str(rule_num) , rule_num, max_pl, avenir_flags_pipeline()); + run_avenir("pipeline", "hot_cache_" + str(rule_num), rule_num, max_pl, hot_start_flags_pipeline()); + run_avenir("pipeline", "no_cache_" + str(rule_num), rule_num, max_pl, non_cache_flags_pipeline()); - run_avenir("set-field", "cache_" + str(rule_num), rule_num, max_sf, avenir_flags()); - run_avenir("set-field", "hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags()); - run_avenir("set-field", "no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags()); + run_avenir("set-field", "cache_" + str(rule_num), rule_num, max_sf, avenir_flags_set_field()); + run_avenir("set-field", "hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags_set_field()); + run_avenir("set-field", "no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags_set_field()); plot(rule_num, max_pl, "pipeline", "obt_to_orig", "# of tables"); plot(rule_num, max_sf, "set-field", "obt_to_orig", "# of fields"); From 05b4d9289ea3624f4ddb0875546019c847aa92c6 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Thu, 17 Sep 2020 00:31:04 -0400 Subject: [PATCH 22/24] Modified args to avenir in whippersnapper/bench.py --- synthesis/whippersnapper/bench.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench.py index f10a96ac..f03b75f5 100644 --- a/synthesis/whippersnapper/bench.py +++ b/synthesis/whippersnapper/bench.py @@ -120,7 +120,7 @@ def rewrite_cmds(cmds): return fmcds; def non_cache_flags_pipeline(): - return ["--reach-filter"] + return ["--reach-filter", "--hints", "exact"] def non_cache_flags_set_field(): return ["-w", "--restrict-mask"]; #hints @@ -173,7 +173,7 @@ def rules_for_obt(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags): st_time = time.perf_counter(); res = subprocess.run(["./avenir", "to-obt", "output/main16.p4", edits_file , edits_file, fvs_file, assume_file, "-b", "100", "-data" - , commands_no_def_file, "-e", "100", "-p"] + flags + ["-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); + , commands_no_def_file, "-e", "25", "-p"] + flags + ["-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); end_time = time.perf_counter(); elapsed = end_time - st_time; @@ -233,7 +233,7 @@ def run_avenir(ws_cmd, fldr, rn, ceil_mx, flags): fvs_file = output + "fvs.txt"; st_time = time.perf_counter(); - subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "100", "-p"] + flags + ["-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); + subprocess.run(["./avenir", "from-obt", output + "main16.p4", edits_file, edits_file, fvs_file, assume_file, "-b", "100", "-data", commands_file, "-e", "25", "-p"] + flags + ["-I", "whippersnapper/p4includes"], stdout = subprocess.PIPE, stderr = subprocess.PIPE); end_time = time.perf_counter(); elapsed = end_time - st_time; res += str(i) + "," + str(elapsed) + "\n" From ccb7edde9bbe80ac0f35d4f93b907fdd7cc7fc30 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Thu, 17 Sep 2020 01:52:26 -0400 Subject: [PATCH 23/24] measure identity mapping --- synthesis/whippersnapper/bench_identity.py | 293 ++++++++++++++++++ .../whippersnapper/{bench.py => bench_obt.py} | 0 2 files changed, 293 insertions(+) create mode 100644 synthesis/whippersnapper/bench_identity.py rename synthesis/whippersnapper/{bench.py => bench_obt.py} (100%) diff --git a/synthesis/whippersnapper/bench_identity.py b/synthesis/whippersnapper/bench_identity.py new file mode 100644 index 00000000..2fa0e4b6 --- /dev/null +++ b/synthesis/whippersnapper/bench_identity.py @@ -0,0 +1,293 @@ +#!/usr/bin/python + +import os +import random +import shutil +import subprocess +import sys +import time + +import plotter as pl + +# generate a rule, generic functions + +# take a list of rule templates (see gen_rule). Generates num rules, using the rule templates as evenly as possible. +def gen_rules(num, rule_temps): + res = [] + for i in list(range(0, num)): + j = i % len(rule_temps); + rt = rule_temps[j]; + r = gen_rule(rt); + res.append(r); + return res; + +# takes a list of strings and ints. Replaces every int n with a hex string of width n, +# concatenates into a single list, and returns +def gen_rule(rule_temp): + rule = map(adj_rule_piece, rule_temp); + return "".join(rule); + +def adj_rule_piece(p): + if isinstance(p, str): + return p; + else: + b = random.getrandbits(p); + b = str(b); #add_colons(str(hex(b))[2:]); + return b; + +def add_colons(s): + s2 = "" + for (i, c) in enumerate(s): + if i != 0 and i % 2 == 0: + s2 += ":" + s2 += c; + return s2; + + +# fvs and rule gen + +def pipeline_fvs(i): + return "hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48\nstandard_metadata.egress_spec,standard_metadata.egress_spec,9" + +def pipeline_rules(ind): + res = [] + for i in list(range(0, ind)): + (tbl_name, act) = ("forward_table", "forward") if i == 0 else ("table_" + str(i), "forward" + str(i)); + res += [["table_add " + tbl_name + " " + act + " ", 48, " => ", 9]]; + return res; + +def set_field_fvs(ind): + fvs = pipeline_fvs(ind); + fvs += "\nhdr.ptp.reserved2,hdr.ptp.reserved2,8\n"; + for i in list(range(0, ind)): + fvs += "hdr.header_0.field_" + str(i) + ",hdr.header_0.field_" + str(i) + ",16\n" + return fvs; + +def set_field_rules(ind): + return [ ["table_add forward_table forward ", 48, " => ", 9] + , ["table_add test_tbl mod_headers ", 8, " =>"]]; + + +def add_header_fvs(ind): + fvs = "hdr.ptp.reserved2,hdr.ptp.reserved2,8\nstandard_metadata.egress_spec,standard_metadata.egress_spec,9\n"; + fvs += "hdr.ethernet.dstAddr,hdr.ethernet.dstAddr,48\n"; + for i in list(range(0, ind)): + fvs += "hdr.header_" + str(i) + ".field_0,hdr.header_" + str(i) + ".field_0,16\n" + return fvs; + + +def add_header_rules(ind): + return [ ["table_add forward_table forward ", 48, " => ", 9] + , ["table_add test_tbl add_headers ", 8, " =>"]]; + + +def rm_header_fvs(ind): + return add_header_fvs(ind); + +def rm_header_rules(ind): + return [ ["table_add forward_table forward ", 48, " => ", 9] + , ["table_add test_tbl remove_headers ", 8, " =>"]]; + +# whippersnapper commands +def whippersnapper_cmds(): + return { "set-field" : (["--operations"], [], set_field_fvs, set_field_rules) + , "add-header" : (["--headers"], [], add_header_fvs, add_header_rules) + , "rm-header" : (["--headers"], [], rm_header_fvs, rm_header_rules) + , "pipeline" : (["--tables"], ["--table-size", "16"], pipeline_fvs, pipeline_rules) } + +# generate the OBT, and the corresponding rules +def rewrite_cmd(cmd): + try: + pieces = cmd.split(","); + if pieces[0] == "ADD": + params = pieces[2]; + fparams = params.split(" ")[2::3]; + fparams = ";".join(fparams); + pieces[2] = fparams; + #pieces = list(map(lambda s : s[s.find("0x"):] if s.find("0x") != -1 else s, pieces)); + fcmd = ",".join(pieces); + return fcmd; + elif pieces[0] == "DEL": + return cmd; + elif pieces[0] == "": + return ""; + except: + return cmd; + +def rewrite_cmds(cmds): + fcmds = list(map(rewrite_cmd, cmds.split("\n"))); + fmcds = "\n".join(fcmds); + return fmcds; + +def non_cache_flags_pipeline(): + return ["--reach-filter", "--hints", "exact"] + +def non_cache_flags_set_field(): + return ["-w", "--restrict-mask"]; #hints + +def avenir_flags_pipeline(): + x = ["--cache-edits", "1", "--cache-queries"] + x.extend(non_cache_flags_pipeline()); + return x; + +def avenir_flags_set_field(): + x = ["--cache-edits", "1", "--cache-queries"] + x.extend(non_cache_flags_set_field()); + return x; + +def hot_start_flags_pipeline(): + x = ["--hot-start"]; + x.extend(avenir_flags_pipeline()); + return x; + +def hot_start_flags_set_field(): + x = ["--hot-start"]; + x.extend(avenir_flags_set_field()); + return x; + +def orig_to_obt(ws_cmd, fldr): + return ("whippersnapper/" + fldr + "/" + ws_cmd + "_res.csv"); + +def avenir(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags): + edits_file = "whippersnapper/empty_edits.txt"; + fvs_file = "output/fvs.txt"; + assume_file = "whippersnapper/empty_assume.txt"; + #commands_file = "output/commands.txt"; + commands_no_def_file = "output/commands_no_def.txt" + + with open(fvs_file, 'w') as fvsf: + fvsf.write(fvs); + + rules = gen_rules(num, rule_temps); + + with open(commands_no_def_file, 'w') as cmdnd: + rules_str = "\n".join(rules); + cmdnd.write(rules_str); + #with open(commands_file, 'r') as cmds: + # with open(commands_no_def_file, 'w') as cmdnd: + # for line in cmds: + # if not line.startswith("table_set_default"): + # cmdnd.write(line); + + + st_time = time.perf_counter(); + res = subprocess.run(["./avenir", "synth", "output/main16.p4", "output/main16.p4", edits_file + , edits_file, fvs_file, "-b", "100", "-data" + , commands_no_def_file, "-e", "25", "-p"] + flags + + ["-I1", "whippersnapper/p4includes"] + + ["-I2", "whippersnapper/p4includes"] + + ["-P4", "--thrift"] + , stdout = subprocess.PIPE, stderr = subprocess.PIPE); + end_time = time.perf_counter(); + elapsed = end_time - st_time; + + obt_commands = "output/obt_commands.txt"; + + cmds = res.stdout.decode('utf-8'); + cmds = cmds.split("Target operations:\n")[1]; + with open(obt_commands, 'w') as f: + f.write(cmds); + #except: + # print("no commands written"); + + with open(orig_to_obt(ws_cmd, fldr), "a") as res_file: + res_file.write(str(i) + "," + str(elapsed) + "\n") + +def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags): + if not os.path.isdir("whippersnapper/" + fldr): + os.mkdir("whippersnapper/" + fldr) + + if not os.path.isdir("whippersnapper/"+ fldr + "/" + ws_cmd): + os.mkdir("whippersnapper/" + fldr + "/" + ws_cmd) + + mn = 1; + if os.path.exists(orig_to_obt(ws_cmd, fldr)): + with open(orig_to_obt(ws_cmd, fldr), 'r') as res_file: + res = res_file.read(); + for lne in res.split("\n"): + if ',' in lne: + mn += 1; + + for i in list(range(mn, int(mx))): + print(str(i)); + (cmd_line1, cmd_line2, fvs, get_rule_temps) = whippersnapper_cmds()[ws_cmd]; + subprocess.run(["p4benchmark", "--feature", ws_cmd] + cmd_line1 + [str(i)] + cmd_line2); + subprocess.run(["p4test", "--p4v", "14", "--pp", "output/main16.p4", "output/main.p4"]); + avenir(ws_cmd, fldr, i, "output", rule_num, get_rule_temps(i), fvs(i), flags); + + shutil.move("output", "whippersnapper/" + fldr + "/"+ ws_cmd + "/output_" + str(i)); + + +# run the actual evaluation, using OBT as the logical program + +# plot + +def read_data(fn): + data_str = "" + with open(fn) as f: + data_str = f.read(); + return data_str; + +def string_to_data(data_str): + data = {}; + for line in data_str.split("\n"): + if "," in line: + pieces = line.split(","); + data[int(pieces[0])] = float(pieces[1]); + + return data + +def get_data(mx, f): + s = read_data(f); + data = string_to_data(s); + data = { k: data[k] for k in data.keys() if k < mx }; + return data; + +def adjust_hot(hot, cold): + for k in hot: + hot[k] = hot[k] - cold[k]; + +def plot(rn, mx, ws_cmd, xlbl): + cache_data = get_data(mx, "whippersnapper/id_cache_" + str(rn) + "/" + ws_cmd + "_res.csv") + hot_data = get_data(mx, "whippersnapper/id_hot_cache_" + str(rn) + "/" + ws_cmd + "_res.csv") + no_cache_data = get_data (mx, "whippersnapper/id_no_cache_" + str(rn) + "/" + ws_cmd + "_res.csv") + + adjust_hot(hot_data, cache_data) + + pl.plot_series(cache_data, hot_data, no_cache_data, name = "whippersnapper/id_" + ws_cmd, xlabel = xlbl, ylabel = "synthesis time (s)"); + +cmd = sys.argv[1]; +ws_cmd = sys.argv[2] if len(sys.argv) > 2 else None; + +if cmd == "generate" and os.path.exists("whippersnapper/" + ws_cmd + "_orig_to_obt_res.csv"): + print("output file already exists"); + sys.exit(); + +if cmd == "gen-all": + rule_num = int(sys.argv[2]); + max_pl = int(sys.argv[3]); + max_sf = int(sys.argv[4]); + + run_whippersnapper("pipeline", "id_cache_" + str(rule_num) , rule_num, max_pl, avenir_flags_pipeline()); + run_whippersnapper("pipeline", "id_hot_cache_" + str(rule_num), rule_num, max_pl, hot_start_flags_pipeline()); + run_whippersnapper("pipeline", "id_no_cache_" + str(rule_num), rule_num, max_pl, non_cache_flags_pipeline()); + + run_whippersnapper("set-field", "id_cache_" + str(rule_num), rule_num, max_sf, avenir_flags_set_field()); + run_whippersnapper("set-field", "id_hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags_set_field()); + run_whippersnapper("set-field", "id_no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags_set_field()); + + plot(rule_num, max_pl, "pipeline", "# of tables"); + plot(rule_num, max_sf, "set-field", "# of fields"); + +elif cmd == "generate": + rule_num = int(sys.argv[3]); + mx = sys.argv[4]; + flags = non_cache_flags() if "--no-cache" in sys.argv else avenir_flags(); + fldr = "no_cache" if "--no-cache" in sys.argv else "cache"; + run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags); +elif cmd == "plot": + if ws_cmd == "pipeline": + xlbl = "# of tables" + else: + xlbl = "# of fields" + plot(ws_cmd, xlbl); diff --git a/synthesis/whippersnapper/bench.py b/synthesis/whippersnapper/bench_obt.py similarity index 100% rename from synthesis/whippersnapper/bench.py rename to synthesis/whippersnapper/bench_obt.py From b555c83ce17d1bf9445d1d64e8289688de1521e3 Mon Sep 17 00:00:00 2001 From: Bill Hallahan Date: Thu, 17 Sep 2020 02:44:58 -0400 Subject: [PATCH 24/24] Various things --- synthesis/whippersnapper/bench_identity.py | 70 ++++++++++++---------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/synthesis/whippersnapper/bench_identity.py b/synthesis/whippersnapper/bench_identity.py index 2fa0e4b6..60b48981 100644 --- a/synthesis/whippersnapper/bench_identity.py +++ b/synthesis/whippersnapper/bench_identity.py @@ -148,7 +148,7 @@ def hot_start_flags_set_field(): def orig_to_obt(ws_cmd, fldr): return ("whippersnapper/" + fldr + "/" + ws_cmd + "_res.csv"); -def avenir(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags): +def avenir(ws_cmd, fldr, i, fn, num, timeout, rule_temps, fvs, flags): edits_file = "whippersnapper/empty_edits.txt"; fvs_file = "output/fvs.txt"; assume_file = "whippersnapper/empty_assume.txt"; @@ -171,29 +171,32 @@ def avenir(ws_cmd, fldr, i, fn, num, rule_temps, fvs, flags): st_time = time.perf_counter(); - res = subprocess.run(["./avenir", "synth", "output/main16.p4", "output/main16.p4", edits_file - , edits_file, fvs_file, "-b", "100", "-data" - , commands_no_def_file, "-e", "25", "-p"] + flags - + ["-I1", "whippersnapper/p4includes"] - + ["-I2", "whippersnapper/p4includes"] - + ["-P4", "--thrift"] - , stdout = subprocess.PIPE, stderr = subprocess.PIPE); - end_time = time.perf_counter(); - elapsed = end_time - st_time; - - obt_commands = "output/obt_commands.txt"; - - cmds = res.stdout.decode('utf-8'); - cmds = cmds.split("Target operations:\n")[1]; - with open(obt_commands, 'w') as f: - f.write(cmds); - #except: - # print("no commands written"); - - with open(orig_to_obt(ws_cmd, fldr), "a") as res_file: - res_file.write(str(i) + "," + str(elapsed) + "\n") - -def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags): + try: + res = subprocess.run(["./avenir", "synth", "output/main16.p4", "output/main16.p4", edits_file + , edits_file, fvs_file, "-b", "100", "-data" + , commands_no_def_file, "-e", "25", "-p"] + flags + + ["-I1", "whippersnapper/p4includes"] + + ["-I2", "whippersnapper/p4includes"] + + ["-P4", "--thrift"] + , stdout = subprocess.PIPE, stderr = subprocess.PIPE, timeout = timeout); + end_time = time.perf_counter(); + elapsed = end_time - st_time; + + obt_commands = "output/obt_commands.txt"; + + cmds = res.stdout.decode('utf-8'); + cmds = cmds.split("Target operations:\n")[1]; + with open(obt_commands, 'w') as f: + f.write(cmds); + #except: + # print("no commands written"); + + with open(orig_to_obt(ws_cmd, fldr), "a") as res_file: + res_file.write(str(i) + "," + str(elapsed) + "\n") + except subprocess.TimeoutExpired: + return; + +def run_whippersnapper(ws_cmd, fldr, timeout, rule_num, mx, flags): if not os.path.isdir("whippersnapper/" + fldr): os.mkdir("whippersnapper/" + fldr) @@ -213,7 +216,7 @@ def run_whippersnapper(ws_cmd, fldr, rule_num, mx, flags): (cmd_line1, cmd_line2, fvs, get_rule_temps) = whippersnapper_cmds()[ws_cmd]; subprocess.run(["p4benchmark", "--feature", ws_cmd] + cmd_line1 + [str(i)] + cmd_line2); subprocess.run(["p4test", "--p4v", "14", "--pp", "output/main16.p4", "output/main.p4"]); - avenir(ws_cmd, fldr, i, "output", rule_num, get_rule_temps(i), fvs(i), flags); + avenir(ws_cmd, fldr, i, "output", rule_num, timeout, get_rule_temps(i), fvs(i), flags); shutil.move("output", "whippersnapper/" + fldr + "/"+ ws_cmd + "/output_" + str(i)); @@ -265,16 +268,17 @@ def plot(rn, mx, ws_cmd, xlbl): if cmd == "gen-all": rule_num = int(sys.argv[2]); - max_pl = int(sys.argv[3]); - max_sf = int(sys.argv[4]); + timeout = int(sys.argv[3]); + max_pl = int(sys.argv[4]); + max_sf = int(sys.argv[5]); - run_whippersnapper("pipeline", "id_cache_" + str(rule_num) , rule_num, max_pl, avenir_flags_pipeline()); - run_whippersnapper("pipeline", "id_hot_cache_" + str(rule_num), rule_num, max_pl, hot_start_flags_pipeline()); - run_whippersnapper("pipeline", "id_no_cache_" + str(rule_num), rule_num, max_pl, non_cache_flags_pipeline()); + run_whippersnapper("pipeline", "id_cache_" + str(rule_num), timeout, rule_num, max_pl, avenir_flags_pipeline()); + run_whippersnapper("pipeline", "id_hot_cache_" + str(rule_num), timeout, rule_num, max_pl, hot_start_flags_pipeline()); + run_whippersnapper("pipeline", "id_no_cache_" + str(rule_num), timeout, rule_num, max_pl, non_cache_flags_pipeline()); - run_whippersnapper("set-field", "id_cache_" + str(rule_num), rule_num, max_sf, avenir_flags_set_field()); - run_whippersnapper("set-field", "id_hot_cache_" + str(rule_num), rule_num, max_sf, hot_start_flags_set_field()); - run_whippersnapper("set-field", "id_no_cache_" + str(rule_num), rule_num, max_sf, non_cache_flags_set_field()); + run_whippersnapper("set-field", "id_cache_" + str(rule_num), timeout, rule_num, max_sf, avenir_flags_set_field()); + run_whippersnapper("set-field", "id_hot_cache_" + str(rule_num), timeout, rule_num, max_sf, hot_start_flags_set_field()); + run_whippersnapper("set-field", "id_no_cache_" + str(rule_num), timeout, rule_num, max_sf, non_cache_flags_set_field()); plot(rule_num, max_pl, "pipeline", "# of tables"); plot(rule_num, max_sf, "set-field", "# of fields");