Annotation of XNU/bsd/netat/atp.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  *
        !            24:  * ORIGINS: 82
        !            25:  *
        !            26:  * (C) COPYRIGHT Apple Computer, Inc. 1992-1996
        !            27:  * All Rights Reserved
        !            28:  *
        !            29:  */                                                                   
        !            30: 
        !            31: /* Definitions for ATP protocol and streams module, per 
        !            32:  * AppleTalk Transaction Protocol documentation from
        !            33:  * `Inside AppleTalk', July 14, 1986.
        !            34:  */
        !            35: 
        !            36: /*
        !            37:  *     Copyright (c) 1988, 1989 Apple Computer, Inc. 
        !            38:  *
        !            39:  *     The information contained herein is subject to change without
        !            40:  *     notice and  should not be  construed as a commitment by Apple
        !            41:  *     Computer, Inc. Apple Computer, Inc. assumes no responsibility
        !            42:  *     for any errors that may appear.
        !            43:  *
        !            44:  *     Confidential and Proprietary to Apple Computer, Inc.
        !            45:  */
        !            46: 
        !            47: #ifndef _NETAT_ATP_H_
        !            48: #define _NETAT_ATP_H_
        !            49: 
        !            50: /* ATP function codes */
        !            51: 
        !            52: #define ATP_CMD_TREQ           0x01    /* TRequest packet  */
        !            53: #define ATP_CMD_TRESP          0x02    /* TResponse packet */
        !            54: #define ATP_CMD_TREL           0x03    /* TRelease packet  */
        !            55: 
        !            56: /* Miscellaneous definitions */
        !            57: 
        !            58: #define        ATP_DEF_RETRIES     8   /* Default for maximum retry count */
        !            59: #define        ATP_DEF_INTERVAL    2   /* Default for retry interval in seconds */
        !            60: 
        !            61: #define ATP_TRESP_MAX       8  /* Maximum number of Tresp pkts */
        !            62: 
        !            63: #define ATP_HDR_SIZE        8          /* Size of the ATP header */
        !            64: #define ATP_DATA_SIZE       578        /* Maximum size of the ATP data area */
        !            65: 
        !            66: /* Consts for asynch support */
        !            67: #define        ATP_ASYNCH_REQ  1
        !            68: #define        ATP_ASYNCH_RESP 2
        !            69: 
        !            70: /* Timer values for XO release timers */
        !            71: #define        ATP_XO_DEF_REL_TIME     0
        !            72: #define        ATP_XO_30SEC            0
        !            73: #define        ATP_XO_1MIN             1
        !            74: #define        ATP_XO_2MIN             2
        !            75: #define        ATP_XO_4MIN             3
        !            76: #define        ATP_XO_8MIN             4
        !            77: 
        !            78: typedef struct {
        !            79:         unsigned       cmd : 2,
        !            80:                        xo : 1,
        !            81:                        eom : 1,
        !            82:                        sts : 1,
        !            83:                        xo_relt : 3;
        !            84:         u_char         bitmap;
        !            85:        ua_short       tid;
        !            86:         ua_long        user_bytes;
        !            87:         u_char         data[ATP_DATA_SIZE];
        !            88: } at_atp_t;
        !            89: 
        !            90: #define ATP_ATP_HDR(c) ((at_atp_t *)(&((at_ddp_t *)(c))->data[0]))
        !            91: 
        !            92: #define TOTAL_ATP_HDR_SIZE    (ATP_HDR_SIZE+DDP_X_HDR_SIZE)
        !            93: #define ATP_CLEAR_CONTROL(c)  (*(char *)(c) = 0)
        !            94: 
        !            95: /* ATP ioctl interface */
        !            96: 
        !            97: /* Structure for the atp_set_default call */
        !            98: 
        !            99: #define        ATP_INFINITE_RETRIES    0xffffffff      /* means retry forever
        !           100:                                                 * in the def_retries field
        !           101:                                                 */
        !           102: 
        !           103: struct atp_set_default {
        !           104:        u_int   def_retries;            /* number of retries for a request */
        !           105:        u_int   def_rate;               /* retry rate (in seconds/100) NB: the
        !           106:                                         * system may not be able to resolve
        !           107:                                         * delays of 100th of a second but will
        !           108:                                         * instead make a 'best effort'
        !           109:                                         */
        !           110:        struct atpBDS *def_bdsp; /*  BDS structure associated with this req */
        !           111:        u_int   def_BDSlen;     /* size of BDS structure */
        !           112: };
        !           113: 
        !           114: 
        !           115: /* Return header from requests */
        !           116: 
        !           117: struct atp_result {
        !           118:        u_short         count;          /* the number of packets */
        !           119:        u_short         hdr;            /* offset to header in buffer */
        !           120:        u_short         offset[8];      /* offset to the Nth packet in the buffer */
        !           121:        u_short         len[8];         /* length of the Nth packet */
        !           122: };
        !           123: 
        !           124: struct atpBDS {
        !           125:        ua_short        bdsBuffSz;
        !           126:        ua_long         bdsBuffAddr;
        !           127:        ua_short        bdsDataSz;
        !           128:        unsigned char   bdsUserData[4];
        !           129: };
        !           130: 
        !           131: 
        !           132: typedef struct {
        !           133:         u_short        at_atpreq_type;
        !           134:         at_inet_t      at_atpreq_to;
        !           135:         u_char         at_atpreq_treq_user_bytes[4];
        !           136:         u_char         *at_atpreq_treq_data;
        !           137:         u_short        at_atpreq_treq_length;
        !           138:         u_char         at_atpreq_treq_bitmap;
        !           139:         u_char         at_atpreq_xo;
        !           140:         u_char         at_atpreq_xo_relt;
        !           141:         u_short        at_atpreq_retry_timeout;
        !           142:         u_short        at_atpreq_maximum_retries;
        !           143:         u_char         at_atpreq_tresp_user_bytes[ATP_TRESP_MAX][4];
        !           144:         u_char         *at_atpreq_tresp_data[ATP_TRESP_MAX];
        !           145:         u_short        at_atpreq_tresp_lengths[ATP_TRESP_MAX];
        !           146:         u_long         at_atpreq_debug[4];
        !           147:         u_short        at_atpreq_tid;
        !           148:         u_char         at_atpreq_tresp_bitmap;
        !           149:         u_char         at_atpreq_tresp_eom_seqno;
        !           150:         u_char         at_atpreq_got_trel;
        !           151: } at_atpreq;
        !           152: 
        !           153: 
        !           154: /* The ATP module ioctl commands */
        !           155: 
        !           156: #define AT_ATP_CANCEL_REQUEST          (('|'<<8)|1)
        !           157: #define AT_ATP_ISSUE_REQUEST           (('|'<<8)|2) /* ALO */
        !           158: #define AT_ATP_ISSUE_REQUEST_DEF       (('|'<<8)|3) /* XO */
        !           159: #define AT_ATP_ISSUE_REQUEST_DEF_NOTE  (('|'<<8)|4) /* XO & nowait -- not needed*/
        !           160: #define AT_ATP_ISSUE_REQUEST_NOTE      (('|'<<8)|5) /* ALO & nowait */
        !           161: #define AT_ATP_GET_POLL                        (('|'<<8)|6)
        !           162: #define AT_ATP_RELEASE_RESPONSE                (('|'<<8)|7)
        !           163: #define AT_ATP_REQUEST_COMPLETE                (('|'<<8)|8)
        !           164: #define AT_ATP_SEND_FULL_RESPONSE      (('|'<<8)|9) /* not used */
        !           165: #define AT_ATP_BIND_REQ                        (('|'<<8)|10)
        !           166: #define AT_ATP_GET_CHANID              (('|'<<8)|11)
        !           167: #define AT_ATP_PEEK                    (('|'<<8)|12)
        !           168: #define AT_ATP_ISSUE_REQUEST_TICKLE    (('|'<<8)|13) /* ALO & nowait */
        !           169: 
        !           170: /* These macros don't really depend here, but since they're used only by the
        !           171:  * old ATP and old PAP, they're put here.  Unisoft PAP includes this file.
        !           172:  */
        !           173: #define        R16(x)          UAS_VALUE(x)
        !           174: #define        W16(x,v)        UAS_ASSIGN(x, v)
        !           175: #define        C16(x,v)        UAS_UAS(x, v)
        !           176: 
        !           177: /*
        !           178:  * these are the dispatch codes for
        !           179:  * the new atp_control system call
        !           180:  */
        !           181: #define ATP_SENDREQUEST  0
        !           182: #define ATP_GETRESPONSE  1
        !           183: #define ATP_SENDRESPONSE 2
        !           184: #define ATP_GETREQUEST   3
        !           185: 
        !           186: #ifdef KERNEL
        !           187: 
        !           188: 
        !           189: 
        !           190: /*
        !           191:  *     Stuff for accessing protocol headers 
        !           192:  */
        !           193: #define AT_DDP_HDR(m) ((at_ddp_t *)(gbuf_rptr(m)))
        !           194: #define AT_ATP_HDR(m) ((at_atp_t *)(&((at_ddp_t *)(gbuf_rptr(m)))->data[0]))
        !           195: 
        !           196: /*
        !           197:  *     Masks for accessing/manipulating the bitmap field in atp headers
        !           198:  */
        !           199: 
        !           200: #ifdef ATP_DECLARE
        !           201: unsigned char atp_mask [] = {
        !           202:        0x01, 0x02, 0x04, 0x08, 
        !           203:        0x10, 0x20, 0x40, 0x80, 
        !           204: };
        !           205: 
        !           206: unsigned char atp_lomask [] = {
        !           207:        0x00, 0x01, 0x03, 0x07, 
        !           208:        0x0f, 0x1f, 0x3f, 0x7f, 
        !           209:        0xff
        !           210: };
        !           211: #else
        !           212: extern unsigned char atp_mask [];
        !           213: extern unsigned char atp_lomask [];
        !           214: #endif /* ATP_DECLARE */
        !           215: 
        !           216: /*
        !           217:  *     doubly linked queue types and primitives
        !           218:  */
        !           219: 
        !           220: #define ATP_Q_ENTER(hdr, object, entry) {                                      \
        !           221:                if ((hdr).head) {                                               \
        !           222:                        (hdr).head->entry.prev = (object);                      \
        !           223:                        (object)->entry.next = (hdr).head;                      \
        !           224:                } else {                                                        \
        !           225:                        (hdr).tail = (object);                                  \
        !           226:                        (object)->entry.next = NULL;                            \
        !           227:                }                                                               \
        !           228:                (object)->entry.prev = NULL;                                    \
        !           229:                (hdr).head = (object);                                          \
        !           230:        }
        !           231: 
        !           232: #define ATP_Q_APPEND(hdr, object, entry) {                                     \
        !           233:                if ((hdr).head) {                                               \
        !           234:                        (hdr).tail->entry.next = (object);                      \
        !           235:                        (object)->entry.prev = (hdr).tail;                      \
        !           236:                } else {                                                        \
        !           237:                        (hdr).head = (object);                                  \
        !           238:                        (object)->entry.prev = NULL;                            \
        !           239:                }                                                               \
        !           240:                (object)->entry.next = NULL;                                    \
        !           241:                (hdr).tail = (object);                                          \
        !           242:        }
        !           243: 
        !           244: #define ATP_Q_REMOVE(hdr, object, entry) {                                     \
        !           245:                if ((object)->entry.prev) {                                     \
        !           246:                        (object)->entry.prev->entry.next = (object)->entry.next;\
        !           247:                } else {                                                        \
        !           248:                        (hdr).head = (object)->entry.next;                      \
        !           249:                }                                                               \
        !           250:                if ((object)->entry.next) {                                     \
        !           251:                        (object)->entry.next->entry.prev = (object)->entry.prev;\
        !           252:                } else {                                                        \
        !           253:                        (hdr).tail = (object)->entry.prev;                      \
        !           254:                }                                                               \
        !           255:        }
        !           256: 
        !           257: struct atp_rcb_qhead {
        !           258:        struct atp_rcb  *head;
        !           259:        struct atp_rcb  *tail;
        !           260: };
        !           261: 
        !           262: struct atp_rcb_q {
        !           263:        struct atp_rcb *prev;
        !           264:        struct atp_rcb *next;
        !           265: };
        !           266: 
        !           267: struct atp_trans_qhead {
        !           268:        struct atp_trans *head;
        !           269:        struct atp_trans *tail;
        !           270: };
        !           271: 
        !           272: struct atp_trans_q {
        !           273:        struct atp_trans *prev;
        !           274:        struct atp_trans *next;
        !           275: };
        !           276: 
        !           277: /*
        !           278:  *     Locally saved remote node address
        !           279:  */
        !           280: 
        !           281: struct atp_socket {
        !           282:        u_short         net;
        !           283:        at_node         node;
        !           284:        at_socket       socket;
        !           285: };
        !           286: 
        !           287: /*
        !           288:  *     transaction control block (local context at requester end)
        !           289:  */
        !           290: 
        !           291: struct atp_trans {
        !           292:        struct atp_trans_q      tr_list;                /* trans list */
        !           293:        struct atp_state        *tr_queue;              /* state data structure */
        !           294:        gbuf_t                  *tr_xmt;                /* message being sent */
        !           295:        gbuf_t                  *tr_rcv[8];             /* message being rcvd */
        !           296:        unsigned int            tr_retry;               /* # retries left */
        !           297:        unsigned int            tr_timeout;             /* timer interval */
        !           298:        char                    tr_state;               /* current state */
        !           299:        char                    tr_rsp_wait;            /* waiting for transaction response */
        !           300:        char                    filler[2];
        !           301:        unsigned char           tr_xo;                  /* execute once transaction */
        !           302:        unsigned char           tr_bitmap;              /* requested bitmask */
        !           303:        unsigned short          tr_tid;                 /* transaction id */
        !           304:        struct atp_socket       tr_socket;              /* the remote socket id */
        !           305:        struct atp_trans_q      tr_snd_wait;            /* list of transactions waiting
        !           306:                                                           for space to send a msg */
        !           307:        at_socket               tr_local_socket;
        !           308:        at_node                 tr_local_node;
        !           309:        at_net                  tr_local_net;
        !           310:        gbuf_t                  *tr_bdsp;               /* bds structure pointer */
        !           311:        unsigned int            tr_tmo_delta;
        !           312:        void                            (*tr_tmo_func)();
        !           313:        struct atp_trans        *tr_tmo_next;
        !           314:        struct atp_trans        *tr_tmo_prev;
        !           315:        atlock_t tr_lock;
        !           316:        atevent_t tr_event;
        !           317: };
        !           318: 
        !           319: #define        TRANS_TIMEOUT           0       /* waiting for a reply */
        !           320: #define        TRANS_REQUEST           1       /* waiting to send a request */
        !           321: #define        TRANS_RELEASE           2       /* waiting to send a release */
        !           322: #define        TRANS_DONE              3       /* done - waiting for poll to complete */
        !           323: #define        TRANS_FAILED            4       /* done - waiting for poll to report failure */
        !           324: 
        !           325: /*
        !           326:  *     reply control block (local context at repling end)
        !           327:  */
        !           328: 
        !           329: struct atp_rcb {
        !           330:        struct atp_rcb_q        rc_list;                /* rcb list */
        !           331:        struct atp_rcb_q        rc_tlist;
        !           332:        struct atp_state        *rc_queue;              /* state data structure */
        !           333:        gbuf_t                  *rc_xmt;                /* replys being sent */
        !           334:        gbuf_t                  *rc_ioctl;              /* waiting ioctl */
        !           335:        char                    rc_snd[8];              /* replys actually to be sent */
        !           336:        int                     rc_pktcnt;              /* no of pkts in this trans */
        !           337:        short                   rc_state;               /* current state */
        !           338:        unsigned char           rc_xo;                  /* execute once transaction */
        !           339:        at_node                 rc_local_node;
        !           340:        at_net                  rc_local_net;
        !           341:        short                   rc_rep_waiting;         /* in the reply wait list */
        !           342:        int                     rc_timestamp;           /* reply timer */
        !           343:        unsigned char           rc_bitmap;              /* replied bitmask */
        !           344:        unsigned char           rc_not_sent_bitmap;     /* replied bitmask */
        !           345:        unsigned short          rc_tid;                 /* transaction id */
        !           346:        struct atp_socket       rc_socket;              /* the remote socket id */
        !           347: };
        !           348: 
        !           349: #define RCB_UNQUEUED           0       /* newly allocated, not q'd */
        !           350: #define RCB_RESPONDING         2       /* waiting all of response from process*/
        !           351: #define RCB_RESPONSE_FULL      3       /* got all of response */
        !           352: #define RCB_RELEASED           4       /* got our release */
        !           353: #define RCB_PENDING            5       /* a no wait rcb is full */
        !           354: #define RCB_NOTIFIED           6
        !           355: #define RCB_SENDING            7       /* we're currently xmitting this trans */
        !           356: 
        !           357: /*
        !           358:  *     socket state (per module data structure)
        !           359:  */
        !           360: 
        !           361: struct atp_state {
        !           362:        gref_t          *atp_gref;      /* must be the first entry */
        !           363:        int             atp_pid;        /* process id, must be the second entry */
        !           364:        gbuf_t          *atp_msgq;      /* data msg, must be the third entry */
        !           365:        unsigned char   dflag;          /* structure flag, must be the fourth entry */
        !           366:        unsigned char   filler;
        !           367:        short   atp_socket_no;
        !           368:        short   atp_flags;              /* general flags */
        !           369:        struct atp_trans_qhead  atp_trans_wait;         /* pending transaction list */
        !           370:        struct atp_state        *atp_trans_waiting;     /* list of atps waiting for a
        !           371:                                                           free transaction */
        !           372:        unsigned int            atp_retry;              /* retry count */
        !           373:        unsigned int            atp_timeout;            /* retry timeout */
        !           374:        struct atp_state        *atp_rcb_waiting;
        !           375:        struct atp_rcb_qhead    atp_rcb;                /* active rcbs */
        !           376:        struct atp_rcb_qhead    atp_attached;           /* rcb's waiting to be read */
        !           377:        atlock_t atp_lock;
        !           378:        atevent_t atp_event;
        !           379:        atlock_t atp_delay_lock;
        !           380:        atevent_t atp_delay_event;
        !           381: };
        !           382: 
        !           383: 
        !           384: /*
        !           385:  *     atp_state flag definitions
        !           386:  */
        !           387: #define ATP_CLOSING  0x08        /* atp stream in process of closing */
        !           388: 
        !           389: 
        !           390: /*
        !           391:  *     tcb/rcb/state allocation queues
        !           392:  */
        !           393: 
        !           394: /*
        !           395:  * Size defines; must be outside following #ifdef to permit
        !           396:  *  debugging code to reference independent of ATP_DECLARE
        !           397:  */
        !           398: #define        NATP_RCB        512     /* the number of ATP RCBs at once */
        !           399: #define NATP_STATE     192     /* the number of ATP sockets open at once */
        !           400:                                /* note: I made NATP_STATE == NSOCKETS */
        !           401: 
        !           402: #ifdef ATP_DECLARE
        !           403: struct atp_trans *atp_trans_free_list = NULL;  /* free transactions */
        !           404: struct atp_rcb *atp_rcb_free_list = NULL;      /* free rcbs */
        !           405: static struct atp_state *atp_free_list = NULL;         /* free atp states */
        !           406: static struct atp_rcb atp_rcb_data[NATP_RCB];
        !           407: static struct atp_state atp_state_data[NATP_STATE];
        !           408: 
        !           409: #else
        !           410: extern struct atp_trans *atp_trans_free_list;          /* free transactions */
        !           411: extern struct atp_rcb *atp_rcb_free_list;              /* free rcbs */
        !           412: extern struct atp_state *atp_free_list;                        /* free atp states */
        !           413: extern struct atp_rcb atp_rcb_data[];
        !           414: extern struct atp_state atp_state_data[];
        !           415: 
        !           416: extern void atp_req_timeout();
        !           417: extern void atp_rcb_timer();
        !           418: extern void atp_x_done();
        !           419: extern struct atp_rcb *atp_rcb_alloc();
        !           420: extern struct atp_trans *atp_trans_alloc();
        !           421: #endif /* ATP_DECLARE */
        !           422: 
        !           423: /* prototypes */
        !           424: void atp_send_req(gref_t *, gbuf_t *);
        !           425: void atp_drop_req(gref_t *, gbuf_t *);
        !           426: void atp_send_rsp(gref_t *, gbuf_t *, int);
        !           427: void atp_wput(gref_t *, gbuf_t *);
        !           428: void atp_rput(gref_t *, gbuf_t *);
        !           429: void atp_retry_req(gbuf_t *);
        !           430: void atp_stop(gbuf_t *, int);
        !           431: void atp_cancel_req(gref_t *, unsigned short);
        !           432: int atp_open(gref_t *, int);
        !           433: int atp_bind(gref_t *, unsigned int, unsigned char *);
        !           434: int atp_close(gref_t *, int);
        !           435: gbuf_t *atp_build_release(struct atp_trans *);
        !           436: void atp_req_timeout(struct atp_trans *);
        !           437: void atp_free(struct atp_trans *);
        !           438: void atp_x_done(struct atp_trans *);
        !           439: void atp_send(struct atp_trans *);
        !           440: void atp_rsp_ind(struct atp_trans *, gbuf_t *);
        !           441: void atp_trans_free(struct atp_trans *);
        !           442: void atp_reply(struct atp_rcb *);
        !           443: void atp_rcb_free(struct atp_rcb *);
        !           444: void atp_send_replies(struct atp_state *, struct atp_rcb *);
        !           445: void atp_dequeue_atp(struct atp_state *);
        !           446: int atp_iocack(struct atp_state *, gbuf_t *);
        !           447: void atp_req_ind(struct atp_state *, gbuf_t *);
        !           448: int atp_iocnak(struct atp_state *, gbuf_t *, int);
        !           449: void atp_trp_timer(void *, int);
        !           450: void atp_timout(void (*func)(), struct atp_trans *, int);
        !           451: void atp_untimout(void (*func)(), struct atp_trans *);
        !           452: int atp_tid(struct atp_state *);
        !           453: 
        !           454: #endif /* KERNEL */
        !           455: #endif /* _NETAT_ATP_H_ */

unix.superglobalmegacorp.com

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