|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.