[0001]
[0002]
[0003]
[0004]
[0005]
[0006]
[0007]
[0008]
[0009]
[0010]
[0011]
[0012]
[0013]
[0014]
[0015]
[0016]
[0017]
[0018]
[0019]
[0020]
[0021]
[0022]
[0023]
[0024]
[0025]
[0026]
[0027]
[0028]
[0029]
[0030]
[0031]
[0032]
[0033]
[0034]
[0035]
[0036]
[0037]
[0038]
[0039]
[0040]
[0041]
[0042]
[0043]
[0044]
[0045]
[0046]
[0047]
[0048]
[0049]
[0050]
[0051]
[0052]
[0053]
[0054]
[0055]
[0056]
[0057]
[0058]
[0059]
[0060]
[0061]
[0062]
[0063]
[0064]
[0065]
[0066]
[0067]
[0068]
[0069]
[0070]
[0071]
[0072]
[0073]
[0074]
[0075]
[0076]
[0077]
[0078]
[0079]
[0080]
[0081]
[0082]
[0083]
[0084]
[0085]
[0086]
[0087]
[0088]
[0089]
[0090]
[0091]
[0092]
[0093]
[0094]
[0095]
[0096]
[0097]
[0098]
[0099]
[0100]
[0101]
[0102]
[0103]
[0104]
[0105]
[0106]
[0107]
[0108]
[0109]
[0110]
[0111]
[0112]
[0113]
[0114]
[0115]
[0116]
[0117]
[0118]
[0119]
[0120]
[0121]
[0122]
[0123]
[0124]
[0125]
[0126]
[0127]
[0128]
[0129]
[0130]
[0131]
[0132]
[0133]
[0134]
[0135]
[0136]
[0137]
[0138]
[0139]
[0140]
[0141]
[0142]
[0143]
[0144]
[0145]
[0146]
[0147]
[0148]
[0149]
[0150]
[0151]
[0152]
[0153]
[0154]
[0155]
[0156]
[0157]
[0158]
[0159]
[0160]
[0161]
[0162]
[0163]
[0164]
[0165]
[0166]
[0167]
[0168]
[0169]
[0170]
[0171]
[0172]
[0173]
[0174]
[0175]
[0176]
[0177]
[0178]
[0179]
[0180]
[0181]
[0182]
[0183]
[0184]
[0185]
[0186]
[0187]
[0188]
[0189]
[0190]
[0191]
[0192]
[0193]
[0194]
[0195]
[0196]
[0197]
[0198]
[0199]
[0200]
[0201]
[0202]
[0203]
[0204]
[0205]
[0206]
[0207]
[0208]
[0209]
[0210]
[0211]
[0212]
[0213]
[0214]
[0215]
[0216]
[0217]
[0218]
[0219]
[0220]
[0221]
[0222]
[0223]
[0224]
[0225]
[0226]
[0227]
[0228]
[0229]
[0230]
[0231]
[0232]
[0233]
[0234]
[0235]
[0236]
[0237]
[0238]
[0239]
[0240]
[0241]
[0242]
[0243]
[0244]
[0245]
[0246]
[0247]
[0248]
[0249]
[0250]
[0251]
[0252]
[0253]
[0254]
[0255]
[0256]
[0257]
[0258]
[0259]
[0260]
[0261]
[0262]
[0263]
[0264]
[0265]
[0266]
[0267]
[0268]
[0269]
[0270]
[0271]
[0272]
/*****************************************************************************/
/*
                                   Net.h
*/
/*****************************************************************************/

#ifndef NET_H_LOADED
#define NET_H_LOADED 1

#include <types.h>
#include "service.h"
#include "strng.h"
#include "wasd.h"

/* output character encoding */
#define NET_WRITE_BUFFERED_NONE     0
#define NET_WRITE_BUFFERED_HTMLESC  1
#define NET_WRITE_BUFFERED_URLENC   2

/* retry failed sys$assign()s for this many seconds */
#define NET_ASSIGN_FAIL_MAX 60

/* number of time to attempt host name lookup when configuring services */
#define NET_LOOKUP_RETRY 2

/* segment sizes (TCP MSS) for QIOs */
#define NETIO_QIO_BYTES_DEFAULT  1460
#define NETIO_QIO_BYTES_MAX      8960
#define NETIO_QIO_BYTES_MIN       536
#define NETIO_QIO_BYTES_SENTINAL  999

/* most significant bit of data size set indicates fill with this much data */
#define NETIO_DATA_FILL_BUF 0x80000000

/* maximum size of buffer allowed to be filled (1MB) */
#define NETIO_DATA_FILL_MAX 1048575

