]> git.saurik.com Git - apple/xnu.git/blame - bsd/netat/appletalk.h
xnu-201.42.3.tar.gz
[apple/xnu.git] / bsd / netat / appletalk.h
CommitLineData
1c79356b
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22/*
23 *
24 * ORIGINS: 82
25 *
26 * (C) COPYRIGHT Apple Computer, Inc. 1992-1996
27 * All Rights Reserved
28 *
29 */
30
31/* Miscellaneous definitions for AppleTalk used by all protocol
32 * modules.
33 */
34
35#ifndef _NETAT_APPLETALK_H_
36#define _NETAT_APPLETALK_H_
37
38#include <sys/types.h>
39#include <sys/uio.h>
40
41/*
42 Non-aligned types are used in packet headers.
43*/
44
45/* New fundemental types: non-aligned variations of u_short and u_long */
46typedef u_char ua_short[2]; /* Unaligned short */
47typedef u_char ua_long[4]; /* Unaligned long */
48
49/* Two at_net typedefs; the first is aligned the other isn't */
50typedef u_short at_net_al; /* Aligned AppleTalk network number */
51typedef ua_short at_net_unal; /* Unaligned AppleTalk network number */
52
53/* Miscellaneous types */
54typedef u_char at_node; /* AppleTalk node number */
55typedef u_char at_socket; /* AppleTalk socket number */
56
57typedef at_net_unal at_net; /* Default: Unaligned AppleTalk network number */
58struct atalk_addr {
59 u_char atalk_unused;
60 at_net atalk_net;
61 at_node atalk_node;
62};
63
64/* Macros to manipulate unaligned fields */
65#define UAS_ASSIGN(x,s) *(unsigned short *) &(x[0]) = (unsigned short) (s)
66#define UAS_UAS(x,y) *(unsigned short *) &(x[0]) = *(unsigned short *) &(y[0])
67#define UAS_VALUE(x) (*(unsigned short *) &(x[0]))
68#define UAL_ASSIGN(x,l) *(unsigned long *) &(x[0]) = (unsigned long) (l)
69#define UAL_UAL(x,y) *(unsigned long *) &(x[0]) = *(unsigned long *) &(y[0])
70#define UAL_VALUE(x) (*(unsigned long *) &(x[0]))
71
72/* Macros to manipulate at_net variables */
73#define NET_ASSIGN(x,s) *(unsigned short *)&(x[0]) = (unsigned short)(s)
74#define NET_NET(x, y) *(unsigned short *)&(x[0]) = *(unsigned short *)&(y[0])
75#define NET_VALUE(x) (*(unsigned short *) &(x[0]))
76#define ATALK_ASSIGN(a, net, node, unused ) \
77 a.atalk_unused = unused; a.atalk_node = node; NET_ASSIGN(a.atalk_net, net)
78
79#define NET_EQUAL(a, b) (NET_VALUE(a) == NET_VALUE(b))
80#define NET_NOTEQ(a, b) (NET_VALUE(a) != NET_VALUE(b))
81#define NET_EQUAL0(a) (NET_VALUE(a) == 0)
82#define NET_NOTEQ0(a) (NET_VALUE(a) != 0)
83
84
85/*
86 AppleTalk Internet Address
87*/
88
89typedef struct at_inet {
90 u_short net; /* Network Address */
91 u_char node; /* Node number */
92 u_char socket; /* Socket number */
93} at_inet_t;
94
95/*
96 DDP Address for OT
97*/
98
99typedef struct ddp_addr {
100 at_inet_t inet;
101 u_short ddptype;
102} ddp_addr_t;
103
104/*
105 AppleTalk address
106*/
107
108struct at_addr {
109 u_short s_net; /* 16-bit network address */
110 u_char s_node; /* 8-bit node # (1-0xfd) */
111};
112
113/*
114 Appletalk sockaddr definition
115*/
116struct sockaddr_at {
117 u_char sat_len; /* total length */
118 u_char sat_family; /* address family (AF_APPLETALK) */
119 u_char sat_port; /* 8-bit "socket number" */
120 struct at_addr sat_addr; /* 16-bit "net" and 8-bit "node */
121 char sat_zero[8]; /* used for netrange in netatalk */
122};
123
124#define ATADDR_ANYNET (u_short)0x0000
125#define ATADDR_ANYNODE (u_char)0x00
126#define ATADDR_ANYPORT (u_char)0x00
127
128#define ATADDR_BCASTNODE (u_char)0xff /* There is no BCAST for NET */
129
130/* make sure the net, node and socket numbers are in legal range :
131 *
132 * Net# 0 Local Net
133 * 1 - 0xfffe Legal net nos
134 * 0xffff Reserved by Apple for future use.
135 * Node# 0 Illegal
136 * 1 - 0x7f Legal (user node id's)
137 * 0x80 - 0xfe Legal (server node id's; 0xfe illegal in
138 * Phase II nodes)
139 * 0xff Broadcast
140 * Socket# 0 Illegal
141 * 1 - 0xfe Legal
142 * 0xff Illegal
143 */
144#define valid_at_addr(addr) \
145 ((!(addr) || (addr)->net == 0xffff || (addr)->node == 0 || \
146 (addr)->socket == 0 || (addr)->socket == 0xff)? 0: 1)
147
148/*** * ETHERTYPE_ definitions are in netinet/if_ether.h *** */
149#define ETHERTYPE_AT 0x809B /* AppleTalk protocol */
150#define ETHERTYPE_AARP 0x80F3 /* AppleTalk ARP */
151
152/*
153 DDP protocol types
154*/
155
156#define DDP_RTMP 0x01
157#define DDP_NBP 0x02
158#define DDP_ATP 0x03
159#define DDP_ECHO 0x04
160#define DDP_RTMP_REQ 0x05
161#define DDP_ZIP 0x06
162#define DDP_ADSP 0x07
163
164/*
165 Protocols for the socket API
166*/
167
168#define ATPROTO_NONE 0 /* no corresponding DDP type exists */
169
170#define ATPROTO_ATP DDP_ATP /* must match DDP type */
171#define ATPROTO_ADSP DDP_ADSP /* must match DDP type */
172
173#define ATPROTO_DDP 249 /* *** to be eliminated eventually *** */
174#define ATPROTO_LAP 250 /* *** to be eliminated eventually *** */
175
176#define ATPROTO_AURP 251 /* no corresponding DDP type exists */
177#define ATPROTO_ASP 252 /* no corresponding DDP type exists */
178#define ATPROTO_AFP 253 /* no corresponding DDP type exists */
179
180#define ATPROTO_RAW 255 /* no corresponding DDP type exists */
181
182/*
183 Options for use with [gs]etsockopt at the DDP level.
184 First word of comment is data type; bool is stored in int.
185*/
186#define DDP_CHKSUM_ON 1 /* int; default = FALSE;
187 DDP checksums should be used */
188#define DDP_HDRINCL 2 /* int; default = FALSE;
189 header is included with data */
190#define DDP_GETSOCKNAME 3 /* used to get ddp_addr_t */
191#define DDP_SLFSND_ON 4 /* int; default = FALSE;
192 packets sent to the cable-multicast address
193 on this socket will be looped back */
194#define DDP_STRIPHDR 5 /* int; default = FALSE;
195 drop DDP header on receive (raw) */
196
197/*
198 AppleTalk protocol retry and timeout
199*/
200
201typedef struct at_retry {
202 short interval; /* Retry interval in seconds */
203 short retries; /* Maximum number of retries */
204 u_char backoff; /* Retry backoff, must be 1 through 4 */
205} at_retry_t;
206
207/*
208 Basic NBP Definitions needed for AppleTalk framework
209*/
210
211#define MAX_ZONES 50
212
213#define NBP_NVE_STR_SIZE 32 /* Maximum NBP tuple string size */
214typedef struct at_nvestr {
215 u_char len;
216 u_char str[NBP_NVE_STR_SIZE];
217} at_nvestr_t;
218
219/* Entity Name */
220typedef struct at_entity {
221 at_nvestr_t object;
222 at_nvestr_t type;
223 at_nvestr_t zone;
224} at_entity_t;
225
226#define NBP_TUPLE_SIZE ((3*NBP_NVE_STR_SIZE)+3)
227 /* 3 for field lengths + 3*32 for three names */
228typedef struct at_nbptuple {
229 at_inet_t enu_addr;
230 u_char enu_enum;
231 at_entity_t enu_entity;
232} at_nbptuple_t;
233
234/*
235 Basic ATP Definitions needed for LibcAT
236*/
237
238#define ATP_TRESP_MAX 8 /* Maximum number of Tresp pkts */
239
240/* Response buffer structure for atp_sendreq() and atp_sendrsp() */
241typedef struct at_resp {
242 u_char bitmap; /* Bitmap of responses */
243 u_char filler[3]; /* Force 68K to RISC alignment */
244 struct iovec resp[ATP_TRESP_MAX]; /* Buffer for response data */
245 long userdata[ATP_TRESP_MAX]; /* Buffer for response user data */
246} at_resp_t;
247
248/*
249 Needed for ASP and ADSP
250*/
251
252typedef struct {
253 int maxlen; /* max buffer length */
254 int len; /* length of data */
255 char *buf; /* pointer to buffer */
256} strbuf_t;
257
258#define IFID_HOME 1 /* home port in ifID_table */
259
260#define ATALK_VALUE(a) ((*(u_long *) &(a))&0x00ffffff)
261#define ATALK_EQUAL(a, b) (ATALK_VALUE(a) == ATALK_VALUE(b))
262
263#define VERSION_LENGTH 80 /* length of version string */
264
265/* struture containing general information regarding the state of
266 * the Appletalk networking
267 */
268typedef struct at_state {
269 unsigned int flags; /* various init flags */
270} at_state_t;
271
272/* at_state_t 'flags' defines */
273#define AT_ST_STARTED 0x0001
274#define AT_ST_MULTIHOME 0x0080 /* set if multihome mode */
275#define AT_ST_ROUTER 0x0100 /* set if we are a router */
276#define AT_ST_IF_CHANGED 0x0200 /* set when state of any I/F
277 changes (for SNMP) */
278#define AT_ST_RT_CHANGED 0x0400 /* route table changed (for SNMP)*/
279#define AT_ST_ZT_CHANGED 0x0800 /* zone table changed (for SNMP) */
280#define AT_ST_NBP_CHANGED 0x1000 /* if nbp table changed (for SNMP)*/
281
282#ifdef KERNEL
283extern at_state_t at_state; /* global state of AT network */
284
285#define ROUTING_MODE (at_state.flags & AT_ST_ROUTER)
286#define MULTIHOME_MODE (at_state.flags & AT_ST_MULTIHOME)
287#define MULTIPORT_MODE (ROUTING_MODE || MULTIHOME_MODE)
288#endif /* KERNEL */
289
290/* defines originally from h/at_elap.h */
291#define AT_ADDR 0
292#define ET_ADDR 1
293#define AT_ADDR_NO_LOOP 2 /* disables packets from looping back */
294
295#endif /* _NETAT_APPLETALK_H_ */