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
63struct 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 */
78struct 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
111struct 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