/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2013-2018 Regents of the University of California.
 *
 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
 *
 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
 *
 * You should have received copies of the GNU General Public License and GNU Lesser
 * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
 * <http://www.gnu.org/licenses/>.
 *
 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
 *
 * @author Davide Pesavento <davide.pesavento@lip6.fr>
 */

#ifndef NDN_NET_NETLINK_SOCKET_HPP
#define NDN_NET_NETLINK_SOCKET_HPP

#include "../network-monitor.hpp"
#include "../../util/signal/signal.hpp"

#include <boost/asio/posix/stream_descriptor.hpp>
#include <map>
#include <vector>

#ifndef NDN_CXX_HAVE_RTNETLINK
#error "This file should not be included ..."
#endif

namespace ndn {
namespace net {

class NetlinkMessage;

class NetlinkSocket : noncopyable
{
public:
  using Error = NetworkMonitor::Error;
  using MessageCallback = std::function<void(const NetlinkMessage&)>;

  void
  joinGroup(int group);

  void
  registerNotificationCallback(MessageCallback cb);

protected:
  explicit
  NetlinkSocket(boost::asio::io_service& io);

  ~NetlinkSocket();

  void
  open(int protocol);

  void
  registerRequestCallback(uint32_t seq, MessageCallback cb);

  virtual std::string
  nlmsgTypeToString(uint16_t type) const;

private:
  void
  asyncWait();

  void
  receiveAndValidate();

protected:
  shared_ptr<boost::asio::posix::stream_descriptor> m_sock; ///< netlink socket descriptor
  uint32_t m_pid; ///< port ID of this socket
  uint32_t m_seqNum; ///< sequence number of the last netlink request sent to the kernel

private:
  std::vector<uint8_t> m_buffer; ///< buffer for netlink messages from the kernel
  std::map<uint32_t, MessageCallback> m_pendingRequests; ///< request sequence number => callback
};

class RtnlSocket final : public NetlinkSocket
{
public:
  explicit
  RtnlSocket(boost::asio::io_service& io);

  void
  open();

  void
  sendDumpRequest(uint16_t nlmsgType, MessageCallback cb);

protected:
  std::string
  nlmsgTypeToString(uint16_t type) const final;
};

class GenlSocket;

class GenlFamilyResolver : noncopyable
{
public:
  GenlFamilyResolver(std::string familyName, GenlSocket& socket);

  util::Signal<GenlFamilyResolver, uint16_t> onResolved;
  util::Signal<GenlFamilyResolver> onError;

private:
  void
  asyncResolve();

  void
  handleResolve(const NetlinkMessage& nlmsg);

private:
  GenlSocket& m_sock;
  std::string m_family;
};

class GenlSocket final : public NetlinkSocket
{
public:
  explicit
  GenlSocket(boost::asio::io_service& io);

  void
  open();

  void
  sendRequest(const std::string& familyName, uint8_t command,
              const void* payload, size_t payloadLen,
              MessageCallback messageCb, std::function<void()> errorCb);

  void
  sendRequest(uint16_t familyId, uint8_t command,
              const void* payload, size_t payloadLen,
              MessageCallback messageCb);

protected:
  std::string
  nlmsgTypeToString(uint16_t type) const final;

private:
  std::map<std::string, uint16_t> m_cachedFamilyIds; ///< family name => family id
  std::map<std::string, GenlFamilyResolver> m_familyResolvers; ///< family name => resolver instance
};

} // namespace net
} // namespace ndn

#endif // NDN_NET_NETLINK_SOCKET_HPP
