/*
 *
 *    Copyright (c) 2014-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    @file
 *      This file contains headers for the TunnelAgent module that coordinates routing between
 *      peripheral networks and the Nest Service within the Border Gateway and Mobile devices.
 *
 */

#ifndef _WEAVE_TUNNEL_AGENT_H_
#define _WEAVE_TUNNEL_AGENT_H_

#include <Weave/Core/WeaveCore.h>
#include <Weave/Profiles/weave-tunneling/WeaveTunnelCommon.h>
#include <Weave/Profiles/weave-tunneling/WeaveTunnelConnectionMgr.h>
#include <Weave/Profiles/service-directory/ServiceDirectory.h>

#if WEAVE_CONFIG_ENABLE_TUNNELING

#define TUN_DEFAULT_INTF_NAME                 "weav-tun0"
#define PRIMARY_TUNNEL_DEFAULT_INTF_NAME      "wlan0"
#define BACKUP_TUNNEL_DEFAULT_INTF_NAME       "ppp0"
#define TUN_INTF_NAME_MAX_LEN                 (64)
#define WEAVE_ULA_FABRIC_DEFAULT_PREFIX_LEN   (48)

#define TUNNEL_PACKET_QUEUE_INVALID_INDEX     (-1)

namespace nl {
namespace Weave {
namespace Profiles {
namespace WeaveTunnel {

#if WEAVE_CONFIG_ENABLE_SERVICE_DIRECTORY
using namespace ::nl::Weave::Profiles::ServiceDirectory;
#endif

class WeaveTunnelConnectionMgr;

/// Platform provided Weave Addressing and Routing routines
namespace Platform {
    /**
     *  @brief
     *    The set of states for Weave tunnel availability.
     */
    typedef enum TunnelAvailabilityMode
    {
        kMode_Primary           = 1,  /**< Set when the Weave Service Tunnel is available over the primary interface */
        kMode_PrimaryAndBackup  = 2,  /**< Set when the Weave Service Tunnel is available over both priary and backup interface */
        kMode_BackupOnly        = 3,  /**< Set when the Weave Service Tunnel is available over the backup interface only */
    } TunnelAvailabilityMode;

    // Following APIs must be implemented by platform:

    // Perform address/route assignment tasks when the Weave tunnel interface is brought up.

    extern void TunnelInterfaceUp(InterfaceId tunIf);

    // Perform address/route deletion tasks when the Weave tunnel interface is brought down.

    extern void TunnelInterfaceDown(InterfaceId tunIf);

    // Perform address/route assignment tasks when the Service tunnel connection is established.

    extern void ServiceTunnelEstablished(InterfaceId tunIf, TunnelAvailabilityMode tunMode);

    // Perform address and route assignment tasks when the Service tunnel connection is torn down.

    extern void ServiceTunnelDisconnected(InterfaceId tunIf);

    /// Perform address and route assignment tasks when the Service tunnel connection avalability state
    /// changes.

    extern void ServiceTunnelModeChange(InterfaceId tunIf, TunnelAvailabilityMode tunMode);

    /// Enable Border Routing at the platform level.

    extern void EnableBorderRouting(void);

    /// Disable Border Routing at the platform level.