#define NETIO_CONNECTED(ptr) ((ptr) && (ptr)->Channel)

#define NETIO_IN_PROGRESS(ptr) ((ptr) && ((ptr)->WriteAstFunction || \
                                          (ptr)->ReadAstFunction))
#define NETIO_READ_IN_PROGRESS(ptr) ((ptr) && (ptr)->ReadAstFunction)
#define NETIO_WRITE_IN_PROGRESS(ptr) ((ptr) && (ptr)->WriteAstFunction)

/**************/
/* structures */
/**************/

typedef struct ClientStruct CLIENT_STRUCT;

struct ClientStruct
{
   int  AgentBusyCount,
        IpPort,
        SetClientAddress,
        UpstreamHostNameLength;

   char  IpAddressString [TCPIP_ADDRESS_STRING_MAX+1],
         MultiHomeIpAddressString [TCPIP_ADDRESS_STRING_MAX+1],
         UpstreamHostName [TCPIP_HOSTNAME_MAX+1],
         UpstreamIpAddressString [TCPIP_ADDRESS_STRING_MAX+1];

   char  *AgentRequestPtr,
         *AgentResponsePtr;

   IPADDRESS  IpAddress,
              MultiHomeIpAddress,
              UpstreamIpAddress;

   TCPIP_HOST_LOOKUP  Lookup;

   SOCKADDRESS  SocketName;
   int  SocketNameLength;
   VMS_ITEM_LIST3  SocketNameItem;
};

typedef struct NetIoStruct NETIO_STRUCT;

struct NetIoStruct
{
   ushort  Channel;

   uint  /* the maximum bytes to be QIOed */
         QioMaxSeg,
         /* IO status block count equivalent (allows IOs > 65535) */
         ReadCount,
         /* read buffer size (also see NETIO_DATA_FILL_BUF) */
         ReadSize,
         /* IO status block status equivalent (allows IOs > 65535) */
         ReadStatus,
         /* tracks network errors */
         ReadErrorCount,
         /* first network error status */
         ReadErrorStatus,
         /* TCP maximum segment size (MSS) */
         TcpIpTcpMaxSeg,
         /* length of upstream host name */
         UpstreamHostNameLength,
         /* when non-zero this status value is returned (e.g. SS$_CANCEL) */
         VmsStatus,
         /* item is beiong WATCHed */
         WatchItem,
         /* IO status block count equivalent (allows IOs > 65535) */
         WriteCount,
         /* write buffer length */
         WriteLength,
         /* IO status block status equivalent (allows IOs > 65535) */
         WriteStatus,
         /* tracks network errors */
         WriteErrorCount,
         /* first network error status */
         WriteErrorStatus;
         
   int64  /* accumulates number of I/Os */
          BlocksRawRx64,
          /* number of I/Os (reset with each stats update) */
          BlocksTallyRx64,
          /* accumulate bytes I/Oed */
          BytesRawRx64,
          /* number of bytes I/Oed (reset with each stats update) */
          BytesTallyRx64,
          /* accumulates number of I/Os */
          BlocksRawTx64,
          /* number of I/Os (reset with each stats update) */
          BlocksTallyTx64,
          /* accumulate bytes I/Oed */
          BytesRawTx64,
          /* number of bytes I/Oed (reset with each stats update) */
          BytesTallyTx64;

   uchar  /* for SSH-shared TLS/SSL services */
          SSHversionDigit;

   uchar  /* buffer space  */
          *ReadPtr,
          /* buffer space  */
          *WritePtr;

   void  /* using HTTP/2 interface */
         *Http2StreamPtr,
         /* AST to be called when I/O complete */
         *ReadAstFunction,
         /* parameter to be supplied to AST */
         *ReadAstParam,
         /* associated with a request */
         *RequestPtr,
         /* using SSL/TLS connection */
         *SesolaPtr,
         /* AST to be called when I/O complete */
         *WriteAstFunction,
         /* parameter to be supplied to AST */
         *WriteAstParam;
         
   IO_SB  AcceptIOsb,
          ReadIOsb,
          WriteIOsb;

   SERVICE_STRUCT  *ServicePtr;

   /***********************************************/
   /* proxy NETIO does not include the following! */
   /***********************************************/

   /* client data and pointer to that (see MapUrl_SetClientAddress()) */
   CLIENT_STRUCT  ClientIp;
   CLIENT_STRUCT  *ClientPtr;
};

struct NetTestStruct
{
   ushort  Channel;
   IO_SB  IOsb;
   char  Buffer [1024];
};

