xref: /trueos/sys/netatalk/ddp.h (revision 4b7d057bea2b5be36228b873bf858f8974e0de68)
1 /*-
2  * Copyright (c) 1990, 1991 Regents of The University of Michigan.
3  * All Rights Reserved.
4  *
5  * Permission to use, copy, modify, and distribute this software and
6  * its documentation for any purpose and without fee is hereby granted,
7  * provided that the above copyright notice appears in all copies and
8  * that both that copyright notice and this permission notice appear
9  * in supporting documentation, and that the name of The University
10  * of Michigan not be used in advertising or publicity pertaining to
11  * distribution of the software without specific, written prior
12  * permission. This software is supplied as is without expressed or
13  * implied warranties of any kind.
14  *
15  *	Research Systems Unix Group
16  *	The University of Michigan
17  *	c/o Mike Clark
18  *	535 W. William Street
19  *	Ann Arbor, Michigan
20  *	+1-313-763-0525
21  *	netatalk@itd.umich.edu
22  *
23  * $FreeBSD$
24  */
25 
26 #ifndef _NETATALK_DDP_H_
27 #define	_NETATALK_DDP_H_
28 
29 /*-
30  * <-1byte(8bits) ->
31  * +---------------+
32  * | 0 | hopc  |len|
33  * +---------------+
34  * | len (cont)    |
35  * +---------------+
36  * |               |
37  * +- DDP csum    -+
38  * |               |
39  * +---------------+
40  * |               |
41  * +- Dest NET    -+
42  * |               |
43  * +---------------+
44  * |               |
45  * +- Src NET     -+
46  * |               |
47  * +---------------+
48  * | Dest NODE     |
49  * +---------------+
50  * | Src NODE      |
51  * +---------------+
52  * | Dest PORT     |
53  * +---------------+
54  * | Src PORT      |
55  * +---------------+
56  *
57  * On Apples, there is also a ddp_type field, after src_port.  However, under
58  * this unix implementation, user level processes need to be able to set the
59  * ddp_type.  In later revisions, the ddp_type may only be available in a
60  * raw_appletalk interface.
61  */
62 
63 struct elaphdr {
64 	u_char	el_dnode;
65 	u_char	el_snode;
66 	u_char	el_type;
67 } __packed;
68 
69 #define	SZ_ELAPHDR	3
70 
71 #define	ELAP_DDPSHORT	0x01
72 #define	ELAP_DDPEXTEND	0x02
73 
74 /*
75  * Extended DDP header. Includes sickness for dealing with arbitrary
76  * bitfields on a little-endian arch.
77  */
78 struct ddpehdr {
79 	union {
80 		struct {
81 #if BYTE_ORDER == BIG_ENDIAN
82 			unsigned	dub_pad:2;
83 			unsigned	dub_hops:4;
84 			unsigned	dub_len:10;
85 			unsigned	dub_sum:16;
86 #endif
87 #if BYTE_ORDER == LITTLE_ENDIAN
88 			unsigned	dub_sum:16;
89 			unsigned	dub_len:10;
90 			unsigned	dub_hops:4;
91 			unsigned	dub_pad:2;
92 #endif
93 		} __packed du_bits;
94 		unsigned	du_bytes;
95 	} deh_u;
96 	u_short	deh_dnet;
97 	u_short	deh_snet;
98 	u_char	deh_dnode;
99 	u_char	deh_snode;
100 	u_char	deh_dport;
101 	u_char	deh_sport;
102 } __packed;
103 #define	deh_pad		deh_u.du_bits.dub_pad
104 #define	deh_hops	deh_u.du_bits.dub_hops
105 #define	deh_len		deh_u.du_bits.dub_len
106 #define	deh_sum		deh_u.du_bits.dub_sum
107 #define	deh_bytes	deh_u.du_bytes
108 
109 #define	DDP_MAXHOPS	15
110 
111 struct ddpshdr {
112 	union {
113 		struct {
114 #if BYTE_ORDER == BIG_ENDIAN
115 			unsigned	dub_pad:6;
116 			unsigned	dub_len:10;
117 			unsigned	dub_dport:8;
118 			unsigned	dub_sport:8;
119 #endif
120 #if BYTE_ORDER == LITTLE_ENDIAN
121 			unsigned	dub_sport:8;
122 			unsigned	dub_dport:8;
123 			unsigned	dub_len:10;
124 			unsigned	dub_pad:6;
125 #endif
126 		} __packed du_bits;
127 		unsigned	du_bytes;
128 	} dsh_u;
129 } __packed;
130 
131 #define	dsh_pad		dsh_u.du_bits.dub_pad
132 #define	dsh_len		dsh_u.du_bits.dub_len
133 #define	dsh_dport	dsh_u.du_bits.dub_dport
134 #define	dsh_sport	dsh_u.du_bits.dub_sport
135 #define	dsh_bytes	dsh_u.du_bytes
136 
137 #endif /* _NETATALK_DDP_H_ */
138