Add a new Tunnel Health Checker. The health checker is configured to
run about every 5th ICMP probe and checks the packet exchanger's
counters in both directions. If *no* packets have passed in one
direction, this will tear down the tunnel, leaving it to be restarted on
the next epoll cycle.
gfe-relnote: n/a (QBONE-only change)
PiperOrigin-RevId: 275474401
Change-Id: I934c45ff35d855593518ce76f4f2d9326e269adb
diff --git a/quic/qbone/bonnet/mock_packet_exchanger_stats_interface.h b/quic/qbone/bonnet/mock_packet_exchanger_stats_interface.h
new file mode 100644
index 0000000..f74e2a3
--- /dev/null
+++ b/quic/qbone/bonnet/mock_packet_exchanger_stats_interface.h
@@ -0,0 +1,27 @@
+// Copyright (c) 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef QUICHE_QUIC_QBONE_BONNET_MOCK_PACKET_EXCHANGER_STATS_INTERFACE_H_
+#define QUICHE_QUIC_QBONE_BONNET_MOCK_PACKET_EXCHANGER_STATS_INTERFACE_H_
+
+#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
+#include "net/third_party/quiche/src/quic/qbone/bonnet/tun_device_packet_exchanger.h"
+
+namespace quic {
+
+class MockPacketExchangerStatsInterface
+ : public TunDevicePacketExchanger::StatsInterface {
+ public:
+ MOCK_METHOD0(OnPacketRead, void());
+ MOCK_METHOD0(OnPacketWritten, void());
+ MOCK_METHOD1(OnReadError, void(string*));
+ MOCK_METHOD1(OnWriteError, void(string*));
+
+ MOCK_CONST_METHOD0(PacketsRead, int64_t());
+ MOCK_CONST_METHOD0(PacketsWritten, int64_t());
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_QBONE_BONNET_MOCK_PACKET_EXCHANGER_STATS_INTERFACE_H_
diff --git a/quic/qbone/bonnet/tun_device_packet_exchanger.cc b/quic/qbone/bonnet/tun_device_packet_exchanger.cc
index 799247c..37fd2c0 100644
--- a/quic/qbone/bonnet/tun_device_packet_exchanger.cc
+++ b/quic/qbone/bonnet/tun_device_packet_exchanger.cc
@@ -81,4 +81,9 @@
return fd_;
}
+const TunDevicePacketExchanger::StatsInterface*
+TunDevicePacketExchanger::stats_interface() const {
+ return stats_;
+}
+
} // namespace quic
diff --git a/quic/qbone/bonnet/tun_device_packet_exchanger.h b/quic/qbone/bonnet/tun_device_packet_exchanger.h
index 12d9efa..42ed7fb 100644
--- a/quic/qbone/bonnet/tun_device_packet_exchanger.h
+++ b/quic/qbone/bonnet/tun_device_packet_exchanger.h
@@ -30,6 +30,9 @@
virtual void OnPacketWritten() = 0;
virtual void OnReadError(string* error) = 0;
virtual void OnWriteError(string* error) = 0;
+
+ ABSL_MUST_USE_RESULT virtual int64_t PacketsRead() const = 0;
+ ABSL_MUST_USE_RESULT virtual int64_t PacketsWritten() const = 0;
};
// |fd| is a open file descriptor on a TUN device that's opened for both read
@@ -48,7 +51,9 @@
size_t max_pending_packets,
StatsInterface* stats);
- int file_descriptor() const;
+ ABSL_MUST_USE_RESULT int file_descriptor() const;
+
+ ABSL_MUST_USE_RESULT const StatsInterface* stats_interface() const;
private:
// From QbonePacketExchanger.
diff --git a/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc b/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc
index 026ec26..0f25e73 100644
--- a/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc
+++ b/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc
@@ -5,6 +5,7 @@
#include "net/third_party/quiche/src/quic/qbone/bonnet/tun_device_packet_exchanger.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
+#include "net/third_party/quiche/src/quic/qbone/bonnet/mock_packet_exchanger_stats_interface.h"
#include "net/third_party/quiche/src/quic/qbone/mock_qbone_client.h"
#include "net/third_party/quiche/src/quic/qbone/platform/mock_kernel.h"
@@ -26,15 +27,6 @@
MOCK_METHOD1(OnWriteError, void(const string&));
};
-class MockStatsInterface : public TunDevicePacketExchanger::StatsInterface {
- public:
- MOCK_METHOD0(OnPacketRead, void());
- MOCK_METHOD0(OnPacketWritten, void());
-
- MOCK_METHOD1(OnReadError, void(string*));
- MOCK_METHOD1(OnWriteError, void(string*));
-};
-
class TunDevicePacketExchangerTest : public QuicTest {
protected:
TunDevicePacketExchangerTest()
@@ -50,7 +42,7 @@
MockKernel mock_kernel_;
StrictMock<MockVisitor> mock_visitor_;
StrictMock<MockQboneClient> mock_client_;
- StrictMock<MockStatsInterface> mock_stats_;
+ StrictMock<MockPacketExchangerStatsInterface> mock_stats_;
TunDevicePacketExchanger exchanger_;
};