/***********************/
/* function prototypes */
/***********************/

/* forward reference required */
typedef struct ServiceStruct SERVICE_STRUCT;
void NetAbortSocket (REQUEST_STRUCT*);
NetAccept (SERVICE_STRUCT*);
NetAcceptAst (NETIO_STRUCT*);
void NetAcceptBegin ();
NetAcceptProcess (NETIO_STRUCT*);
BOOL NetAcceptSupervisor ();
void NetAllServices (void);
int NetStartService (SERVICE_STRUCT*);
void NetListFor (char*);
NetControl (int, char*);
NetDirectResponse (NETIO_STRUCT*, int);
NetDirectResponseAst (NETIO_STRUCT*);
NetDirectResponseTimeoutAst (NETIO_STRUCT*);
char* NetGetBgDevice (ushort, char*, int);
int RefGetRefCnt (ushort);
NetGetServerHostName ();
int NetGetRefCnt (ushort);
NetHostNameLookup (char*, int, char*, char*, char*, IPADDRESS*, int*);
ulong NetHostPortHash (char*, char*);
NetListen ();
NetParseHostString (char*, char*, int, int*);
NetResponseHeaderAst (REQUEST_STRUCT*);
NetServerShutdown (ushort);
int NetServiceReportConfig (REQUEST_STRUCT*, struct ConfigStruct*);
int NetServiceReportStats (REQUEST_STRUCT*);
NetServiceZeroAccounting ();
NetSetService ();
int NetClientSocketCcl (NETIO_STRUCT*, int);
void NetCloseSocket (REQUEST_STRUCT*);
int NetRead (REQUEST_STRUCT*, REQUEST_AST, char*, int);
void NetUpdateConnected (void*, int);
void NetUpdatePersistent (int);
void NetUpdateProcessing (void*, int);

NetActive (BOOL);
NetPassive ();
NetResume ();
NetSuspend (BOOL);

int NetWrite (REQUEST_STRUCT*, REQUEST_AST, char*, int);
void NetWriteBuffered (REQUEST_STRUCT*, REQUEST_AST, char*, int);
int NetWriteChunked (REQUEST_STRUCT*, REQUEST_AST, char*, int);
int NetWriteGzip (REQUEST_STRUCT*, REQUEST_AST, char*, int);
int NetWriteGzipAst (REQUEST_STRUCT*);
int NetWriteRaw (REQUEST_STRUCT*, REQUEST_AST, char*, int);
void NetWriteStrDsc (REQUEST_STRUCT*, REQUEST_AST);
void NetWriteStrDsc_SENTINAL (void*);

/* testing purpose only! */
void NetTestBreak (int);
NetTestRequest (ushort);
NetTestReadAst (struct NetTestStruct*);
NetTestWriteAst (struct NetTestStruct*);

/* definition to flush the buffer only if there is more than a buffer-full */
#define NetWritePartFlush(rq,ast) NetWriteBuffered(rq,ast,NULL,-1)
/* to flush buffered contents completely */
#define NetWriteFullFlush(rq,ast) NetWriteBuffered(rq,ast,NULL,0)
/* initialize the buffer */
#define NetWriteInit(rq) NetWriteBuffered(rq,NULL,NULL,0)

/***********************/
/* NetIo..() functions */
/***********************/

void NetAgentBegin (NETIO_STRUCT*);
void NetAgentEnd (REQUEST_STRUCT*);
NETIO_STRUCT* NetIoBegin ();
NETIO_STRUCT* NetIoProxyBegin ();
void NetIoCancel (NETIO_STRUCT*);
void NetIoEnd (NETIO_STRUCT*);
void NetIoQioMaxSeg (NETIO_STRUCT*);
int NetIoCloseSocket (NETIO_STRUCT*);
int NetIoPeek (REQUEST_STRUCT*, REQUEST_AST);
int NetIoRead (NETIO_STRUCT*, VOID_AST, void*, void*, uint);
void NetIoReadAst (NETIO_STRUCT*);
void NetIoReadStatus (NETIO_STRUCT*, VOID_AST, void*, int, uint);
void NetIoToSink (NETIO_STRUCT*);
int NetIoWrite (NETIO_STRUCT*, VOID_AST, void*, void*, uint);
void NetIoWriteAst (NETIO_STRUCT*);
int NetIoWriteStatus (NETIO_STRUCT*, VOID_AST, void*, int, int);

#if WATCH_MOD
void NetIoReadTest (REQUEST_STRUCT*);
void NetIoWriteTest (REQUEST_STRUCT*);
#endif

#endif /* NET_H_LOADED */

/*****************************************************************************/