Annotation of 43BSDReno/sys/netiso/clnp.h, revision 1.1.1.1

1.1       root        1: 
                      2: /***********************************************************
                      3:                Copyright IBM Corporation 1987
                      4: 
                      5:                       All Rights Reserved
                      6: 
                      7: Permission to use, copy, modify, and distribute this software and its 
                      8: documentation for any purpose and without fee is hereby granted, 
                      9: provided that the above copyright notice appear in all copies and that
                     10: both that copyright notice and this permission notice appear in 
                     11: supporting documentation, and that the name of IBM not be
                     12: used in advertising or publicity pertaining to distribution of the
                     13: software without specific, written prior permission.  
                     14: 
                     15: IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     17: IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     21: SOFTWARE.
                     22: 
                     23: ******************************************************************/
                     24: 
                     25: /*
                     26:  * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
                     27:  */
                     28: /* $Header: /var/src/sys/netiso/RCS/clnp.h,v 5.1 89/02/09 16:17:22 hagens Exp $ */
                     29: /* $Source: /var/src/sys/netiso/RCS/clnp.h,v $ */
                     30: /*     @(#)clnp.h      7.6 (Berkeley) 4/5/90 */
                     31: 
                     32: #ifndef BYTE_ORDER
                     33: /*
                     34:  * Definitions for byte order,
                     35:  * according to byte significance from low address to high.
                     36:  */
                     37: #define        LITTLE_ENDIAN   1234    /* least-significant byte first (vax) */
                     38: #define        BIG_ENDIAN      4321    /* most-significant byte first (IBM, net) */
                     39: #define        PDP_ENDIAN      3412    /* LSB first in word, MSW first in long (pdp) */
                     40: 
                     41: #ifdef vax
                     42: #define        BYTE_ORDER      LITTLE_ENDIAN
                     43: #else
                     44: #define        BYTE_ORDER      BIG_ENDIAN      /* mc68000, tahoe, most others */
                     45: #endif
                     46: #endif BYTE_ORDER
                     47: 
                     48: /* should be config option but cpp breaks with too many #defines */
                     49: #define        DECBIT
                     50: 
                     51: /*
                     52:  *     Return true if the mbuf is a cluster mbuf
                     53:  */
                     54: #define        IS_CLUSTER(m)   ((m)->m_flags & M_EXT)
                     55: 
                     56: /*
                     57:  *     Move the halfword into the two characters
                     58:  */
                     59: #define        HTOC(msb, lsb, hword)\
                     60:        (msb) = (u_char)((hword) >> 8);\
                     61:        (lsb) = (u_char)((hword) & 0xff)
                     62: /*
                     63:  *     Move the two charcters into the halfword
                     64:  */
                     65: #define        CTOH(msb, lsb, hword)\
                     66:        (hword) = ((msb) << 8) | (lsb)
                     67: 
                     68: /*
                     69:  *     Return true if the checksum has been set - ie. the checksum is
                     70:  *     not zero
                     71:  */
                     72: #define        CKSUM_REQUIRED(clnp)\
                     73:        (((clnp)->cnf_cksum_msb != 0) || ((clnp)->cnf_cksum_lsb != 0))
                     74: 
                     75: /*
                     76:  *     Fixed part of clnp header
                     77:  */
                     78: struct clnp_fixed {
                     79:        u_char  cnf_proto_id;           /* network layer protocol identifier */
                     80:        u_char  cnf_hdr_len;            /* length indicator (octets) */
                     81:        u_char  cnf_vers;                       /* version/protocol identifier extension */
                     82:        u_char  cnf_ttl;                        /* lifetime (500 milliseconds) */
                     83:        u_char  cnf_type;                       /* type code */
                     84:                                                                /* Includes err_ok, more_segs, and seg_ok */
                     85:        u_char  cnf_seglen_msb;         /* pdu segment length (octets) high byte */
                     86:        u_char  cnf_seglen_lsb;         /* pdu segment length (octets) low byte */
                     87:        u_char  cnf_cksum_msb;          /* checksum high byte */
                     88:        u_char  cnf_cksum_lsb;          /* checksum low byte */
                     89: };
                     90: #define CNF_TYPE       0x1f
                     91: #define CNF_ERR_OK     0x20
                     92: #define CNF_MORE_SEGS  0x40
                     93: #define CNF_SEG_OK     0x80
                     94: 
                     95: #define CLNP_CKSUM_OFF 0x07    /* offset of checksum */
                     96: 
                     97: #define        clnl_fixed      clnp_fixed
                     98: 
                     99: /*
                    100:  *     Segmentation part of clnp header
                    101:  */
                    102: struct clnp_segment {
                    103:        u_short cng_id;                         /* data unit identifier */
                    104:        u_short cng_off;                        /* segment offset */
                    105:        u_short cng_tot_len;            /* total length */
                    106: };
                    107: 
                    108: /*
                    109:  *     Clnp fragment reassembly structures:
                    110:  *
                    111:  *     All packets undergoing reassembly are linked together in 
                    112:  *     clnp_fragl structures. Each clnp_fragl structure contains a
                    113:  *     pointer to the original clnp packet header, as well as a 
                    114:  *     list of packet fragments. Each packet fragment
                    115:  *     is headed by a clnp_frag structure. This structure contains the
                    116:  *     offset of the first and last byte of the fragment, as well as
                    117:  *     a pointer to the data (an mbuf chain) of the fragment.
                    118:  */
                    119: 
                    120: /*
                    121:  *     NOTE:
                    122:  *             The clnp_frag structure is stored in an mbuf immedately preceeding
                    123:  *     the fragment data. Since there are words in this struct,
                    124:  *     it must be word aligned. 
                    125:  *
                    126:  *     NOTE:
                    127:  *             All the fragment code assumes that the entire clnp header is 
                    128:  *     contained in the first mbuf.
                    129:  */
                    130: struct clnp_frag {
                    131:        u_int                           cfr_first;              /* offset of first byte of this frag */
                    132:        u_int                           cfr_last;               /* offset of last byte of this frag */
                    133:        u_int                           cfr_bytes;              /* bytes to shave to get to data */
                    134:        struct mbuf                     *cfr_data;              /* ptr to data for this frag */
                    135:        struct clnp_frag        *cfr_next;              /* next fragment in list */
                    136: };
                    137: 
                    138: struct clnp_fragl {
                    139:        struct iso_addr         cfl_src;                /* source of the pkt */
                    140:        struct iso_addr         cfl_dst;                /* destination of the pkt */
                    141:        u_short                         cfl_id;                 /* id of the pkt */
                    142:        u_char                          cfl_ttl;                /* current ttl of pkt */
                    143:        u_short                         cfl_last;               /* offset of last byte of packet */
                    144:        struct mbuf             *cfl_orighdr;   /* ptr to original header */
                    145:        struct clnp_frag        *cfl_frags;             /* linked list of fragments for pkt */
                    146:        struct clnp_fragl       *cfl_next;              /* next pkt being reassembled */
                    147: };
                    148: 
                    149: /*
                    150:  *     The following structure is used to index into an options section
                    151:  *     of a clnp datagram. These values can be used without worry that
                    152:  *     offset or length fields are invalid or too big, etc. That is,
                    153:  *     the consistancy of the options will be guaranteed before this
                    154:  *     structure is filled in. Any pointer (field ending in p) is
                    155:  *     actually the offset from the beginning of the mbuf the option
                    156:  *     is contained in.  A value of NULL for any pointer
                    157:  *     means that the option is not present. The length any option
                    158:  *     does not include the option code or option length fields.
                    159:  */
                    160: struct clnp_optidx {
                    161:        u_short cni_securep;            /* ptr to beginning of security option */
                    162:        char    cni_secure_len;         /* length of entire security option */
                    163: 
                    164:        u_short cni_srcrt_s;            /* offset of start of src rt option */
                    165:        u_short cni_srcrt_len;          /* length of entire src rt option */
                    166: 
                    167:        u_short cni_recrtp;                     /* ptr to beginning of recrt option */
                    168:        char    cni_recrt_len;          /* length of entire recrt option */
                    169: 
                    170:        char    cni_priorp;                     /* ptr to priority option */
                    171: 
                    172:        u_short cni_qos_formatp;        /* ptr to format of qos option */
                    173:        char    cni_qos_len;            /* length of entire qos option */
                    174: 
                    175:        u_char  cni_er_reason;          /* reason from ER pdu option */
                    176: 
                    177:                                                                /* ESIS options */
                    178: 
                    179:        u_short cni_esct;                       /* value from ISH ESCT option */
                    180: 
                    181:        u_short cni_netmaskp;           /* ptr to beginning of netmask option */
                    182:        char    cni_netmask_len;                /* length of entire netmask option */
                    183: 
                    184:        u_short cni_snpamaskp;          /* ptr to beginning of snpamask option */
                    185:        char    cni_snpamask_len;               /* length of entire snpamask option */
                    186: 
                    187: };
                    188: 
                    189: #define        ER_INVALREAS    0xff    /* code for invalid ER pdu discard reason */
                    190: 
                    191: /* given an mbuf and addr of option, return offset from data of mbuf */
                    192: #define CLNP_OPTTOOFF(m, opt)\
                    193:        ((u_short) (opt - mtod(m, caddr_t)))
                    194: 
                    195: /* given an mbuf and offset of option, return address of option */
                    196: #define CLNP_OFFTOOPT(m, off)\
                    197:        ((caddr_t) (mtod(m, caddr_t) + off))
                    198: 
                    199: /*     return true iff src route is valid */
                    200: #define        CLNPSRCRT_VALID(oidx)\
                    201:        ((oidx) && (oidx->cni_srcrt_s))
                    202: 
                    203: /*     return the offset field of the src rt */
                    204: #define CLNPSRCRT_OFF(oidx, options)\
                    205:        (*((u_char *)(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s) + 1)))
                    206: 
                    207: /*     return the type field of the src rt */
                    208: #define CLNPSRCRT_TYPE(oidx, options)\
                    209:        ((u_char)(*(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s))))
                    210: 
                    211: /* return the length of the current address */
                    212: #define CLNPSRCRT_CLEN(oidx, options)\
                    213:        ((u_char)(*(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s) + CLNPSRCRT_OFF(oidx, options) - 1)))
                    214: 
                    215: /* return the address of the current address */
                    216: #define CLNPSRCRT_CADDR(oidx, options)\
                    217:        ((caddr_t)(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s) + CLNPSRCRT_OFF(oidx, options)))
                    218: 
                    219: /* 
                    220:  *     return true if the src route has run out of routes
                    221:  *     this is true if the offset of next route is greater than the end of the rt 
                    222:  */
                    223: #define        CLNPSRCRT_TERM(oidx, options)\
                    224:        (CLNPSRCRT_OFF(oidx, options) > oidx->cni_srcrt_len)
                    225: 
                    226: /*
                    227:  *     Options a user can set/get
                    228:  */
                    229: #define        CLNPOPT_FLAGS   0x01    /* flags: seg permitted, no er xmit, etc  */
                    230: #define        CLNPOPT_OPTS    0x02    /* datagram options */
                    231: 
                    232: /*
                    233:  *     Values for particular datagram options
                    234:  */
                    235: #define        CLNPOVAL_PAD            0xcc    /* padding */
                    236: #define        CLNPOVAL_SECURE         0xc5    /* security */
                    237: #define        CLNPOVAL_SRCRT          0xc8    /* source routing */
                    238: #define        CLNPOVAL_RECRT          0xcb    /* record route */
                    239: #define        CLNPOVAL_QOS            0xc3    /* quality of service */
                    240: #define        CLNPOVAL_PRIOR          0xcd    /* priority */
                    241: #define CLNPOVAL_ERREAS                0xc1    /* ER PDU ONLY: reason for discard */
                    242: 
                    243: #define        CLNPOVAL_SRCSPEC        0x40    /* source address specific */
                    244: #define        CLNPOVAL_DSTSPEC        0x80    /* destination address specific */
                    245: #define        CLNPOVAL_GLOBAL         0xc0    /* globally unique */
                    246: 
                    247: /* Globally Unique QOS */
                    248: #define        CLNPOVAL_SEQUENCING     0x10    /* sequencing preferred */
                    249: #define CLNPOVAL_CONGESTED     0x08    /* congestion experienced */
                    250: #define CLNPOVAL_LOWDELAY      0x04    /* low transit delay */
                    251: 
                    252: #define        CLNPOVAL_PARTRT         0x00    /* partial source routing */
                    253: #define CLNPOVAL_COMPRT                0x01    /* complete source routing */
                    254: 
                    255: /*
                    256:  *     Clnp flags used in a control block flags field. 
                    257:  *     NOTE: these must be out of the range of bits defined in ../net/raw_cb.h
                    258:  */
                    259: #define        CLNP_NO_SEG             0x010   /* segmentation not permitted */
                    260: #define        CLNP_NO_ER              0x020   /* do not generate ERs */
                    261: #define CLNP_SEND_RAW  0x080   /* send pkt as RAW DT rather than TP DT */
                    262: #define        CLNP_NO_CKSUM   0x100   /* don't use clnp checksum */
                    263: #define CLNP_ECHO              0x200   /* fake echo function */
                    264: #define        CLNP_NOCACHE    0x400   /* don't store cache information */
                    265: 
                    266: /* valid clnp flags */
                    267: #define CLNP_VFLAGS            (CLNP_SEND_RAW|CLNP_NO_SEG|CLNP_NO_ER|CLNP_NO_CKSUM\
                    268:        |CLNP_ECHO|CLNP_NOCACHE)
                    269: 
                    270: /* 
                    271:  *     Constants used by clnp
                    272:  */
                    273: #define        CLNP_HDR_MIN    (sizeof (struct clnp_fixed))
                    274: #define        CLNP_HDR_MAX    (254)
                    275: #define        CLNP_TTL_UNITS  2                                       /* 500 milliseconds */
                    276: #define CLNP_TTL               15*CLNP_TTL_UNITS       /* time to live (seconds) */
                    277: #define        ISO8473_V1              0x01
                    278: 
                    279: /*
                    280:  *     Clnp packet types
                    281:  *     In order to test raw clnp and tp/clnp simultaneously, a third type of
                    282:  *     packet has been defined: CLNP_RAW. This is done so that the input
                    283:  *     routine can switch to the correct input routine (rclnp_input or
                    284:  *     tpclnp_input) based on the type field. If clnp had a higher level protocol
                    285:  *     field, this would not be necessary.
                    286:  */
                    287: #define        CLNP_DT                 0x1C    /* normal data */
                    288: #define        CLNP_ER                 0x01    /* error report */
                    289: #define        CLNP_RAW                0x1D    /* debug only */
                    290: #define CLNP_EC                        0x1E    /* echo packet */
                    291: #define CLNP_ECR               0x1F    /* echo reply */
                    292: 
                    293: /*
                    294:  *     ER pdu error codes
                    295:  */
                    296: #define GEN_NOREAS                     0x00    /* reason not specified */
                    297: #define GEN_PROTOERR           0x01    /* protocol procedure error */
                    298: #define GEN_BADCSUM                    0x02    /* incorrect checksum */
                    299: #define GEN_CONGEST                    0x03    /* pdu discarded due to congestion */
                    300: #define GEN_HDRSYNTAX          0x04    /* header syntax error */
                    301: #define GEN_SEGNEEDED          0x05    /* segmentation needed, but not permitted */
                    302: #define GEN_INCOMPLETE         0x06    /* incomplete pdu received */
                    303: #define GEN_DUPOPT                     0x07    /* duplicate option */
                    304: 
                    305: /* address errors */
                    306: #define ADDR_DESTUNREACH       0x80    /* destination address unreachable */
                    307: #define ADDR_DESTUNKNOWN       0x81    /* destination address unknown */
                    308: 
                    309: /* source routing */
                    310: #define SRCRT_UNSPECERR                0x90    /* unspecified src rt error */
                    311: #define SRCRT_SYNTAX           0x91    /* syntax error in src rt field */
                    312: #define SRCRT_UNKNOWNADDR      0x92    /* unknown addr in src rt field */
                    313: #define SRCRT_BADPATH          0x93    /* path not acceptable */
                    314: 
                    315: /* lifetime */
                    316: #define TTL_EXPTRANSIT         0xa0    /* lifetime expired during transit */
                    317: #define TTL_EXPREASS           0xa1    /* lifetime expired during reassembly */
                    318: 
                    319: /* pdu discarded */
                    320: #define DISC_UNSUPPOPT         0xb0    /* unsupported option not specified? */
                    321: #define DISC_UNSUPPVERS                0xb1    /* unsupported protocol version */
                    322: #define DISC_UNSUPPSECURE      0xb2    /* unsupported security option */
                    323: #define DISC_UNSUPPSRCRT       0xb3    /* unsupported src rt option */
                    324: #define DISC_UNSUPPRECRT       0xb4    /* unsupported rec rt option */
                    325: 
                    326: /* reassembly */
                    327: #define REASS_INTERFERE                0xc0    /* reassembly interference */
                    328: #define CLNP_ERRORS            22
                    329: 
                    330: 
                    331: #ifdef KERNEL
                    332: int clnp_er_index();
                    333: #endif
                    334: 
                    335: #ifdef CLNP_ER_CODES
                    336: u_char clnp_er_codes[CLNP_ERRORS] =  {
                    337: GEN_NOREAS, GEN_PROTOERR, GEN_BADCSUM, GEN_CONGEST,
                    338: GEN_HDRSYNTAX, GEN_SEGNEEDED, GEN_INCOMPLETE, GEN_DUPOPT,
                    339: ADDR_DESTUNREACH, ADDR_DESTUNKNOWN,
                    340: SRCRT_UNSPECERR, SRCRT_SYNTAX, SRCRT_UNKNOWNADDR, SRCRT_BADPATH,
                    341: TTL_EXPTRANSIT, TTL_EXPREASS,
                    342: DISC_UNSUPPOPT, DISC_UNSUPPVERS, DISC_UNSUPPSECURE,
                    343: DISC_UNSUPPSRCRT, DISC_UNSUPPRECRT, REASS_INTERFERE };
                    344: #endif
                    345: 
                    346: #ifdef TROLL
                    347: 
                    348: #define        TR_DUPEND               0x01    /* duplicate end of fragment */
                    349: #define TR_DUPPKT              0x02    /* duplicate entire packet */
                    350: #define        TR_DROPPKT              0x04    /* drop packet on output */
                    351: #define TR_TRIM                        0x08    /* trim bytes from packet */
                    352: #define TR_CHANGE              0x10    /* change bytes in packet */
                    353: #define TR_MTU                 0x20    /* delta to change device mtu */
                    354: #define        TR_CHUCK                0x40    /* drop packet in rclnp_input */
                    355: #define        TR_BLAST                0x80    /* force rclnp_output to blast many packet */
                    356: #define        TR_RAWLOOP              0x100   /* make if_loop call clnpintr directly */
                    357: struct troll {
                    358:        int             tr_ops;                         /* operations to perform */
                    359:        float   tr_dup_size;            /* % to duplicate */
                    360:        float   tr_dup_freq;            /* frequency to duplicate packets */
                    361:        float   tr_drop_freq;           /* frequence to drop packets */
                    362:        int             tr_mtu_adj;                     /* delta to adjust if mtu */
                    363:        int             tr_blast_cnt;           /* # of pkts to blast out */
                    364: };
                    365: 
                    366: #define        SN_OUTPUT(clcp, m)\
                    367:        troll_output(clcp->clc_ifa->ia_ifp, m, clcp->clc_firsthop, clcp->clc_rt)
                    368: 
                    369: #define        SN_MTU(ifp)\
                    370:        (ifp->if_mtu - trollctl.tr_mtu_adj)
                    371: 
                    372: #ifdef KERNEL
                    373: extern float troll_random;
                    374: #endif
                    375: 
                    376: #else  /* NO TROLL */
                    377: 
                    378: #define        SN_OUTPUT(clcp, m)\
                    379:        (*clcp->clc_ifa->ia_ifp->if_output)(clcp->clc_ifa->ia_ifp, m, clcp->clc_firsthop, clcp->clc_rt)
                    380: 
                    381: #define        SN_MTU(ifp)\
                    382:        (ifp->if_mtu)
                    383: 
                    384: #endif TROLL
                    385: 
                    386: /*
                    387:  *     Macro to remove an address from a clnp header
                    388:  */
                    389: #define CLNP_EXTRACT_ADDR(isoa, hoff, hend)\
                    390:        {\
                    391:                isoa.isoa_len = (u_char)*hoff;\
                    392:                if ((((++hoff) + isoa.isoa_len) > hend) ||\
                    393:                        (isoa.isoa_len > 20) || (isoa.isoa_len == 0)) {\
                    394:                        hoff = (caddr_t)0;\
                    395:                } else {\
                    396:                        (void) bcopy(hoff, (caddr_t)isoa.isoa_genaddr, isoa.isoa_len);\
                    397:                        hoff += isoa.isoa_len;\
                    398:                }\
                    399:        }
                    400: 
                    401: /*
                    402:  *     Macro to insert an address into a clnp header
                    403:  */
                    404: #define CLNP_INSERT_ADDR(hoff, isoa)\
                    405:        *hoff++ = (isoa).isoa_len;\
                    406:        (void) bcopy((caddr_t)((isoa).isoa_genaddr), hoff, (isoa).isoa_len);\
                    407:        hoff += (isoa).isoa_len;
                    408: 
                    409: /*
                    410:  *     Clnp hdr cache. Whenever a clnp packet is sent, a copy of the
                    411:  *     header is made and kept in this cache. In addition to a copy of
                    412:  *     the cached clnp hdr, the cache contains
                    413:  *     information necessary to determine whether the new packet
                    414:  *     to send requires a new header to be built.
                    415:  */
                    416: struct clnp_cache {
                    417:        /* these fields are used to check the validity of the cache */
                    418:        struct iso_addr         clc_dst;                /* destination of packet */
                    419:        struct mbuf             *clc_options;   /* ptr to options mbuf */
                    420:        int                                     clc_flags;              /* flags passed to clnp_output */
                    421: 
                    422:        /* these fields are state that clnp_output requires to finish the pkt */
                    423:        int                                     clc_segoff;             /* offset of seg part of header */
                    424:        struct sockaddr         *clc_firsthop;  /* first hop of packet (points into
                    425:                                                                                        the route structure) */
                    426:        struct iso_ifaddr       *clc_ifa;               /* ptr to interface (points into
                    427:                                                                                        the route structure) */
                    428:        struct rtentry          *clc_rt;                /* ptr to rtentry (points into
                    429:                                                                                        the route structure) */
                    430:        struct mbuf             *clc_hdr;               /* cached pkt hdr (finally)! */
                    431: };
                    432: 
                    433: #ifndef        satosiso
                    434: #define        satosiso(sa)\
                    435:        ((struct sockaddr_iso *)(sa))
                    436: #endif
                    437: 
                    438: #ifdef KERNEL
                    439: caddr_t                        clnp_insert_addr();
                    440: struct iso_addr        *clnp_srcaddr();
                    441: struct mbuf            *clnp_reass();
                    442: #ifdef TROLL
                    443: struct troll   trollctl;
                    444: #endif TROLL
                    445: #endif KERNEL

unix.superglobalmegacorp.com

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