blob: 38ced901d75032ec6a1794dea2aa7a58e91ee6b4 [file] [log] [blame]
// Copyright 2018 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 NET_BASE_NETWORK_INTERFACES_FUCHSIA_H_
#define NET_BASE_NETWORK_INTERFACES_FUCHSIA_H_
#include <fuchsia/net/interfaces/cpp/fidl.h>
#include <vector>
#include "net/base/network_change_notifier.h"
#include "net/base/network_interfaces.h"
namespace net {
namespace internal {
// Move-only wrapper for fuchsia::net::interface::Properties that guarantees
// that its inner |properties_| are valid and complete properties as reported by
// |VerifyCompleteInterfaceProperties|.
class InterfaceProperties final {
public:
// Creates an |InterfaceProperties| if |properties| are valid complete
// properties as reported by |VerifyCompleteInterfaceProperties|.
static base::Optional<InterfaceProperties> VerifyAndCreate(
fuchsia::net::interfaces::Properties properties);
InterfaceProperties(InterfaceProperties&& interface);
InterfaceProperties& operator=(InterfaceProperties&& interface);
~InterfaceProperties();
// Updates this instance with the values set in |properties|.
// Fields not set in |properties| retain their previous values.
// Returns false if the |properties| has a missing or mismatched |id| field,
// or if any field set in |properties| has an invalid value (e.g. addresses of
// unknown types).
bool Update(fuchsia::net::interfaces::Properties properties);
// Appends the NetworkInterfaces for this interface to |interfaces|.
void AppendNetworkInterfaces(NetworkInterfaceList* interfaces) const;
// Returns true if the interface is online and it has either an IPv4 default
// route and a non-link-local address, or an IPv6 default route and a global
// address.
bool IsPubliclyRoutable() const;
bool HasAddresses() const { return !properties_.addresses().empty(); }
uint64_t id() const { return properties_.id(); }
bool online() const { return properties_.online(); }
const fuchsia::net::interfaces::DeviceClass& device_class() const {
return properties_.device_class();
}
private:
explicit InterfaceProperties(fuchsia::net::interfaces::Properties properties);
fuchsia::net::interfaces::Properties properties_;
};
using ExistingInterfaceProperties =
std::vector<std::pair<uint64_t, InterfaceProperties>>;
// Returns the //net ConnectionType for the supplied netstack interface
// description. Returns CONNECTION_NONE for loopback interfaces.
NetworkChangeNotifier::ConnectionType ConvertConnectionType(
const fuchsia::net::interfaces::DeviceClass& device_class);
// Connects to the service via the process' ComponentContext, and connects the
// Watcher to the service.
fuchsia::net::interfaces::WatcherHandle ConnectInterfacesWatcher();
// Validates that |properties| contains all the required fields, returning
// |true| if so.
bool VerifyCompleteInterfaceProperties(
const fuchsia::net::interfaces::Properties& properties);
// Consumes events describing existing interfaces from |watcher| and
// returns a vector of interface Id & properties pairs. |watcher| must
// be a newly-connected Watcher channel.
// Returns base::nullopt if any protocol error is encountered, e.g.
// |watcher| supplies an invalid event, or disconnects.
base::Optional<internal::ExistingInterfaceProperties> GetExistingInterfaces(
const fuchsia::net::interfaces::WatcherSyncPtr& watcher);
} // namespace internal
} // namespace net
#endif // NET_BASE_NETWORK_INTERFACES_FUCHSIA_H_