    extern void DisableBorderRouting(void);

} // namespace Platform

#if WEAVE_CONFIG_TUNNEL_ENABLE_STATISTICS
/**
 *  This structure contains the relevant statistics counters that is common
 *  to the Primary and Backup Tunnels
 */
typedef struct WeaveTunnelCommonStatistics
{
    uint64_t     mTxBytesToService;                                        /**< Number of bytes transmitted to the Service. */
    uint64_t     mRxBytesFromService;                                      /**< Number of bytes received from the Service. */
    uint32_t     mTxMessagesToService;                                     /**< Number of messages transmitted to the Service. */
    uint32_t     mRxMessagesFromService;                                   /**< Number of messages received from the Service. */
    uint32_t     mTunnelDownCount;                                         /**< Counter for the Weave Tunnel Down events. */
    uint32_t     mTunnelConnAttemptCount;                                  /**< Counter for the Weave Tunnel Connection attempts. */
    WEAVE_ERROR  mLastTunnelDownError;                                     /**< The Weave error encountered when the tunnel last went down. */
    uint64_t     mLastTimeTunnelWentDown;                                  /**< Last time Weave Tunnel went Down. */
    uint64_t     mLastTimeTunnelEstablished;                               /**< Last time Weave Tunnel was Established. */
} WeaveTunnelCommonStatistics;

/**
 *  This structure contains the relevant statistics counters for the WeaveTunnel.
 */
typedef struct WeaveTunnelStatistics
{
    WeaveTunnelCommonStatistics mPrimaryStats;                             /**< Primary Weave Tunnel statistics counters. */
    uint32_t     mDroppedMessagesCount;                                    /**< Number of dropped messages by the WeaveTunnelAgent. */
    TunnelType   mCurrentActiveTunnel;                                     /**< The Weave tunnel that is currently being used for data traffic. */
#if WEAVE_CONFIG_TUNNEL_FAILOVER_SUPPORTED
    WeaveTunnelCommonStatistics mBackupStats;                              /**< Backup Weave Tunnel statistics counters. */
    uint32_t     mTunnelFailoverCount;                                     /**< Counter for the Weave Tunnel Failover events. */
    WEAVE_ERROR  mLastTunnelFailoverError;                                 /**< The Weave error encountered when the tunnel last failed over from Primary to Backup. */
    uint64_t     mLastTimeForTunnelFailover;                               /**< Last time Weave Tunnel failed over to Backup. */
    uint64_t     mLastTimeWhenPrimaryAndBackupWentDown;                    /**< Last time when both Primary and Backup Weave Tunnel went down. */
#endif // WEAVE_CONFIG_TUNNEL_FAILOVER_SUPPORTED
} WeaveTunnelStatistics;
#endif // WEAVE_CONFIG_TUNNEL_ENABLE_STATISTICS

class WeaveTunnelAgent
{
  friend class WeaveTunnelControl;
  friend class WeaveTunnelConnectionMgr;

public:

/// States of the Tunnel Agent in relation to its connection(s) to
/// the Service.
    typedef enum AgentState
    {
        kState_NotInitialized                      = 0, ///<Used to indicate that the Tunnel Agent is not initialized.
        kState_Initialized_NoTunnel                = 1, ///<Used to indicate that the Tunnel Agent is initialized but no tunnel has been established.
        kState_PrimaryTunModeEstablished           = 2, ///<Used to indicate that the Primary tunnel to the Service has been established.
        kState_BkupOnlyTunModeEstablished          = 3, ///<Used to indicate that the Backup tunnel to the Service has been established.
        kState_PrimaryAndBkupTunModeEstablished    = 4, ///<Used to indicate that both the Primary and the Backup tunnel has been established.
    } AgentState;

/// Weave Tunnel flag bits.
    typedef enum WeaveTunnelFlags
    {
        kTunnelFlag_PrimaryEnabled      = 0x01,  ///< Set when the primary tunnel is enabled.
        kTunnelFlag_BackupEnabled       = 0x02,  ///< Set when the backup tunnel is enabled.
        kTunnelFlag_PrimaryRestricted   = 0x04,  ///< Set when the primary tunnel is routing restricted.
        kTunnelFlag_BackupRestricted    = 0x08,  ///< Set when the backup tunnel is routing restricted.
    } WeaveTunnelFlags;

#if WEAVE_CONFIG_ENABLE_SERVICE_DIRECTORY
/// Service Manager pointer to use to lookup and connect to Service.
    WeaveServiceManager *mServiceMgr;
#endif

