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