1/* 2 * $Id: ddp.h,v 1.2 2001-06-29 14:14:47 rufustfirefly Exp $ 3 * 4 * Copyright (c) 1990,1991 Regents of The University of Michigan. 5 * All Rights Reserved. See COPYRIGHT. 6 * 7 */ 8 9/* 10 * <-1byte(8bits) -> 11 * +---------------+ 12 * | 0 | hopc |len| 13 * +---------------+ 14 * | len (cont) | 15 * +---------------+ 16 * | | 17 * +- DDP csum -+ 18 * | | 19 * +---------------+ 20 * | | 21 * +- Dest NET -+ 22 * | | 23 * +---------------+ 24 * | | 25 * +- Src NET -+ 26 * | | 27 * +---------------+ 28 * | Dest NODE | 29 * +---------------+ 30 * | Src NODE | 31 * +---------------+ 32 * | Dest PORT | 33 * +---------------+ 34 * | Src PORT | 35 * +---------------+ 36 * 37 * On Apples, there is also a ddp_type field, after src_port. However, 38 * under this unix implementation, user level processes need to be able 39 * to set the ddp_type. In later revisions, the ddp_type may only be 40 * available in a raw_appletalk interface. 41 */ 42 43#ifndef _NETATALK_DDP_H 44#define _NETATALK_DDP_H 1 45 46#include <netatalk/endian.h> 47 48struct elaphdr { 49 u_char el_dnode; 50 u_char el_snode; 51 u_char el_type; 52}; 53 54#define SZ_ELAPHDR 3 55 56#define ELAP_DDPSHORT 0x01 57#define ELAP_DDPEXTEND 0x02 58 59/* 60 * Extended DDP header. Includes sickness for dealing with arbitrary 61 * bitfields on a little-endian arch. 62 */ 63struct ddpehdr { 64 union { 65 struct { 66#if BYTE_ORDER == BIG_ENDIAN 67 unsigned dub_pad:2; 68 unsigned dub_hops:4; 69 unsigned dub_len:10; 70 unsigned dub_sum:16; 71#else /* BYTE_ORDER == BIG_ENDIAN */ 72#if BYTE_ORDER == LITTLE_ENDIAN 73 unsigned dub_sum:16; 74 unsigned dub_len:10; 75 unsigned dub_hops:4; 76 unsigned dub_pad:2; 77#else /* BYTE_ORDER == LITTLE_ENDIAN */ 78 OOPS! 79#endif /* BYTE_ORDER == LITTLE_ENDIAN */ 80#endif /* BYTE_ORDER == BIG_ENDIAN */ 81 } du_bits; 82 unsigned du_bytes; 83 } deh_u; 84#define deh_pad deh_u.du_bits.dub_pad 85#define deh_hops deh_u.du_bits.dub_hops 86#define deh_len deh_u.du_bits.dub_len 87#define deh_sum deh_u.du_bits.dub_sum 88#define deh_bytes deh_u.du_bytes 89 u_short deh_dnet; 90 u_short deh_snet; 91 u_char deh_dnode; 92 u_char deh_snode; 93 u_char deh_dport; 94 u_char deh_sport; 95}; 96 97#define SZ_DDPEHDR 12 98 99#define DDP_MAXHOPS 15 100 101struct ddpshdr { 102 union { 103 struct { 104#if BYTE_ORDER == BIG_ENDIAN 105 unsigned dub_pad:6; 106 unsigned dub_len:10; 107 unsigned dub_dport:8; 108 unsigned dub_sport:8; 109#endif /* BYTE_ORDER == BIG_ENDIAN */ 110#if BYTE_ORDER == LITTLE_ENDIAN 111 unsigned dub_sport:8; 112 unsigned dub_dport:8; 113 unsigned dub_len:10; 114 unsigned dub_pad:6; 115#endif /* BYTE_ORDER == LITTLE_ENDIAN */ 116 } du_bits; 117 unsigned du_bytes; 118 } dsh_u; 119#define dsh_pad dsh_u.du_bits.dub_pad 120#define dsh_len dsh_u.du_bits.dub_len 121#define dsh_dport dsh_u.du_bits.dub_dport 122#define dsh_sport dsh_u.du_bits.dub_sport 123#define dsh_bytes dsh_u.du_bytes 124}; 125#define SZ_DDPSHDR 4 126 127#endif /* netatalk/ddp.h */ 128