|
|
1.1 root 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 */
46: typedef u_char ua_short[2]; /* Unaligned short */
47: typedef u_char ua_long[4]; /* Unaligned long */
48:
49: /* Two at_net typedefs; the first is aligned the other isn't */
50: typedef u_short at_net_al; /* Aligned AppleTalk network number */
51: typedef ua_short at_net_unal; /* Unaligned AppleTalk network number */
52:
53: /* Miscellaneous types */
54: typedef u_char at_node; /* AppleTalk node number */
55: typedef u_char at_socket; /* AppleTalk socket number */
56:
57: typedef at_net_unal at_net; /* Default: Unaligned AppleTalk network number */
58: struct 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:
89: typedef 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:
99: typedef struct ddp_addr {
100: at_inet_t inet;
101: u_short ddptype;
102: } ddp_addr_t;
103:
104: /*
105: AppleTalk address
106: */
107:
108: struct 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: */
116: struct 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 /* DDP checksums should be used */
187: /* *** DDP_CHKSUM_ON not yet fully implemented *** */
188: #define DDP_HDRINCL 2 /* int; header is included with data */
189: #define DDP_GETSOCKNAME 3 /* used to get ddp_addr_t */
190: #define DDP_SLFSNDOFF 4 /* packets sent to the cable-multicast address
191: on this socket should not be looped back */
192: /* *** DDP_SLFSNDOFF not yet fully implemented *** */
193: #define DDP_STRIPHDR 5 /* drop DDP header on receive (raw) */
194:
195: /*
196: AppleTalk protocol retry and timeout
197: */
198:
199: typedef struct at_retry {
200: short interval; /* Retry interval in seconds */
201: short retries; /* Maximum number of retries */
202: u_char backoff; /* Retry backoff, must be 1 through 4 */
203: } at_retry_t;
204:
205: /*
206: Basic NBP Definitions needed for LibcAT
207: */
208:
209: #define NBP_NVE_STR_SIZE 32 /* Maximum NBP tuple string size */
210: typedef struct at_nvestr {
211: u_char len;
212: u_char str[NBP_NVE_STR_SIZE];
213: } at_nvestr_t;
214:
215: /* Entity Name */
216: typedef struct at_entity {
217: at_nvestr_t object;
218: at_nvestr_t type;
219: at_nvestr_t zone;
220: } at_entity_t;
221:
222: #define NBP_TUPLE_SIZE ((3*NBP_NVE_STR_SIZE)+3)
223: /* 3 for field lengths + 3*32 for three names */
224: typedef struct at_nbptuple {
225: at_inet_t enu_addr;
226: u_char enu_enum;
227: at_entity_t enu_entity;
228: } at_nbptuple_t;
229:
230: /*
231: Basic ATP Definitions needed for LibcAT
232: */
233:
234: #define ATP_TRESP_MAX 8 /* Maximum number of Tresp pkts */
235:
236: /* Response buffer structure for atp_sendreq() and atp_sendrsp() */
237: typedef struct at_resp {
238: u_char bitmap; /* Bitmap of responses */
239: u_char filler[3]; /* Force 68K to RISC alignment */
240: struct iovec resp[ATP_TRESP_MAX]; /* Buffer for response data */
241: long userdata[ATP_TRESP_MAX]; /* Buffer for response user data */
242: } at_resp_t;
243:
244: /*
245: Needed for ASP and ADSP
246: */
247:
248: typedef struct {
249: int maxlen; /* max buffer length */
250: int len; /* length of data */
251: char *buf; /* pointer to buffer */
252: } strbuf_t;
253:
254: #define IFID_HOME 0 /* home port in ifID_table */
255:
256: #define ATALK_VALUE(a) ((*(u_long *) &(a))&0x00ffffff)
257: #define ATALK_EQUAL(a, b) (ATALK_VALUE(a) == ATALK_VALUE(b))
258:
259: #define VERSION_LENGTH 80 /* length of version string */
260:
261: /* struture containing general information regarding the state of
262: * the Appletalk networking
263: */
264: typedef struct at_state {
265: unsigned int flags; /* various init flags */
266: } at_state_t;
267:
268: /* at_state_t 'flags' defines */
269: #define AT_ST_STARTED 0x0001
270: #define AT_ST_MULTIHOME 0x0080 /* set if multihome mode */
271: #define AT_ST_ROUTER 0x0100 /* set if we are a router */
272: #define AT_ST_IF_CHANGED 0x0200 /* set when state of any I/F
273: changes (for SNMP) */
274: #define AT_ST_RT_CHANGED 0x0400 /* route table changed (for SNMP)*/
275: #define AT_ST_ZT_CHANGED 0x0800 /* zone table changed (for SNMP) */
276: #define AT_ST_NBP_CHANGED 0x1000 /* if nbp table changed (for SNMP)*/
277:
278: #ifdef KERNEL
279: extern at_state_t at_state; /* global state of AT network */
280:
281: #define ROUTING_MODE (at_state.flags & AT_ST_ROUTER)
282: #define MULTIHOME_MODE (at_state.flags & AT_ST_MULTIHOME)
283: #define MULTIPORT_MODE (ROUTING_MODE || MULTIHOME_MODE)
284: #endif /* KERNEL */
285:
286: /* defines originally from h/at_elap.h */
287: #define AT_ADDR 0
288: #define ET_ADDR 1
289: #define AT_ADDR_NO_LOOP 2 /* disables packets from looping back */
290:
291: #endif /* _NETAT_APPLETALK_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.