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