    WeaveTunnelAgent(void);

#if WEAVE_CONFIG_ENABLE_SERVICE_DIRECTORY
/**
 * Initialize the Tunnel agent. This creates te Tunnel endpoint object, sets up the tunnel
 * interface, initializes member variables, callbacks and WeaveTunnelControl.
 */
    WEAVE_ERROR Init(InetLayer *inet, WeaveExchangeManager *exchMgr,
                     uint64_t dstNodeId, WeaveAuthMode authMode,
                     WeaveServiceManager *svcMgr,
                     const char *intfName = TUN_DEFAULT_INTF_NAME,
                     uint8_t role = kClientRole_BorderGateway,
                     void *appContext = NULL);
#endif

/**
 * Initialize the Tunnel agent. This creates te Tunnel endpoint object, sets up the tunnel
 * interface, initializes member variables, callbacks and WeaveTunnelControl.
 */
    WEAVE_ERROR Init(InetLayer *inet, WeaveExchangeManager *exchMgr,
                     uint64_t dstNodeId, IPAddress dstIPAddr, WeaveAuthMode authMode,
                     const char *intfName = TUN_DEFAULT_INTF_NAME,
                     uint8_t role = kClientRole_BorderGateway,
                     void *appContext = NULL);

/**
 * Set the WeaveAuthMode for the Tunnel.
 *
 */
    void SetAuthMode(const WeaveAuthMode authMode);

/**
 * Set the destination nodeId, IPAddress and port for the Tunnel.
 *
 */
    void SetDestination(const uint64_t nodeId, const IPAddress ipAddr,
                        const uint16_t servicePort = WEAVE_PORT);

/**
 * Set the Tunneling device role(BorderGateway, StandaloneDevice, MobileDevice) for the Tunnel.
 *
 */
    void SetTunnelingDeviceRole(const Role role);

/**
 * Get the TunnelAgent state.
 *
 */
    AgentState GetWeaveTunnelAgentState(void);

/**
 * Get the Primary Tunnel Connection
 *
 */
    nl::Weave::WeaveConnection * GetPrimaryTunnelConnection(void) const;

#if WEAVE_CONFIG_TUNNEL_TCP_USER_TIMEOUT_SUPPORTED
/**
 *  Configure the TCP user timeout option on the primary tunnel connection.
 */
    WEAVE_ERROR ConfigurePrimaryTunnelTimeout(uint16_t maxTimeoutSecs);

#endif // WEAVE_CONFIG_TUNNEL_TCP_USER_TIMEOUT_SUPPORTED

#if WEAVE_CONFIG_TUNNEL_TCP_KEEPALIVE_SUPPORTED
/**
 *  Configure and enable the TCP keepalive option on the primary
 *  tunnel connection.
 */
    WEAVE_ERROR ConfigureAndEnablePrimaryTunnelTCPKeepAlive(uint16_t keepAliveIntervalSecs,
                                                            uint16_t maxNumProbes);
#endif // WEAVE_CONFIG_TUNNEL_TCP_KEEPALIVE_SUPPORTED

#if WEAVE_CONFIG_TUNNEL_LIVENESS_SUPPORTED
/**
 * Configure the Primary Tunnel Liveness interval.
 */
    void ConfigurePrimaryTunnelLivenessInterval(uint16_t livenessIntervalSecs);
#endif // WEAVE_CONFIG_TUNNEL_LIVENESS_SUPPORTED
/**
 *  Check if the primary tunnel is enabled.
 */
    bool IsPrimaryTunnelEnabled(void) const;

/**
 * Enable Primary Tunnel.
 */
    void EnablePrimaryTunnel(void);

/**
 * Disable Primary Tunnel.
 */
    void DisablePrimaryTunnel(void);

/**
 *  Check if the primary tunnel is subject to routing restrictions by the service.
 */
    bool IsPrimaryTunnelRoutingRestricted(void);

/**
 * Reset the Reconnect time for the primary tunnel
 *
 */
    WEAVE_ERROR ResetPrimaryReconnectBackoff(bool reconnectImmediately);

#if WEAVE_CONFIG_PERSIST_CONNECTED_SESSION
/**
 * Set Callbacks for persisted tunnel connection
 */
    void SetCallbacksForPersistedTunnelConnection(WeaveTunnelConnectionMgr::PersistedSecureSessionExistsFunct aIsPersistedTunnelSessionPresent,
                                                  WeaveTunnelConnectionMgr::LoadPersistedSessionFunct aLoadPersistedTunnelSession);
#endif // WEAVE_CONFIG_PERSIST_CONNECTED_SESSION

#if WEAVE_CONFIG_TCP_CONN_REPAIR_SUPPORTED
/**
 * Set the callback to get TCP connection repair info
 */
    void SetTunnelConnectionRepairInfoCallback(TunnelType tunType,
                                               nl::Weave::WeaveConnection::ConnectionRepairInfoGetterFunct aGetConnectionRepairInfo,
                                               void *repairCtxt);
#endif // WEAVE_CONFIG_TCP_CONN_REPAIR_SUPPORTED

#if WEAVE_CONFIG_TUNNEL_FAILOVER_SUPPORTED

/**
 * Reset the Reconnect time for the backup tunnel
 *
 */
    WEAVE_ERROR  ResetBackupReconnectBackoff(bool reconnectImmediately);

/**
 *  Check if the backup tunnel is enabled.
 */
    bool IsBackupTunnelEnabled(void) const;

/**
 * Enable Backup Tunnel.
 */
    void EnableBackupTunnel(void);

/**
 * Disable Backup Tunnel.
 */
    void DisableBackupTunnel(void);

/**
 * Start Primary Tunnel.
 */
    void StartPrimaryTunnel(void);

/**
 * Stop Primary Tunnel.
 */
    void StopPrimaryTunnel(void);

/**
 * Start Backup Tunnel.
 */
    void StartBackupTunnel(void);

/**
 * Stop Backup Tunnel.
 */
    void StopBackupTunnel(void);

/**
 *  Check if the backup tunnel is subject to routing restrictions by the service.
 */
    bool IsBackupTunnelRoutingRestricted(void);

#if WEAVE_CONFIG_TUNNEL_TCP_USER_TIMEOUT_SUPPORTED
/**
 *  Configure the TCP user timeout option on the backup tunnel connection.
 */
    WEAVE_ERROR ConfigureBackupTunnelTimeout(uint16_t maxTimeoutSecs);

#endif // WEAVE_CONFIG_TUNNEL_TCP_USER_TIMEOUT_SUPPORTED

#if WEAVE_CONFIG_TUNNEL_TCP_KEEPALIVE_SUPPORTED
/**
 *  Configure and enable the TCP keepalive option on the backup
 *  tunnel connection.
 */
    WEAVE_ERROR ConfigureAndEnableBackupTunnelTCPKeepAlive(uint16_t keepAliveIntervalSecs,
                                                           uint16_t maxNumProbes);
#endif // WEAVE_CONFIG_TUNNEL_TCP_KEEPALIVE_SUPPORTED

#if WEAVE_CONFIG_TUNNEL_LIVENESS_SUPPORTED
/**
 * Configure the Backup Tunnel Liveness interval.
 */
    void ConfigureBackupTunnelLivenessInterval(uint16_t livenessIntervalSecs);
#endif // WEAVE_CONFIG_TUNNEL_LIVENESS_SUPPORTED

/**
 * Set the primary tunnel interface name
 *
 */
    void SetPrimaryTunnelInterface(const char *primaryIntfName);

/**
 * Set the backup tunnel interface name
 *
 */
    void SetBackupTunnelInterface(const char *backupIntfName);

/**
 * Set the primary tunnel interface type
 *
 */
    void SetPrimaryTunnelInterfaceType(const SrcInterfaceType primaryIntfType);

/**
 * Set the backup tunnel interface type
 *
 */
    void SetBackupTunnelInterfaceType(const SrcInterfaceType backupIntfType);

#endif // WEAVE_CONFIG_TUNNEL_FAILOVER_SUPPORTED

/**
 * Shutdown the Tunnel Agent. This tears down connection to the Service and closes the TunEndPoint
 * interface after removing addresses and routes associated with the tunnel interface.
 */
    WEAVE_ERROR Shutdown(void);

/**
 * Start the Service Tunnel. This enables the tunnel and tries to establish a connection
 * to the Service.
 */
    WEAVE_ERROR StartServiceTunnel(void);

/**
 * Start the Service Tunnel. This enables the tunnel and tries to establish a connection
 * to the Service.
 */
    WEAVE_ERROR StartServiceTunnel(uint64_t dstNodeId,
                                   IPAddress dstIPAddr,
                                   WeaveAuthMode authMode);

/**
 * Close the Tunnel connection to the Service.
 */
    void StopServiceTunnel(void);

/**
 * Close the Tunnel connection to the Service.
 */
    void StopServiceTunnel(WEAVE_ERROR err);

/**
 *  Check if the tunnel is subject to routing restrictions by the service.
 */
    bool IsTunnelRoutingRestricted(void);

#if WEAVE_CONFIG_TUNNEL_ENABLE_STATISTICS
/**
 * Get the WeaveTunnel statistics counters.
 *
 * @param[out] tunnelStats  A reference to the WeaveTunnelStatistics structure.
 *
 * @return WEAVE_ERROR  Weave error encountered when getting tunnel statistics.
 */
   WEAVE_ERROR GetWeaveTunnelStatistics(WeaveTunnelStatistics &tunnelStats);
#endif // WEAVE_CONFIG_TUNNEL_ENABLE_STATISTICS

/**
 * Function pointer to handler set by a higher layer to act upon various notifications related to
 * the tunnel to the Service.
 *
 * @param[in] reason        The reason for the status notification to the application.
 *
 * @param[in] err           Weave error encountered, if any
 *
 * @param[in] appCtxt       A pointer to an application context object
 *
 */
    typedef void (*OnServiceTunnelStatusNotifyFunct)(WeaveTunnelConnectionMgr::TunnelConnNotifyReasons reason,
                                                     WEAVE_ERROR err, void *appCtxt);

/**
 * Function pointer to handler set by a higher layer to act upon various notifications related to
 * the tunnel to the Service.
 *
 */
    OnServiceTunnelStatusNotifyFunct OnServiceTunStatusNotify;

/**
 * Function pointer to handler set by a higher layer when a Tunnel Reconnect is received from the Service
 *
 * @param[in] tunType          The tunnel type, Primary or Backup.
 *
 * @param[in] reconnectHost    The hostname provided by Service to reconnect to.
 *
 * @param[in] reconnectPort    The destination port provided by Service to reconnect to.
 *
 * @param[in] appCtxt       A pointer to an application context object
 *
 */
    typedef void (*OnServiceTunnelReconnectNotifyFunct)(TunnelType tunType,
                                                        const char *reconnectHost,
                                                        const uint16_t reconnectPort,
                                                        void *appCtxt);

