#ifndef CONNECT___NCBI_COMM__H
#define CONNECT___NCBI_COMM__H

/* $Id: ncbi_comm.h,v 6.25 2016/10/04 18:54:13 fukanchi Exp $
 * ===========================================================================
 *
 *                            PUBLIC DOMAIN NOTICE
 *               National Center for Biotechnology Information
 *
 *  This software/database is a "United States Government Work" under the
 *  terms of the United States Copyright Act.  It was written as part of
 *  the author's official duties as a United States Government employee and
 *  thus cannot be copyrighted.  This software/database is freely available
 *  to the public for use. The National Library of Medicine and the U.S.
 *  Government have not placed any restriction on its use or reproduction.
 *
 *  Although all reasonable efforts have been taken to ensure the accuracy
 *  and reliability of the software and data, the NLM and the U.S.
 *  Government do not and cannot warrant the performance or results that
 *  may be obtained by using this software or data. The NLM and the U.S.
 *  Government disclaim all warranties, express or implied, including
 *  warranties of performance, merchantability or fitness for any particular
 *  purpose.
 *
 *  Please cite the author in any work or product based on this material.
 *
 * ===========================================================================
 *
 * Author:  Anton Lavrentiev
 *
 * File Description:
 *   Common part of internal communication protocol used by both sides
 *   (client and server) of firewall daemon and service dispatcher.
 *
 */

#define NCBID_WEBPATH           "/Service/ncbid.cgi"
#define NCBI_DISP_VERSION       "1.2"
#define HTTP_CONNECTION_INFO    "Connection-Info:"
#define HTTP_DISP_FAILURES      "Dispatcher-Failures:"
#define HTTP_DISP_MESSAGES      "Dispatcher-Messages:"
#define HTTP_NCBI_MESSAGE       "NCBI-Message:"
#define HTTP_NCBI_SID           "NCBI-SID:"
#define HTTP_NCBI_PHID          "NCBI-PHID:"
#define LBSM_DEFAULT_TIME       30      /* Default expiration time, seconds */
#define LBSM_DEFAULT_RATE       1000.0  /* For SLBSM_Service::info::rate    */
#define LBSM_STANDBY_THRESHOLD  0.01
#define DISPATCHER_CFGPATH      "/etc/lbsmd/"
#define DISPATCHER_CFGFILE      "servrc.cfg"
#define DISPATCHER_MSGFILE      ".dispd.msg"
#define CONN_FWD_PORT_MIN       5860
#define CONN_FWD_PORT_MAX       5870
#define CONN_FWD_BASE                                   \
    "https://www.ncbi.nlm.nih.gov/IEB/ToolBox/NETWORK"
#define CONN_FWD_LINK           CONN_FWD_BASE "/dispatcher.html#Firewalling"
#define CONN_FWD_URL            CONN_FWD_BASE "/firewall.html#Settings"
#define NCBI_EXTERNAL           "NCBI-External"


#ifdef __cplusplus
extern "C" {
#endif


typedef unsigned int           ticket_t;


/* This structure is assumed packed */
typedef struct {
    unsigned int   host;   /* must be in network byte order                  */
    unsigned short port;   /* see note about byte flag byte order below      */
    unsigned short flag;   /* FWDaemon control information, see below        */
    ticket_t       ticket; /* connection ticket (raw binary data, n.b.o.)    */
    unsigned int   client; /* expected host to call back (nbo, logging only) */
    char           text[1];/* name requested (for statistics purposes only)  */
} SFWDRequestReply;


/* Maximal accepted request/reply size */
#define FWD_MAX_RR_SIZE 128


/*
 * Currently, bit 0 (if set) of FWDaemon control information (flag) is used to
 * indicate that the client is a true firewall client.  If the bit is clear,
 * it means that the client is a relay client (and should use a secondary
 * -not an official firewall- port of the daemon, if available).
 * Non-zero bit 0 in response indicates that the true firewall mode (via DMZ)
 * is available (acknowledged when requested) and is being used by FWDaemon.
 *
 * Byte order for port and flag fields:
 * When FWDaemon is contacted via INET socket, these two fields must be
 * in network byte order.
 * When FWDaemon is contacted via UNIX socket, these two fields are assumed
 * to be in host byte order, unless 0xF000 is ORed with input "flag" value
 * and both fields are then converted (or not) into network byte order:  in
 * this case the byte order can be auto-detected, and the values returned
 * in both fields in the response are going to use that very same byte order.
 * NOTE:  0xF000 can also be used with INET socket, but conversion to and
 *        from network byte order is still mandatory.
 * NOTE:  0xF000 is ORed in reply flag field only if it has been present
 *        in the request.
 * NOTE:  This is a transitional interface;  future revisions will
 *        require both flag and port to always be in network byte order.
 */


#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* CONNECT___NCBI_COMM__H */
