Annotation of embedaddon/quagga/isisd/include-netbsd/clnp.h, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>