    OnServiceTunnelReconnectNotifyFunct OnServiceTunReconnectNotify;

#if WEAVE_CONFIG_TUNNEL_ENABLE_TCP_IDLE_CALLBACK
/**
 * Function pointer to handler set by a higher layer to act upon a notification related to
 * the tunnel to the Service being idle or not.
 *
 * @param[in] tunType       The tunnel type, Primary or Backup.
 *
 * @param[in] isIdle        true if the Tunnel TCP connection is idle, otherwise false.
 *
 * @param[in] appCtxt       A pointer to an application context object
 *
 */
    typedef void (*OnServiceTunnelTCPIdleNotifyFunct)(TunnelType tunType,
                                                      bool isIdle,
                                                      void *appCtxt);

    OnServiceTunnelTCPIdleNotifyFunct OnServiceTunTCPIdleNotify;
#endif // WEAVE_CONFIG_TUNNEL_ENABLE_TCP_IDLE_CALLBACK

#if WEAVE_CONFIG_TUNNEL_ENABLE_TRANSIT_CALLBACK
/**
 * Function pointer to handler set by a higher layer to decode and log contents of IP packets.
 *
 * @param[in] pkt         A const reference to an IP packet buffer.
 *
 * @param[in] direction   The direction of the tunneled packet(inbound or outbound).
 *
 * @param[in] type        The type of the Tunnel.
 *
 * @param[out] toDrop     Indicates whether the packet needs to be dropped based on some application policy.
 *
 */
    typedef void (*OnPacketTransitFunct)(const PacketBuffer &pkt,
                                         nl::Weave::Profiles::WeaveTunnel::TunnelPktDirection direction,
                                         nl::Weave::Profiles::WeaveTunnel::TunnelType type, bool &toDrop);

