/*
 *
 *    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 Weave Tunnel Control Protocol, its state management
 *      and protocol operation functions.
 *
 *
 */
#ifndef _WEAVE_TUNNEL_CONTROL_H_
#define _WEAVE_TUNNEL_CONTROL_H_

#include <Weave/Core/WeaveCore.h>
#include <Weave/Profiles/WeaveProfiles.h>
#include <Weave/Profiles/weave-tunneling/WeaveTunnelCommon.h>

#if WEAVE_CONFIG_ENABLE_TUNNELING

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

class WeaveTunnelAgent;
class WeaveTunnelConnectionMgr;

/// Weave Tunnel Status Codes

enum
{
    kStatusCode_TunnelOpenFail                  = 1,  ///< The Service has encountered an error while opening the tunnel.
    kStatusCode_TunnelCloseFail                 = 2,  ///< The Service has encountered an error while closing the tunnel.
    kStatusCode_TunnelRouteUpdateFail           = 3,  ///< The Service has encountered an error while updating the routes.
    kStatusCode_TunnelReconnectFail             = 4,  ///< The Border gateway has encountered an error while reconnecting to the Service.
};

class NL_DLL_EXPORT WeaveTunnelControl
{
  friend class WeaveTunnelConnectionMgr;
public:

/// The timeout(in seconds) for responses to control messages
    uint16_t mCtrlResponseTimeout;

/// Interval in seconds for periodic shortcut tunnel advertisements.
    uint16_t mShortcutTunnelAdvInterval;

    WeaveTunnelControl(void);

/**
 * Function pointer to handler set by a higher layer to act upon receipt of a StatusReport
 * message in response to a Tunnel control message sent.
 *
 * @param[in] tType           The tunnel type, i.e., Primary or Backup.
 *
 * @param[in] tunStatus       A reference to the Tunnel control StatusReport message.
 *
 * @return void.
 */
    typedef void (*TunnelStatusRcvdFunct)(uint8_t tType, StatusReport &tunStatus);
    TunnelStatusRcvdFunct OnTunStatusRcvd;

/**
 * Initialize WeaveTunnelControl to set relevant members like the Weave Tunnel Agent and callbacks.
 */
    WEAVE_ERROR Init(WeaveTunnelAgent *tunAgent,
                     TunnelStatusRcvdFunct statusRcvd = NULL);

/**
 * Close WeaveTunnelControl by closing any outstanding exchange contexts and resetting members.
 */
    WEAVE_ERROR Close(void);


/**
 * Send a Tunnel Open control message to the peer node with a set of tunnel routes.
 */
    WEAVE_ERROR SendTunnelOpen(WeaveTunnelConnectionMgr *conMgr, WeaveTunnelRoute *tunRoute);

/**
 * Send a Tunnel Close control message to the peer node with a set of tunnel routes.
 */
    WEAVE_ERROR SendTunnelClose(WeaveTunnelConnectionMgr *conMgr);

/**
 * Send a Tunnel Route Update control message to the peer node with a set of tunnel routes.
 */
    WEAVE_ERROR SendTunnelRouteUpdate(WeaveTunnelConnectionMgr *conMgr, WeaveTunnelRoute *tunRoute);

#if WEAVE_CONFIG_TUNNEL_LIVENESS_SUPPORTED
/**
 * Send a Tunnel Close control message to the peer node with a set of tunnel routes.
 */
    WEAVE_ERROR SendTunnelLiveness(WeaveTunnelConnectionMgr *conMgr);
#endif // WEAVE_CONFIG_TUNNEL_LIVENESS_SUPPORTED

/**
 * Reconnect with the peer node.
 */
    WEAVE_ERROR Reconnect(WeaveTunnelConnectionMgr *conMgr);

/**
 * Send a border router advertise message advertising its fabric Id.
 */
    WEAVE_ERROR SendBorderRouterAdvertise (void);

/**
 * Send a mobile client advertise message advertising its Node Id.
 */
    WEAVE_ERROR SendMobileClientAdvertise (void);

/**
 * Function registered with WeaveMessageLayer for listening to Shortcut
 * tunnel advertisments and updating cache.
 */
    static void HandleShortcutTunnelAdvertiseMessage(ExchangeContext *ec, const IPPacketInfo *pktInfo,
                                                     const WeaveMessageInfo *msgInfo, uint32_t profileId,
                                                     uint8_t msgType, PacketBuffer *payload);

/**
 * Verify if the peer is present in the tunnel shortcut cache for sending locally.
 */
    bool IsPeerInShortcutTunnelCache(uint64_t peerId);

/**
 * Enable shortcut tunneling by sending advertisments from either the Border gateway or Mobile client and
 * also listening to advertisements from shortcut tunnel counterparts.
 */
    void EnableShortcutTunneling(void);

/**
 * Disable shortcut tunneling of sending advertisments from either the Border gateway or Mobile client and
 * also listening to advertisements from shortcut tunnel counterparts.
 */
    void DisableShortcutTunneling(void);

/**
 * Send message over the tunnel shortcut.
 */
    WEAVE_ERROR SendMessageOverTunnelShortcut(uint64_t peerId, WeaveMessageInfo *msgHdr, PacketBuffer *msg);

private:

    WEAVE_ERROR CreateContext(WeaveConnection *aConnection,
                              ExchangeContext::MessageReceiveFunct onMsgRcvd);
    void Free(void);
    WEAVE_ERROR SendTunnelMessage(TunnelCtrlMsgType msgType,
                                  WeaveTunnelConnectionMgr *con,
                                  uint64_t fabricId,
                                  WeaveTunnelRoute *tunRoute,
                                  ExchangeContext::MessageReceiveFunct onMsgRcvd);


