summaryrefslogtreecommitdiff
path: root/chromium/net/third_party/quiche/src/quic/qbone/bonnet
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/qbone/bonnet')
-rw-r--r--chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.cc22
-rw-r--r--chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.h16
-rw-r--r--chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller_test.cc9
3 files changed, 45 insertions, 2 deletions
diff --git a/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.cc b/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.cc
index c8a6517a4c3..dd996c5c55b 100644
--- a/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.cc
+++ b/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.cc
@@ -49,6 +49,10 @@ bool TunDeviceController::UpdateAddress(const IpRange& desired_range) {
if (address_updated) {
current_address_ = desired_address;
+
+ for (const auto& cb : address_update_cbs_) {
+ cb(current_address_);
+ }
}
return address_updated;
@@ -110,6 +114,19 @@ bool TunDeviceController::UpdateRoutes(
return true;
}
+bool TunDeviceController::UpdateRoutesWithRetries(
+ const IpRange& desired_range,
+ const std::vector<IpRange>& desired_routes,
+ int retries) {
+ while (retries-- > 0) {
+ if (UpdateRoutes(desired_range, desired_routes)) {
+ return true;
+ }
+ absl::SleepFor(absl::Milliseconds(100));
+ }
+ return false;
+}
+
bool TunDeviceController::UpdateRules(IpRange desired_range) {
if (!absl::GetFlag(FLAGS_qbone_tun_device_replace_default_routing_rules)) {
return true;
@@ -148,4 +165,9 @@ QuicIpAddress TunDeviceController::current_address() {
return current_address_;
}
+void TunDeviceController::RegisterAddressUpdateCallback(
+ const std::function<void(QuicIpAddress)>& cb) {
+ address_update_cbs_.push_back(cb);
+}
+
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.h b/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.h
index 6854521014f..612e98f5222 100644
--- a/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.h
+++ b/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller.h
@@ -39,6 +39,20 @@ class TunDeviceController {
virtual bool UpdateRoutes(const IpRange& desired_range,
const std::vector<IpRange>& desired_routes);
+ // Same as UpdateRoutes, but will wait and retry up to the number of times
+ // given by |retries| before giving up. This is an unpleasant workaround to
+ // deal with older kernels that aren't always able to set a route with a
+ // source address immediately after adding the address to the interface.
+ //
+ // TODO(b/179430548): Remove this once we've root-caused the underlying issue.
+ virtual bool UpdateRoutesWithRetries(
+ const IpRange& desired_range,
+ const std::vector<IpRange>& desired_routes,
+ int retries);
+
+ virtual void RegisterAddressUpdateCallback(
+ const std::function<void(QuicIpAddress)>& cb);
+
virtual QuicIpAddress current_address();
private:
@@ -51,6 +65,8 @@ class TunDeviceController {
NetlinkInterface* netlink_;
QuicIpAddress current_address_;
+
+ std::vector<std::function<void(QuicIpAddress)>> address_update_cbs_;
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller_test.cc b/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller_test.cc
index 73a7abc2864..53e5b3c14c2 100644
--- a/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller_test.cc
+++ b/chromium/net/third_party/quiche/src/quic/qbone/bonnet/tun_device_controller_test.cc
@@ -44,8 +44,10 @@ class TunDeviceControllerTest : public QuicTest {
public:
TunDeviceControllerTest()
: controller_(kIfname, true, &netlink_),
- link_local_range_(
- *QboneConstants::TerminatorLocalAddressRange()) {}
+ link_local_range_(*QboneConstants::TerminatorLocalAddressRange()) {
+ controller_.RegisterAddressUpdateCallback(
+ [this](QuicIpAddress address) { notified_address_ = address; });
+ }
protected:
void ExpectLinkInfo(const std::string& interface_name, int ifindex) {
@@ -60,6 +62,7 @@ class TunDeviceControllerTest : public QuicTest {
MockNetlink netlink_;
TunDeviceController controller_;
+ QuicIpAddress notified_address_;
IpRange link_local_range_;
};
@@ -77,6 +80,7 @@ TEST_F(TunDeviceControllerTest, AddressAppliedWhenNoneExisted) {
.WillOnce(Return(true));
EXPECT_TRUE(controller_.UpdateAddress(kIpRange));
+ EXPECT_THAT(notified_address_, Eq(kIpRange.FirstAddressInRange()));
}
TEST_F(TunDeviceControllerTest, OldAddressesAreRemoved) {
@@ -110,6 +114,7 @@ TEST_F(TunDeviceControllerTest, OldAddressesAreRemoved) {
.WillOnce(Return(true));
EXPECT_TRUE(controller_.UpdateAddress(kIpRange));
+ EXPECT_THAT(notified_address_, Eq(kIpRange.FirstAddressInRange()));
}
TEST_F(TunDeviceControllerTest, UpdateRoutesRemovedOldRoutes) {