arc: Move platform2/arc/network/ to platform2/patchpanel
Next step in the arc-networkd -> patchpanel rename, this patch moves the
location of the code.
BUG=b:151879931
TEST=units,flashed image to atlas
TEST=tasts arc.PlayStore, crostini.LaunchTerminal.download
Change-Id: I1b5cf8d670e1631d46f6449b725395157bf88dde
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2115863
Tested-by: Garrick Evans <garrick@chromium.org>
Commit-Queue: Garrick Evans <garrick@chromium.org>
Reviewed-by: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: Eric Caruso <ejcaruso@chromium.org>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
Reviewed-by: Hugo Benichi <hugobenichi@google.com>
diff --git a/patchpanel/datapath_fuzzer.cc b/patchpanel/datapath_fuzzer.cc
new file mode 100644
index 0000000..a288161
--- /dev/null
+++ b/patchpanel/datapath_fuzzer.cc
@@ -0,0 +1,93 @@
+// Copyright 2019 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <net/if.h>
+
+#include <fuzzer/FuzzedDataProvider.h>
+#include <string>
+#include <vector>
+
+#include <base/bind.h>
+#include <base/bind_helpers.h>
+#include <base/logging.h>
+
+#include "patchpanel/datapath.h"
+#include "patchpanel/minijailed_process_runner.h"
+#include "patchpanel/multicast_forwarder.h"
+#include "patchpanel/net_util.h"
+
+namespace patchpanel {
+
+// Always succeeds
+int ioctl_stub(int fd, unsigned long req, ...) {
+ return 0;
+}
+
+class RandomProcessRunner : public MinijailedProcessRunner {
+ public:
+ explicit RandomProcessRunner(FuzzedDataProvider* data_provider)
+ : data_provider_{data_provider} {}
+ ~RandomProcessRunner() = default;
+
+ int Run(const std::vector<std::string>& argv, bool log_failures) override {
+ return data_provider_->ConsumeBool();
+ }
+
+ private:
+ FuzzedDataProvider* data_provider_;
+
+ DISALLOW_COPY_AND_ASSIGN(RandomProcessRunner);
+};
+
+namespace {
+
+class Environment {
+ public:
+ Environment() {
+ logging::SetMinLogLevel(logging::LOG_FATAL); // <- DISABLE LOGGING.
+ }
+};
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ // Turn off logging.
+ logging::SetMinLogLevel(logging::LOG_FATAL);
+
+ FuzzedDataProvider provider(data, size);
+ RandomProcessRunner runner(&provider);
+ Datapath datapath(&runner, ioctl_stub);
+
+ while (provider.remaining_bytes() > 0) {
+ std::string ifname = provider.ConsumeRandomLengthString(IFNAMSIZ - 1);
+ std::string bridge = provider.ConsumeRandomLengthString(IFNAMSIZ - 1);
+ uint32_t addr = provider.ConsumeIntegral<uint32_t>();
+ std::string addr_str = IPv4AddressToString(addr);
+ uint32_t prefix_len = provider.ConsumeIntegralInRange<uint32_t>(0, 31);
+ Subnet subnet(provider.ConsumeIntegral<int32_t>(), prefix_len,
+ base::DoNothing());
+ std::unique_ptr<SubnetAddress> subnet_addr = subnet.AllocateAtOffset(0);
+ MacAddress mac;
+ std::vector<uint8_t> bytes = provider.ConsumeBytes<uint8_t>(mac.size());
+ std::copy(std::begin(bytes), std::begin(bytes), std::begin(mac));
+
+ datapath.AddBridge(ifname, addr, prefix_len);
+ datapath.RemoveBridge(ifname);
+ datapath.AddInboundIPv4DNAT(ifname, addr_str);
+ datapath.RemoveInboundIPv4DNAT(ifname, addr_str);
+ datapath.AddVirtualInterfacePair(ifname, bridge);
+ datapath.ToggleInterface(ifname, provider.ConsumeBool());
+ datapath.ConfigureInterface(ifname, mac, addr, prefix_len,
+ provider.ConsumeBool(), provider.ConsumeBool());
+ datapath.RemoveInterface(ifname);
+ datapath.AddTAP(ifname, &mac, subnet_addr.get(), "");
+ datapath.RemoveTAP(ifname);
+ datapath.AddIPv4Route(provider.ConsumeIntegral<uint32_t>(),
+ provider.ConsumeIntegral<uint32_t>(),
+ provider.ConsumeIntegral<uint32_t>());
+ }
+
+ return 0;
+}
+
+} // namespace
+} // namespace patchpanel