    OnPacketTransitFunct OnTunneledPacketTransit;

#endif // WEAVE_CONFIG_TUNNEL_ENABLE_TRANSIT_CALLBACK

/**
 * Function pointer to a handler provided by the application for performing a
 * network level online check.
 *
 * @param[in] tunType          The tunnel type, Primary or Backup.
 *
 * @param[in] appCtxt          A pointer to an application context object
 *
 */
    typedef void (*PlatformNetworkOnlineCheck)(TunnelType tunType, void *appCtxt);

    PlatformNetworkOnlineCheck NetworkOnlineCheck;

/**
 * Handler to receive IPv6 packets from the Tunnel EndPoint interface and forward, either to the Service
 * via the Service TCP connection after encapsulating IPv6 packet inside the tunnel header or to the Mobile
 * client over a shortcut tunnel. If the Service connection is not yet up, the message is queued until the
 * connection is set up. For tunneling to the Mobile client device, the nexthop neighbor table is referenced.
 */
    static void RecvdFromTunnelEndPoint(TunEndPoint *tunEP, PacketBuffer *message);

/**
 * Handler to receive tunneled IPv6 packets over the shortcut UDP tunnel between the border gateway and the mobile
 * device and forward to the Tunnel EndPoint interface after decapsulating the raw IPv6 packet from inside the
 * tunnel header.
 */
    static void RecvdFromShortcutUDPTunnel (WeaveMessageLayer *msgLayer, PacketBuffer *message);

/**
 * Get the WeaveTunnelAgentState name
 *
 */
    const char *GetAgentStateName(const AgentState state);

/**
 * Get the system time in milliseconds
 *
 */
    uint64_t GetTimeMsec(void);

/**
 * Callback invoked by the platform when the result of the network online
 * checker is available.
 *
 */
    void NetworkOnlineCheckResult(TunnelType tunType, bool isOnline);

private:

