/* options */ #ifndef DTDEBUG #define DTDEBUG /* Debugging */ #endif #define DTSTATS /* Statistics */ #define DTHEADONLY /* allow header only transfers */ /* eventually these oughta be permanant - you can take out the ifdefs : */ #define DT_THREE #define DTRW #define DTNOSTE #define DTNOINR #define DTRWX #define DTRUNTCK #define DTFLY /* general */ #define FALSE 0 #define TRUE 1 #define DT_ERROR 0 #define DT_OK 1 /* identification */ #define DT_VERSION 77 #define DT_BOOTPK 0x1234 #define VII_BROADCAST 255 /* sizes */ #define DT_PKTSZ 2046 #define DT_NSOCK 64 #define DT_NNODE 64 #define DT_HEADSZ (sizeof(struct dt_head)) #define DT_BODYSZ (DT_PKTSZ-DT_HEADSZ) #define DT_ACKSZ 4 #ifndef STANDALONE #ifdef KERNEL /* transmit states */ #define DT_XOFF 0 #define DT_XSTART 1 #define DT_XACK 2 #define DT_XHEAD 3 #define DT_XADONE 4 #define DT_XBDONE 5 /* receive states */ #define DT_RSTART 0 #define DT_RHEAD 1 #define DT_RBODY 2 #define DT_RDONE 3 #define DT_RSTOP 4 #ifdef DTDEBUG char *dtxstates[7] = { "XOFF", "XSTART", "XACK", "XHEAD", "XADONE", "XBDONE" }; char *dtrstates[5] = { "RSTART", "RHEAD", "RBODY", "RDONE", "RSTOP" }; #endif DTDEBUG #endif KERNEL #endif STANDALONE /* ** Packet header ** Ack body and packet header. */ #ifndef DT_THREE struct dt_head { u_char dh_dstn; /* destination node number */ u_char dh_srcn; /* source node number */ u_char dh_vers; /* version number */ u_char /* flag bits */ dh_res:3, /* reserved bits */ dh_val:1, /* ack valid bit */ dh_bak:1, /* bare ack bit */ dh_dgm:1, /* datagram bit */ dh_ack:1, /* ack bit */ dh_seq:1; /* sequence number bit */ u_short dh_rsvd; /* reserved field */ u_short dh_lgth; /* length of body in bytes */ u_short dh_dsts; /* destination socket */ u_short dh_srcs; /* source socket */ }; #else DT_THREE #undef DT_VERSION #define DT_VERSION 86 #undef DT_ACKSZ #define DT_ACKSZ (sizeof(struct dt_head)) typedef struct cry_addr CRYADDR; struct cry_addr { u_char c_net; u_char c_node; }; typedef struct cry_cap CRYCAP; struct cry_cap { u_long c_ctrl; u_long c_comm; }; struct dt_head { /* crystal net specific fields */ /* LAN (hardware) Specific Fields */ u_char dt_vvdst; /* Hardware node destination */ u_char dt_vvsrc; /* Hardware node source (set by hardware)*/ u_char dt_vvvers; /* LAN version # (RING_VERSION) */ u_char dt_vvproto; /* LAN protocol # (RING_CRY) */ /* Crystal Net (software) Specific Fields */ u_long dt_seq; /* sequence number */ CRYCAP dt_cap; /* capability */ CRYADDR dt_dtdst; /* net and node of dst */ CRYADDR dt_dtsrc; /* net and node of src */ u_short dt_dport; /* port of dst */ u_short dt_sport; /* port of src */ u_short dt_len; /* Length of data + header */ u_short dt_credit; /* Amount of data, credit */ u_char dt_vers; /* version number */ u_char dt_proto; /* protocol type */ /* Delta_t specific fields */ u_char dt_flags; /* Should be u_short and not have bit fields below */ u_char /* flag bits */ dh_res:3, /* reserved bits */ dh_val:1, /* ack valid bit */ dh_bak:1, /* bare ack bit */ dh_dgm:1, /* datagram bit */ dh_ack:1, /* ack bit */ dh_seq:1; /* sequence number bit */ }; #define dh_dstn dt_vvdst #define dh_srcn dt_vvsrc #define dh_vers dt_vvvers #define dh_rsvd #define dh_lgth dt_len #define dh_dsts dt_dport #define dh_srcs dt_sport #endif DT_THREE #ifndef STANDALONE /* ** Ack ** One per destination node. Contains the ack body, count ** and available flag. */ struct dt_ack { u_char /* ack flags */ da_avail:1; /* ack struct available */ struct dt_head da_head; /* ack body */ struct dt_ack *da_next; /* ack queue next */ }; /* ** Interface control structure */ struct dt_softc { u_char /* flags */ ds_xerror:1, /* transmit error */ ds_rerror:1; /* receive error */ u_char ds_xstate; /* transmit state */ u_char ds_rstate; /* receive state */ u_char ds_sendack; /* node to send ack to */ u_long ds_xaddr; /* transmit uba map address */ u_long ds_raddr; /* receive uba map address */ int ds_ubano; /* uba number */ int ds_host; /* our node number */ int ds_xtries; /* number of transmit retries */ struct dt_head *ds_xdh; /* transmit current header */ struct dt_head ds_rhead; /* receive header */ struct buf *ds_xbp; /* transmit current buf */ struct buf *ds_rbp; /* receive current buf */ struct dt_ack *ds_xda; /* transmit current ack */ struct buf *ds_xnext; /* transmit queue first pointer */ struct buf *ds_xlast; /* transmit queue last pointer */ struct dt_ack *ds_anext; /* ack queue first */ struct dt_ack *ds_alast; /* ack queue first */ #ifdef DTFLY int ds_ferrs; /* # input errors in last tick */ u_char ds_fmode; /* recovery mode */ u_char ds_frstop; /* used to disable input interrupts */ #endif DTFLY #ifdef DTNOINR unsigned ds_inr; /* 0 if don't use inr, VII_INR if do */ #endif DTNOINR }; /* ** Node Info ** One per destination node. Contains the node transmit queue, ** sequence and ack numbers, need ack flag and active flag. */ struct dt_node { u_short /* node info flags */ dn_active:1, /* active transmit request */ dn_queued:1, /* first packet is on xqueue */ dn_xdone:1, /* xdone called while on xqueue */ dn_xdonerr:1, /* xdone set and error on call */ dn_needack:1, /* expecting an ack on current packet */ dn_retrans:1, /* current request is a retransmission */ dn_sndst:1, /* send state */ dn_recst:1, /* receive state */ dn_risdead:1, /* think receive side is dead */ dn_xisdead:1 /* think transmit side is dead */ #ifdef DTPT ,dn_trace:1 /* protocol trace */ #endif DTPT ; struct buf *dn_next; /* NODE transmit queue, first pointer */ struct buf *dn_last; /* NODE transmit queue, last pointer */ struct dt_ack dn_ack; /* node ack structure */ }; /* ** node map ** Bit map of nodes that a given socket can interact with. ** a 1 bit means talk is allowed. */ typedef u_char dt_nmap[DT_NNODE/8]; /* node map checking macros */ #define DTACCESS(m, n) (m[n/8]&(1<<(n%8))) #define DTSETACCESS(m, n) m[n/8] |= (1<<(n%8)) #define DTCOPYMAP(f, t) bcopy((caddr_t)f, (caddr_t)t, sizeof(dt_nmap)) /* ** Socket info ** One per socket. Socket number is determined by device ** minor number. Contains the buf and header structures for ** outstanding transmit request, process id of owner, destination ** of current request, available and receive active flags. ** ** The struct dt_sockx is just so the ioctl that pulls socket info ** can get only the interesting stuff, not the buf structures. ** This kludge was necessary because the generic ioctl mechanism ** limits copyouts to 127 bytes. */ struct dt_sockx { u_char /* socket flags */ xdtopen:1, /* socket is open */ #ifdef DTRW xdtrinuse:1, /* read active */ /* the timing on this flag is different from the timing on * dt_ractive, so it's not really redundant */ xdtwinuse:1, /* write active */ #else xdtactive:1, /* request (r/w) active */ #endif DTRW xdtwanted:1, /* do wakeup when request done */ xdtractive:1; /* receive request active */ /* dt_ractive tells whether dtrint() can ack the incoming * packet (is there somewhere to put it?) */ int xdtreadstop; /* read stop time in 100ths */ dt_nmap xdtnodemap; /* node permission bit map */ #ifndef DTRWX struct dt_head xdtheadr; /* current packet header */ #endif DTRWX }; struct dt_sock { struct dt_sockx dtx; /* interesting socket info */ #ifdef DTRWX struct dt_head dtxheadr; /* current packet header */ struct dt_head dtrheadr; /* current packet header */ #endif DTRWX #ifdef DTRW struct buf dt_xbuff; /* X current packet body (buffer header) */ struct buf dt_rbuff; /* R current packet body (buffer header) */ #else struct buf dt_buff; /* current packet body (buffer header) */ #endif DTRW }; #define dt_open dtx.xdtopen #define dt_rinuse dtx.xdtrinuse #define dt_winuse dtx.xdtwinuse #define dt_active dtx.xdtactive #define dt_wanted dtx.xdtwanted #define dt_ractive dtx.xdtractive #define dt_readstop dtx.xdtreadstop #define dt_nodemap dtx.xdtnodemap #ifdef DTRWX #define dt_headr dtrheadr #define dt_headx dtxheadr #else #define dt_headr dtx.xdtheadr #endif DTRWX /* ioctl parameters */ struct dt_param { u_char /* flags */ dp_debug:1 /* debug interface */ ,dp_trace:7 /* protocol trace */ ; int dp_xretries; /* times to retry sending */ int dp_retrans; /* retransmission timeout in 100ths */ int dp_deadsend; /* max time retransmitting in 100ths */ int dp_readstop; /* time before stop read in 100ths */ int dp_rdead; /* receive dead timeout in 100ths */ int dp_xdead; /* transmit dead timeout in 100ths */ int dp_piggy; /* wait before sending bare ack */ #ifdef DTFLY int dp_flythresh; /* threshhold for errors */ #endif DTFLY dt_nmap dp_nodemap; /* node permission bit map */ }; /* dt statistics */ struct dt_stat { u_short dd_ubarst; /* uba resets */ u_short dd_rerrs; /* input interrupt errors */ u_short dd_rhead; /* read header state */ u_short dd_rbadhd; /* bad headers read */ u_short dd_rbadbd; /* bad bodies read */ u_short dd_rdone; /* read done state */ u_short dd_rstart; /* read start state */ u_short dd_xretry; /* transmit collision retries */ u_short dd_xerrs; /* transmit errors */ u_short dd_xstart; /* transmit start state */ /* 20 */ u_short dd_xhead; /* transmit header state */ u_short dd_xack; /* transmit ack state */ u_short dd_xadone; /* transmit ack done */ u_short dd_xbdone; /* transmit body done */ u_short dd_xnoq; /* packets sent without xmit queue */ u_short dd_xanoq; /* acks sent without xmit queue */ u_short dd_write; /* write system calls */ u_short dd_writebad; /* write error returns */ u_short dd_read; /* read system calls */ u_short dd_readbad; /* read error returns */ /* 40 */ u_short dd_badhead; /* bad headers received */ u_short dd_noread; /* no reads */ u_short dd_goodack; /* good acks */ u_short dd_badack; /* bad acks */ u_short dd_rpigs; /* piggy back acks received */ u_short dd_xpigs; /* piggy back acks sent */ u_short dd_rdgm; /* datagrams received */ u_short dd_xdgm; /* datagrams sent */ u_short dd_rinval; /* invalid acks recieved */ u_short dd_xinval; /* invalid acks sent */ /* 60 */ u_short dd_rejects; /* rejected packets */ u_short dd_deadsend; /* dead send timeouts */ u_short dd_livesend; /* live send timeouts */ u_short dd_deadrecv; /* dead receive timeouts */ u_short dd_retrans; /* retransmission timeouts */ u_short dd_readstop; /* read stop timeouts */ u_short dd_unrdstop; /* read stop undos */ u_short dd_xrfs; /* xmit RFS error */ u_short dd_xovr; /* xmit OVR error */ u_short dd_xnok; /* xmit NOK error */ /* 80 */ u_short dd_xbdf; /* xmit BDF error */ u_short dd_rovr; /* recv OVR error */ u_short dd_rodb; /* recv ODB error */ u_short dd_rlde; /* recv LDE error */ u_short dd_rnok; /* recv NOK error */ u_short dd_rbdf; /* recv BDF error */ u_short dd_rhdshrt; /* UNUSED */ /* 94 */ #ifdef DTFLY u_short dd_fly; /* # calls to dtfly */ u_short dd_flyinit; /* # time dtfly initialized the if */ u_short dd_flyhiwat; /* high water mark for ds_ferrs */ u_short dd_flybad; /* high water mark for ds_ferrs */ #endif DTFLY #ifdef DTRUNTCK u_short dd_runt; /* runt packets */ #endif DTRUNTCK #ifdef DTNOINR u_short dd_xcoll; /* collisions */ u_short dd_xinr; /* times INR used */ u_short dd_xnxm; /* xmit nxm errs */ u_short dd_xopt; /* xmit output timeout errs */ #endif DTNOINR }; #ifdef KERNEL struct dt_sock Sockets[DT_NSOCK]; /* Socket info table */ struct dt_node Nodes[DT_NNODE]; /* Node info, one per node */ struct dt_softc dtsoftc; #ifdef DTSTATS struct dt_stat dtstat; /* statistics */ struct dt_stat dtstatinit; /* initialize statistics */ #endif DTSTATS struct dt_param dtparam = { /* ioctl parameters */ 0, /* dp_debug */ 0, /* dp_trace */ 20, /* dp_xretries */ 3, /* dp_retrans */ 360, /* dp_deadsend - this plus dp_xdead == Stimer in spec */ 1200, /* dp_readstop */ 720, /* dp_rdead */ 360, /* dp_xdead */ 0 /* dp_piggy */ #ifdef DTFLY ,30 /* dp_flythresh */ #endif DTFLY }; #ifdef DTHANG struct dtcmap { caddr_t dtc_base; int dtc_count; }; #endif DTHANG #endif KERNEL #endif STANDALONE