|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26:
27: #ifndef _NW_H_
28: #define _NW_H_ 1
29:
30: #if defined(KMODE) || defined(KERNEL)
31: #include <sys/types.h>
32: #include <mach/port.h>
33: #else
34: #include "stub0.h"
35: #endif
36:
37: /*** NETWORK APPLICATION PROGRAMMING INTERFACE ***/
38:
39: /*** TYPES ***/
40:
41: typedef enum {
42: NW_SUCCESS,
43: NW_FAILURE,
44: NW_BAD_ADDRESS,
45: NW_OVERRUN,
46: NW_NO_CARRIER,
47: NW_NOT_SERVER,
48: NW_NO_EP,
49: NW_BAD_EP,
50: NW_INVALID_ARGUMENT,
51: NW_NO_RESOURCES,
52: NW_PROT_VIOLATION,
53: NW_BAD_BUFFER,
54: NW_BAD_LENGTH,
55: NW_NO_REMOTE_EP,
56: NW_TIME_OUT,
57: NW_INCONSISTENCY,
58: NW_ABORTED,
59: NW_SYNCH,
60: NW_QUEUED
61: } nw_result, *nw_result_t;
62:
63: typedef enum {
64: NW_INITIALIZE,
65: NW_HOST_ADDRESS_REGISTER,
66: NW_HOST_ADDRESS_UNREGISTER
67: } nw_update_type;
68:
69: typedef enum {
70: NW_STATUS,
71: NW_HOST_ADDRESS_LOOKUP
72: } nw_lookup_type;
73:
74: typedef u_int ip_address;
75:
76: typedef u_int nw_address_1;
77: typedef u_int nw_address_2;
78:
79: typedef struct {
80: char name[20]; /*Host name -- first 19 characters, zero-terminated*/
81: ip_address ip_addr;
82: nw_address_1 nw_addr_1; /*4 most significant bits specify the device*/
83: nw_address_2 nw_addr_2;
84: } nw_address_s, *nw_address_t;
85:
86: typedef enum {
87: NW_NULL,
88: NW_IP, /*Virtual network for IP addresses*/
89: NW_TCA100_1, /*Fore Systems ATM network, first unit*/
90: NW_TCA100_2 /*Fore Systems ATM network, second unit*/
91: } nw_device, *nw_device_t;
92:
93: #define NW_DEVICE(addr) (addr >> 28)
94:
95: typedef u_int nw_ep, *nw_ep_t;
96:
97: typedef enum {
98: NW_RAW, /*Raw service provided by network*/
99: NW_DATAGRAM, /*Connectionless service*/
100: NW_SEQ_PACKET, /*Connection-oriented service*/
101: NW_LINE /*Multiplexing line (system use only)*/
102: } nw_protocol;
103:
104: typedef enum {
105: NW_NO_ACCEPT, /*Connection requests not accepted (client)*/
106: NW_APPL_ACCEPT, /*Connection requests received as message by
107: application (msg_seqno 0), for examination
108: and approval (nw_connection_accept function)*/
109: NW_AUTO_ACCEPT, /*Connection requests automatically accepted
110: if endpoint is connection-oriented and
111: not already connected*/
112: NW_LINE_ACCEPT /*Connection requests automatically accepted
113: on a new endpoint (system use only)*/
114: } nw_acceptance;
115:
116: typedef struct {
117: nw_address_1 rem_addr_1;
118: nw_address_2 rem_addr_2;
119: nw_ep remote_ep:16;
120: nw_ep local_ep:16;
121: } nw_peer_s, *nw_peer_t;
122:
123: typedef struct nw_buffer {
124: u_int buf_used:1; /*Read-only for applications (always 1)*/
125: u_int buf_length:31; /*Read-only for applications*/
126: struct nw_buffer *buf_next; /*Used only to gather on sends*/
127: u_int msg_seqno:10; /*Sequential number of message,
128: automatically set by network interface*/
129: u_int block_offset:22; /*Offset to the beginning of data (in bytes),
130: from the start of the buffer*/
131: u_int block_deallocate:1; /*Used only to deallocate on sends*/
132: u_int block_length:31; /*Length of data (in bytes)
133: beginning at offset*/
134: nw_peer_s peer; /*Set on receives. Also required
135: in first block on datagram sends.
136: Ignored on sequenced packet sends.*/
137: } nw_buffer_s, *nw_buffer_t;
138:
139:
140: /* msg_seqno is normally between 1 and 1023, and increases modulo 1024
141: (skipping 0) between consecutive messages. In sequenced packets, msg_seqno
142: increases strictly by one. msg_seqno is assigned automatically.
143: The network interface writes in the buffer the msg_seqno used,
144: but only after the buffer has been transmitted and, in case of
145: sequenced packet, acknowledged. The application can use this update
146: to determine if a buffer can be reused, after a sending a message without
147: the deallocate option.
148: msg_seqno 0 is used when the corresponding send specifies the NW_URGENT
149: option. Such messages bypass any other messages possibly enqueued.
150: msg_seqno 0 is also used for open connection requests, in the case
151: of sequenced packet endpoints with the NW_APPL_ACCEPT option.
152: The type of msg_seqno 0 message is differentiated by the first word in the
153: message, which has type nw_options */
154:
155: #define NW_BUFFER_ERROR ((nw_buffer_t) -1) /*Used for error indication
156: other than buffer overrun
157: (for which NULL is used)*/
158:
159: typedef enum {
160: NW_INEXISTENT,
161: NW_UNCONNECTED,
162: NW_SIMPLEX_ORIGINATING,
163: NW_SIMPLEX_ORIGINATED,
164: NW_DUPLEX_ORIGINATING,
165: NW_DUPLEX_ORIGINATING_2,
166: NW_DUPLEX_ORIGINATED,
167: NW_ORIGINATOR_CLOSING,
168: NW_ORIGINATOR_RCLOSING,
169: NW_ACCEPTING,
170: NW_SIMPLEX_ACCEPTED,
171: NW_DUPLEX_ACCEPTING,
172: NW_DUPLEX_ACCEPTED,
173: NW_ACCEPTOR_CLOSING,
174: NW_ACCEPTOR_RCLOSING
175: } nw_state, *nw_state_t;
176:
177:
178: typedef enum nw_options {
179: NW_NORMAL,
180: NW_URGENT,
181: NW_SYNCHRONIZATION /*System use only*/
182: } nw_options;
183:
184:
185: /*** FUNCTIONS ***/
186:
187: extern nw_result nw_update(mach_port_t master_port, nw_update_type up_type,
188: int *up_info);
189:
190: /*****************************************************************************
191: Allows privileged applications to update network tables. The
192: application must present the device master port. up_type selects the
193: type of update, and up_info is cast accordingly to the correct type.
194:
195: For NW_HOST_ADDRESS_REGISTER and NW_HOST_ADDRESS_UNREGISTER,
196: up_info has type nw_address_t. For NW_HOST_ADDRESS_UNREGISTER,
197: however, only the network address field is used.
198:
199: up_info is not used for NW_INITIALIZE. This option is used to
200: initialize network interface tables, but does not initialize
201: devices. Initialization of hardware and network tables occurs
202: automatically at probe/boot time, so this option is normally
203: unnecessary.
204:
205: Returns NW_SUCCESS if operation completed successfully.
206: NW_FAILURE if master port not presented.
207: NW_NO_RESOURCES if network tables full (NW_HOST_ADDRESS_REGISTER).
208: NW_BAD_ADDRESS if host not found (NW_HOST_ADDRESS_UNREGISTER).
209: NW_INVALID_ARGUMENT if up_type is invalid or up_info is
210: a bad pointer.
211: *****************************************************************************/
212:
213:
214: extern nw_result nw_lookup(nw_lookup_type lt, int *look_info);
215:
216: /*****************************************************************************
217: Allows applications to lookup network tables. The type of
218: lookup is selected by lt, and look_info is cast to the correct type
219: accordingly.
220:
221: For lt equal to NW_HOST_ADDRESS_LOOKUP, look_info has type
222: nw_address_t. In this option, the host is looked up first using the
223: IP address as a key (if non-zero), then by name (if non-empty),
224: and finally by network address (if non-zero). The function
225: returns NW_SUCCESS on the first match it finds, and sets the non-key
226: fields of look_info to the values found. No consistency check is
227: made if more than one key is supplied. The function returns
228: NW_BAD_ADDRESS if the host was not found, and NW_INVALID_ARGUMENT
229: if lt is invalid or look_info is a bad pointer.
230:
231: For lt equal to NW_STATUS, look_info has type nw_device_t on input
232: and nw_result_t on output. The function returns NW_INVALID_ARGUMENT
233: if the device chosen is invalid or look_info is a bad pointer;
234: otherwise, the function returns NW_SUCCESS. look_info is
235: set to: NW_FAILURE if the device is not present, NW_NOT_SERVER
236: if the device is not serviced by this interface, or a
237: device-dependent value otherwise (NW_SUCCESS if there is no device error).
238:
239: *****************************************************************************/
240:
241:
242: extern nw_result nw_endpoint_allocate(nw_ep_t epp, nw_protocol protocol,
243: nw_acceptance accept, u_int buffer_size);
244:
245: /*****************************************************************************
246: Allocates a communication endpoint. On input, epp should point to the
247: the endpoint number desired, or to 0 if any number is adequate.
248: On output, epp points to the actual number allocated for the endpoint.
249: protocol specifies the transport discipline applied to data transmitted
250: or received through the endpoint. accept selects how open connection
251: requests received for the endpoint should be handled (connection-oriented
252: protocol), or whether the endpoint can receive messages (connectionless
253: protocol). buffer_size specifies the length in bytes of the buffer area
254: for data sent or received through the endpoint.
255:
256: Returns NW_SUCCESS if endpoint successfully allocated.
257: NW_INVALID_ARGUMENT if epp is a bad pointer or the
258: protocol or accept arguments are invalid.
259: NW_NO_EP if the endpoint name space is exhausted.
260: NW_BAD_EP if there already is an endpoint with the
261: number selected, or the number selected is
262: out of bounds.
263: NW_NO_RESOURCES if not enough memory for buffer.
264: *****************************************************************************/
265:
266:
267: extern nw_result nw_endpoint_deallocate(nw_ep ep);
268:
269: /*****************************************************************************
270: Deallocates the given endpoint.
271:
272: Returns NW_SUCCESS if successfully deallocated endpoint.
273: NW_BAD_EP if endpoint does not exist.
274: NW_PROT_VIOLATION if access to endpoint not authorized.
275: *****************************************************************************/
276:
277:
278: extern nw_buffer_t nw_buffer_allocate(nw_ep ep, u_int size);
279:
280: /*****************************************************************************
281: Allocates a buffer of the given size (in bytes) from the buffer area
282: of the given endpoint.
283:
284: Returns NW_BUFFER_ERROR if endpoint does not exist or access to endpoint
285: is not authorized.
286: NULL if no buffer with given size could be allocated.
287: Pointer to allocated buffer, otherwise.
288: *****************************************************************************/
289:
290:
291: extern nw_result nw_buffer_deallocate(nw_ep ep, nw_buffer_t buffer);
292:
293: /*****************************************************************************
294: Deallocates the given buffer.
295:
296: Returns NW_SUCCESS if successfully deallocated buffer.
297: NW_BAD_EP if endpoint does not exist.
298: NW_PROT_VIOLATION if access to endpoint not authorized.
299: NW_BAD_BUFFER if buffer does not belong to endpoint's
300: buffer area or is malformed.
301: *****************************************************************************/
302:
303:
304: extern nw_result nw_connection_open(nw_ep local_ep, nw_address_1 rem_addr_1,
305: nw_address_2 rem_addr_2, nw_ep remote_ep);
306:
307: /*****************************************************************************
308: Opens a connection.
309:
310: Returns NW_SUCCESS if connection successfully opened.
311: NW_BAD_EP if local endpoint does not exist, uses connectionless
312: protocol or is already connected.
313: NW_PROT_VIOLATION if access to local or remote endpoint
314: not authorized.
315: NW_BAD_ADDRESS if address of remote host is invalid.
316: NW_NO_REMOTE_EP if connection name space exhausted at
317: remote host.
318: NW_TIME_OUT if attempt to open connection timed out repeatedly.
319: NW_FAILURE if remote endpoint does not exist, uses connectionless
320: protocol or is already connected, or if remote
321: application did not accept open request.
322: *****************************************************************************/
323:
324:
325: extern nw_result nw_connection_accept(nw_ep ep, nw_buffer_t msg,
326: nw_ep_t new_epp);
327:
328: /*****************************************************************************
329: Accepts open request (at the remote host). On input, new_epp equal to
330: NULL indicates that the application does not accept the request.
331: new_epp pointing to the value 0 indicates that the application wants
332: to accept the connection on a new endpoint, created dynamically,
333: with the same attributes as the original endpoint; new_epp pointing
334: to the value ep indicates that the application wants to simply
335: accept the open request. On output, new_epp points to the endpoint
336: actually connected, if any. msg points to the open request, which is
337: automatically deallocated.
338:
339: Returns NW_SUCCESS if connection correctly accepted or refused.
340: NW_BAD_EP if endpoint does not exist or has no outstanding
341: open request.
342: NW_PROT_VIOLATION if access to endpoint not authorized.
343: NW_BAD_BUFFER if msg does not belong to the endpoint's
344: buffer area, or is malformed.
345: NW_INVALID_ARGUMENT if new_epp is a bad pointer or points to
346: invalid value.
347: NW_NO_EP if endpoint name space exhausted.
348: NW_NO_RESOURCES if no buffer available for new endpoint.
349: NW_TIME_OUT if attempt to accept at different endpoint
350: repeatedly timed out.
351: *****************************************************************************/
352:
353:
354: extern nw_result nw_connection_close(nw_ep ep);
355:
356: /*****************************************************************************
357: Closes the endpoint's connection.
358:
359: Returns NW_SUCCESS if successfully closed connection.
360: NW_BAD_EP if endpoint does not exist or is not connected.
361: NW_PROT_VIOLATION if access to endpoint not authorized.
362: *****************************************************************************/
363:
364:
365: extern nw_result nw_multicast_add(nw_ep local_ep, nw_address_1 rem_addr_1,
366: nw_address_2 rem_addr_2, nw_ep remote_ep);
367:
368: /*****************************************************************************
369: Open multicast group or add one more member to multicast group.
370:
371: Returns NW_SUCCESS if successfully opened multicast group
372: or added member.
373: NW_BAD_EP if local endpoint does not exist, uses connectionless
374: protocol or is already connected point-to-point.
375: NW_PROT_VIOLATION if access to local or remote endpoint
376: not authorized.
377: NW_BAD_ADDRESS if address of remote host is invalid.
378: NW_NO_REMOTE_EP if connection name space exhausted at
379: remote host.
380: NW_TIME_OUT if attempt to open or add to multicast
381: timed out repeatedly.
382: NW_FAILURE if remote endpoint does not exist, uses connectionless
383: protocol or is already connected, or if remote
384: application did not accept open or add request.
385: *****************************************************************************/
386:
387:
388: extern nw_result nw_multicast_drop(nw_ep local_ep, nw_address_1 rem_addr_1,
389: nw_address_2 rem_addr_2, nw_ep remote_ep);
390:
391: /*****************************************************************************
392: Drop member from multicast group, or close group if last member.
393:
394: Returns NW_SUCCESS if successfully dropped member or closed group.
395: NW_BAD_EP if local endpoint does not exist or is not connected in
396: multicast to the given remote endpoint.
397: NW_PROT_VIOLATION if access to local endpoint not authorized.
398: *****************************************************************************/
399:
400:
401: extern nw_result nw_endpoint_status(nw_ep ep, nw_state_t state,
402: nw_peer_t peer);
403:
404: /*****************************************************************************
405: Returns the state of the given endpoint and peer to which it is
406: connected, if any. In case of multicast group, the first peer is
407: returned.
408:
409: Returns NW_SUCCESS if status correctly returned.
410: NW_BAD_EP if endpoint does not exist.
411: NW_PROT_VIOLATION if access to endpoint not authorized.
412: NW_INVALID_ARGUMENT if state or peer is a bad pointer.
413: *****************************************************************************/
414:
415:
416: extern nw_result nw_send(nw_ep ep, nw_buffer_t msg, nw_options options);
417:
418: /*****************************************************************************
419: Sends message through endpoint with the given options.
420:
421: Returns NW_SUCCESS if message successfully queued for sending
422: (connectionless protocol) or sent and acknowledged
423: (connection-oriented protocol).
424: NW_BAD_EP if endpoint does not exist or uses connection-oriented
425: protocol but is unconnected.
426: NW_PROT_VIOLATION if access to endpoint not authorized.
427: NW_BAD_BUFFER if msg (or one of the buffers linked by buf_next)
428: is not a buffer in the endpoint's buffer area, or
429: is malformed (e.g., block_length extends beyond
430: end of buffer).
431: NW_NO_RESOURCES if unable to queue message due to resource
432: exhaustion.
433: NW_BAD_LENGTH if the total message length is too long for the
434: network and protocol used.
435: NW_BAD_ADDRESS if address of remote host is invalid
436: (connectionless protocol).
437: NW_FAILURE if repeated errors in message transmission
438: (connection-oriented).
439: NW_TIME_OUT if repeated time-outs in message transmission
440: (connection-oriented).
441: NW_OVERRUN if no buffer available in receiver's buffer area.
442: (connection-oriented).
443: *****************************************************************************/
444:
445:
446: extern nw_buffer_t nw_receive(nw_ep ep, int time_out);
447:
448: /*****************************************************************************
449: Receive message destined to endpoint. Return if request not
450: satisfied within time_out msec. time_out 0 means non-blocking receive,
451: while -1 means block indefinitely.
452:
453: Returns NW_BUFFER_ERROR if endpoint does not exist or access
454: to endpoint is not authorized.
455: NULL if no message available for reception within the
456: specified time-out period.
457: Pointer to message, otherwise.
458: *****************************************************************************/
459:
460:
461: extern nw_buffer_t nw_rpc(nw_ep ep, nw_buffer_t send_msg, nw_options options,
462: int time_out);
463:
464: /*****************************************************************************
465: Send message through given endpoint with given options and then
466: receive message through the same endpoint. Receive waiting time
467: is limited to time_out msec.
468:
469: Returns NW_BUFFER_ERROR if endpoint does not exist, access to
470: endpoint is not authorized, or there was
471: some transmission error.
472: NULL if no message available for reception within the
473: specified time-out period.
474: Pointer to message received, otherwise.
475: *****************************************************************************/
476:
477:
478: extern nw_buffer_t nw_select(u_int nep, nw_ep_t epp, int time_out);
479:
480: /*****************************************************************************
481: Receive message from one of the nep endpoints in the array epp.
482: Waiting time is limited to time_out msec.
483:
484: Returns NW_BUFFER_ERROR if epp does not point to a valid array of nep
485: endpoint numbers, one of the endpoints does
486: not exist or has restricted access or the request
487: could not be correctly queued because of resource
488: exhaustion.
489: NULL if no message arrived within the specified time-out period.
490: Pointer to message received, otherwise.
491: *****************************************************************************/
492:
493:
494: #endif /* _NW_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.