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

unix.superglobalmegacorp.com

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