blob: 449e50a7c9b04e648ed456eba43c0a5bd007bed2 [file]
# Copyright 2025 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
load("@fuchsia_rules_common//build_flags:build_flags.bzl", "build_flags")
load("//build/bazel/config/derived:compilation_modes.bzl", "is_debug")
load("//build/bazel/platforms:constraints.bzl", "HOST_OS_CONSTRAINTS")
load("//build/bazel/rules/host_tests:host_rustc_test.bzl", "wrap_host_rust_test")
load("//build/bazel/rules/rust:rustc_check_cfg_build_flags.bzl", "rustc_check_cfg_build_flags")
load("//build/bazel/rules/rust:rustc_library.bzl", "rustc_library")
load("//build/bazel/rules/rust:rustc_test.bzl", "rustc_test")
load("//build/bazel/rules/testing:fx_unittest_package.bzl", "fx_unittest_package")
load(":assert_no_deps.bzl", "assert_no_deps_tags")
package(default_applicable_licenses = ["//:license"])
# LINT.IfChange(loom)
# The loom crate documentation recommends compiling with optimizations since
# the number of iterations can be large enough to make tests unreasonably slow
# otherwise.
# @bazel2gn:skip
build_flags(
name = "loom",
rustflags = ["--cfg=loom"],
subflags = ["//build/config:optimize_moderate"],
visibility = ["//src/connectivity/network/netstack3/core:__subpackages__"],
)
# LINT.ThenChange(//src/connectivity/network/netstack3/core/BUILD.gn:loom)
# LINT.IfChange(benchmark)
# @bazel2gn:skip
build_flags(
name = "benchmark",
rustflags = ["--cfg=benchmark"],
visibility = ["//src/connectivity/network/netstack3:__subpackages__"],
)
# LINT.ThenChange(//src/connectivity/network/netstack3/core/BUILD.gn:benchmark)
# LINT.IfChange(no_lock_order)
# Disable lock ordering to speed-up compilation.
# @bazel2gn:skip
build_flags(
name = "no_lock_order",
rustflags = ["--cfg=no_lock_order"],
)
# LINT.ThenChange(//src/connectivity/network/netstack3/core/BUILD.gn:no_lock_order)
# LINT.IfChange(no_lock_order_except_debug_device)
# Only re-enabled lock order checks for debug non-host configurations.
#
# Keeping it disabled for host builds makes it easier to spot
# conditional compilation problems when building a debug image.
# @bazel2gn:skip
build_flags(
name = "no_lock_order_except_debug_device",
rustflags = select({
"//build/bazel/platforms:is_host_os": ["--cfg=no_lock_order"],
"//conditions:default": [],
}) if is_debug else ["--cfg=no_lock_order"],
)
# LINT.ThenChange(//src/connectivity/network/netstack3/core/BUILD.gn:no_lock_order_except_debug_device)
rustc_check_cfg_build_flags(
name = "check_cfg_flags",
cfgs = [
"benchmark",
"loom",
"no_lock_order",
"test",
],
features = [
"instrumented",
"testutils",
],
)
_COMMON_SRCS = [
"src/api.rs",
"src/context.rs",
"src/counters.rs",
"src/device/base.rs",
"src/device/blackhole.rs",
"src/device/ethernet.rs",
"src/device/loopback.rs",
"src/device/pure_ip.rs",
"src/device/socket.rs",
"src/filter/integration.rs",
"src/ip/base.rs",
"src/ip/device.rs",
"src/ip/multicast_forwarding.rs",
"src/ip/raw.rs",
"src/lib.rs",
"src/lock_ordering.rs",
"src/marker.rs",
"src/state.rs",
"src/testutil.rs",
"src/time.rs",
"src/transport.rs",
"src/transport/integration.rs",
]
_COMMON_BUILD_FLAGS = [
":check_cfg_flags",
"//build/config/rust/lints:deny_unused_results",
"//src/connectivity/network/netstack3:netstack3_configs",
]
# @bazel2gn:transformer=deps
_COMMON_PROC_MACRO_DEPS = [
"//src/connectivity/network/netstack3/core/macros:netstack3-macros",
"//third_party/rust_crates/vendor:derivative",
]
# @bazel2gn:transformer=deps
_COMMON_DEPS = [
"//src/connectivity/lib/net-types",
"//src/connectivity/lib/packet-formats",
"//src/connectivity/network/netstack3/core/hashmap",
"//src/connectivity/network/netstack3/core/lock-order",
"//src/lib/network/packet",
"//third_party/rust_crates/vendor:assert_matches",
"//third_party/rust_crates/vendor:log",
]
# @bazel2gn:transformer=deps
_TESTUTILS_DEPS = [
"//third_party/rust_crates/vendor:zerocopy",
]
# @bazel2gn:transformer=deps
_ALL_CORE_CRATES = [
"//src/connectivity/network/netstack3/core/base:netstack3-base",
"//src/connectivity/network/netstack3/core/base:netstack3-base-benchmarks",
"//src/connectivity/network/netstack3/core/base:netstack3-base-instrumented",
"//src/connectivity/network/netstack3/core/base:netstack3-base-loom",
"//src/connectivity/network/netstack3/core/base:netstack3-base-testutils",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram-benchmarks",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram-instrumented",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram-loom",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram-testutils",
"//src/connectivity/network/netstack3/core/device:netstack3-device",
"//src/connectivity/network/netstack3/core/device:netstack3-device-benchmarks",
"//src/connectivity/network/netstack3/core/device:netstack3-device-instrumented",
"//src/connectivity/network/netstack3/core/device:netstack3-device-loom",
"//src/connectivity/network/netstack3/core/device:netstack3-device-testutils",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter-benchmarks",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter-instrumented",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter-loom",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter-testutils",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo-benchmarks",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo-instrumented",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo-loom",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo-testutils",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip-benchmarks",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip-instrumented",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip-loom",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip-testutils",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync-instrumented",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync-loom",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync-testutils",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp-benchmarks",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp-instrumented",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp-loom",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp-testutils",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace-benchmarks",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace-instrumented",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace-loom",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace-testutils",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp-benchmarks",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp-instrumented",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp-loom",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp-testutils",
]
# @bazel2gn:transformer=deps
_CORE_DEPS = [
"//src/connectivity/network/netstack3/core/base:netstack3-base",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram",
"//src/connectivity/network/netstack3/core/device:netstack3-device",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp",
]
# @bazel2gn:transformer=deps
_INSTRUMENTED_CORE_DEPS = [
"//src/connectivity/network/netstack3/core/base:netstack3-base-instrumented",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram-instrumented",
"//src/connectivity/network/netstack3/core/device:netstack3-device-instrumented",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter-instrumented",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo-instrumented",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip-instrumented",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync-instrumented",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp-instrumented",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace-instrumented",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp-instrumented",
]
# @bazel2gn:transformer=deps
_TESTUTILS_CORE_DEPS = [
"//src/connectivity/network/netstack3/core/base:netstack3-base-testutils",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram-testutils",
"//src/connectivity/network/netstack3/core/device:netstack3-device-testutils",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter-testutils",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo-testutils",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip-testutils",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync-testutils",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp-testutils",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace-testutils",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp-testutils",
]
# @bazel2gn:transformer=deps
_BENCHMARKS_CORE_DEPS = [
"//src/connectivity/network/netstack3/core/base:netstack3-base-benchmarks",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram-benchmarks",
"//src/connectivity/network/netstack3/core/device:netstack3-device-benchmarks",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter-benchmarks",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo-benchmarks",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip-benchmarks",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync-testutils",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp-benchmarks",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace-testutils",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp-benchmarks",
]
# @bazel2gn:transformer=deps
_LOOM_CORE_DEPS = [
"//src/connectivity/network/netstack3/core/base:netstack3-base-loom",
"//src/connectivity/network/netstack3/core/datagram:netstack3-datagram-loom",
"//src/connectivity/network/netstack3/core/device:netstack3-device-loom",
"//src/connectivity/network/netstack3/core/filter:netstack3-filter-loom",
"//src/connectivity/network/netstack3/core/icmp_echo:netstack3-icmp-echo-loom",
"//src/connectivity/network/netstack3/core/ip:netstack3-ip-loom",
"//src/connectivity/network/netstack3/core/sync:netstack3-sync-loom",
"//src/connectivity/network/netstack3/core/tcp:netstack3-tcp-loom",
"//src/connectivity/network/netstack3/core/trace:netstack3-trace-loom",
"//src/connectivity/network/netstack3/core/udp:netstack3-udp-loom",
]
# @bazel2gn:raw_attribute:assert_no_deps = _ALL_CORE_CRATES - _CORE_DEPS
rustc_library(
name = "netstack3-core",
srcs = _COMMON_SRCS,
build_flags = _COMMON_BUILD_FLAGS + [":no_lock_order"],
edition = "2024",
proc_macro_deps = _COMMON_PROC_MACRO_DEPS,
# Guard against bad crate variants.
tags = assert_no_deps_tags(_ALL_CORE_CRATES, _CORE_DEPS), # @bazel2gn:skip
visibility = ["//src/connectivity/network/netstack3:__pkg__"],
deps = _COMMON_DEPS + _CORE_DEPS,
)
# A variant of the netstack3-core library that has additional
# instrumentation that is useful for debugging and testing.
# @bazel2gn:raw_attribute:assert_no_deps = _ALL_CORE_CRATES - _INSTRUMENTED_CORE_DEPS
rustc_library(
name = "netstack3-core-instrumented",
srcs = _COMMON_SRCS,
build_flags = _COMMON_BUILD_FLAGS + [":no_lock_order_except_debug_device"],
crate_features = ["instrumented"],
crate_name = "netstack3_core",
edition = "2024",
proc_macro_deps = _COMMON_PROC_MACRO_DEPS,
# Guard against bad crate variants.
tags = assert_no_deps_tags(_ALL_CORE_CRATES, _INSTRUMENTED_CORE_DEPS), # @bazel2gn:skip
visibility = ["//src/connectivity/network/netstack3:__pkg__"],
deps = _COMMON_DEPS + _INSTRUMENTED_CORE_DEPS,
)
# A variant of the netstack3-core library that exposes test utilities.
# @bazel2gn:raw_attribute:assert_no_deps = _ALL_CORE_CRATES - _TESTUTILS_CORE_DEPS
rustc_library(
name = "netstack3-core-testutils",
testonly = True,
srcs = _COMMON_SRCS,
build_flags = _COMMON_BUILD_FLAGS + [":no_lock_order"],
crate_features = [
"instrumented",
"testutils",
],
crate_name = "netstack3_core",
edition = "2024",
proc_macro_deps = _COMMON_PROC_MACRO_DEPS,
# Guard against bad crate variants.
tags = assert_no_deps_tags(_ALL_CORE_CRATES, _TESTUTILS_CORE_DEPS), # @bazel2gn:skip
visibility = ["//src/connectivity/network/netstack3:__subpackages__"],
deps = _COMMON_DEPS + _TESTUTILS_DEPS + _TESTUTILS_CORE_DEPS,
)
# A variant of the netstack3-core library that is built for running
# benchmarks.
# @bazel2gn:raw_attribute:assert_no_deps = _ALL_CORE_CRATES - _BENCHMARKS_CORE_DEPS
rustc_library(
name = "netstack3-core-benchmarks",
testonly = True,
srcs = _COMMON_SRCS,
build_flags = _COMMON_BUILD_FLAGS + [
":benchmark",
":no_lock_order",
],
crate_features = ["testutils"],
crate_name = "netstack3_core",
edition = "2024",
proc_macro_deps = _COMMON_PROC_MACRO_DEPS,
# Guard against bad crate variants.
tags = assert_no_deps_tags(_ALL_CORE_CRATES, _BENCHMARKS_CORE_DEPS), # @bazel2gn:skip
visibility = ["//src/connectivity/network/netstack3/bench:__pkg__"],
deps = _COMMON_DEPS + _TESTUTILS_DEPS + _BENCHMARKS_CORE_DEPS,
)
# A variant of the netstack3-core library that is built for running loom
# tests, by using instrumented loom-provided types for all
# synchronization.
# @bazel2gn:raw_attribute:assert_no_deps = _ALL_CORE_CRATES - _LOOM_CORE_DEPS
rustc_library(
name = "netstack3-core-loom",
testonly = True,
srcs = _COMMON_SRCS,
build_flags = _COMMON_BUILD_FLAGS + [
":loom",
":no_lock_order",
],
crate_features = [
"instrumented",
"testutils",
],
crate_name = "netstack3_core",
edition = "2024",
proc_macro_deps = _COMMON_PROC_MACRO_DEPS,
# Guard against bad crate variants.
tags = assert_no_deps_tags(_ALL_CORE_CRATES, _LOOM_CORE_DEPS), # @bazel2gn:skip
target_compatible_with = HOST_OS_CONSTRAINTS,
visibility = ["//src/connectivity/network/netstack3/core/tests:__pkg__"],
deps = _COMMON_DEPS + _TESTUTILS_DEPS + _LOOM_CORE_DEPS,
)
# Cannot attach to `:netstack3-core-instrumented` via `crate` because unit tests
# require `-testutils` variants of core subcrates.
rustc_test(
name = "netstack3-core-instrumented_test",
srcs = _COMMON_SRCS,
build_flags = _COMMON_BUILD_FLAGS + [":no_lock_order_except_debug_device"],
crate_features = ["instrumented"],
edition = "2024",
proc_macro_deps = _COMMON_PROC_MACRO_DEPS,
deps = _COMMON_DEPS + _TESTUTILS_DEPS + _TESTUTILS_CORE_DEPS,
)
wrap_host_rust_test(
name = "netstack3-core-host-test",
binary_name = "netstack3-core-instrumented_test",
visibility = ["//src/connectivity/network:__pkg__"],
)
fx_unittest_package(
name = "netstack3-core-test-package",
package_name = "netstack3-core-test",
unit_tests = [":netstack3-core-instrumented_test"],
visibility = ["//src/connectivity/network:__pkg__"],
)