| // Copyright (c) 2020 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_TUN_DEVICE_CONTROLLER_H_ | |
| #define QUICHE_QUIC_QBONE_BONNET_TUN_DEVICE_CONTROLLER_H_ | |
| #include "quic/qbone/bonnet/tun_device.h" | |
| #include "quic/qbone/platform/netlink_interface.h" | |
| #include "quic/qbone/qbone_control.pb.h" | |
| #include "quic/qbone/qbone_control_stream.h" | |
| namespace quic { | |
| // TunDeviceController consumes control stream messages from a Qbone server | |
| // and applies the given updates to the TUN device. | |
| class TunDeviceController { | |
| public: | |
| // |ifname| is the interface name of the TUN device to be managed. This does | |
| // not take ownership of |netlink|. | |
| TunDeviceController(std::string ifname, bool setup_tun, | |
| NetlinkInterface* netlink) | |
| : ifname_(std::move(ifname)), setup_tun_(setup_tun), netlink_(netlink) {} | |
| TunDeviceController(const TunDeviceController&) = delete; | |
| TunDeviceController& operator=(const TunDeviceController&) = delete; | |
| TunDeviceController(TunDeviceController&&) = delete; | |
| TunDeviceController& operator=(TunDeviceController&&) = delete; | |
| virtual ~TunDeviceController() = default; | |
| // Updates the local address of the TUN device to be the first address in the | |
| // given |response.ip_range()|. | |
| virtual bool UpdateAddress(const IpRange& desired_range); | |
| // Updates the set of routes that the TUN device will provide. All current | |
| // routes for the tunnel that do not exist in the |response| will be removed. | |
| 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: | |
| // Update the IP Rules, this should only be used by UpdateRoutes. | |
| bool UpdateRules(IpRange desired_range); | |
| const std::string ifname_; | |
| const bool setup_tun_; | |
| NetlinkInterface* netlink_; | |
| QuicIpAddress current_address_; | |
| std::vector<std::function<void(QuicIpAddress)>> address_update_cbs_; | |
| }; | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_QBONE_BONNET_TUN_DEVICE_CONTROLLER_H_ |