diff options
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/qbone/bonnet')
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) { |