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