diff --git a/Cargo.lock b/Cargo.lock index d8476cb8..d13bc128 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,24 +4,18 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.19" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.66" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" - -[[package]] -name = "arc-swap" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "983cd8b9d4b02a6dc6ffa557262eb5858a27a0038ffffe21a0f133eaa819a164" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "atty" @@ -46,6 +40,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "bitvec" version = "1.0.1" @@ -60,18 +60,18 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cfg-if" @@ -81,12 +81,12 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "3.2.23" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -98,15 +98,15 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.2.18" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck", "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -120,43 +120,23 @@ dependencies = [ [[package]] name = "colored" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "atty", "lazy_static", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" -dependencies = [ - "cfg-if", -] - [[package]] name = "crypto-common" version = "0.1.6" @@ -169,35 +149,14 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.5" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "dof" version = "0.1.5" @@ -220,14 +179,21 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "1.8.0" +name = "errno" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "instant", + "libc", + "windows-sys 0.52.0", ] +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + [[package]] name = "funty" version = "2.0.0" @@ -236,9 +202,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -246,9 +212,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -257,9 +223,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "hashbrown" @@ -269,9 +235,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -284,23 +250,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - [[package]] name = "ipnetwork" version = "0.19.0" @@ -312,9 +269,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.4" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "lazy_static" @@ -324,9 +281,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.137" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libloading" @@ -339,19 +296,16 @@ dependencies = [ ] [[package]] -name = "log" -version = "0.4.17" +name = "linux-raw-sys" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "no-std-net" @@ -361,9 +315,9 @@ checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" [[package]] name = "num" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" dependencies = [ "num-bigint", "num-complex", @@ -375,9 +329,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -387,9 +341,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ "num-traits", "serde", @@ -431,40 +385,30 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "once_cell" -version = "1.16.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "os_str_bytes" -version = "6.3.1" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3baf96e39c5359d2eb0dd6ccb42c62b91d9678aa68160d261b9e0ccbf9e9dea9" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "p4" version = "0.1.0" dependencies = [ "colored", - "regex", ] [[package]] @@ -476,7 +420,7 @@ dependencies = [ "proc-macro2", "serde", "serde_tokenstream", - "syn", + "syn 1.0.109", ] [[package]] @@ -498,7 +442,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "tempfile", ] @@ -507,33 +451,29 @@ name = "p4rs" version = "0.1.0" dependencies = [ "bitvec", - "colored", "num", "pnet", "serde", "serde_json", - "slog", - "slog-async", - "slog-envlogger", - "slog-term", "usdt", ] [[package]] name = "pest" -version = "2.4.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a528564cc62c19a7acac4d81e01f39e53e25e17b934878f4c6d25cc2836e62f8" +checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.4.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fd9bc6500181952d34bd0b2b0163a54d794227b498be0b7afa7698d0a7b18f" +checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" dependencies = [ "pest", "pest_generator", @@ -541,26 +481,26 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.4.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2610d5ac5156217b4ff8e46ddcef7cdf44b273da2ac5bca2ecbfa86a330e7c4" +checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn", + "syn 2.0.48", ] [[package]] name = "pest_meta" -version = "2.4.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824749bf7e21dd66b36fbe26b3f45c713879cccd4a009a917ab8e045ca8246fe" +checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" dependencies = [ "once_cell", "pest", - "sha1", + "sha2", ] [[package]] @@ -606,7 +546,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn", + "syn 1.0.109", ] [[package]] @@ -660,12 +600,12 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "prettyplease" -version = "0.1.21" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c142c0e46b57171fe0c528bee8c5b7569e80f0c17e377cd0e30ea57dbc11bb51" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ "proc-macro2", - "syn", + "syn 1.0.109", ] [[package]] @@ -677,7 +617,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -694,18 +634,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.47" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.21" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -748,29 +688,30 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] -name = "redox_users" -version = "0.4.3" +name = "regex" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ - "getrandom", - "redox_syscall", - "thiserror", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "regex" -version = "1.7.0" +name = "regex-automata" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", @@ -779,56 +720,54 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] -name = "remove_dir_all" -version = "0.5.3" +name = "rustix" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "winapi", + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", ] -[[package]] -name = "rustversion" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" - [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "serde" -version = "1.0.147" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.87" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ "itoa", "ryu", @@ -837,20 +776,20 @@ dependencies = [ [[package]] name = "serde_tokenstream" -version = "0.1.3" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6deb15c3a535e81438110111d90168d91721652f502abb147f31cde129f683d" +checksum = "797ba1d80299b264f3aac68ab5d12e5825a561749db4df7cd7c8083900c5d4e9" dependencies = [ "proc-macro2", "serde", - "syn", + "syn 1.0.109", ] [[package]] -name = "sha1" -version = "0.10.5" +name = "sha2" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -870,84 +809,27 @@ dependencies = [ ] [[package]] -name = "slog" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" - -[[package]] -name = "slog-async" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "766c59b252e62a34651412870ff55d8c4e6d04df19b43eecb2703e417b097ffe" -dependencies = [ - "crossbeam-channel", - "slog", - "take_mut", - "thread_local", -] - -[[package]] -name = "slog-envlogger" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906a1a0bc43fed692df4b82a5e2fbfc3733db8dad8bb514ab27a4f23ad04f5c0" -dependencies = [ - "log", - "regex", - "slog", - "slog-async", - "slog-scope", - "slog-stdlog", - "slog-term", -] - -[[package]] -name = "slog-scope" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f95a4b4c3274cd2869549da82b57ccc930859bdbf5bcea0424bc5f140b3c786" -dependencies = [ - "arc-swap", - "lazy_static", - "slog", -] - -[[package]] -name = "slog-stdlog" -version = "4.1.1" +name = "strsim" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6706b2ace5bbae7291d3f8d2473e2bfab073ccd7d03670946197aec98471fa3e" -dependencies = [ - "log", - "slog", - "slog-scope", -] +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "slog-term" -version = "2.9.0" +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d29185c55b7b258b4f120eab00f48557d4d9bc814f41713f449d35b0f8977c" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "atty", - "slog", - "term", - "thread_local", - "time", + "proc-macro2", + "quote", + "unicode-ident", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "syn" -version = "1.0.103" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -962,16 +844,10 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "unicode-xid", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" - [[package]] name = "tap" version = "1.0.1" @@ -980,34 +856,22 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.3.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand", - "libc", "redox_syscall", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", + "rustix", + "windows-sys 0.52.0", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -1037,90 +901,51 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.37" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.37" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.48", ] [[package]] name = "thread-id" -version = "4.0.0" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fdfe0627923f7411a43ec9ec9c39c3a9b4151be313e0922042581fb6c9b717f" +checksum = "f0ec81c46e9eb50deaa257be2f148adf052d1fb7701cfd55ccfab2525280b70b" dependencies = [ "libc", - "redox_syscall", "winapi", ] -[[package]] -name = "thread_local" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" -dependencies = [ - "once_cell", -] - -[[package]] -name = "time" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" -dependencies = [ - "itoa", - "libc", - "num_threads", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" - -[[package]] -name = "time-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" -dependencies = [ - "time-core", -] - [[package]] name = "typenum" -version = "1.15.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unicode-ident" -version = "1.0.5" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-xid" @@ -1151,7 +976,7 @@ dependencies = [ "proc-macro2", "quote", "serde_tokenstream", - "syn", + "syn 1.0.109", "usdt-impl", ] @@ -1169,7 +994,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn", + "syn 1.0.109", "thiserror", "thread-id", "version_check", @@ -1185,7 +1010,7 @@ dependencies = [ "proc-macro2", "quote", "serde_tokenstream", - "syn", + "syn 1.0.109", "usdt-impl", ] @@ -1219,9 +1044,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -1232,11 +1057,143 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "wyz" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ "tap", ] @@ -1250,7 +1207,6 @@ dependencies = [ "colored", "p4", "p4-rust", - "regex", ] [[package]] @@ -1281,9 +1237,9 @@ source = "git+https://github.com/oxidecomputer/xfr#8a89ee73d039abf91fdddcdd66de6 [[package]] name = "zerocopy" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6580539ad917b7c026220c4b3f2c08d52ce54d6ce0dc491e66002e35388fab46" +checksum = "da091bab2bd35db397c46f5b81748b56f28f8fda837087fab9b6b07b6d66e3f1" dependencies = [ "byteorder", "zerocopy-derive", @@ -1296,6 +1252,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d498dbd1fd7beb83c86709ae1c33ca50942889473473d287d56ce4770a18edfb" dependencies = [ "proc-macro2", - "syn", + "syn 1.0.109", "synstructure", ] diff --git a/book/code/src/bin/hello-world.rs b/book/code/src/bin/hello-world.rs index a9b03f30..be466bf3 100644 --- a/book/code/src/bin/hello-world.rs +++ b/book/code/src/bin/hello-world.rs @@ -1,4 +1,5 @@ #![allow(clippy::needless_update)] +use std::sync::{Arc, Mutex}; use tests::expect_frames; use tests::softnpu::{RxFrame, SoftNpu, TxFrame}; @@ -8,7 +9,8 @@ p4_macro::use_p4!( ); fn main() -> Result<(), anyhow::Error> { - let mut npu = SoftNpu::new(2, main_pipeline::new(2), false); + let mut npu = + SoftNpu::new(2, Arc::new(Mutex::new(main_pipeline::new(2))), false); let phy1 = npu.phy(0); let phy2 = npu.phy(1); diff --git a/book/code/src/bin/vlan-switch.rs b/book/code/src/bin/vlan-switch.rs index d6c5ede4..3f5cea9d 100644 --- a/book/code/src/bin/vlan-switch.rs +++ b/book/code/src/bin/vlan-switch.rs @@ -1,4 +1,5 @@ #![allow(clippy::needless_update)] +use std::sync::{Arc, Mutex}; use tests::expect_frames; use tests::softnpu::{RxFrame, SoftNpu, TxFrame}; @@ -50,7 +51,7 @@ fn run_test( m3: [u8; 6], ) -> Result<(), anyhow::Error> { // create and run the softnpu instance - let mut npu = SoftNpu::new(2, pipeline, false); + let mut npu = SoftNpu::new(2, Arc::new(Mutex::new(pipeline)), false); let phy1 = npu.phy(0); let phy2 = npu.phy(1); npu.run(); diff --git a/codegen/rust/src/control.rs b/codegen/rust/src/control.rs index 6c1bbb36..bc5c42e1 100644 --- a/codegen/rust/src/control.rs +++ b/codegen/rust/src/control.rs @@ -46,6 +46,7 @@ impl<'a> ControlGenerator<'a> { fn generate_top_level_control(&mut self, control: &Control) { let tables = control.tables(self.ast); + for (cs, t) in tables { let qtn = qualified_table_function_name(Some(control), &cs, t); let qtfn = qualified_table_function_name(Some(control), &cs, t); @@ -324,10 +325,32 @@ impl<'a> ControlGenerator<'a> { > }; + let mut externs = quote! {}; + + for var in &control.variables { + if let Type::UserDefined(typename) = &var.ty { + if self.ast.get_extern(typename).is_some() { + let extern_name = format_ident!("{}", var.name); + let extern_type = format_ident!("{}", typename); + externs.extend(quote! { + let #extern_name = p4rs::externs::#extern_type::new(); + }) + } + } + } + let mut tokens = quote! { + #externs let mut #table_name: #table_type = #table_type::new(); }; + if let Some(lval) = &table.counter { + let counter_name = format_ident!("{}", lval.name); + tokens.extend(quote! { + #table_name.counter = Some(#counter_name); + }); + } + if table.const_entries.is_empty() { tokens.extend(quote! { #table_name }); return (table_type, tokens); @@ -400,6 +423,15 @@ impl<'a> ControlGenerator<'a> { action_fn_args.push(quote! { #a }); } + for var in &control.variables { + if let Type::UserDefined(typename) = &var.ty { + if self.ast.get_extern(typename).is_some() { + let name = format_ident!("{}", var.name); + action_fn_args.push(quote! { #name }); + } + } + } + let action_fn_name = format_ident!("{}_action_{}", control.name, entry.action.name); for (i, expr) in entry.action.parameters.iter().enumerate() { @@ -451,6 +483,15 @@ impl<'a> ControlGenerator<'a> { closure_params.push(quote! { #name }); } + for var in &control.variables { + if let Type::UserDefined(typename) = &var.ty { + if self.ast.get_extern(typename).is_some() { + let name = format_ident!("{}", var.name); + closure_params.push(quote! { #name }); + } + } + } + tokens.extend(quote! { let action: std::sync::Arc = @@ -494,9 +535,12 @@ impl<'a> ControlGenerator<'a> { if self.ast.get_extern(typename).is_some() { let name = format_ident!("{}", var.name); let extern_type = format_ident!("{}", typename); - tokens.extend(quote! { - let #name = p4rs::externs::#extern_type::new(); - }) + //FIXME terrible hack + if typename == "Checksum" { + tokens.extend(quote! { + let #name = p4rs::externs::#extern_type::new(); + }) + } } } } diff --git a/codegen/rust/src/pipeline.rs b/codegen/rust/src/pipeline.rs index 70638914..63e713e4 100644 --- a/codegen/rust/src/pipeline.rs +++ b/codegen/rust/src/pipeline.rs @@ -116,10 +116,16 @@ impl<'a> PipelineGenerator<'a> { let add_table_entry_method = self.add_table_entry_method(ingress, egress); + let remove_table_entry_method = self.remove_table_entry_method(ingress, egress); + let get_table_entries_method = self.get_table_entries_method(ingress, egress); + + let get_table_counters_method = + self.get_table_counters_method(ingress, egress); + let get_table_ids_method = self.get_table_ids_method(ingress, egress); let table_modifiers = self.table_modifiers(ingress, egress); @@ -156,6 +162,7 @@ impl<'a> PipelineGenerator<'a> { #add_table_entry_method #remove_table_entry_method #get_table_entries_method + #get_table_counters_method #get_table_ids_method } @@ -654,6 +661,43 @@ impl<'a> PipelineGenerator<'a> { } } + fn get_table_counters_method( + &mut self, + ingress: &Control, + egress: &Control, + ) -> TokenStream { + let mut body = TokenStream::new(); + for control in &[ingress, egress] { + let tables = control.tables(self.ast); + for (cs, table) in tables.iter() { + if table.counter.is_none() { + continue; + } + let qtn = qualified_table_name(Some(control), cs, table); + let qtfn = + qualified_table_function_name(Some(control), cs, table); + let call = format_ident!("get_{}_counters", qtfn); + body.extend(quote! { + #qtn => Some(self.#call()), + }); + } + } + body.extend(quote! { + x => None, + }); + + quote! { + fn get_table_counters( + &self, + table_id: &str, + ) -> Option { + match table_id { + #body + } + } + } + } + fn table_modifiers( &mut self, ingress: &Control, @@ -689,6 +733,13 @@ impl<'a> PipelineGenerator<'a> { table_control, &qtfn, )); + if table.counter.is_some() { + tokens.extend(self.get_table_counters_function( + table, + table_control, + &qtfn, + )); + } } } @@ -1046,6 +1097,22 @@ impl<'a> PipelineGenerator<'a> { } } + fn get_table_counters_function( + &mut self, + _table: &Table, + _control: &Control, + qtfn: &str, + ) -> TokenStream { + let name = format_ident!("get_{}_counters", qtfn); + let tname = format_ident!("{}", qtfn); + + quote! { + pub fn #name(&self) -> p4rs::externs::TableEntryCounter { + self.#tname.counter.clone().unwrap() + } + } + } + pub(crate) fn parse_entrypoint( &mut self, parser: &Parser, diff --git a/codegen/rust/src/statement.rs b/codegen/rust/src/statement.rs index b4ab4abf..b2dcda05 100644 --- a/codegen/rust/src/statement.rs +++ b/codegen/rust/src/statement.rs @@ -495,11 +495,24 @@ impl<'a> StatementGenerator<'a> { let name = format_ident!("{}", var.name); if let Type::UserDefined(typename) = &var.ty { if self.ast.get_extern(typename).is_some() { - action_args.push(quote! { &#name }); + //FIXME terrible hack + if typename == "Checksum" { + action_args.push(quote! { &#name }); + } } } } + if table.counter.is_some() { + action_args.push(quote! { + &#table_name + .counter + .as_ref() + .unwrap() + .set_key(matches[0].key_bytes()) + }); + } + let mut selector_components = Vec::new(); for (lval, _match_kind) in &table.key { let lvref: Vec = lval @@ -542,6 +555,15 @@ impl<'a> StatementGenerator<'a> { } }); if table.default_action != "NoAction" { + if table.counter.is_some() { + action_args.pop(); + action_args.push(quote! { + &#table_name + .counter + .as_ref() + .unwrap() + }); + } tokens.extend(quote! { else { softnpu_provider::control_table_miss!(||#table_name_str); diff --git a/dtrace/drop-monitor.d b/dtrace/drop-monitor.d new file mode 100644 index 00000000..660ba970 --- /dev/null +++ b/dtrace/drop-monitor.d @@ -0,0 +1,19 @@ +::parser_accepted { + printf("%s", copyinstr(arg0)); +} + +::control_table_miss { + printf("%s", copyinstr(arg0)); +} + +::match_miss { + printf("%s", copyinstr(arg0)); +} + +::parser_dropped { + printf("parser dropped\n"); +} + +::ingress_dropped { + printf("ingress dropped\n"); +} diff --git a/lang/p4rs/Cargo.toml b/lang/p4rs/Cargo.toml index c722b601..ec801cb2 100644 --- a/lang/p4rs/Cargo.toml +++ b/lang/p4rs/Cargo.toml @@ -5,12 +5,7 @@ edition = "2021" [dependencies] num = { version = "0.4", features = ["serde"] } -slog = { version = "2.7", features = ["max_level_trace"] } -slog-term = "2.9" -slog-async = "2.7" -slog-envlogger = "2.2" bitvec = "1.0" -colored = "2.0" usdt.workspace = true serde = "1.0" serde_json = "1.0" diff --git a/lang/p4rs/src/checksum.rs b/lang/p4rs/src/checksum.rs index 4ce439ea..936289dd 100644 --- a/lang/p4rs/src/checksum.rs +++ b/lang/p4rs/src/checksum.rs @@ -77,6 +77,35 @@ pub fn udp6_checksum(data: &[u8]) -> u16 { csum.result() } +pub trait Checksum { + fn csum(&self) -> BitVec; +} + +fn bvec_csum(bv: &BitVec) -> BitVec { + let x: u128 = bv.load(); + let buf = x.to_be_bytes(); + let mut c: u16 = 0; + for i in (0..16).step_by(2) { + c += u16::from_be_bytes([buf[i], buf[i + 1]]) + } + let c = !c; + let mut result = bitvec![u8, Msb0; 0u8, 16]; + result.store(c); + result +} + +impl Checksum for BitVec { + fn csum(&self) -> BitVec { + bvec_csum(self) + } +} + +impl Checksum for &BitVec { + fn csum(&self) -> BitVec { + bvec_csum(self) + } +} + #[cfg(test)] mod tests { use super::*; @@ -126,32 +155,3 @@ mod tests { assert_eq!(x, y); } } - -pub trait Checksum { - fn csum(&self) -> BitVec; -} - -fn bvec_csum(bv: &BitVec) -> BitVec { - let x: u128 = bv.load(); - let buf = x.to_be_bytes(); - let mut c: u16 = 0; - for i in (0..16).step_by(2) { - c += u16::from_be_bytes([buf[i], buf[i + 1]]) - } - let c = !c; - let mut result = bitvec![u8, Msb0; 0u8, 16]; - result.store(c); - result -} - -impl Checksum for BitVec { - fn csum(&self) -> BitVec { - bvec_csum(self) - } -} - -impl Checksum for &BitVec { - fn csum(&self) -> BitVec { - bvec_csum(self) - } -} diff --git a/lang/p4rs/src/externs.rs b/lang/p4rs/src/externs.rs index 643f5272..99fd1a95 100644 --- a/lang/p4rs/src/externs.rs +++ b/lang/p4rs/src/externs.rs @@ -1,6 +1,8 @@ // Copyright 2022 Oxide Computer Company use bitvec::prelude::*; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; pub struct Checksum {} @@ -29,3 +31,44 @@ impl Default for Checksum { Self::new() } } + +#[derive(Clone, Debug)] +pub struct TableEntryCounter { + pub entries: Arc, u128>>>, + pub key: Option>, +} + +impl Default for TableEntryCounter { + fn default() -> Self { + Self::new() + } +} + +impl TableEntryCounter { + pub fn new() -> Self { + Self { + entries: Arc::new(Mutex::new(HashMap::new())), + key: None, + } + } + + pub fn set_key(&self, value: Vec) -> Self { + let mut ctr = self.clone(); + ctr.key = Some(value); + ctr + } + + pub fn count(&self) { + let key = match &self.key { + Some(k) => k, + None => return, + }; + let mut entries = self.entries.lock().unwrap(); + match entries.get_mut(key) { + Some(e) => *e += 1, + None => { + entries.insert(key.clone(), 1); + } + } + } +} diff --git a/lang/p4rs/src/lib.rs b/lang/p4rs/src/lib.rs index 8e99c025..2c42e363 100644 --- a/lang/p4rs/src/lib.rs +++ b/lang/p4rs/src/lib.rs @@ -182,6 +182,12 @@ pub trait Pipeline: Send { /// Get all the entries in a table. fn get_table_entries(&self, table_id: &str) -> Option>; + /// Get the counters for a table. + fn get_table_counters( + &self, + table_id: &str, + ) -> Option; + /// Get a list of table ids fn get_table_ids(&self) -> Vec<&str>; } diff --git a/lang/p4rs/src/table.rs b/lang/p4rs/src/table.rs index 54d33f79..1e86dbf8 100644 --- a/lang/p4rs/src/table.rs +++ b/lang/p4rs/src/table.rs @@ -104,6 +104,7 @@ pub struct Prefix { pub struct Table { pub entries: HashSet>, + pub counter: Option, } impl Default for Table { @@ -116,6 +117,7 @@ impl Table { pub fn new() -> Self { Self { entries: HashSet::new(), + counter: None, } } @@ -328,6 +330,17 @@ pub struct TableEntry { pub parameter_data: Vec, } +impl TableEntry { + pub fn key_bytes(&self) -> Vec { + let mut result = Vec::new(); + for k in &self.key { + let bytes = k.to_bytes(); + result.extend_from_slice(&bytes); + } + result + } +} + // TODO: Cannot hash on just the key, this does not work for multipath. impl std::hash::Hash for TableEntry { fn hash(&self, state: &mut H) { @@ -498,6 +511,7 @@ mod tests { 1, ), ]), + counter: None, }; //println!("M1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); @@ -666,6 +680,7 @@ mod tests { 10, ), ]), + counter: None, }; let dst: Ipv6Addr = "fd00:1::1".parse().unwrap(); @@ -763,6 +778,7 @@ mod tests { 10, ), ]), + counter: None, }; let dst: Ipv6Addr = "fd00:1::1".parse().unwrap(); let selector = [ @@ -835,6 +851,7 @@ mod tests { parameter_data: Vec::new(), }, ]), + counter: None, }; let selector = [BigUint::from(1u8)]; diff --git a/p4/Cargo.toml b/p4/Cargo.toml index c3103ac3..35338f7b 100644 --- a/p4/Cargo.toml +++ b/p4/Cargo.toml @@ -5,4 +5,3 @@ edition = "2021" [dependencies] colored = "2" -regex = "1" diff --git a/p4/examples/codegen/router.p4 b/p4/examples/codegen/router.p4 index bf4911f1..10b7d0d8 100644 --- a/p4/examples/codegen/router.p4 +++ b/p4/examples/codegen/router.p4 @@ -12,6 +12,12 @@ extern packet_out { void emit(in T hdr); } + +// XXX import from softnpu.p4 +extern TableEntryCounter { + void count(); +} + // XXX import from softnpu.p4 struct ingress_metadata_t { bit<16> port; @@ -74,10 +80,13 @@ control ingress( inout egress_metadata_t egress, ) { + TableEntryCounter() counter; + action drop() { } action forward(bit<16> port) { egress.port = port; + counter.count(); } table router { @@ -102,6 +111,7 @@ control ingress( forward(16w1); } + counters = counter; } apply { diff --git a/p4/examples/codegen/softnpu.p4 b/p4/examples/codegen/softnpu.p4 index 36458bbd..a2eb907c 100644 --- a/p4/examples/codegen/softnpu.p4 +++ b/p4/examples/codegen/softnpu.p4 @@ -15,3 +15,23 @@ struct egress_metadata_t { extern Checksum { bit<16> run(in T data); } + +/* TODO +enum counter_type_t { + PACKETS, + BYTES, + PACKETS_AND_BYTES +} +*/ + +extern TableEntryCounter { + /*TODO TableEntryCounter(counter_type_t type);*/ + void count(); +} + +/* +extern Counter { + Counter(bit<32> size, TODO counter_type_t type); + void count(in bit<32> index); +} +*/ diff --git a/p4/src/ast.rs b/p4/src/ast.rs index c8be2961..1edc6903 100644 --- a/p4/src/ast.rs +++ b/p4/src/ast.rs @@ -1371,6 +1371,7 @@ impl ActionParameter { pub struct Table { pub name: String, pub actions: Vec, + pub counter: Option, pub default_action: String, pub key: Vec<(Lvalue, MatchKind)>, pub const_entries: Vec, @@ -1383,6 +1384,7 @@ impl Table { Self { name, actions: Vec::new(), + counter: None, default_action: String::new(), key: Vec::new(), const_entries: Vec::new(), diff --git a/p4/src/lexer.rs b/p4/src/lexer.rs index 107a2ab9..b46dbf18 100644 --- a/p4/src/lexer.rs +++ b/p4/src/lexer.rs @@ -24,6 +24,7 @@ pub enum Kind { Lpm, Range, Actions, + Counters, DefaultAction, Entries, In, @@ -152,6 +153,7 @@ impl fmt::Display for Kind { Kind::Lpm => write!(f, "keyword lpm"), Kind::Range => write!(f, "keyword range"), Kind::Actions => write!(f, "keyword actions"), + Kind::Counters => write!(f, "keyword counters"), Kind::DefaultAction => write!(f, "keyword default_action"), Kind::Entries => write!(f, "keyword entries"), Kind::In => write!(f, "keyword in"), @@ -553,6 +555,10 @@ impl<'a> Lexer<'a> { return Ok(t); } + if let Some(t) = self.match_token("counters", Kind::Counters) { + return Ok(t); + } + if let Some(t) = self.match_token("default_action", Kind::DefaultAction) { return Ok(t); diff --git a/p4/src/parser.rs b/p4/src/parser.rs index 89de9e5f..701dd304 100644 --- a/p4/src/parser.rs +++ b/p4/src/parser.rs @@ -1184,6 +1184,7 @@ impl<'a, 'b> TableParser<'a, 'b> { lexer::Kind::CurlyClose => break, lexer::Kind::Key => self.parse_key(table)?, lexer::Kind::Actions => self.parse_actions(table)?, + lexer::Kind::Counters => self.parse_counter(table)?, lexer::Kind::DefaultAction => { self.parse_default_action(table)? } @@ -1314,6 +1315,14 @@ impl<'a, 'b> TableParser<'a, 'b> { Ok(()) } + pub fn parse_counter(&mut self, table: &mut Table) -> Result<(), Error> { + self.parser.expect_token(lexer::Kind::Equals)?; + let (name, token) = self.parser.parse_identifier("counter name")?; + self.parser.expect_token(lexer::Kind::Semicolon)?; + table.counter = Some(Lvalue { name, token }); + Ok(()) + } + pub fn parse_default_action( &mut self, table: &mut Table, diff --git a/test/src/basic_router.rs b/test/src/basic_router.rs index d5b308d1..829ccc49 100644 --- a/test/src/basic_router.rs +++ b/test/src/basic_router.rs @@ -1,5 +1,7 @@ use crate::softnpu::{Interface6, RxFrame, SoftNpu}; use crate::{expect_frames, muffins}; +use std::net::Ipv6Addr; +use std::sync::{Arc, Mutex}; p4_macro::use_p4!( p4 = "p4/examples/codegen/router.p4", @@ -24,7 +26,8 @@ p4_macro::use_p4!( #[test] fn basic_router2() -> Result<(), anyhow::Error> { - let mut npu = SoftNpu::new(2, main_pipeline::new(2), false); + let pipe = Arc::new(Mutex::new(main_pipeline::new(2))); + let mut npu = SoftNpu::new(2, pipe.clone(), false); let phy1 = npu.phy(0); let phy2 = npu.phy(1); @@ -33,6 +36,13 @@ fn basic_router2() -> Result<(), anyhow::Error> { npu.run(); + let counters = pipe + .lock() + .unwrap() + .get_table_counters("ingress.router") + .unwrap(); + assert_eq!(counters.entries.lock().unwrap().len(), 0); + let et = 0x86dd; let msg = muffins!(); @@ -63,5 +73,38 @@ fn basic_router2() -> Result<(), anyhow::Error> { assert_eq!(phy2.tx_count(), 4usize); assert_eq!(phy2.rx_count(), 2usize); + let counters = pipe + .lock() + .unwrap() + .get_table_counters("ingress.router") + .unwrap(); + assert_eq!(counters.entries.lock().unwrap().len(), 2); + + let entries = counters.entries.lock().unwrap(); + + // form prefix key fd00:1000::/24 corresponding to the const entry in + // router.p4 and ensure the counter is equal to 4 + let key: Ipv6Addr = "fd00:1000::".parse().unwrap(); + let mut key = key.octets().to_vec(); + key.push(24); + let count = entries.get(&key).expect("fd00:1000::/24 counter"); + assert_eq!(*count, 4u128); + + // form prefix key fd00:2000::/24 corresponding to the const entry in + // router.p4 and ensure the counter is equal to 2 + let key: Ipv6Addr = "fd00:2000::".parse().unwrap(); + let mut key = key.octets().to_vec(); + key.push(24); + let count = entries.get(&key).expect("fd00:2000::/24 counter"); + assert_eq!(*count, 2u128); + + // form prefix key fd00:3000::/24 corresponding to no entry in router.p4 + // and ensure there is no associated counter + let key: Ipv6Addr = "fd00:3000::".parse().unwrap(); + let mut key = key.octets().to_vec(); + key.push(24); + let count = entries.get(&key); + assert!(count.is_none()); + Ok(()) } diff --git a/test/src/decap.rs b/test/src/decap.rs index edbfa64a..64e7467c 100644 --- a/test/src/decap.rs +++ b/test/src/decap.rs @@ -8,12 +8,13 @@ use pnet::packet::udp::{MutableUdpPacket, UdpPacket}; use pnet::packet::Packet; use pnet::util::MacAddr; use std::net::{Ipv4Addr, Ipv6Addr}; +use std::sync::{Arc, Mutex}; p4_macro::use_p4!(p4 = "test/src/p4/decap.p4", pipeline_name = "decap",); #[test] fn geneve_decap() -> Result<(), anyhow::Error> { - let pipeline = main_pipeline::new(2); + let pipeline = Arc::new(Mutex::new(main_pipeline::new(2))); let mut npu = SoftNpu::new(2, pipeline, false); let phy0 = npu.phy(0); let phy1 = npu.phy(1); diff --git a/test/src/disag_router.rs b/test/src/disag_router.rs index 173d9103..0797f8e2 100644 --- a/test/src/disag_router.rs +++ b/test/src/disag_router.rs @@ -1,6 +1,7 @@ use crate::softnpu::{Interface6, RxFrame, SoftNpu}; use crate::{expect_frames, muffins}; use std::net::Ipv6Addr; +use std::sync::{Arc, Mutex}; p4_macro::use_p4!(p4 = "test/src/p4/router.p4", pipeline_name = "disag",); @@ -29,7 +30,8 @@ p4_macro::use_p4!(p4 = "test/src/p4/router.p4", pipeline_name = "disag",); #[test] fn disag_router() -> Result<(), anyhow::Error> { - let mut npu = SoftNpu::new(4, main_pipeline::new(4), true); + let pipe = Arc::new(Mutex::new(main_pipeline::new(4))); + let mut npu = SoftNpu::new(4, pipe, true); let cpu = npu.phy(0); let phy1 = npu.phy(1); let phy2 = npu.phy(2); diff --git a/test/src/dynamic_router.rs b/test/src/dynamic_router.rs index 52d23767..612676fd 100644 --- a/test/src/dynamic_router.rs +++ b/test/src/dynamic_router.rs @@ -1,6 +1,7 @@ use crate::softnpu::{Interface6, RxFrame, SoftNpu}; use crate::{expect_frames, muffins}; use std::net::Ipv6Addr; +use std::sync::{Arc, Mutex}; p4_macro::use_p4!( p4 = "test/src/p4/dynamic_router.p4", @@ -77,7 +78,7 @@ fn dynamic_router2() -> Result<(), anyhow::Error> { // run program // - let mut npu = SoftNpu::new(4, pipeline, true); + let mut npu = SoftNpu::new(4, Arc::new(Mutex::new(pipeline)), true); let cpu = npu.phy(0); let phy1 = npu.phy(1); let phy2 = npu.phy(2); diff --git a/test/src/hub.rs b/test/src/hub.rs index 9333fb78..4f3e5f1e 100644 --- a/test/src/hub.rs +++ b/test/src/hub.rs @@ -1,5 +1,6 @@ use crate::softnpu::{RxFrame, SoftNpu, TxFrame}; use crate::{expect_frames, muffins}; +use std::sync::{Arc, Mutex}; p4_macro::use_p4!(p4 = "test/src/p4/hub.p4", pipeline_name = "hub2"); @@ -27,7 +28,8 @@ p4_macro::use_p4!(p4 = "test/src/p4/hub.p4", pipeline_name = "hub2"); /// #[test] fn hub2() -> Result<(), anyhow::Error> { - let mut npu = SoftNpu::new(3, main_pipeline::new(3), false); + let mut npu = + SoftNpu::new(3, Arc::new(Mutex::new(main_pipeline::new(3))), false); let phy1 = npu.phy(0); let phy2 = npu.phy(1); let phy3 = npu.phy(2); diff --git a/test/src/mac_rewrite.rs b/test/src/mac_rewrite.rs index dbc01884..b674014f 100644 --- a/test/src/mac_rewrite.rs +++ b/test/src/mac_rewrite.rs @@ -1,6 +1,7 @@ use crate::softnpu::{Interface6, RxFrame, SoftNpu}; use crate::{expect_frames, muffins}; use std::net::Ipv6Addr; +use std::sync::{Arc, Mutex}; p4_macro::use_p4!( p4 = "test/src/p4/dynamic_router_noaddr_nbr.p4", @@ -114,7 +115,7 @@ fn mac_rewrite2() -> Result<(), anyhow::Error> { // run program // - let mut npu = SoftNpu::new(4, pipeline, true); + let mut npu = SoftNpu::new(4, Arc::new(Mutex::new(pipeline)), true); let cpu = npu.phy(0); let phy1 = npu.phy(1); let phy2 = npu.phy(2); diff --git a/test/src/p4/sidecar-lite.p4 b/test/src/p4/sidecar-lite.p4 index c7052636..34385faa 100644 --- a/test/src/p4/sidecar-lite.p4 +++ b/test/src/p4/sidecar-lite.p4 @@ -451,16 +451,22 @@ control router( inout ingress_metadata_t ingress, inout egress_metadata_t egress, ) { + //TODO counter support when control contains multiple tables. + //TableEntryCounter() v4_counter; + //TableEntryCounter() v6_counter; + action drop() { } action forward_v6(bit<16> port, bit<128> nexthop) { egress.port = port; egress.nexthop_v6 = nexthop; + //v6_counter.count(); } action forward_v4(bit<16> port, bit<32> nexthop) { egress.port = port; egress.nexthop_v4 = nexthop; + //v4_counter.count(); } table router_v6 { @@ -472,6 +478,7 @@ control router( forward_v6; } default_action = drop; + //counters = v6_counter; } table router_v4 { @@ -483,6 +490,7 @@ control router( forward_v4; } default_action = drop; + //counters = v4_counter; } apply { diff --git a/test/src/p4/softnpu.p4 b/test/src/p4/softnpu.p4 index 2f994abd..86eddd0d 100644 --- a/test/src/p4/softnpu.p4 +++ b/test/src/p4/softnpu.p4 @@ -16,3 +16,7 @@ struct egress_metadata_t { extern Checksum { bit<16> run(in T data); } + +extern TableEntryCounter { + void count(); +} diff --git a/test/src/range.rs b/test/src/range.rs index 64691661..6a053c58 100644 --- a/test/src/range.rs +++ b/test/src/range.rs @@ -1,6 +1,7 @@ use crate::expect_frames; use crate::softnpu::{Interface4, RxFrame, SoftNpu}; use std::net::Ipv4Addr; +use std::sync::{Arc, Mutex}; p4_macro::use_p4!(p4 = "test/src/p4/range.p4", pipeline_name = "range",); @@ -69,7 +70,7 @@ fn range() -> Result<(), anyhow::Error> { // run program // - let mut npu = SoftNpu::new(4, pipeline, false); + let mut npu = SoftNpu::new(4, Arc::new(Mutex::new(pipeline)), false); let phy0 = npu.phy(0); let phy1 = npu.phy(1); let phy2 = npu.phy(2); diff --git a/test/src/softnpu.rs b/test/src/softnpu.rs index 2511b62c..0b137577 100644 --- a/test/src/softnpu.rs +++ b/test/src/softnpu.rs @@ -4,7 +4,7 @@ use p4rs::packet_in; use rand::Rng; use std::net::{Ipv4Addr, Ipv6Addr}; use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use std::thread::spawn; use xfr::{ring, FrameBuffer, RingConsumer, RingProducer}; @@ -79,7 +79,7 @@ const FBUF: usize = 4096; const MTU: usize = 1500; pub struct SoftNpu { - pub pipeline: Option

, + pub pipeline: Arc>, inner_phys: Option>>, outer_phys: Vec>>, _fb: Arc>, @@ -91,7 +91,7 @@ impl SoftNpu

{ /// run. When `cpu_port` is set to true, sidecar data in `TxFrame` elements /// will be added to packets sent through port 0 (as a sidecar header) on /// the way to the ASIC. - pub fn new(radix: usize, pipeline: P, cpu_port: bool) -> Self { + pub fn new(radix: usize, pipeline: Arc>, cpu_port: bool) -> Self { let fb = Arc::new(FrameBuffer::::new()); let mut inner_phys = Vec::new(); let mut outer_phys = Vec::new(); @@ -111,7 +111,7 @@ impl SoftNpu

{ inner_phys, outer_phys, _fb: fb, - pipeline: Some(pipeline), + pipeline, } } @@ -120,16 +120,22 @@ impl SoftNpu

{ Some(phys) => phys, None => panic!("phys already in use"), }; + let pipe = self.pipeline.clone(); + /* let pipe = match self.pipeline.take() { Some(pipe) => pipe, None => panic!("pipe already in use"), }; + */ spawn(move || { Self::do_run(inner_phys, pipe); }); } - fn do_run(inner_phys: Vec>, mut pipeline: P) { + fn do_run( + inner_phys: Vec>, + pipeline: Arc>, + ) { loop { // TODO: yes this is a highly suboptimal linear gather-scatter across // each ingress. Will update to something more concurrent eventually. @@ -147,7 +153,8 @@ impl SoftNpu

{ let mut pkt = packet_in::new(content); let port = i as u16; - let output = pipeline.process_packet(port, &mut pkt); + let output = + pipeline.lock().unwrap().process_packet(port, &mut pkt); for (out_pkt, out_port) in &output { let out_port = *out_port as usize; // diff --git a/x4c/Cargo.toml b/x4c/Cargo.toml index f18ab98c..4bf02b93 100644 --- a/x4c/Cargo.toml +++ b/x4c/Cargo.toml @@ -7,6 +7,5 @@ edition = "2021" colored = "2" clap = { version = "3", features = ["color", "derive"] } anyhow = "1" -regex = "1" p4 = { path = "../p4" } p4-rust = { path = "../codegen/rust" }