[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 */ /*****************************************************************************/