    // Node Id of the Service endpoint

    uint64_t mPeerNodeId;

    // IP address of the Service endpoint

    IPAddress mServiceAddress;

    // Port of the Service endpoint

    uint16_t mServicePort;

    // Authentication mode to be used

    WeaveAuthMode mAuthMode;

    // Queued messages for Service; pending until connection established.

    PacketBuffer *queuedMsgs[WEAVE_CONFIG_TUNNELING_MAX_NUM_PACKETS_QUEUED];
    int qFront, qRear;

    // Role; Border gateway or Mobile device

    uint8_t mRole;

    // Flag for enabling/disabling specific Tunnel

    uint8_t mTunnelFlags;

    InetLayer *mInet;                       // Associated InetLayer object

#if !WEAVE_SYSTEM_CONFIG_USE_LWIP
    // Interface name of TunEndPoint

    char mIntfName[TUN_INTF_NAME_MAX_LEN];
#endif // !WEAVE_SYSTEM_CONFIG_USE_LWIP

    TunEndPoint *mTunEP;

    // Handle to the WeaveExchangeManager object.

    WeaveExchangeManager *mExchangeMgr;

    // Weave Tunnel Connection Manager object for the Primary tunnel

    WeaveTunnelConnectionMgr mPrimaryTunConnMgr;

#if WEAVE_CONFIG_TUNNEL_FAILOVER_SUPPORTED
    // Weave Tunnel Connection Manager object for the Backup tunnel

    WeaveTunnelConnectionMgr mBackupTunConnMgr;
#endif

#if WEAVE_CONFIG_TUNNEL_SHORTCUT_SUPPORTED
    // Weave Tunnel Control for Tunnel shortcut

    WeaveTunnelControl mTunShortcutControl;
#endif

    // WeaveTunnelAgent state

    AgentState  mTunAgentState;

    // Application context
    void *mAppContext;

#if WEAVE_CONFIG_TUNNEL_ENABLE_STATISTICS
    WeaveTunnelStatistics mWeaveTunnelStats;

    void UpdateOutboundMessageStatistics(const TunnelType tunType, const uint64_t msgLen);
    void UpdateTunnelDownStatistics(const TunnelType tunType, const WEAVE_ERROR conErr);
    WeaveTunnelCommonStatistics *GetCommonTunnelStatistics(const TunnelType tunType);
#endif // WEAVE_CONFIG_TUNNEL_ENABLE_STATISTICS

    void SetState(AgentState toState);
    // TunEndPoint management functions

    WEAVE_ERROR CreateTunEndPoint(void);
    WEAVE_ERROR SetupTunEndPoint(void);
    WEAVE_ERROR TeardownTunEndPoint(void);

    // Tunnel management and maintenance functions

    WEAVE_ERROR ConfigureAndInit (InetLayer *inet, WeaveExchangeManager *exchMgr,
                                  uint64_t dstNodeId, IPAddress dstIPAddr, WeaveAuthMode authMode,
#if WEAVE_CONFIG_ENABLE_SERVICE_DIRECTORY
                                  WeaveServiceManager *svcMgr,
#endif
                                  const char *intfName, uint8_t role, void *appContext);

