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