summaryrefslogtreecommitdiff
path: root/chips/nw.h
diff options
context:
space:
mode:
Diffstat (limited to 'chips/nw.h')
-rw-r--r--chips/nw.h494
1 files changed, 494 insertions, 0 deletions
diff --git a/chips/nw.h b/chips/nw.h
new file mode 100644
index 0000000..63d497b
--- /dev/null
+++ b/chips/nw.h
@@ -0,0 +1,494 @@
+/*
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#ifndef _NW_H_
+#define _NW_H_ 1
+
+#if defined(KMODE) || defined(KERNEL)
+#include <sys/types.h>
+#include <mach/port.h>
+#else
+#include "stub0.h"
+#endif
+
+/*** NETWORK APPLICATION PROGRAMMING INTERFACE ***/
+
+/*** TYPES ***/
+
+typedef enum {
+ NW_SUCCESS,
+ NW_FAILURE,
+ NW_BAD_ADDRESS,
+ NW_OVERRUN,
+ NW_NO_CARRIER,
+ NW_NOT_SERVER,
+ NW_NO_EP,
+ NW_BAD_EP,
+ NW_INVALID_ARGUMENT,
+ NW_NO_RESOURCES,
+ NW_PROT_VIOLATION,
+ NW_BAD_BUFFER,
+ NW_BAD_LENGTH,
+ NW_NO_REMOTE_EP,
+ NW_TIME_OUT,
+ NW_INCONSISTENCY,
+ NW_ABORTED,
+ NW_SYNCH,
+ NW_QUEUED
+} nw_result, *nw_result_t;
+
+typedef enum {
+ NW_INITIALIZE,
+ NW_HOST_ADDRESS_REGISTER,
+ NW_HOST_ADDRESS_UNREGISTER
+} nw_update_type;
+
+typedef enum {
+ NW_STATUS,
+ NW_HOST_ADDRESS_LOOKUP
+} nw_lookup_type;
+
+typedef u_int ip_address;
+
+typedef u_int nw_address_1;
+typedef u_int nw_address_2;
+
+typedef struct {
+ char name[20]; /*Host name -- first 19 characters, zero-terminated*/
+ ip_address ip_addr;
+ nw_address_1 nw_addr_1; /*4 most significant bits specify the device*/
+ nw_address_2 nw_addr_2;
+} nw_address_s, *nw_address_t;
+
+typedef enum {
+ NW_NULL,
+ NW_IP, /*Virtual network for IP addresses*/
+ NW_TCA100_1, /*Fore Systems ATM network, first unit*/
+ NW_TCA100_2 /*Fore Systems ATM network, second unit*/
+} nw_device, *nw_device_t;
+
+#define NW_DEVICE(addr) (addr >> 28)
+
+typedef u_int nw_ep, *nw_ep_t;
+
+typedef enum {
+ NW_RAW, /*Raw service provided by network*/
+ NW_DATAGRAM, /*Connectionless service*/
+ NW_SEQ_PACKET, /*Connection-oriented service*/
+ NW_LINE /*Multiplexing line (system use only)*/
+} nw_protocol;
+
+typedef enum {
+ NW_NO_ACCEPT, /*Connection requests not accepted (client)*/
+ NW_APPL_ACCEPT, /*Connection requests received as message by
+ application (msg_seqno 0), for examination
+ and approval (nw_connection_accept function)*/
+ NW_AUTO_ACCEPT, /*Connection requests automatically accepted
+ if endpoint is connection-oriented and
+ not already connected*/
+ NW_LINE_ACCEPT /*Connection requests automatically accepted
+ on a new endpoint (system use only)*/
+} nw_acceptance;
+
+typedef struct {
+ nw_address_1 rem_addr_1;
+ nw_address_2 rem_addr_2;
+ nw_ep remote_ep:16;
+ nw_ep local_ep:16;
+} nw_peer_s, *nw_peer_t;
+
+typedef struct nw_buffer {
+ u_int buf_used:1; /*Read-only for applications (always 1)*/
+ u_int buf_length:31; /*Read-only for applications*/
+ struct nw_buffer *buf_next; /*Used only to gather on sends*/
+ u_int msg_seqno:10; /*Sequential number of message,
+ automatically set by network interface*/
+ u_int block_offset:22; /*Offset to the beginning of data (in bytes),
+ from the start of the buffer*/
+ u_int block_deallocate:1; /*Used only to deallocate on sends*/
+ u_int block_length:31; /*Length of data (in bytes)
+ beginning at offset*/
+ nw_peer_s peer; /*Set on receives. Also required
+ in first block on datagram sends.
+ Ignored on sequenced packet sends.*/
+} nw_buffer_s, *nw_buffer_t;
+
+
+/* msg_seqno is normally between 1 and 1023, and increases modulo 1024
+ (skipping 0) between consecutive messages. In sequenced packets, msg_seqno
+ increases strictly by one. msg_seqno is assigned automatically.
+ The network interface writes in the buffer the msg_seqno used,
+ but only after the buffer has been transmitted and, in case of
+ sequenced packet, acknowledged. The application can use this update
+ to determine if a buffer can be reused, after a sending a message without
+ the deallocate option.
+ msg_seqno 0 is used when the corresponding send specifies the NW_URGENT
+ option. Such messages bypass any other messages possibly enqueued.
+ msg_seqno 0 is also used for open connection requests, in the case
+ of sequenced packet endpoints with the NW_APPL_ACCEPT option.
+ The type of msg_seqno 0 message is differentiated by the first word in the
+ message, which has type nw_options */
+
+#define NW_BUFFER_ERROR ((nw_buffer_t) -1) /*Used for error indication
+ other than buffer overrun
+ (for which NULL is used)*/
+
+typedef enum {
+ NW_INEXISTENT,
+ NW_UNCONNECTED,
+ NW_SIMPLEX_ORIGINATING,
+ NW_SIMPLEX_ORIGINATED,
+ NW_DUPLEX_ORIGINATING,
+ NW_DUPLEX_ORIGINATING_2,
+ NW_DUPLEX_ORIGINATED,
+ NW_ORIGINATOR_CLOSING,
+ NW_ORIGINATOR_RCLOSING,
+ NW_ACCEPTING,
+ NW_SIMPLEX_ACCEPTED,
+ NW_DUPLEX_ACCEPTING,
+ NW_DUPLEX_ACCEPTED,
+ NW_ACCEPTOR_CLOSING,
+ NW_ACCEPTOR_RCLOSING
+} nw_state, *nw_state_t;
+
+
+typedef enum nw_options {
+ NW_NORMAL,
+ NW_URGENT,
+ NW_SYNCHRONIZATION /*System use only*/
+} nw_options;
+
+
+/*** FUNCTIONS ***/
+
+extern nw_result nw_update(mach_port_t master_port, nw_update_type up_type,
+ int *up_info);
+
+/*****************************************************************************
+ Allows privileged applications to update network tables. The
+ application must present the device master port. up_type selects the
+ type of update, and up_info is cast accordingly to the correct type.
+
+ For NW_HOST_ADDRESS_REGISTER and NW_HOST_ADDRESS_UNREGISTER,
+ up_info has type nw_address_t. For NW_HOST_ADDRESS_UNREGISTER,
+ however, only the network address field is used.
+
+ up_info is not used for NW_INITIALIZE. This option is used to
+ initialize network interface tables, but does not initialize
+ devices. Initialization of hardware and network tables occurs
+ automatically at probe/boot time, so this option is normally
+ unnecessary.
+
+ Returns NW_SUCCESS if operation completed successfully.
+ NW_FAILURE if master port not presented.
+ NW_NO_RESOURCES if network tables full (NW_HOST_ADDRESS_REGISTER).
+ NW_BAD_ADDRESS if host not found (NW_HOST_ADDRESS_UNREGISTER).
+ NW_INVALID_ARGUMENT if up_type is invalid or up_info is
+ a bad pointer.
+ *****************************************************************************/
+
+
+extern nw_result nw_lookup(nw_lookup_type lt, int *look_info);
+
+/*****************************************************************************
+ Allows applications to lookup network tables. The type of
+ lookup is selected by lt, and look_info is cast to the correct type
+ accordingly.
+
+ For lt equal to NW_HOST_ADDRESS_LOOKUP, look_info has type
+ nw_address_t. In this option, the host is looked up first using the
+ IP address as a key (if non-zero), then by name (if non-empty),
+ and finally by network address (if non-zero). The function
+ returns NW_SUCCESS on the first match it finds, and sets the non-key
+ fields of look_info to the values found. No consistency check is
+ made if more than one key is supplied. The function returns
+ NW_BAD_ADDRESS if the host was not found, and NW_INVALID_ARGUMENT
+ if lt is invalid or look_info is a bad pointer.
+
+ For lt equal to NW_STATUS, look_info has type nw_device_t on input
+ and nw_result_t on output. The function returns NW_INVALID_ARGUMENT
+ if the device chosen is invalid or look_info is a bad pointer;
+ otherwise, the function returns NW_SUCCESS. look_info is
+ set to: NW_FAILURE if the device is not present, NW_NOT_SERVER
+ if the device is not serviced by this interface, or a
+ device-dependent value otherwise (NW_SUCCESS if there is no device error).
+
+ *****************************************************************************/
+
+
+extern nw_result nw_endpoint_allocate(nw_ep_t epp, nw_protocol protocol,
+ nw_acceptance accept, u_int buffer_size);
+
+/*****************************************************************************
+ Allocates a communication endpoint. On input, epp should point to the
+ the endpoint number desired, or to 0 if any number is adequate.
+ On output, epp points to the actual number allocated for the endpoint.
+ protocol specifies the transport discipline applied to data transmitted
+ or received through the endpoint. accept selects how open connection
+ requests received for the endpoint should be handled (connection-oriented
+ protocol), or whether the endpoint can receive messages (connectionless
+ protocol). buffer_size specifies the length in bytes of the buffer area
+ for data sent or received through the endpoint.
+
+ Returns NW_SUCCESS if endpoint successfully allocated.
+ NW_INVALID_ARGUMENT if epp is a bad pointer or the
+ protocol or accept arguments are invalid.
+ NW_NO_EP if the endpoint name space is exhausted.
+ NW_BAD_EP if there already is an endpoint with the
+ number selected, or the number selected is
+ out of bounds.
+ NW_NO_RESOURCES if not enough memory for buffer.
+ *****************************************************************************/
+
+
+extern nw_result nw_endpoint_deallocate(nw_ep ep);
+
+/*****************************************************************************
+ Deallocates the given endpoint.
+
+ Returns NW_SUCCESS if successfully deallocated endpoint.
+ NW_BAD_EP if endpoint does not exist.
+ NW_PROT_VIOLATION if access to endpoint not authorized.
+ *****************************************************************************/
+
+
+extern nw_buffer_t nw_buffer_allocate(nw_ep ep, u_int size);
+
+/*****************************************************************************
+ Allocates a buffer of the given size (in bytes) from the buffer area
+ of the given endpoint.
+
+ Returns NW_BUFFER_ERROR if endpoint does not exist or access to endpoint
+ is not authorized.
+ NULL if no buffer with given size could be allocated.
+ Pointer to allocated buffer, otherwise.
+ *****************************************************************************/
+
+
+extern nw_result nw_buffer_deallocate(nw_ep ep, nw_buffer_t buffer);
+
+/*****************************************************************************
+ Deallocates the given buffer.
+
+ Returns NW_SUCCESS if successfully deallocated buffer.
+ NW_BAD_EP if endpoint does not exist.
+ NW_PROT_VIOLATION if access to endpoint not authorized.
+ NW_BAD_BUFFER if buffer does not belong to endpoint's
+ buffer area or is malformed.
+ *****************************************************************************/
+
+
+extern nw_result nw_connection_open(nw_ep local_ep, nw_address_1 rem_addr_1,
+ nw_address_2 rem_addr_2, nw_ep remote_ep);
+
+/*****************************************************************************
+ Opens a connection.
+
+ Returns NW_SUCCESS if connection successfully opened.
+ NW_BAD_EP if local endpoint does not exist, uses connectionless
+ protocol or is already connected.
+ NW_PROT_VIOLATION if access to local or remote endpoint
+ not authorized.
+ NW_BAD_ADDRESS if address of remote host is invalid.
+ NW_NO_REMOTE_EP if connection name space exhausted at
+ remote host.
+ NW_TIME_OUT if attempt to open connection timed out repeatedly.
+ NW_FAILURE if remote endpoint does not exist, uses connectionless
+ protocol or is already connected, or if remote
+ application did not accept open request.
+ *****************************************************************************/
+
+
+extern nw_result nw_connection_accept(nw_ep ep, nw_buffer_t msg,
+ nw_ep_t new_epp);
+
+/*****************************************************************************
+ Accepts open request (at the remote host). On input, new_epp equal to
+ NULL indicates that the application does not accept the request.
+ new_epp pointing to the value 0 indicates that the application wants
+ to accept the connection on a new endpoint, created dynamically,
+ with the same attributes as the original endpoint; new_epp pointing
+ to the value ep indicates that the application wants to simply
+ accept the open request. On output, new_epp points to the endpoint
+ actually connected, if any. msg points to the open request, which is
+ automatically deallocated.
+
+ Returns NW_SUCCESS if connection correctly accepted or refused.
+ NW_BAD_EP if endpoint does not exist or has no outstanding
+ open request.
+ NW_PROT_VIOLATION if access to endpoint not authorized.
+ NW_BAD_BUFFER if msg does not belong to the endpoint's
+ buffer area, or is malformed.
+ NW_INVALID_ARGUMENT if new_epp is a bad pointer or points to
+ invalid value.
+ NW_NO_EP if endpoint name space exhausted.
+ NW_NO_RESOURCES if no buffer available for new endpoint.
+ NW_TIME_OUT if attempt to accept at different endpoint
+ repeatedly timed out.
+ *****************************************************************************/
+
+
+extern nw_result nw_connection_close(nw_ep ep);
+
+/*****************************************************************************
+ Closes the endpoint's connection.
+
+ Returns NW_SUCCESS if successfully closed connection.
+ NW_BAD_EP if endpoint does not exist or is not connected.
+ NW_PROT_VIOLATION if access to endpoint not authorized.
+ *****************************************************************************/
+
+
+extern nw_result nw_multicast_add(nw_ep local_ep, nw_address_1 rem_addr_1,
+ nw_address_2 rem_addr_2, nw_ep remote_ep);
+
+/*****************************************************************************
+ Open multicast group or add one more member to multicast group.
+
+ Returns NW_SUCCESS if successfully opened multicast group
+ or added member.
+ NW_BAD_EP if local endpoint does not exist, uses connectionless
+ protocol or is already connected point-to-point.
+ NW_PROT_VIOLATION if access to local or remote endpoint
+ not authorized.
+ NW_BAD_ADDRESS if address of remote host is invalid.
+ NW_NO_REMOTE_EP if connection name space exhausted at
+ remote host.
+ NW_TIME_OUT if attempt to open or add to multicast
+ timed out repeatedly.
+ NW_FAILURE if remote endpoint does not exist, uses connectionless
+ protocol or is already connected, or if remote
+ application did not accept open or add request.
+ *****************************************************************************/
+
+
+extern nw_result nw_multicast_drop(nw_ep local_ep, nw_address_1 rem_addr_1,
+ nw_address_2 rem_addr_2, nw_ep remote_ep);
+
+/*****************************************************************************
+ Drop member from multicast group, or close group if last member.
+
+ Returns NW_SUCCESS if successfully dropped member or closed group.
+ NW_BAD_EP if local endpoint does not exist or is not connected in
+ multicast to the given remote endpoint.
+ NW_PROT_VIOLATION if access to local endpoint not authorized.
+ *****************************************************************************/
+
+
+extern nw_result nw_endpoint_status(nw_ep ep, nw_state_t state,
+ nw_peer_t peer);
+
+/*****************************************************************************
+ Returns the state of the given endpoint and peer to which it is
+ connected, if any. In case of multicast group, the first peer is
+ returned.
+
+ Returns NW_SUCCESS if status correctly returned.
+ NW_BAD_EP if endpoint does not exist.
+ NW_PROT_VIOLATION if access to endpoint not authorized.
+ NW_INVALID_ARGUMENT if state or peer is a bad pointer.
+ *****************************************************************************/
+
+
+extern nw_result nw_send(nw_ep ep, nw_buffer_t msg, nw_options options);
+
+/*****************************************************************************
+ Sends message through endpoint with the given options.
+
+ Returns NW_SUCCESS if message successfully queued for sending
+ (connectionless protocol) or sent and acknowledged
+ (connection-oriented protocol).
+ NW_BAD_EP if endpoint does not exist or uses connection-oriented
+ protocol but is unconnected.
+ NW_PROT_VIOLATION if access to endpoint not authorized.
+ NW_BAD_BUFFER if msg (or one of the buffers linked by buf_next)
+ is not a buffer in the endpoint's buffer area, or
+ is malformed (e.g., block_length extends beyond
+ end of buffer).
+ NW_NO_RESOURCES if unable to queue message due to resource
+ exhaustion.
+ NW_BAD_LENGTH if the total message length is too long for the
+ network and protocol used.
+ NW_BAD_ADDRESS if address of remote host is invalid
+ (connectionless protocol).
+ NW_FAILURE if repeated errors in message transmission
+ (connection-oriented).
+ NW_TIME_OUT if repeated time-outs in message transmission
+ (connection-oriented).
+ NW_OVERRUN if no buffer available in receiver's buffer area.
+ (connection-oriented).
+ *****************************************************************************/
+
+
+extern nw_buffer_t nw_receive(nw_ep ep, int time_out);
+
+/*****************************************************************************
+ Receive message destined to endpoint. Return if request not
+ satisfied within time_out msec. time_out 0 means non-blocking receive,
+ while -1 means block indefinitely.
+
+ Returns NW_BUFFER_ERROR if endpoint does not exist or access
+ to endpoint is not authorized.
+ NULL if no message available for reception within the
+ specified time-out period.
+ Pointer to message, otherwise.
+ *****************************************************************************/
+
+
+extern nw_buffer_t nw_rpc(nw_ep ep, nw_buffer_t send_msg, nw_options options,
+ int time_out);
+
+/*****************************************************************************
+ Send message through given endpoint with given options and then
+ receive message through the same endpoint. Receive waiting time
+ is limited to time_out msec.
+
+ Returns NW_BUFFER_ERROR if endpoint does not exist, access to
+ endpoint is not authorized, or there was
+ some transmission error.
+ NULL if no message available for reception within the
+ specified time-out period.
+ Pointer to message received, otherwise.
+ *****************************************************************************/
+
+
+extern nw_buffer_t nw_select(u_int nep, nw_ep_t epp, int time_out);
+
+/*****************************************************************************
+ Receive message from one of the nep endpoints in the array epp.
+ Waiting time is limited to time_out msec.
+
+ Returns NW_BUFFER_ERROR if epp does not point to a valid array of nep
+ endpoint numbers, one of the endpoints does
+ not exist or has restricted access or the request
+ could not be correctly queued because of resource
+ exhaustion.
+ NULL if no message arrived within the specified time-out period.
+ Pointer to message received, otherwise.
+ *****************************************************************************/
+
+
+#endif /* _NW_H_ */