Annotation of researchv8dc/sys/chaos/chaos.h, revision 1.1

1.1     ! root        1: #ifndef _CHAOS_
        !             2: #define _CHAOS_
        !             3: /*
        !             4:  * Accomodate Ritchie C compiler...
        !             5:  */
        !             6: #ifdef pdp11
        !             7: #ifndef lint
        !             8: #ifndef void
        !             9: #define void int
        !            10: #endif
        !            11: #endif
        !            12: #endif
        !            13: #include "../chaos/constants.h"
        !            14: /*
        !            15:  * System and device independent include file for the Chaosnet NCP
        !            16:  */
        !            17: 
        !            18: /*
        !            19:  * A chaos index - a hosts connection identifier
        !            20:  */
        !            21: typedef        union   {
        !            22:        unsigned short  ci_idx;         /* Index as a whole */
        !            23:        struct  {
        !            24:                unsigned char   ci_Tidx;        /* Connection table index */
        !            25:                unsigned char   ci_Uniq;        /* Uniquizer for table slot */
        !            26:        }               ci_bytes;
        !            27: } chindex;
        !            28: #define ci_uniq        ci_bytes.ci_Uniq
        !            29: #define ci_tidx        ci_bytes.ci_Tidx
        !            30: 
        !            31: /*
        !            32:  * A chaos network address.
        !            33:  */
        !            34: typedef        union   {
        !            35:        unsigned short          ch_addr;        /* Address as a whole */
        !            36:        struct  {
        !            37:                unsigned char   ch_Host;        /* Host number on subnet */
        !            38:                unsigned char   ch_Subnet;      /* Subnet number */
        !            39:        }               ch_bytes;
        !            40: } chaddr;
        !            41: #define ch_subnet      ch_bytes.ch_Subnet
        !            42: #define ch_host                ch_bytes.ch_Host
        !            43: /*
        !            44:  * A chaosnet clock time - wrapsaround
        !            45:  */
        !            46: typedef unsigned short chtime;
        !            47: /*
        !            48:  * This is the part of the packet which is only for use by the ncp.
        !            49:  * It is not transmitted over the network
        !            50:  * NOTE that this structure is assumed to be at least 8 bytes by
        !            51:  * the Interlan Ethernet driver, and assumed to be at most 8 bytes
        !            52:  * by the storage allocator!!!!!  GGAAAAAAAAAAAGGGHHH
        !            53:  */
        !            54: struct ncp_header      {
        !            55:        struct packet   *nh_next;       /* Link to next packet on this list */
        !            56:        chtime          nh_time;        /* Last time packet was processed */
        !            57:        chaddr          nh_xdest;       /* Routed destination address */
        !            58: };
        !            59: /*
        !            60:  * This is the part of the packet header that is transmitted over the
        !            61:  * network, thus must have fixed, portable format from ncp to ncp
        !            62:  */
        !            63: struct pkt_header      {
        !            64:        unsigned char           ph_type;        /* Protocol type */
        !            65:        unsigned char           ph_op;          /* Opcode of the packet */
        !            66:        union {
        !            67:                unsigned short  ph_lfcwhole;
        !            68:                struct  {
        !            69:                        unsigned short ph_Len:12;       /* Length of packet */
        !            70:                        unsigned short ph_fcount:4;     /* Forwarding count */
        !            71:                }       ph_lfcparts;
        !            72:        }               ph_lenfc;
        !            73:        chaddr          ph_daddr;               /* Destination address */
        !            74:        chindex         ph_didx;                /* Destination index */
        !            75:        chaddr          ph_saddr;               /* Source address */
        !            76:        chindex         ph_sidx;                /* Source index */
        !            77:        unsigned short  ph_pkn;                 /* Packet number */
        !            78:        unsigned short  ph_ackn;                /* Acknowledged packet number */
        !            79: };
        !            80: #define ph_len ph_lenfc.ph_lfcparts.ph_Len
        !            81: /* This is the actual structure of a packet in core */
        !            82: struct packet  {
        !            83:        struct ncp_header       pk_nhead;       /* NCP specific information */
        !            84:        struct pkt_header       pk_phead;       /* Network header */
        !            85:        union   {
        !            86:                char            pk_Cdata[sizeof(short)];/* Character data */
        !            87:                short           pk_Idata[1];    /* word data */
        !            88:                long            pk_Ldata[1];    /* long data */
        !            89:                struct sts_data {               /* data of STS packets */
        !            90:                        unsigned short  pk_Receipt;
        !            91:                        unsigned short  pk_Rwsize;
        !            92:                }               pk_stsdata;
        !            93:                struct rut_data {               /* data of RUT packets */
        !            94:                        unsigned short  pk_subnet;
        !            95:                        unsigned short  pk_cost;
        !            96:                }               pk_Rutdata[1];
        !            97:                struct status   {
        !            98: #define CHSTNAME 32
        !            99:                        char    sb_name[CHSTNAME];
        !           100:                        struct  statdata {
        !           101:                                struct stathead {
        !           102:                                        unsigned short  sb_Ident;
        !           103:                                        unsigned short  sb_Nshorts;
        !           104:                                }               sb_head;
        !           105:                                union {
        !           106:                                        struct statxcvr {
        !           107:                                                long    sx_Rcvd;
        !           108:                                                long    sx_Xmtd;
        !           109:                                                long    sx_Abrt;
        !           110:                                                long    sx_Lost;
        !           111:                                                long    sx_Crcr;
        !           112:                                                long    sx_Crci;
        !           113:                                                long    sx_Leng;
        !           114:                                                long    sx_Rej;
        !           115:                                        }               sb_Xstat;
        !           116:                                }                       sb_union;
        !           117:                        }                               sb_data[1];
        !           118:                }               pk_Status;
        !           119:        }                       pk_data;
        !           120: };
        !           121: 
        !           122: #define NOPKT          ((struct packet *)0)
        !           123: #define CHHEADSIZE     (sizeof(struct ncp_header)+sizeof(struct pkt_header))
        !           124: #define pkalloc(x,y)   ((struct packet *)ch_alloc((x)+CHHEADSIZE,(y)))
        !           125: /*
        !           126:  * Allocate an NCP packet given the number of shorts in the received packet.
        !           127:  */
        !           128: #define hpkalloc(nshorts)      ((struct packet *)ch_alloc((int) \
        !           129:                                ((nshorts) /* * sizeof(short) */ << 1) + \
        !           130:                                sizeof(struct ncp_header), 1))
        !           131: 
        !           132: /* macros for accessing packets fields */
        !           133: #define pk_next                pk_nhead.nh_next
        !           134: #define pk_time                pk_nhead.nh_time
        !           135: #define pk_xdest       pk_nhead.nh_xdest.ch_addr
        !           136: #define pk_type                pk_phead.ph_type
        !           137: #define pk_op          pk_phead.ph_op
        !           138: #define pk_len         pk_phead.ph_len
        !           139: #define pk_fc          pk_phead.ph_lenfc.ph_lfcparts.ph_fcount
        !           140: #define pk_lenword     pk_phead.ph_lenfc.ph_lfcwhole
        !           141: #define pk_daddr       pk_phead.ph_daddr.ch_addr
        !           142: #define pk_dhost       pk_phead.ph_daddr.ch_host
        !           143: #define pk_dsubnet     pk_phead.ph_daddr.ch_subnet
        !           144: #define pk_didx                pk_phead.ph_didx.ci_idx
        !           145: #define pk_dtindex     pk_phead.ph_didx.ci_tidx
        !           146: #define pk_saddr       pk_phead.ph_saddr.ch_addr
        !           147: #define pk_shost       pk_phead.ph_saddr.ch_host
        !           148: #define pk_ssubnet     pk_phead.ph_saddr.ch_subnet
        !           149: #define pk_sidx                pk_phead.ph_sidx.ci_idx
        !           150: #define pk_stindex     pk_phead.ph_sidx.ci_tidx
        !           151: #define pk_suniq       pk_phead.ph_sidx.ci_uniq
        !           152: #define pk_pkn         pk_phead.ph_pkn
        !           153: #define pk_ackn                pk_phead.ph_ackn
        !           154: #define pk_cdata       pk_data.pk_Cdata
        !           155: #define pk_idata       pk_data.pk_Idata
        !           156: #define pk_ldata       pk_data.pk_Ldata
        !           157: #define pk_receipt     pk_data.pk_stsdata.pk_Receipt
        !           158: #define pk_rwsize      pk_data.pk_stsdata.pk_Rwsize
        !           159: #define pk_rutdata     pk_data.pk_Rutdata
        !           160: #define pk_status      pk_data.pk_Status
        !           161: #define sb_ident       sb_head.sb_Ident
        !           162: #define sb_nshorts     sb_head.sb_Nshorts
        !           163: #define sb_xstat       sb_union.sb_Xstat
        !           164: 
        !           165: #define ISDATOP(pkt)   (((pkt)->pk_op & DATOP) != 0)
        !           166: #define CONTPKT(pkt)   (ISDATOP(pkt) || (pkt)->pk_op == RFCOP || \
        !           167:                        (pkt)->pk_op == OPNOP || (pkt)->pk_op == EOFOP)
        !           168: /* Here are the packet types */
        !           169: #define PKNML  00              /* Normal */
        !           170: #define PKLSN  01              /* Listen list packet */
        !           171: /*
        !           172:  * This is the connection structure. These are allocated in a packet of the
        !           173:  * appropriate size
        !           174:  */
        !           175: struct connection {
        !           176:        struct  csys_header cn_syshead; /* System dependent info  */
        !           177:        unsigned char   cn_flags;       /* Random flags */
        !           178:        unsigned char   cn_state;       /* State of the connection */
        !           179:        chtime  cn_active;      /* Last time connection was active */
        !           180:        chaddr  cn_Faddr;               /* Foreign address */
        !           181:        chindex cn_Fidx;                /* Foreign index */
        !           182:        chindex cn_Lidx;                /* Local index */
        !           183: 
        !           184:        /* transmit side state */
        !           185:        unsigned short  cn_twsize;      /* Transmit window size */
        !           186:        unsigned short  cn_tlast;       /* Last packet we sent */
        !           187:        unsigned short  cn_trecvd;      /* Last pkt receipted by him */
        !           188:        unsigned short  cn_tacked;      /* Last pkt acked by him */
        !           189:        struct packet   *cn_thead;      /* Head of list of pkts transmitted */
        !           190:        struct packet   *cn_ttail;      /* Tail of list of pkts transmitted */
        !           191: #ifdef CHSTRCODE
        !           192:        struct packet   *cn_toutput;    /* Pkt being filled for output */
        !           193:                                        /* NOT a list, just one packet */
        !           194:        unsigned short  cn_troom;       /* Room left in cn_toutput packet */
        !           195:                                        /* pk_len shows current fill level */
        !           196: #endif
        !           197:        /* receive side state */
        !           198:        unsigned short  cn_rwsize;      /* Receive window size */
        !           199:        unsigned short  cn_rlast;       /* Last pkt rcvd (in order) */
        !           200:        unsigned short  cn_racked;      /* Last pkt acked by us */
        !           201:        unsigned short  cn_rread;       /* Last pkt read by our user */
        !           202:        unsigned short  cn_rsts;        /* Max rread-racked before auto STS */
        !           203: #ifdef CHSTRCODE
        !           204:        unsigned short  cn_roffset;     /* read offset in current packet */
        !           205:                                        /* which is conn->cn_rhead */
        !           206: #endif
        !           207:        struct packet   *cn_rhead;      /* Head of ordered rcvd pkts */
        !           208:        struct packet   *cn_rtail;      /* Tail of ordered received packets */
        !           209:        struct packet   *cn_routorder;  /* list of out of order packets */
        !           210: };
        !           211: 
        !           212: #define cn_fidx                        cn_Fidx.ci_idx
        !           213: #define cn_faddr               cn_Faddr.ch_addr
        !           214: #define cn_fhost               cn_Faddr.ch_host
        !           215: #define cn_fsubnet             cn_Faddr.ch_subnet
        !           216: #define cn_lidx                        cn_Lidx.ci_idx
        !           217: #define cn_ltidx               cn_Lidx.ci_tidx
        !           218: #define cn_luniq               cn_Lidx.ci_uniq
        !           219: 
        !           220: /* bit values for cn_flags */
        !           221: #ifdef CHSTRCODE
        !           222: #define CHEOFSEEN      1       /* EOF packet received and acknowledged */
        !           223: #endif
        !           224: #define CHANSWER       2       /* This connection should send an ANS pkt */
        !           225: 
        !           226: /* macros for certain connection states */
        !           227: 
        !           228: #define chtfull(conn)  ((conn)->cn_state == CSOPEN && \
        !           229:                         (short)((conn)->cn_tlast - (conn)->cn_tacked) >= \
        !           230:                                (conn)->cn_twsize)
        !           231: #define chtempty(conn) ((conn)->cn_state != CSOPEN || \
        !           232:                         (conn)->cn_tlast == (conn)->cn_tacked)
        !           233: #define chrempty(conn) ((conn)->cn_rhead == NOPKT && \
        !           234:                         (conn)->cn_state == CSOPEN)
        !           235: 
        !           236: 
        !           237: #define NOCONN         ((struct connection *)0)
        !           238: #define connalloc()    ((struct connection *)ch_alloc(sizeof(struct connection),0))
        !           239: /*
        !           240:  * These are unsigned comparisons
        !           241:  * all the casting is necessary due to compiler flakiness with shorts etc.
        !           242:  * cmp_lt(a,b) is true if a < b, cmp_le(a,b) if a <= b, cmp_gt(a,b) if a > b
        !           243:  * and cmp_ge(a,b) if a >= b
        !           244:  */
        !           245: #define cmp_gt(a,b) (0100000 & (b - a))
        !           246: #define cmp_ge(a,b) !(cmp_lt(a,b)
        !           247: #define cmp_lt(a,b) cmp_gt(b, a)
        !           248: #define cmp_le(a,b) !cmp_gt(a,b)
        !           249: /* codes for error returns in various places - needs cleaning up somewhat */
        !           250: 
        !           251: #define CHERROR                -1
        !           252: #define CHEOF          -2
        !           253: #define CHNOPKT                -3      /* No packets */
        !           254: #define CHNOCONN       -4      /* No connections */
        !           255: #define CHCTIMEOUT     -5      /* Time out */
        !           256: #define CHTEMP         -6
        !           257: 
        !           258: /*
        !           259:  * Network interface structure.
        !           260:  *
        !           261:  * There is one chxcvr structure for each interface connected to this host,
        !           262:  * all of which are defined in the file "chconf.c". The xcinfo is a union
        !           263:  * of structures needed for each device type's device dependent state.
        !           264:  * This union should be defined in "chconf.h"
        !           265:  * The bottom level device driver routines define arrays of these structures
        !           266:  * one per interface of a given type and find the structure appropriate
        !           267:  * to a given interface by indexing on the device number given in the
        !           268:  * interrupt vector.  The top level gets at an chxcvr structure through
        !           269:  * the routing table.
        !           270:  * The ttime and rtime values are for timing-out hung transmitters or
        !           271:  * receivers.  The drivers must ensure that tpkt and rpkt are only nonzero
        !           272:  * when there is really a packet being received or transmitted.  This may
        !           273:  * be partly useless for dma (or other packet-atomic) interfaces.
        !           274:  */
        !           275: struct chxcvr  {
        !           276:        struct packet   *xc_list;       /* Packets to be transmitted */
        !           277:        struct packet   *xc_tail;       /* Tail of xc_list */
        !           278:        struct packet   *xc_tpkt;       /* Packet being transmitted */
        !           279:        struct packet   *xc_rpkt;       /* Packet being received */
        !           280:        chtime          xc_ttime;       /* Time tpkt begun transmission */
        !           281:        chtime          xc_rtime;       /* Time rpkt began reception */
        !           282:        chaddr          xc_Addr;        /* Address of this interface */
        !           283:        unsigned        *xc_devaddr;    /* Device address (UNIBUS) */
        !           284:        int             (*xc_start)();  /* Start routine for idle xmtr */
        !           285:        int             (*xc_reset)();  /* Reset routine for interface */
        !           286:        struct statxcvr xc_xstat;       /* Xcvr metering */
        !           287:        union xcinfo    xc_info;        /* Device dependent info */
        !           288: };
        !           289: #define xc_addr                xc_Addr.ch_addr
        !           290: #define xc_subnet      xc_Addr.ch_subnet
        !           291: #define xc_host                xc_Addr.ch_host
        !           292: #define xc_rcvd                xc_xstat.sx_Rcvd
        !           293: #define xc_xmtd                xc_xstat.sx_Xmtd
        !           294: #define xc_crcr                xc_xstat.sx_Crcr
        !           295: #define xc_crci                xc_xstat.sx_Crci
        !           296: #define xc_lost                xc_xstat.sx_Lost
        !           297: #define xc_leng                xc_xstat.sx_Leng
        !           298: #define xc_rej         xc_xstat.sx_Rej
        !           299: #define xc_abrt                xc_xstat.sx_Abrt
        !           300: 
        !           301: #define NOXCVR         ((struct chxcvr *)0)
        !           302: /*
        !           303:  * Routing table entry structure.
        !           304:  * One per subnet possibly accessible from this host.
        !           305:  * Entries for directly connected subnets point to hardware
        !           306:  * transceiver structure (rt_type == CHDIRECT).
        !           307:  * Bridges (rt_type == CHFIXED or CHBRIDGE) have address of
        !           308:  * directly connected bridges.
        !           309:  */
        !           310: struct chroute {
        !           311:        union {
        !           312:                struct chxcvr   *rt_Xcvr;       /* interface to use */
        !           313:                chaddr          rt_Addr;        /* bridge address */
        !           314:        }                       rt_u;
        !           315:        unsigned char           rt_type;        /* type of access */
        !           316:        unsigned short          rt_cost;        /* cost of access path */
        !           317: };
        !           318: #define rt_xcvr                rt_u.rt_Xcvr
        !           319: #define rt_addr                rt_u.rt_Addr.ch_addr
        !           320: #define rt_host                rt_u.rt_Addr.ch_host
        !           321: #define rt_subnet      rt_u.rt_Addr.ch_subnet
        !           322: 
        !           323: /* values for rt_type */
        !           324: #define CHNOPATH       0       /* No path to this subnet yet (now) */
        !           325: #define        CHDIRECT        1       /* Either chaos cable or other hardware */
        !           326: #define CHFIXED                2       /* Unvarying bridge */
        !           327: #define CHBRIDGE       3       /* Bridge - known via RUT packet */
        !           328: /* initial values for rt_cost depending on rt_type */
        !           329: #define CHDCOST                10      /* Directly connected hardware (ala dr11) */
        !           330: #define CHCCOST                16      /* Chaos cable connection (ether) */
        !           331: #define CHACOST                20      /* Async or other slow link */
        !           332: #define CHHCOST                512     /* "high" cost */
        !           333: 
        !           334: /* definition of globals */
        !           335: 
        !           336: #ifdef CHDEFINE
        !           337: #define EXTERN
        !           338: #      ifdef DEBUG
        !           339:        int                     Chdebug = 0;
        !           340: #      endif
        !           341: #else
        !           342: #define EXTERN extern
        !           343: #      ifdef DEBUG
        !           344:        EXTERN int              Chdebug;
        !           345: #      endif
        !           346: #endif CHDEFINE
        !           347: EXTERN int                     Chaos_error;
        !           348: EXTERN struct connection       *Chconntab[CHNCONNS];   /* connection table */
        !           349: EXTERN chtime                  Chclock;        /* clock (mod ??) */
        !           350: EXTERN struct packet           *Chlsnlist,     /* listening connections */
        !           351:                                *Chrfclist,     /* list of unmatched rfc's */
        !           352:                                *Chrfctail;     /* tail of same list */
        !           353: EXTERN struct chroute          Chroutetab[CHNSUBNET];  /* subnet routing table */
        !           354: EXTERN int                     Chhz;           /* Hertz of clock */
        !           355: EXTERN int                     Chrfcrcv;       /* Flag for rfc reader */
        !           356: extern short                   Chmyaddr;       /* This ncp'c host number */
        !           357: extern char                    Chmyname[];     /* This ncp's host name */
        !           358: 
        !           359: extern char            *ch_alloc();
        !           360: extern struct packet   *pktstr(), *ch_rnext(), *xmitnext();
        !           361: extern struct connection *allconn(), *ch_open(), *ch_listen();
        !           362: 
        !           363: /* debugging instrumentation */
        !           364: 
        !           365: #ifdef DEBUG
        !           366: 
        !           367: #define debug(a,b)     if(Chdebug&(a)) b; else /* expect a ; after! */
        !           368: 
        !           369: #define DALLOC 1       /* Allocation tracing */
        !           370: #define DTRANS 2       /* Transmitter tracing */
        !           371: #define DCONN  4       /* Connection activity */
        !           372: #define DPKT   8       /* Print packets */
        !           373: #define DNOCLK 16      /* No clock timeouts */
        !           374: #define DABNOR 32      /* Abnormal events */
        !           375: #define DSEND  64      /* Trace each packet sent */
        !           376: 
        !           377: #else
        !           378: #define debug(a,b)
        !           379: #endif
        !           380: 
        !           381: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.