blob: afc4e97710ac54eaa5ae97b328cb92484debfb1d [file] [log] [blame]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "patchpanel/conntrack_monitor.h"
#include <fcntl.h>
#include <linux/netfilter/nf_conntrack_tcp.h>
#include <unistd.h>
#include <cstdint>
#include <memory>
#include <utility>
#include <base/files/file_util.h>
#include <base/files/scoped_file.h>
#include <base/test/task_environment.h>
#include <gtest/gtest.h>
#include <net-base/mock_socket.h>
using testing::_;
using testing::Return;
namespace patchpanel {
namespace {
constexpr uint8_t kDefaultEventBitMask = 0;
constexpr uint8_t kNewEventBitMask = (1 << 0);
constexpr ConntrackMonitor::EventType kEventType[] = {
ConntrackMonitor::EventType::kNew};
// This buffer is taken from real data that was passed into socket.
constexpr uint8_t kEventBuf1[] = {
252, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0,
0, 10, 0, 0, 0, 76, 0, 1, 128, 44, 0, 1, 128, 20, 0,
3, 0, 36, 1, 250, 0, 4, 128, 238, 8, 244, 233, 24, 174, 140,
174, 23, 33, 20, 0, 4, 0, 36, 4, 104, 0, 64, 4, 8, 34,
0, 0, 0, 0, 0, 0, 32, 3, 28, 0, 2, 128, 5, 0, 1,
0, 6, 0, 0, 0, 6, 0, 2, 0, 167, 64, 0, 0, 6, 0,
3, 0, 1, 187, 0, 0, 76, 0, 2, 128, 44, 0, 1, 128, 20,
0, 3, 0, 36, 4, 104, 0, 64, 4, 8, 34, 0, 0, 0, 0,
0, 0, 32, 3, 20, 0, 4, 0, 36, 1, 250, 0, 4, 128, 238,
8, 244, 233, 24, 174, 140, 174, 23, 33, 28, 0, 2, 128, 5, 0,
1, 0, 6, 0, 0, 0, 6, 0, 2, 0, 1, 187, 0, 0, 6,
0, 3, 0, 167, 64, 0, 0, 8, 0, 12, 0, 209, 33, 223, 24,
8, 0, 3, 0, 0, 0, 1, 136, 8, 0, 7, 0, 0, 0, 0,
120, 48, 0, 4, 128, 44, 0, 1, 128, 5, 0, 1, 0, 1, 0,
0, 0, 5, 0, 2, 0, 7, 0, 0, 0, 5, 0, 3, 0, 0,
0, 0, 0, 6, 0, 4, 0, 3, 0, 0, 0, 6, 0, 5, 0,
0, 0, 0, 0, 8, 0, 8, 0, 3, 234, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 64, 236, 61, 241, 125, 86, 0,
0, 112, 97, 116, 99, 104, 112, 97, 110, 101, 108, 100, 0, 32, 0,
0, 0, 4, 0, 0, 0, 21, 0, 1, 0, 62, 0, 0, 192, 6,
0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 1, 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255,
127, 21, 0, 0, 1, 41, 0, 0, 0, 5, 0, 0, 0, 75, 0,
0, 0, 21, 0, 0, 1, 55, 0, 0, 0, 6, 0, 0, 0, 0,
0, 255, 127, 21, 0, 0, 1, 72, 0, 0, 0, 6, 0, 0, 0,
0, 0, 255, 127, 21, 0, 0, 1, 9, 0, 0, 0, 5, 0, 0,
0, 113, 0, 0, 0, 21, 0, 0, 1, 157, 0, 0, 0, 5, 0,
0, 0, 135, 0, 0, 0, 21, 0, 0, 1, 6, 1, 0, 0, 6,
0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 10, 0, 0, 0,
5, 0, 0, 0, 175, 0, 0, 0, 21, 0, 0, 1, 1, 1, 0,
0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 138, 0,
0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 0,
0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1,
11, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0, 0,
1, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0,
0, 1, 125, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21,
0, 0, 1, 126, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127,
21, 0, 0, 1, 116, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255,
127, 21, 0, 0, 1, 119, 0, 0, 0, 6, 0, 0, 0, 0, 0,
255, 127, 21, 0, 0, 1, 117, 0, 0, 0, 6, 0, 0, 0, 0,
0, 255, 127, 21, 0, 0, 1, 73, 0, 0, 0, 6, 0, 0, 0,
0, 0, 255, 127, 21, 0, 0, 1, 137, 0, 0, 0, 6, 0, 0,
0, 0, 0, 255, 127, 21, 0, 0, 1, 231, 0, 0, 0, 6, 0,
0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 219, 0, 0, 0, 6,
0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 60, 0, 0};
constexpr uint8_t kEventBuf2[] = {
156, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0,
0, 2, 0, 0, 0, 52, 0, 1, 128, 20, 0, 1, 128, 8, 0,
1, 0, 100, 115, 92, 133, 8, 0, 2, 0, 100, 115, 92, 134, 28,
0, 2, 128, 5, 0, 1, 0, 17, 0, 0, 0, 6, 0, 2, 0,
83, 250, 0, 0, 6, 0, 3, 0, 0, 53, 0, 0, 52, 0, 2,
128, 20, 0, 1, 128, 8, 0, 1, 0, 8, 8, 4, 4, 8, 0,
2, 0, 100, 87, 84, 250, 28, 0, 2, 128, 5, 0, 1, 0, 17,
0, 0, 0, 6, 0, 2, 0, 0, 53, 0, 0, 6, 0, 3, 0,
83, 250, 0, 0, 8, 0, 12, 0, 238, 205, 93, 7, 8, 0, 3,
0, 0, 0, 1, 184, 8, 0, 7, 0, 0, 0, 0, 30, 8, 0,
8, 0, 3, 234, 1, 0, 6, 0, 2, 0, 1, 187, 0, 0, 6,
0, 3, 0, 149, 230, 0, 0, 8, 0, 12, 0, 228, 140, 201, 89,
8, 0, 3, 0, 0, 0, 1, 136, 8, 0, 7, 0, 0, 0, 0,
30, 8, 0, 8, 0, 3, 234, 1, 0, 5, 0, 1, 0, 3, 0,
0, 0, 5, 0, 2, 0, 0, 0, 0, 0, 5, 0, 3, 0, 0,
0, 0, 0, 6, 0, 4, 0, 10, 0, 0, 0, 6, 0, 5, 0,
10, 0, 0, 0, 8, 0, 8, 0, 3, 235, 4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 64, 236, 61, 241, 125, 86, 0,
0, 112, 97, 116, 99, 104, 112, 97, 110, 101, 108, 100, 0, 32, 0,
0, 0, 4, 0, 0, 0, 21, 0, 1, 0, 62, 0, 0, 192, 6,
0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 1, 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255,
127, 21, 0, 0, 1, 41, 0, 0, 0, 5, 0, 0, 0, 75, 0,
0, 0, 21, 0, 0, 1, 55, 0, 0, 0, 6, 0, 0, 0, 0,
0, 255, 127, 21, 0, 0, 1, 72, 0, 0, 0, 6, 0, 0, 0,
0, 0, 255, 127, 21, 0, 0, 1, 9, 0, 0, 0, 5, 0, 0,
0, 113, 0, 0, 0, 21, 0, 0, 1, 157, 0, 0, 0, 5, 0,
0, 0, 135, 0, 0, 0, 21, 0, 0, 1, 6, 1, 0, 0, 6,
0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 10, 0, 0, 0,
5, 0, 0, 0, 175, 0, 0, 0, 21, 0, 0, 1, 1, 1, 0,
0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 138, 0,
0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 0,
0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1,
11, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0, 0,
1, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21, 0,
0, 1, 125, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127, 21,
0, 0, 1, 126, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255, 127,
21, 0, 0, 1, 116, 0, 0, 0, 6, 0, 0, 0, 0, 0, 255,
127, 21, 0, 0, 1, 119, 0, 0, 0, 6, 0, 0, 0, 0, 0,
255, 127, 21, 0, 0, 1, 117, 0, 0, 0, 6, 0, 0, 0, 0,
0, 255, 127, 21, 0, 0, 1, 73, 0, 0, 0, 6, 0, 0, 0,
0, 0, 255, 127, 21, 0, 0, 1, 137, 0, 0, 0, 6, 0, 0,
0, 0, 0, 255, 127, 21, 0, 0, 1, 231, 0, 0, 0, 6, 0,
0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 219, 0, 0, 0, 6,
0, 0, 0, 0, 0, 255, 127, 21, 0, 0, 1, 60, 0, 0, 0,
6, 0, 0, 0, 0, 0,
};
const ConntrackMonitor::Event kEvent1 = ConntrackMonitor::Event{
.src = *net_base::IPAddress::CreateFromString(
"2401:fa00:480:ee08:f4e9:18ae:8cae:1721"),
.dst = (*net_base::IPAddress::CreateFromString("2404:6800:4004:822::2003")),
.sport = 16551,
.dport = 47873,
.proto = IPPROTO_TCP,
.type = ConntrackMonitor::EventType::kNew,
.state = TCP_CONNTRACK_SYN_SENT};
const ConntrackMonitor::Event kEvent2 = ConntrackMonitor::Event{
.src = *net_base::IPAddress::CreateFromString("100.115.92.133"),
.dst = (*net_base::IPAddress::CreateFromString("100.115.92.134")),
.sport = 64083,
.dport = 13568,
.proto = IPPROTO_UDP,
.type = ConntrackMonitor::EventType::kNew,
};
class MockCallback {
public:
MOCK_METHOD(void,
OnConntrackEventReceived,
(const ConntrackMonitor::Event& event));
};
} // namespace
class ConntrackMonitorTest : public testing::Test {
protected:
ConntrackMonitorTest() {
CHECK_EQ(pipe(pipe_fds_), 0);
write_fd_ = base::ScopedFD(pipe_fds_[1]);
read_fd_ = base::ScopedFD(pipe_fds_[0]);
auto socket_factory = std::make_unique<net_base::MockSocketFactory>();
socket_factory_ = socket_factory.get();
ConntrackMonitor::GetInstance()->SetSocketFactoryForTesting(
std::move(socket_factory));
}
~ConntrackMonitorTest() {
// Need to clear the state for the singleton manually after each test,
// otherwise its state will affect following tests.
ConntrackMonitor::GetInstance()->StopForTesting();
}
int read_fd() const { return pipe_fds_[0]; }
int write_fd() const { return pipe_fds_[1]; }
// The environment instances which are required for using
// base::FileDescriptorWatcher::WatchReadable. Declared them first to ensure
// they are the last things to be cleaned up.
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::MainThreadType::IO};
net_base::MockSocketFactory* socket_factory_; // Owned by ConntrackMonitor
int pipe_fds_[2];
base::ScopedFD write_fd_, read_fd_;
};
MATCHER_P(IsNetlinkAddr, groups, "") {
const struct sockaddr_nl* socket_address =
reinterpret_cast<const struct sockaddr_nl*>(arg);
return socket_address->nl_family == AF_NETLINK &&
socket_address->nl_groups == groups;
}
MATCHER(IsNetlinkAddrLength, "") {
const unsigned int* addrlen = reinterpret_cast<const unsigned int*>(arg);
return *addrlen == sizeof(sockaddr_nl);
}
MATCHER_P(IsConntrackEvent, event, "") {
return arg == event;
}
TEST_F(ConntrackMonitorTest, Start) {
auto socket = std::make_unique<net_base::MockSocket>(
base::ScopedFD(std::move(read_fd_)));
bool read_once = 0;
EXPECT_CALL(*socket_factory_, Create(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER))
.WillOnce([&socket, this, &read_once]() {
EXPECT_CALL(*socket, GetSockName(IsNetlinkAddr(kDefaultEventBitMask),
IsNetlinkAddrLength()))
.WillOnce(Return(true));
EXPECT_CALL(*socket,
Bind(IsNetlinkAddr(kNewEventBitMask), sizeof(sockaddr_nl)))
.WillRepeatedly(Return(true));
EXPECT_CALL(*socket, RecvFrom(_, 0, IsNetlinkAddr(kDefaultEventBitMask),
IsNetlinkAddrLength()))
.WillRepeatedly(testing::WithArg<0>([this, &read_once](
base::span<uint8_t> buf) {
// We need to set right size to receive from fd based on which
// event we are trying to receive.
size_t read_size =
read_once ? sizeof(kEventBuf2) : sizeof(kEventBuf1);
read_once = true;
EXPECT_TRUE(base::ReadFromFD(
read_fd(), reinterpret_cast<char*>(buf.data()), read_size));
return read_size;
}));
return std::move(socket);
});
auto* monitor = ConntrackMonitor::GetInstance();
ASSERT_NE(monitor, nullptr);
monitor->Start(kEventType);
MockCallback event_cb;
auto listener = monitor->AddListener(
kEventType, base::BindRepeating(&MockCallback::OnConntrackEventReceived,
base::Unretained(&event_cb)));
EXPECT_CALL(event_cb, OnConntrackEventReceived(IsConntrackEvent(kEvent1)));
EXPECT_CALL(event_cb, OnConntrackEventReceived(IsConntrackEvent(kEvent2)));
// Write a message to fill buffer and trigger file descriptor watcher.
ASSERT_TRUE(base::WriteFileDescriptor(write_fd_.get(), kEventBuf1));
ASSERT_TRUE(base::WriteFileDescriptor(write_fd_.get(), kEventBuf2));
task_environment_.RunUntilIdle();
}
TEST_F(ConntrackMonitorTest, CreateGetSockNameFailed) {
EXPECT_CALL(*socket_factory_, Create(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER))
.WillOnce([this]() {
auto socket = std::make_unique<net_base::MockSocket>(
base::ScopedFD(std::move(read_fd_)));
EXPECT_CALL(*socket, GetSockName(IsNetlinkAddr(kDefaultEventBitMask),
IsNetlinkAddrLength()))
.WillOnce(Return(false));
return socket;
});
auto monitor = ConntrackMonitor::GetInstance();
ASSERT_NE(monitor, nullptr);
monitor->Start(kEventType);
EXPECT_TRUE(monitor->IsSocketNullForTesting());
}
TEST_F(ConntrackMonitorTest, CreateBindFailed) {
EXPECT_CALL(*socket_factory_, Create(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER))
.WillOnce([this]() {
auto socket =
std::make_unique<net_base::MockSocket>(std::move(read_fd_));
EXPECT_CALL(*socket, GetSockName(IsNetlinkAddr(kDefaultEventBitMask),
IsNetlinkAddrLength()))
.WillOnce(Return(true));
EXPECT_CALL(*socket,
Bind(IsNetlinkAddr(kNewEventBitMask), sizeof(sockaddr_nl)))
.WillOnce(Return(false));
return socket;
});
auto monitor = ConntrackMonitor::GetInstance();
ASSERT_NE(monitor, nullptr);
monitor->Start(kEventType);
EXPECT_TRUE(monitor->IsSocketNullForTesting());
}
TEST_F(ConntrackMonitorTest, CreateSocketIsNull) {
EXPECT_CALL(*socket_factory_, Create(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER))
.WillOnce(Return(nullptr));
auto monitor = ConntrackMonitor::GetInstance();
ASSERT_NE(monitor, nullptr);
monitor->Start(kEventType);
EXPECT_TRUE(monitor->IsSocketNullForTesting());
}
} // namespace patchpanel