blob: 6854521014fb9afcbfd588798780fe44f736853c [file] [log] [blame]
// 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);
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_;
};
} // namespace quic
#endif // QUICHE_QUIC_QBONE_BONNET_TUN_DEVICE_CONTROLLER_H_