    // Message encapsulating/decapsulating functions for sending between Tunnel and other interfaces

    WEAVE_ERROR AddTunnelHdrToMsg(PacketBuffer *msg);
    WEAVE_ERROR HandleSendingToService(PacketBuffer *msg);
    WEAVE_ERROR HandleTunneledReceive(PacketBuffer *msg, TunnelType tunType);

    /// Decide based on lookup of nexthop table and send locally
    /// via UDP tunnel or remotely via Service TCP connection.

    WEAVE_ERROR DecideAndSendShortcutOrRemoteTunnel(uint64_t nodeId, PacketBuffer *msg);

    void PopulateTunnelMsgHeader(WeaveMessageInfo *msgInfo, const WeaveTunnelConnectionMgr *connMgr);

    void ParseDestinationIPAddress(const PacketBuffer &inMsg, IPAddress &outDest);

    WEAVE_ERROR SendMessageUponPktTransitAnalysis(const WeaveTunnelConnectionMgr *connMgr,
                                                  TunnelPktDirection pktDir,
                                                  TunnelType tunType,
                                                  WeaveMessageInfo *msgInfo,
                                                  PacketBuffer *msg,
                                                  bool &dropPacket);

    static void ServiceMgrStatusHandler(void* appState, WEAVE_ERROR err, StatusReport *report);

    // Service queue management functions

    void SendQueuedMessages(const WeaveTunnelConnectionMgr *connMgr);
    WEAVE_ERROR EnQueuePacket(PacketBuffer *pkt);
    PacketBuffer *DeQueuePacket(void);
    void DumpQueuedMessages(void);

    // Tunnel Control post-processing functions

    void WeaveTunnelConnectionUp(const WeaveMessageInfo *msgInfo,
                                 const WeaveTunnelConnectionMgr *connMgr,
                                 const bool isRoutingRestricted);
    void WeaveTunnelConnectionDown(const WeaveTunnelConnectionMgr *connMgr, WEAVE_ERROR conErr);
    void WeaveTunnelServiceReconnectRequested(const WeaveTunnelConnectionMgr *connMgr,
                                              const char *redirectHost, const uint16_t redirectPort);
    void WeaveTunnelDownNotifyAndSetState(WEAVE_ERROR conErr);
    void WeaveTunnelUpNotifyAndSetState(AgentState state,
                                        Platform::TunnelAvailabilityMode tunMode,
                                        WeaveTunnelConnectionMgr::TunnelConnNotifyReasons notifyReason,
                                        WeaveTunnelConnectionMgr *connMgr,
                                        const bool isRoutingRestricted);
    void DisableBorderRouting(void);

#if WEAVE_CONFIG_TUNNEL_FAILOVER_SUPPORTED

    void WeaveTunnelModeChangeNotifyAndSetState(AgentState state,
                                                Platform::TunnelAvailabilityMode tunMode,
                                                WeaveTunnelConnectionMgr::TunnelConnNotifyReasons notifyReason,
                                                WEAVE_ERROR conErr);
#endif // WEAVE_CONFIG_TUNNEL_FAILOVER_SUPPORTED
    void WeaveTunnelConnectionErrorNotify(const WeaveTunnelConnectionMgr *connMgr, WEAVE_ERROR conErr);

#if WEAVE_CONFIG_TUNNEL_LIVENESS_SUPPORTED
    void RestartTunnelLivenessTimer(TunnelType tunType);

    void NotifyTunnelLiveness(TunnelType tunType, WEAVE_ERROR err);
#endif // WEAVE_CONFIG_TUNNEL_LIVENESS_SUPPORTED

#if WEAVE_CONFIG_TUNNEL_ENABLE_TCP_IDLE_CALLBACK
    void WeaveTunnelNotifyTCPSendIdleStateChange(const TunnelType tunType, const bool isIdle);
#endif // WEAVE_CONFIG_TUNNEL_ENABLE_TCP_IDLE_CALLBACK

};


} // namespace WeaveTunnel
} // namespace Profiles
} // namespace Weave
} // namespace nl
#endif // WEAVE_CONFIG_ENABLE_TUNNELING
#endif// _WEAVE_TUNNEL_AGENT_H_
