You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
8.5 KiB
168 lines
8.5 KiB
#ifndef H__pktz
|
|
#define H__pktz
|
|
|
|
#define NDDESignature 0x4E444445L
|
|
|
|
/* states of packetizer */
|
|
#define PKTZ_CONNECTED 1
|
|
#define PKTZ_WAIT_PHYSICAL_CONNECT 2
|
|
#define PKTZ_WAIT_NEG_CMD 3
|
|
#define PKTZ_WAIT_NEG_RSP 4
|
|
#define PKTZ_PAUSE_FOR_MEMORY 5
|
|
#define PKTZ_CLOSE 6
|
|
|
|
/* Timer IDs */
|
|
#define TID_NO_RCV_CONN_CMD 1
|
|
#define TID_NO_RCV_CONN_RSP 2
|
|
#define TID_MEMORY_PAUSE 3
|
|
#define TID_NO_RESPONSE 4
|
|
#define TID_KEEPALIVE 5
|
|
#define TID_XMT_STUCK 6
|
|
#define TID_CLOSE_PKTZ 7
|
|
|
|
|
|
/*
|
|
PKTZ_NEG_CMD: negotiate pktsize, etc.
|
|
*/
|
|
typedef struct {
|
|
WORD nc_type; /* PKTZ_NEG_CMD */
|
|
WORD nc_pktSize; /* proposed size of packets */
|
|
WORD nc_maxUnackPkts; /* proposed maximum unacknowledged packets */
|
|
WORD nc_offsSrcNodeName; /* offset (from nc_strings[0]) of source node name */
|
|
WORD nc_offsDstNodeName; /* offset (from nc_strings[0]) of destination node name */
|
|
WORD nc_offsProtocols; /* offset (from nc_strings[0]) of start of protocol strings */
|
|
WORD nc_protocolBytes; /* number of bytes of protocol strings */
|
|
BYTE nc_strings[1]; /* start of NULL-terminated strings
|
|
srcNodeName
|
|
dstNodeName
|
|
protocols
|
|
*/
|
|
} NEGCMD, FAR *LPNEGCMD;
|
|
|
|
#define NEGRSP_ERRCLASS_NONE (0x0000)
|
|
#define NEGRSP_ERRCLASS_NAME (0x0001)
|
|
|
|
#define NEGRSP_ERRNAME_MISMATCH (0x0001)
|
|
#define NEGRSP_ERRNAME_DUPLICATE (0x0002)
|
|
|
|
#define NEGRSP_PROTOCOL_NONE (0xFFFF)
|
|
|
|
typedef struct {
|
|
WORD nr_type; /* one of PKTZ_NEG_CMD or PKTZ_NEG_RSP or PKTZ_KEEPALIVE */
|
|
WORD nr_pktSize; /* size of packets agreed upon */
|
|
WORD nr_maxUnackPkts; /* maximum unacknowledged packets agreed on */
|
|
WORD nr_protocolIndex; /* protocol index. NEGRSP_PROTOCOL_NONE indicates error */
|
|
WORD nr_errorClass; /* errors */
|
|
WORD nr_errorNum;
|
|
} NEGRSP, FAR *LPNEGRSP;
|
|
|
|
typedef struct {
|
|
WORD pc_type; /* PKTZ_NEG_... */
|
|
} PKTZCMD;
|
|
typedef PKTZCMD FAR *LPPKTZCMD;
|
|
|
|
/* types of PKTZ messages */
|
|
#define PKTZ_NEG_CMD (1)
|
|
#define PKTZ_NEG_RSP (2)
|
|
#define PKTZ_KEEPALIVE (3)
|
|
|
|
|
|
/*
|
|
N E T H D R
|
|
|
|
NETHDR is the data in front of each network packet that the
|
|
PKTZ uses to keep track of various information
|
|
*/
|
|
typedef struct nethdr {
|
|
struct nethdr FAR *nh_prev; /* previous link */
|
|
struct nethdr FAR *nh_next; /* next link */
|
|
WORD nh_noRsp; /* count of consecutive no response errors */
|
|
WORD nh_xmtErr; /* count of consecutive transmission errors */
|
|
WORD nh_memErr; /* count of consecutive out-of-memory errors */
|
|
WORD nh_filler; /* filler for byte-alignment problems */
|
|
DWORD nh_timeSent; /* timestamp of when sent (in msec) */
|
|
HTIMER nh_hTimerRspTO; /* hTimer for send response timeout */
|
|
} NETHDR, FAR *LPNETHDR;
|
|
|
|
|
|
/*
|
|
PKTZ is the data associated with each instance of PKTZ
|
|
*/
|
|
typedef struct {
|
|
CONNID pk_connId; /* connId: connection id for the associated network interface */
|
|
WORD pk_state; /* PKTZ_... */
|
|
BOOL pk_fControlPktNeeded; /* fControlPktNeeded: do we need to send a control packet */
|
|
PKTID pk_pktidNextToSend; /* pktidNextToSend: pktId of the next packet that we should send. If we get a NACK regarding a packet, we should set pktidNextToSend to that pktid and retransmit it next chance we have */
|
|
PKTID pk_pktidNextToBuild; /* pktidNextToBuild: pktId of the next packet that we build. */
|
|
BYTE pk_lastPktStatus; /* lastPktStatus: status of last packet that we received from the other side. This gets put into the next packet that we send out (put in np_lastPktStatus field) */
|
|
PKTID pk_lastPktRcvd; /* lastPktRcvd: last packet that we received. This gets put into np_lastPktRcvd on next pkt we xmit. */
|
|
PKTID pk_lastPktOk; /* lastPktOk: last packet that we received OK. This gets put into np_lastPktOK on the next pkt we xmit. */
|
|
PKTID pk_lastPktOkOther; /* lastPktOkOther: last packet that the other side has received OK. */
|
|
PKTID pk_pktidNextToRecv; /* pktidNextToRecv: next packet number that we're expecting. We ignore any packets except this packet number */
|
|
DWORD pk_pktOffsInXmtMsg; /* pktOffsInMsg: where we should start in the next DDE Packet to xmit. If this is non-zero, it means that part of the DDE Packet at the head of the DDE Packet list (pk_ddePktListHead) is in the unacked packet list */
|
|
LPDDEPKT pk_lpDdePktSave; /* lpDdePktSave: if we are in the middle of a DDE packet, this is a pointer to the beginning of the packet */
|
|
char pk_szDestName[ MAX_NODE_NAME+1 ];/* szDestName: name of destination node */
|
|
char pk_szAliasName[ MAX_NODE_NAME+1 ]; /* szAliasName: alias of destination node, e.g. 15.8.0.244 w/ destName of sidloan */
|
|
WORD pk_pktSize; /* pktSize: how big are the packets for this netintf */
|
|
WORD pk_maxUnackPkts; /* maxUnackPkts: how many unacknowledged packets should we xmit? */
|
|
DWORD pk_timeoutRcvNegCmd; /* configuration parameters for timeouts and retry limits */
|
|
DWORD pk_timeoutRcvNegRsp;
|
|
DWORD pk_timeoutMemoryPause;
|
|
DWORD pk_timeoutKeepAlive;
|
|
DWORD pk_timeoutXmtStuck;
|
|
DWORD pk_timeoutSendRsp;
|
|
WORD pk_wMaxNoResponse;
|
|
WORD pk_wMaxXmtErr;
|
|
WORD pk_wMaxMemErr;
|
|
BOOL pk_fDisconnect; /* disconnect information */
|
|
int pk_nDelay;
|
|
LPNIPTRS pk_lpNiPtrs;/* lpNiPtrs: pointer to list of functions for associated netintf */
|
|
/* statistics */
|
|
DWORD pk_sent;
|
|
DWORD pk_rcvd;
|
|
HTIMER pk_hTimerKeepalive;
|
|
HTIMER pk_hTimerXmtStuck; /* hTimerRcvNegCmd: timer for timeout waiting for client to send us the connect cmd */
|
|
HTIMER pk_hTimerRcvNegCmd; /* hTimerRcvNegRsp: timer for timeout waiting for server to send us the connect cmd rsp */
|
|
HTIMER pk_hTimerRcvNegRsp; /* hTimerMemoyrPause: timer for waiting before retransmitting a packet that was NACKed because of memory errors */
|
|
HTIMER pk_hTimerMemoryPause;
|
|
HTIMER pk_hTimerCloseConnection; /* rt_hTimerClose: timer for closing this route */
|
|
/* list of saved packets that have been transmitted and are not acked. */
|
|
LPNETHDR pk_pktUnackHead; /* Head is lowest numbered (least recent) packet */
|
|
LPNETHDR pk_pktUnackTail; /* tail is highest numbered (most recent) packet */
|
|
LPVOID pk_rcvBuf; /* receive buffer for getting info from netintf */
|
|
LPNETPKT pk_controlPkt; /* buffer for control packet. Must always have memory available to send a control packet */
|
|
LPNETHDR pk_pktFreeHead; /* list of packet buffers available for transmission */
|
|
LPNETHDR pk_pktFreeTail;
|
|
/* list of DDE packets that have yet to be xmitted */
|
|
LPVOID pk_ddePktHead; /* earliest (least recent) */
|
|
LPVOID pk_ddePktTail; /* latest (most recent) */
|
|
LPVOID pk_prevPktz; /* list of packetizers in the system */
|
|
LPVOID pk_nextPktz;
|
|
LPVOID pk_prevPktzForNetintf; /* list of packetizers associated with this netintf */
|
|
LPVOID pk_nextPktzForNetintf;
|
|
HROUTER pk_hRouterHead; /* head of list of routers associated with PKTZ */
|
|
WORD pk_hRouterExtraHead; /* extra info for list of hRouters */
|
|
} PKTZ;
|
|
typedef PKTZ FAR *LPPKTZ;
|
|
|
|
|
|
|
|
VOID PktzSlice( void );
|
|
BOOL PktzGetPktzForRouter( LPNIPTRS lpNiPtrs, LPSTR lpszNodeName,
|
|
LPSTR lpszNodeInfo, HROUTER hRouter, WORD hRouterExtra,
|
|
WORD FAR *lpwHopErr, BOOL bDisconnect, int nDelay,
|
|
HPKTZ hPktzDisallowed );
|
|
HPKTZ PktzNew( LPNIPTRS lpNiPtrs, BOOL bClient,
|
|
LPSTR lpszNodeName, LPSTR lpszNodeInfo, CONNID connId,
|
|
BOOL bDisconnect, int nDelay );
|
|
VOID PktzAssociateRouter( HPKTZ hPktz, HROUTER hRouter,
|
|
WORD hRouterExtra );
|
|
VOID PktzDisassociateRouter( HPKTZ hPktz, HROUTER hRouter,
|
|
WORD hRouterExtra );
|
|
HPKTZ PktzGetNext( HPKTZ hPktz );
|
|
HPKTZ PktzGetPrev( HPKTZ hPktz );
|
|
VOID PktzSetNext( HPKTZ hPktz, HPKTZ hPktzNext );
|
|
VOID PktzSetPrev( HPKTZ hPktz, HPKTZ hPktzPrev );
|
|
VOID PktzLinkDdePktToXmit( HPKTZ hPktz, LPDDEPKT lpDdePkt );
|
|
|
|
#endif
|