// Copyright 2018 The Chromium OS 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 PORTIER_NETWORK_SOCKET_H_
#define PORTIER_NETWORK_SOCKET_H_

#include <net/if.h>  // Interface stuff.

#include <string>

#include <base/files/scoped_file.h>
#include <base/macros.h>

#include "portier/ll_address.h"
#include "portier/status.h"

namespace portier {

// A generic interface for network related sockets.
class NetworkSocket {
 public:
  enum class State { UNINITIALIZED, READY, CLOSED };
  static std::string GetStateName(State state);
  virtual ~NetworkSocket() = default;

  // Socket file descriptor.  Returns -1 if the socket is closed.
  int fd() const { return fd_.get(); }
  // Index of network interface as assigned by the kernel.  Used for various
  // system calls.
  int index() const { return index_; }
  // Name of network interface, as provided during construction.
  const std::string& name() const { return name_; }
  // Socket state.
  State state() const { return state_; }

  bool IsReady() const;
  bool IsClosed() const;

  // Interface information getters.

  // Get link-layer address assigned to this interface.
  Status GetLinkLayerAddress(LLAddress* ll_address) const;

  // Get the MTU of the interface.  This may not be available on all
  // interfaces.
  Status GetLinkMTU(uint32_t* mtu) const;

  // Determine if the interface is a loopback interface.
  Status GetLoopbackFlag(bool* loopback_flag) const;

  // Enabled or disable non-blocking mode.  When enabled, reads and writes
  // to the socket will not block.  If no data is available to receive,
  // read calls will return immediately without data.  Writing when the
  // interface is busy will queue packet to be sent.
  Status SetNonBlockingMode(bool enabled);

  // Closes socket.  Should be overrided by base class if there are
  // special steps required.
  virtual Status Close();

 protected:
  explicit NetworkSocket(const std::string& if_name);
  virtual Status Init() = 0;

  void set_fd(int fd) { fd_.reset(fd); }

  bool IsUnitialized() const;

  // A special close function used internally.  Does not make much
  // validation checking.
  void CloseFd();

  // Initializes the struct ifreq for making an ioctl() call for the
  // given socket's associated interface.  Simply sets all attributes
  // to zero and copies the name of the interface into the struct's
  // ifr_name field.
  void PrepareIfRequestStruct(struct ifreq* ifreq) const;

  // Sets and gets the Linux interface flags via an ioctl() call
  Status SetInterfaceFlags(int16_t flags);
  Status GetInterfaceFlags(int16_t* flags) const;

  // Interface name (Ex. eth0).
  std::string name_;

  // Interface index as identified by the kernel.
  int index_;

  // Socket file descriptor.
  base::ScopedFD fd_;

  // Internal state of socket.
  State state_;

  DISALLOW_COPY_AND_ASSIGN(NetworkSocket);
};

}  // namespace portier

#endif  // PORTIER_NETWORK_SOCKET_H_