    static void HandleTunnelOpenResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo,
                                         const WeaveMessageInfo *msgInfo, uint32_t profileId,
                                         uint8_t msgType, PacketBuffer *payload);

    static void HandleTunnelCloseResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo,
                                          const WeaveMessageInfo *msgInfo, uint32_t profileId,
                                          uint8_t msgType, PacketBuffer *payload);

    static void HandleTunnelRouteUpdateResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo,
                                                const WeaveMessageInfo *msgInfo, uint32_t profileId,
                                                uint8_t msgType, PacketBuffer *payload);

    static void HandleTunnelLivenessResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo,
                                             const WeaveMessageInfo *msgInfo, uint32_t profileId,
                                             uint8_t msgType, PacketBuffer *payload);

    static void HandleTunnelReconnect(ExchangeContext *ec, const IPPacketInfo *pktInfo,
                                      const WeaveMessageInfo *msgInfo, uint32_t profileId,
                                      uint8_t msgType, PacketBuffer *payload);

    static WEAVE_ERROR SendStatusReport(ExchangeContext *ec, uint32_t profileId,
                                        uint16_t tunStatusCode);

    // Timeout handler for tunnel control response.

    static void TunCtrlRespExpiryHandler(ExchangeContext *ec);

    // Helper function to close the tunnel connection and report error based on a status report

    void TunnelCloseAndReportErrorStatus(WeaveTunnelConnectionMgr *conMgr, WEAVE_ERROR err, StatusReport report);

    // Helper function to free buffer and close the tunnel control ExchangeContext

    void FreeBufferAndCloseExchange(PacketBuffer *buf, ExchangeContext *&ec);

    static WEAVE_ERROR VerifyAndParseStatusResponse(uint32_t profileId,
                                                    uint8_t msgType, PacketBuffer *payload,
                                                    StatusReport & report,
                                                    bool & isRoutingRestricted);

    static WEAVE_ERROR ParseTunnelTLVData(StatusReport & report,
                                          bool & isRoutingRestricted);

    WEAVE_ERROR DecodeTunnelReconnect(uint16_t &hostPort,
                                      char *hostName,
                                      uint8_t &hostNameLen,
                                      PacketBuffer *msg);


#if WEAVE_CONFIG_TUNNEL_SHORTCUT_SUPPORTED
    WEAVE_ERROR GetSendInterfaceIdForBroadcast(InterfaceId &sendIntfId);
    WEAVE_ERROR SendShortcutTunnelAdvertiseMessage(TunnelCtrlMsgType shortcutTunAdvMsgType,
                                                   InterfaceId sendIntfId, uint64_t localAddrIdentifier);

    // Timer based periodic advertisement messaging functions.

    void StartShortcutTunnelAdvertisementsFromBorderRouter(void);
    void StopShortcutTunnelAdvertisementsFromBorderRouter(void);

    void StartShortcutTunnelAdvertisementsFromMobileClient(void);
    void StopShortcutTunnelAdvertisementsFromMobileClient(void);

    void RegisterShortcutTunnelAdvHandlers(void);
    void UnregisterShortcutTunnelAdvHandlers(void);

    // Timeout functions performing timer actions.

    static void BorderRouterAdvTimeout(InetLayer *inetLayer, void *appState, INET_ERROR err);
    static void MobileClientAdvTimeout(InetLayer *inetLayer, void *appState, INET_ERROR err);
    static void PurgeStaleNextHopEntries(InetLayer *inetLayer, void *appState, INET_ERROR err);

    // Timer based Nexthop cache monitor

    void StartNextHopTableMonitor(void);
    void StopNextHopTableMonitor(void);

    // Nexthop cache management functions

    int FindTunnelPeerEntry (uint64_t peerId);
    int NewNextHopEntry(void);
    WEAVE_ERROR FreeNextHopEntry(int index);
    WEAVE_ERROR UpdateOrAddTunnelPeerEntry(uint64_t peerId, IPAddress peerAddr, uint64_t peerNodeId);
#endif // WEAVE_CONFIG_TUNNEL_SHORTCUT_SUPPORTED

    // Weave Tunnel Agent handle

    WeaveTunnelAgent        *mTunnelAgent;

    // Exchange Context to use when sending Weave control messages to Service.

    ExchangeContext         *mServiceExchangeCtxt;

#if WEAVE_CONFIG_TUNNEL_SHORTCUT_SUPPORTED
    // Exchange Context to use when sending Weave shortcut tunnel advertise messages.

    ExchangeContext         *mShortcutTunExchangeCtxt;

    class ShortcutTunnelPeerEntry
    {
      public:
        uint64_t  peerIdentifier; // NodeId for MobileClient or FabricId for Border Gateway
        uint64_t  peerNodeId;     // Peer NodeId
        IPAddress peerAddr;       // Shortcut tunnel peer address
        bool      staleFlag;      // true if stale; false if fresh.
    };

    ShortcutTunnelPeerEntry ShortcutTunnelPeerCache[WEAVE_CONFIG_TUNNELING_MAX_NUM_SHORTCUT_TUNNEL_PEERS];
#endif // WEAVE_CONFIG_TUNNEL_SHORTCUT_SUPPORTED
};

} // namespace WeaveTunnel
} // namespace Profiles
} // namespace Weave
} // namespace nl

#endif // WEAVE_CONFIG_ENABLE_TUNNELING
#endif //_WEAVE_TUNNEL_CONTROL_H_
