IP.4
资源名称:os_source.zip [点击查看]
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:36k
源码类别:
操作系统开发
开发平台:
C/C++
- ."
- ." Copyright 1994 Vrije Universiteit, The Netherlands.
- ." For full copyright and restrictions on use see the file COPYRIGHT in the
- ." top level of the Amoeba distribution.
- ."
- .ig
- Software: Philip Homburg, 1991
- Document: Philip Homburg, Sept 3, 1991
- Modified: Greg Sharp and Philip Homburg, March 1992
- - merged with udp(L) and made a little more complete.
- Greg Sharp, April 1992
- - updated keywords for auto index generation
- Modified: Kees J. Bot, June 1994
- - changed to man(7) format for Minix.
- ..
- .TH IP 4
- .SH NAME
- ip, eth, psip, udp, tcp - Internet Protocol server devices and definitions
- .SH DESCRIPTION
- .de SP
- .if t .sp 0.4
- .if n .sp
- ..
- The
- .BR ip* ,
- .BR eth* ,
- .BR psip* ,
- .BR tcp* ,
- and
- .B udp*
- devices give access to the Internet Protocol (IP) services in Minix.
- There are 16 such devices for four different networks, and four
- different ways of accessing them. The
- .B eth*
- and
- .B psip*
- devices give direct access to the network packets at the lowest level.
- The
- .BR ip* ,
- .BR tcp* ,
- and
- .B udp*
- devices give access to IP, TCP, or UDP services. See
- .BR set_net_default (8)
- for a description of the default network devices and environment
- variables. The proper TCP device to use for instance is found by:
- .PP
- .RS
- .nf
- if ((tcp_device= getenv("TCP_DEVICE")) == NULL)
- tcp_device= "/dev/tcp";
- .fi
- .RE
- .PP
- Access to the IP services is provided using filedescriptors to open IP
- devices. These open IP channels can be configured with
- .BR ioctl (2)
- calls, and data can be transferred by calls to
- .BR read (2),
- and
- .BR write (2).
- .SS "Types (general)"
- .IP <sys/types.h>
- .br
- defines
- .BR u8_t ,
- .BR u16_t ,
- .B u32_t
- and
- .B i32_t
- (and
- .BR U8_t ,
- .BR U16_t ,
- .B U32_t
- and
- .B I32_t
- for use in prototypes).
- .SS "Types (eth)"
- .IP <net/gen/ether.h>
- .br
- defines struct ether_addr (fBether_addr_tfP) and
- .B ether_type_t
- and
- .B Ether_type_t
- for use in prototypes.
- .IP <net/gen/eth_io.h>
- .br
- defines struct nwio_ethopt (fBnwio_ethopt_tfP) and
- struct nwio_ethstat (fBnwio_ethstat_tfP)
- .IP <net/gen/eth_hdr.h>
- .br
- defines struct eth_hdr (fBeth_hdr_tfP)
- .SS "Types (ip)"
- .IP <net/gen/in.h>
- .br
- defines
- .BR ipaddr_t ,
- .BR ipproto_t
- and struct ip_hdropt (fBip_hdropt_tfP).
- .IP <net/gen/ip_io.h>
- .br
- defines struct nwio_ipconf (fBnwio_ipconf_tfP) and
- struct nwio_ipopt (fBnwio_ipopt_tfP)
- .IP <net/gen/ip_hdr.h>
- .br
- defines struct ip_hdr (fBip_hdr_tfP)
- .IP <net/gen/route.h>
- .br
- defines struct nwio_route (fBnwio_route_tfP)
- .SS "Types (tcp)"
- .IP <net/gen/tcp.h>
- .br
- defines
- .B tcpport_t
- and
- .B Tcpport_t
- for use in prototypes.
- .IP <net/gen/tcp_io.h>
- .br
- defines struct nwio_tcpconf (fBnwio_tcpconf_tfP),
- struct nwio_tcpcl (fBnwio_tcpcl_tfP),
- struct nwio_tcpatt (fBnwio_tcpatt_tfP) and
- struct nwio_tcpopt (fBnwio_tcpopt_tfP).
- .IP <net/gen/tcp_hdr.h>
- .br
- defines struct tcp_hdr (fBtcp_hdr_tfP) and struct tcp_hdropt
- (fBtcp_hdropt_tfP).
- .SS "Types (udp)"
- .IP <net/gen/udp.h>
- .br
- defines
- .B udpport_t
- and
- .B Udpport_t
- for use in prototypes.
- .IP <net/gen/udp_io.h>
- .br
- defines struct nwio_udpopt (fBnwio_udpopt_tfP).
- .IP <net/gen/udp_hdr.h>
- .br
- defines struct udp_hdr (fBudp_hdr_tfP) and struct udp_io_hdr
- (fBudp_io_hdr_tfP).
- .SS "Byte Order Conversion"
- All 16-bit and 32-bit quantities in IP headers must be in network byte
- order. The macros described in
- .BR hton (3)
- can be used to convert these values to and from the byte order used by
- the host machine.
- .SS "The Internet Checksum"
- The
- .B OneC_sum
- function (see
- .BR oneC_sum (3))
- is used to calculate the one's complement checksum needed for IP network
- packets.
- .SS "General Functions"
- .PP
- .ft B
- fIfdfP = open(fItcpip_devicefP, O_RDWR)
- .ft R
- .PP
- This is how one normally obtains a filedescriptor for a new TCP/IP channel.
- .I tcpip_device
- names one of the TCP/IP devices. The channel may be used both to send or to
- receive data.
- .PP
- .ft B
- fInfP = read(fIfdfP, fIbuffP, fIsizefP)
- .ft R
- .PP
- Receives one packet (low level devices) or a number of bytes (TCP stream).
- Returns the the number of bytes placed into
- .IR buf ,
- or returns -1 with an error code placed into
- .BR errno .
- .PP
- .ft B
- fInfP = write(fIfdfP, fIbuffP, fIsizefP)
- .ft R
- .PP
- Sends one packet (low level devices) or a number of bytes (TCP stream).
- Returns
- .I size
- or -1 with the error code placed into
- .BR errno .
- The TCP/IP
- .B read
- and
- .B write
- functions behave like reads and writes on pipes when it comes to signals.
- .SS "ETH Functions"
- .PP
- .ft B
- ioctl(fIfdfP, NWIOGETHSTAT, &struct nwio_ethstat)
- .ft R
- .PP
- The
- .B NWIOGETHSTAT
- ioctl
- returns the Ethernet address and some statistics of the Ethernet server of
- the channel
- .IR fd .
- The result is returned in the nwio_ethstat structure.
- The fBstruct nwio_ethstatfP is defined in <net/gen/eth_io.h>:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_ethstat
- {
- ether_addr_t nwes_addr;
- eth_stat_t nwes_stat;
- } nwio_ethstat_t;
- .SP
- typedef struct eth_stat
- {
- unsigned long ets_recvErr, /* # receive errors */
- ets_sendErr, /* # send error */
- ets_OVW, /* # buffer overwrite warnings,
- (packets arrive faster than
- can be processed) */
- ets_CRCerr, /* # crc errors of read */
- ets_frameAll, /* # frames not aligned (# bits
- not a multiple of 8) */
- ets_missedP, /* # packets missed due to too
- slow packet processing */
- ets_packetR, /* # packets received */
- ets_packetT, /* # packets transmitted */
- ets_transDef, /* # transmission deferred (there
- was a transmission of an
- other station in progress */
- ets_collision, /* # collisions */
- ets_transAb, /* # transmissions aborted due
- to excessive collisions */
- ets_carrSense, /* # carrier sense lost */
- ets_fifoUnder, /* # fifo underruns (processor
- is too busy) */
- ets_fifoOver, /* # fifo overruns (processor is
- too busy) */
- ets_CDheartbeat, /* # times unable to transmit
- collision signal */
- ets_OWC; /* # times out of window
- collision */
- } eth_stat_t;
- .if t .ft R
- .fi
- .RE
- .PP
- .ft B
- ioctl(fIfdfP, NWIOSETHOPT, &struct nwio_ethopt)
- .ft R
- .PP
- Before an Ethernet channel can be used to send or receive
- Ethernet packets, it has to be configured using the
- .B NWIOSETHOPT
- ioctl.
- The structure
- .B nwio_ethopt
- is defined in <net/gen/eth_io.h>:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_ethopt
- {
- u32_t nweo_flags;
- ether_addr_t nweo_multi, nweo_rem;
- ether_type_t nweo_type;
- } nwio_ethopt_t;
- .SP
- #define NWEO_NOFLAGS 0x0000L
- #define NWEO_ACC_MASK 0x0003L
- # define NWEO_EXCL 0x00000001L
- # define NWEO_SHARED 0x00000002L
- # define NWEO_COPY 0x00000003L
- #define NWEO_LOC_MASK 0x0010L
- # define NWEO_EN_LOC 0x00000010L
- # define NWEO_DI_LOC 0x00100000L
- #define NWEO_BROAD_MASK 0x0020L
- # define NWEO_EN_BROAD 0x00000020L
- # define NWEO_DI_BROAD 0x00200000L
- #define NWEO_MULTI_MASK 0x0040L
- # define NWEO_EN_MULTI 0x00000040L
- # define NWEO_DI_MULTI 0x00400000L
- #define NWEO_PROMISC_MASK 0x0080L
- # define NWEO_EN_PROMISC 0x00000080L
- # define NWEO_DI_PROMISC 0x00800000L
- #define NWEO_REM_MASK 0x0100L
- # define NWEO_REMSPEC 0x00000100L
- # define NWEO_REMANY 0x01000000L
- #define NWEO_TYPE_MASK 0x0200L
- # define NWEO_TYPESPEC 0x00000200L
- # define NWEO_TYPEANY 0x02000000L
- #define NWEO_RW_MASK 0x1000L
- # define NWEO_RWDATONLY 0x00001000L
- # define NWEO_RWDATALL 0x10000000L
- .if t .ft R
- .fi
- .RE
- .PP
- The configuration is divided in a number of section (covered by the xx_MASK
- macros).
- Options can be set in the
- .B nweo_flags
- field.
- The first section (fBNWEO_ACC_MASKfP) controls the access to a certain
- Ethernet packet type.
- If
- .B NWEO_EXCL
- is selected then this is the only channel that can send or
- receive Ethernet packets of the selected type.
- If
- .B NWEO_SHARED
- is selected then multiple channels (which all have to
- select
- .BR NWEO_SHARED )
- can use the same Ethernet type, they all can send
- packets but incoming packets will be delivered to at most one of them.
- If
- .B NWEO_COPY
- is selected then multiple channels have access to the same
- Ethernet type and all receive a copy of an incoming packet.
- .LP
- The
- .B NWEO_LOC_MASK
- flags control the delivery of packets with a destination
- address equal to the Ethernet address of the machine.
- If
- .B NWEO_EN_LOC
- is selected then these packets will be delivered and with
- .B NWEO_DI_LOC
- they will be discarded.
- .PP
- .BR NWEO_BROAD_MASK ,
- .BR NWEO_MULTI_MASK ,
- and
- .B NWEO_PROMISC_MASK
- do the same to broadcast packets,
- multicast packets and promiscuous mode packets as
- .B NWEO_LOC_MASK
- does for local packets.
- Except that the precise multicast address is taken from the fBnweo_multifP
- field.
- .LP
- The
- .B NWEO_REM_MASK
- flags control whether communication is restricted to
- single destination or not.
- .B NWEO_REMSPEC
- restricts sending and receiving of packets to the single
- remote computer specified in the fBnweo_remfP field.
- .B NWEO_REMANY
- allows sending to and receiving from any remote computer.
- .PP
- .B NWEO_TYPESPEC
- restricts sending and receiving of packets to the type
- specified in fBnweo_typefP.
- The type has to be in network byte order (using
- .BR hton (3)).
- .B NWEO_TYPEANY
- allows any type.
- .PP
- If the Ethernet header is completely specified by the
- .B nweo_flags
- i.e., all of
- .BR NWEO_EN_LOC ,
- .BR NWEO_DI_BROAD ,
- .BR NWEO_DI_MULTI ,
- .BR NWEO_DI_PROMISC ,
- .BR NWEO_REMSPEC
- and
- .B NWEO_TYPESPEC
- are
- specified, then
- .B NWEO_RWDATONLY
- can be used to send and receive only the data part of an Ethernet packet.
- If
- .B NWEO_RWDATALL
- is specified then both Ethernet header and data are used.
- .SS "PSIP Functions"
- .PP
- [[[No description available yet.]]]
- .SS "IP Functions"
- .PP
- .ft B
- ioctl(fIfdfP, NWIOGIPCONF, &struct nwio_ipconf)
- .ft R
- .PP
- The
- .B NWIOGIPCONF
- ioctl reports the Internet Address and the netmask.
- For the fInwio_ipconffP structure see the fBNWIOSIPCONFfP ioctl below.
- .PP
- .ft B
- ioctl(fIfdfP, NWIOGIPOROUTE, &struct nwio_route)
- .ft R
- .PP
- The
- .B NWIOGIPOROUTE
- ioctl can be used to query an IP server about its routing table.
- [[[NWIODIPOROUTE, NWIOGIPIROUTE, NWIODIPIROUTE?]]]
- The structure fBnwio_routefP is defined in <net/gen/route.h>:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_route
- {
- u32_t nwr_ent_no;
- u32_t nwr_ent_count;
- ipaddr_t nwr_dest;
- ipaddr_t nwr_netmask;
- ipaddr_t nwr_gateway;
- u32_t nwr_dist;
- u32_t nwr_flags;
- u32_t nwr_pref;
- } nwio_route_t;
- .SP
- #define NWRF_EMPTY 0
- #define NWRF_INUSE 1
- #define NWRF_FIXED 2
- .if t .ft R
- .fi
- .RE
- .PP
- The requested entry is taken from fBnwr_ent_nofP.
- Entries are counted from 0, so the value 0 can be used for an initial query.
- The size of the routing table is returned in fBnwr_ent_countfP.
- The fBnwr_flagsfP indicates if the entry is in use (fBNWRF_INUSEfP) and
- if the entry was inserted manually (using fBNWIOSIPOROUTEfP) or generated
- by the IP server itself.
- The route is described by
- .BR nwr_dest ,
- .BR nwr_netmask ,
- .BR nwr_gateway ,
- .BR nwr_dist ,
- and
- .BR nwr_pref .
- fBNwr_destfP and fBnwr_netmaskfP select the destination addresses.
- A value of 0.0.0.0 (0x0) in both fBnwr_destfP and fBnwr_netmaskfP means
- every host.
- A value of 255.255.255.255 (0xffffffff) in fBnwr_netmaskfP means a single
- host.
- Other values of fBnwr_netmaskfP are netmasks for the network specified
- by fBnwr_destfP.
- fBNwr_gatewayfP is gateway that should be used.
- fBNwr_distfP is a minimal distance.
- Packets with a time to live smaller than fBnwr_distfP will not reach the
- destination.
- If two routes have equal netmask and distance fields but different
- gateways then the gateway with highest value in fBnwr_preffP is used.
- .PP
- .ft B
- ioctl(fIfdfP, NWIOSIPCONF, &struct nwio_ipconf)
- .ft R
- .PP
- The
- .B NWIOSIPCONF
- ioctl can be used to inform the IP server about its Internet Address
- and/or its netmask.
- Normally an IP server will discover its Internet Address using the RARP
- protocol.
- .B NWIOSIPCONF
- can be used in the case that the RARP failed, or the netmask has to be changed.
- Note that higher level protocols (TCP and UDP) assume that the Internet Address
- of an IP device does not change, therefore TCP and UDP stop functioning if
- the Internet Address is changed.
- .PP
- The structure fBnwio_ipconffP is defined in <net/gen/ip_io.h>:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_ipconf
- {
- u32_t nwic_flags;
- ipaddr_t nwic_ipaddr;
- ipaddr_t nwic_netmask;
- } nwio_ipconf_t;
- .SP
- #define NWIC_NOFLAGS 0x0
- #define NWIC_FLAGS 0x3
- # define NWIC_IPADDR_SET 0x1
- # define NWIC_NETMASK_SET 0x2
- .if t .ft R
- .fi
- .RE
- .PP
- The function of fBnwio_ipconffP depends on the value of fBnwic_flagsfP.
- If
- .B NWIC_IPADDR_SET
- is set then the Internet Address will be set to
- fBnwic_ipaddrfP.
- If
- .B NWIC_NETMASK_SET
- is set then the Internet Address will be set to
- fBnwic_netmaskfP.
- .PP
- .ft B
- ioctl(fIfdfP, NWIOSIPOPT, &struct nwio_ipopt)
- .ft R
- .PP
- Before an IP channel can be used, it has to be configured using the
- .B NWIOSIPOPT
- ioctl.
- The structure fBnwio_ipoptfP is defined in <net/gen/ip_io.h>:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_ipopt
- {
- u32_t nwio_flags;
- ipaddr_t nwio_rem;
- ip_hdropt_t nwio_hdropt;
- u8_t nwio_tos;
- u8_t nwio_ttl;
- u8_t nwio_df;
- ipproto_t nwio_proto;
- } nwio_ipopt_t;
- .SP
- #define NWIO_NOFLAGS 0x0000L
- #define NWIO_ACC_MASK 0x0003L
- # define NWIO_EXCL 0x00000001L
- # define NWIO_SHARED 0x00000002L
- # define NWIO_COPY 0x00000003L
- #define NWIO_LOC_MASK 0x0010L
- # define NWIO_EN_LOC 0x00000010L
- # define NWIO_DI_LOC 0x00100000L
- #define NWIO_BROAD_MASK 0x0020L
- # define NWIO_EN_BROAD 0x00000020L
- # define NWIO_DI_BROAD 0x00200000L
- #define NWIO_REM_MASK 0x0100L
- # define NWIO_REMSPEC 0x00000100L
- # define NWIO_REMANY 0x01000000L
- #define NWIO_PROTO_MASK 0x0200L
- # define NWIO_PROTOSPEC 0x00000200L
- # define NWIO_PROTOANY 0x02000000L
- #define NWIO_HDR_O_MASK 0x0400L
- # define NWIO_HDR_O_SPEC 0x00000400L
- # define NWIO_HDR_O_ANY 0x04000000L
- #define NWIO_RW_MASK 0x1000L
- # define NWIO_RWDATONLY 0x00001000L
- # define NWIO_RWDATALL 0x10000000L
- .if t .ft R
- .fi
- .RE
- .PP
- The options are divided in several categories:
- .BR NWIO_ACC_MASK ,
- .BR NWIO_LOC_MASK ,
- .BR NWIO_BROAD_MASK ,
- .BR NWIO_REM_MASK ,
- .BR NWIO_PROTO_MASK ,
- .B NWIO_HDR_O_MASK
- and
- .BR NWIO_RW_MASK .
- A channel is configured when one option of each category is set.
- .PP
- The options covered by
- .B NWIO_ACC_MASK
- control the number of channels that
- can use one IP protocol.
- If
- .B NWIO_EXCL
- is specified then only that channel can use a certain IP protocol.
- If
- .B NWIO_SHARED
- then multiple channels that all have to specify
- .B NWIO_SHARED
- can use the same IP protocol, but incoming packets will
- be delivered to a most one channel.
- .B NWIO_SHARED
- does not impose any restrictions.
- Every channel gets a copy of an incoming packet.
- .PP
- .B NWIO_LOC_MASK
- and
- .B NWIO_BROAD_MASK
- control the delivery of packets.
- If
- .B NWIO_EN_LOC
- is specified then packets that are explicitly send to
- the IP server are delivered.
- If
- .B NWIO_EN_BROAD
- is specified then broadcast packets are delivered.
- Either one or both of them can be disabled with
- .B NWIO_DI_LOC
- and
- .BR NWIO_DI_BROAD .
- .PP
- .B NWIO_REMSPEC
- can be used to restrict communication to one remote host.
- This host is taken from the fBnwio_remfP field.
- If any remote host is to be allowed then
- .B NWIO_REMANY
- can be used.
- .PP
- .B NWIO_PROTOSPEC
- restricts communication to one IP protocol, specified
- in fBnwio_protofP.
- .B NWIO_PROTOANY
- allows any protocol to be sent or received.
- .PP
- .B NWIO_HDR_O_SPEC
- specifies all IP header options in advance.
- The values are taken from
- .BR nwio_hdropt ,
- .BR nwio_tos ,
- .BR nwio_ttl ,
- and
- .BR nwio_df .
- fBNwio_hdroptfP specifies the IP options that should be present in an
- outgoing packet.
- fBIp_hdropt_tfP is defined in <net/gen/in.h>:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct ip_hdropt
- {
- u8_t iho_opt_siz;
- u8_t iho_data[IP_MAX_HDR_SIZE-IP_MIN_HDR_SIZE];
- } ip_hdropt_t;
- .if t .ft R
- .fi
- .RE
- .PP
- The bytes of size fBiho_opt_sizfP in fBiho_datafP are appended to the IP
- header.
- fBNwio_tosfP specifies the value of the ``type of service'' bits,
- fBnwio_ttlfP gives the value of the ``time to live'' field and fBnwio_dffP
- specifies whether fragmentation is disallowed or not.
- .B NWIO_HDR_O_ANY
- specifies that the header options should be specified at
- each write request.
- .PP
- .B NWIO_RWDATONLY
- specifies that the header should be omitted from a
- write request.
- This option can only be used when all header fields are specified in previous
- options:
- .BR NWIO_EN_LOC ,
- .BR NWIO_DI_BROAD ,
- .BR NWIO_REMSPEC ,
- .B NWIO_PROTOSPEC
- and
- .BR NWIO_HDR_O_SPEC .
- A read operation will also only return the data part, so the IP options will
- be lost.
- .PP
- .ft B
- ioctl(fIfdfP, NWIOSIPOROUTE, &struct nwio_route)
- .ft R
- .PP
- The
- .B NWIOSIPOROUTE
- ioctl adds a route to the routing table.
- See fBNWIOGIPOROUTEfP above for a description of the fBnwio_routefP
- structure.
- The fields fBnwr_ent_nofP and fBnwr_ent_countfP are ignored.
- .SS "TCP Functions"
- .PP
- .ft B
- ioctl(fIfdfP, NWIOTCPCONN, &struct nwio_tcpcl)
- .ft R
- .PP
- The
- .B NWIOTCPCONN
- ioctl tries to setup a connection with a remote TCP/IP server.
- The channel must be fully configured (see
- .BR NWIOSTCPCONF )
- and values for the local port, the remote port and the remote address have be
- specified using
- .B NWTC_LP_SET
- or
- .BR NWTC_LP_SEL ,
- .B NWTC_SET_RA
- and
- .BR NWTC_SET_RP .
- The struct nwio_tcpcl is defined in <net/gen/tcp_io.h> as:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_tcpcl
- {
- long nwtcl_flags;
- long nwtcl_ttl;
- } nwio_tcpcl_t;
- .if t .ft R
- .fi
- .RE
- .PP
- Set the
- .B nwtcl_flags
- field to zero before the connect or listen call. [[[Further explanation of
- nwio_tcpcl?]]]
- .PP
- .ft B
- ioctl(fIfdfP, NWIOGTCPCONF, &struct nwio_tcpconf)
- .ft R
- .PP
- This call reports the current configuration of a TCP channel.
- The
- .B nwtc_flags
- field shows the status of the
- .BR access ,
- .BR locport ,
- .B remaddr
- and
- .B remport
- fields.
- .B Nwtc_locaddr
- contains the Internet address of the TCP/IP server.
- .B Remaddr
- contains the Internet address of the remote TCP/IP server when set with
- .B NWTC_SET_RA
- or after a successful connect or listen (see
- .B NWIOTCPCONN
- or
- .BR NWIOTCPLISTEN ).
- .B Nwio_locport
- contains the local TCP/IP port set with
- .B NWTC_LP_SET
- or the selected port set with
- .BR NWTC_LP_SEL .
- .B Nwtc_remport
- contains the TCP port of the remote TCP/IP server as set with
- .B NWIO_SET_RP
- or after a successful connect or listen.
- .PP
- A value of 0 (zero) is reported for
- .BR nwtc_remaddr ,
- .B nwtc_locport
- or
- .B nwtc_remport
- when no value is set either explicitly or implicitly.
- .PP
- .ft B
- ioctl(fIfdfP, NWIOTCPLISTEN, &struct nwio_tcpcl)
- .ft R
- .PP
- The
- .B NWIOTCPLISTEN
- ioctl waits until a remote TCP/IP server tries to connect to this channel.
- The channel has to be configured (see
- .BR NWIOSTCPCONF ).
- An additional restriction is that the local port
- must be set (with
- .BR NWTC_LP_SET )
- or selected (with
- .BR NWTC_LP_SEL ).
- When a remote address is set only connections for that host are accepted, and
- when a remote port is set only connections from that port are accepted.
- After a successful listen
- .B NWIOGTCPCONF
- can be used to find out what the address and port of the other side are.
- .PP
- .ft B
- ioctl(fIfdfP, NWIOSTCPCONF, &struct nwio_tcpconf)
- .ft R
- .PP
- Before a TCP channel can be used it must configured using the
- .B NWIOSTCPCONF
- ioctl.
- The parameters to
- .B NWIOSTCPCONF
- are the channel file descriptor and a
- .B struct nwio_tcpconf
- as defined in <net/gen/tcp_io.h>:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_tcpconf
- {
- u32_t nwtc_flags;
- ipaddr_t nwtc_locaddr;
- ipaddr_t nwtc_remaddr;
- tcpport_t nwtc_locport;
- tcpport_t nwtc_remport;
- } nwio_tcpconf_t;
- .SP
- #define NWTC_NOFLAGS 0x0000L
- #define NWTC_ACC_MASK 0x0003L
- # define NWTC_EXCL 0x00000001L
- # define NWTC_SHARED 0x00000002L
- # define NWTC_COPY 0x00000003L
- #define NWTC_LOCPORT_MASK 0x0030L
- # define NWTC_LP_UNSET 0x00000010L
- # define NWTC_LP_SET 0x00000020L
- # define NWTC_LP_SEL 0x00000030L
- #define NWTC_REMADDR_MASK 0x0100L
- # define NWTC_SET_RA 0x00000100L
- # define NWTC_UNSET_RA 0x01000000L
- #define NWTC_REMPORT_MASK 0x0200L
- # define NWTC_SET_RP 0x00000200L
- # define NWTC_UNSET_RP 0x02000000L
- .if t .ft R
- .fi
- .RE
- .PP
- A tcp channel is considered configured when one flag in each category has
- been selected.
- Thus one of
- .BR NWTC_EXCL ,
- .B NWTC_SHARED
- or
- .BR NWTC_COPY ,
- one of
- .BR NWTC_LP_UNSET ,
- .B NWTC_LP_SET
- or
- .BR NWTC_LP_SEL ,
- one of
- .B NWTC_SET_RA
- or
- .BR NWTC_UNSET_RA ,
- and one of
- .B NWTC_SET_RP
- or
- .BR NWTC_UNSET_RP .
- .PP
- The acc flags control the access to a certain TCP port.
- .B NWTC_EXCL
- means exclusive access.
- An attempt to configure a channel will be denied if the same port is specified
- as that of a channel that requested exclusive access.
- .B NWTC_SHARED
- indicates that several channels use the same port but cooperate.
- If the shared mode is specified for one channel than all other channel that
- use the same port should also be configured with the
- .B NWTC_SHARED
- flag.
- .B NWTC_COPY
- is specified when the programmer does not care about other channels.
- This is the default.
- .PP
- The locport flags control which TCP port is used for communication.
- .B NWTC_LP_UNSET
- indicates the absence of a local port.
- This is the default.
- .B NWTC_LP_SET
- means that the
- .B nwtc_locport
- field contains the local port to be used by TCP.
- This value must be in network byte order (see
- .BR hton (3).)
- .B NWTC_LP_SEL
- requests the TCP server to pick a port.
- This port will be in the range from 32768 to 65535 and will be unique.
- .LP
- The
- .B remaddr
- flags specify which hosts are acceptable for connections.
- .B NWTC_SET_RA
- indicates that only connection to the host specified in
- .B nwtc_remaddr
- are acceptable.
- .B Nwtc_remaddr
- should be in network byte order (see
- .BR hton (3).)
- .B NWTC_UNSET_RA
- allows every host on the other side of a connection.
- This is the default.
- .PP
- The
- .B remport
- flags specify which remote ports are acceptable for connections.
- .B NWTC_SET_RP
- indicates that only the port specified in
- .B nwtc_remport
- is acceptable.
- .B NWTC_UNSET_RP
- allows every port on the other side of a connection.
- This is the default.
- .PP
- .ft B
- ioctl(fIfdfP, NWIOTCPSHUTDOWN)
- .ft R
- .PP
- The
- .B NWIOTCPSHUTDOWN
- tells the TCP/IP server that no more data will be sent over the channel
- specified by
- .IR fd .
- This command can be issued when the channel is connected to a remote TCP/IP
- server.
- The TCP/IP server will tell the remote TCP/IP server and the client of the
- remote TCP/IP server will receive an end-of-file indication.
- .PP
- .ft B
- ioctl(fIfdfP, NWIOGTCPOPT, &struct nwio_tcpopt)
- .br
- ioctl(fIfdfP, NWIOSTCPOPT, &struct nwio_tcpopt)
- .ft R
- .PP
- The behaviour of a TCP channel may be changed by setting a number of
- options. The TCP options can be obtained with the
- .B NWIOGTCPOPT
- ioctl and set with the
- .B NWIOSTCPOPT
- ioctl. The options are passed in a
- .B struct nwio_tcpopt
- as defined in <net/gen/tcp_io.h>:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_tcpopt
- {
- u32_t nwto_flags;
- } nwio_tcpconf_t;
- .SP
- #define NWTO_NOFLAG 0x0000L
- #define NWTO_SND_URG_MASK 0x0001L
- # define NWTO_SND_URG 0x00000001L
- # define NWTO_SND_NOTURG 0x00010000L
- #define NWTO_RCV_URG_MASK 0x0002L
- # define NWTO_RCV_URG 0x00000002L
- # define NWTO_RCV_NOTURG 0x00020000L
- #define NWTO_BSD_URG_MASK 0x0004L
- # define NWTO_BSD_URG 0x00000004L
- #define NWTO_DEL_RST_MASK 0x0008L
- # define NWTO_DEL_RST 0x00000008L
- .if t .ft R
- .fi
- .RE
- .PP
- The
- .B NWTO_SND_URG
- option causes bytes written to the channel to be send out as urgent data.
- On receiving an
- .B EURG
- error the
- .B NWTO_RCV_URG
- option must be set to switch over to reading urgent data. When all urgent
- data has been read an
- .B ENOURG
- error will follow,
- indicating that the option must be cleared with
- .BR NWTO_RCV_NOTURG .
- Alas the BSD implementation of urgent data disagrees with the RFC's, so to
- be BSD compatible one must set the
- .B NWTO_BSD_URG
- option beforehand on a channel that is to send or receive urgent data.
- Given that the BSD implementation is the regarded as the TCP/IP standard one
- should always use the BSD style. The
- .B NWTO_DEL_RST
- option delays a failure response on a connect to the same port as the
- current open connection. Without this option a connect would fail if
- a server is not yet listening. With this option a connect will linger
- on until the server starts listening. This option is useful for a server
- that opens a connection, tells the remote end the local port number and
- then listens (FTP), or for a program that forks off servers for incoming
- connections (TELNET). A new connection may come in before a new listen
- can be started, so it is nice if the new connect doesn't fail. Use this
- option only when it is clearly needed.
- .SS "UDP Functions"
- .PP
- .ft B
- ioctl(fIfdfP, NWIOGUDPOPT, &struct nwio_udpopt)
- .ft R
- .PP
- The
- .B NWIOGUDPOPT
- ioctl returns the current options that result from the default options
- and the options set with
- .BR NWIOSUDPOPT .
- When
- .B NWUO_LP_SEL
- or
- .B NWUO_LP_SET
- is selected the local port is returned in
- .BR nwuo_locport .
- When
- .B NWUO_RP_SET
- is selected the remote port is returned in
- .BR nwuo_remport .
- The local address is always returned in
- .BR nwuo_locaddr ,
- and when
- .B NWUO_RA_SET
- is selected the remote address is returned in
- .BR nwuo_remaddr .
- .PP
- .ft B
- ioctl(fIfdfP, NWIOSUDPOPT, &struct nwio_udpopt)
- .ft R
- .PP
- A UDP channel must be configured using the
- .B NWIOSUDPOPT
- ioctl before any data can be read or written.
- .B NWIOSUDPOPT
- takes two parameters, a file descriptor to an open UDP device and
- pointer to a
- .B nwio_udpopt
- structure that describes the requested configuration.
- The
- .B nwio_udpopt
- structure is defined in <net/gen/udp_io.h> as:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct nwio_udpopt
- {
- unsigned long nwuo_flags;
- udpport_t nwuo_locport;
- udpport_t nwuo_remport;
- ipaddr_t nwuo_locaddr;
- ipaddr_t nwuo_remaddr;
- } nwio_udpopt_t;
- .SP
- #define NWUO_NOFLAGS 0x0000L
- #define NWUO_ACC_MASK 0x0003L
- #define NWUO_EXCL 0x00000001L
- #define NWUO_SHARED 0x00000002L
- #define NWUO_COPY 0x00000003L
- #define NWUO_LOCPORT_MASK 0x000CL
- #define NWUO_LP_SEL 0x00000004L
- #define NWUO_LP_SET 0x00000008L
- #define NWUO_LP_ANY 0x0000000CL
- #define NWUO_LOCADDR_MASK 0x0010L
- #define NWUO_EN_LOC 0x00000010L
- #define NWUO_DI_LOC 0x00100000L
- #define NWUO_BROAD_MASK 0x0020L
- #define NWUO_EN_BROAD 0x00000020L
- #define NWUO_DI_BROAD 0x00200000L
- #define NWUO_REMPORT_MASK 0x0100L
- #define NWUO_RP_SET 0x00000100L
- #define NWUO_RP_ANY 0x01000000L
- #define NWUO_REMADDR_MASK 0x0200L
- #define NWUO_RA_SET 0x00000200L
- #define NWUO_RA_ANY 0x02000000L
- #define NWUO_RW_MASK 0x1000L
- #define NWUO_RWDATONLY 0x00001000L
- #define NWUO_RWDATALL 0x10000000L
- #define NWUO_IPOPT_MASK 0x2000L
- #define NWUO_EN_IPOPT 0x00002000L
- #define NWUO_DI_IPOPT 0x20000000L
- .if t .ft R
- .fi
- .RE
- .PP
- A UDP channel is considered configured when one flag in each category has been
- selected.
- Thus one of
- .BR NWUO_EXCL ,
- .B NWUO_SHARED
- or
- .BR NWUO_COPY ,
- one of
- .BR NWUO_LP_SEL ,
- .B NWUO_LP_SET
- or
- .BR NWUO_LP_ANY ,
- one of
- .B NWUO_EN_LOC
- or
- .BR NWUO_DI_LOC ,
- one of
- .BR NWUO_EN_BROAD ,
- or
- .BR NWUO_DI_BROAD ,
- one of
- .BR NWUO_RP_SET ,
- or
- .BR NWUO_RP_ANY ,
- one of
- .BR NWUO_RA_SET ,
- or
- .BR NWUO_RA_ANY ,
- one of
- .BR NWUO_RWDATONLY ,
- or
- .BR NWUO_RWDATALL ,
- and one of
- .BR NWUO_EN_IPOPT ,
- or
- .BR NWUO_DI_IPOPT .
- The acc flags control the access to a certain UDP port.
- .B NWUO_EXCL
- means exclusive access:
- no other channel can use this port.
- .B NWUO_SHARED
- means shared access:
- only channels that specify shared access can use this port
- and all packets that are received are handed to at most one channel.
- .B NWUO_COPY
- imposes no access restriction and all channels get a copy of every received
- packet for that port.
- .PP
- The
- .B locport
- flags control the selection of the UDP port for this channel.
- .B NWUO_LP_SEL
- requests the server to pick a port.
- This port will be in the range from 32768 to 65535 and it will be unique.
- .B NWUO_LP_SET
- sets the local port to the value of the
- .B nwuo_locport
- field.
- .B NWUO_LP_ANY
- does not select a port.
- Reception of data is therefore not possible but it is
- possible to send data.
- (See
- .BR tcpip_read ,
- and
- .B tcpip_write
- above).
- .PP
- The
- .B locaddr
- flags control the reception of packets.
- .B NWUO_EN_LOC
- enables the reception of packets with the local IP address as destination.
- .B NWUO_DI_LOC
- disables the reception of packet for the local IP address.
- .PP
- The
- .B broad
- flags control the reception of broadcast packets.
- .B NWUO_EN_BROAD
- enables the reception of broadcast packets and
- .B NWUO_DI_BROAD
- disables the reception of broadcast packets.
- .PP
- The
- .B remport
- flags let the client to specify one specific remote UDP port or
- to allow any remote port.
- .B NWUO_RP_SET
- sets the remote UDP port to the value of
- .BR nwuo_remport .
- Only packets with a matching remote port will be delivered
- and all packets will be sent to that port.
- .B NWUO_RP_ANY
- allows reception of packets form any port and when transmitting packets the
- remote port has to be specified.
- .PP
- The
- .B remaddr
- flags control the remote IP address.
- .B NWUO_RA_SET
- sets the remote IP address the value of
- .BR nwuo_remaddr .
- Only packets from that address will be delivered and all packets will be sent
- to that address.
- .B NWUO_RA_ANY
- allows reception of packets from any host and when transmitting packets the
- remote host has to be specified.
- .PP
- The
- .B rw
- flags control the format of the data to be sent or received.
- With
- .B NWUO_RWDATONLY
- only the data part of a UDP packet is sent to the server and only the data
- part is received from the server.
- The
- .B NWUO_RWDATALL
- mode presents the data part of a UDP packet with a header that contains
- the source and destination IP address, source and destination UDP ports,
- the IP options, etc.
- The server expects such a header in front of the data to be transmitted.
- .ig " Some for Philip to explain properly:
- The header is defined in <net/gen/udp_hdr.h> and looks like this:
- .PP
- .RS
- .nf
- .if t .ft C
- typedef struct udp_io_hdr
- {
- ipaddr_t uih_src_addr;
- ipaddr_t uih_dst_addr;
- udpport_t uih_src_port;
- udpport_t uih_dst_port;
- u16_t uih_ip_opt_len;
- u16_t uih_data_len;
- } udp_io_hdr_t;
- .if t .ft R
- .fi
- .RE
- .PP
- The first four fields are the source and destination IP addresses and
- ports.
- .B Uih_ip_opt_len
- is ???.
- .B Uih_data_len
- should equal the length of the packet data (packet lenght minus the
- header.) ???
- ..
- .PP
- The
- .B ipopt
- flags control the delivery and transmission of IP options.
- When
- .B NWUO_EN_IPOPT
- is set IP, options will be delivered and sent.
- When
- .B NWUO_DI_IPOPT
- is set IP option will be stripped from received packets and no IP options will
- be sent.
- .ig " Minix doesn't have this stuff (yet? ever?)
- .SS "UDP Library Functions"
- .PP
- The following routines provide an somewhat easier to use interface to UDP than
- the routines described above (fBtcpip_openfP, fBudp_ioc_setoptfP,
- fBtcpip_readfP and fBtcpip_writefP).
- .LP
- .sC
- errstat
- udp_connect(udp_cap, chan_cap, srcport, dstport, dstaddr, flags)
- capability *udp_cap;
- capability *chan_cap;
- udpport_t srcport;
- udpport_t dstport;
- ipaddr_t dstaddr;
- int flags;
- .eC
- .kW "fIudp_connectfP"
- fIUdp_connectfP combines the functionality of fItcpip_openfP and
- fIudp_ioc_setoptfP.
- A pointer to a UDP server capability should be passed in fIudp_capfP, and
- the channel capability will be returned in the capability pointed to by
- fIchan_capfP.
- If fIsrcportfP is 0 then an unused port will be selected, otherwise the local
- port will be set to fIsrcportfP.
- If fIdstportfP is non-zero then communication will be restricted to remote ports
- that equal to fIdstportfP, otherwise any data can be sent to or received from
- any remote port.
- The same thing applies to fIdstaddrfP; if fIdstaddrfP is non-zero then
- only fIdstaddrfP can be reached.
- Currently no flags are defined so fIflagsfP should be 0.
- .sH
- udp_reconnect
- .LP
- .sC
- errstat
- udp_reconnect(chan_cap, srcport, dstport, dstaddr, flags)
- capability *chan_cap;
- udpport_t srcport;
- udpport_t dstport;
- ipaddr_t dstaddr;
- int flags;
- .eC
- .kW "fIudp_reconnectfP"
- fIUdp_reconnectfP is the same as fIudp_connectfP except that an existing
- channel capability is (re)used.
- .sH
- udp_read_msg
- .LP
- .sC
- errstat
- udp_read_msg(chan_cap, msg, msglen, actlen, flags)
- capability *chan_cap;
- char *msg;
- int msglen;
- int *actlen;
- int flags;
- .eC
- .kW "fIudp_read_msgfP"
- fIUdp_read_msgfP delivers a UDP packet.
- The data part of the UDP packet is
- prepended with an fIudp_io_hdrfP.
- The actual length of the possibly truncated packet is returned in fIactlenfP.
- No flags are defined so fIflagsfP should be 0.
- .sH
- udp_write_msg
- .LP
- .sC
- errstat
- udp_write_msg(chan_cap, msg, msglen, flags)
- capability *chan_cap;
- char *msg;
- int msglen;
- int flags;
- .eC
- .kW "fIudp_write_msgfP"
- A UDP packet can be sent with fIudp_write_msgfP.
- fIMsgfP should point to a fIudp_io_hdrfP followed by the data part of the
- UDP packet.
- The fIuih_dst_addrfP and fIuih_dst_portfP fields of the fIudp_io_hdrfP
- should be filled in if no values are specified in the fIudp_connectfP,
- or fIudp_reconnectfP.
- .sH
- udp_close
- .LP
- .sC
- errstat
- udp_close(chan_cap, flags)
- capability *chan_cap;
- int flags;
- .eC
- .kW "fIudp_closefP"
- fIUdp_closefP cleans up the administration kept by the UDP library but does
- not destroy the capability.
- The function should be used if the capability is passed to another process
- and should continue to exist.
- No flags are defined so fIflagsfP should be 0.
- .sH
- udp_destroy
- .LP
- .sC
- errstat
- udp_destroy(chan_cap, flags)
- capability *chan_cap;
- int flags;
- .eC
- .kW "fIudp_destroyfP"
- fIUdp_destroyfP not only cleans up the administration kept by the UDP library
- but also destroys the channel capability.
- ..
- .SH FILES
- .IP /dev/eth[01] 18n
- First and second raw ethernet.
- .IP /dev/psip[01]
- First and second Pseudo IP network.
- .IP /dev/ip[0123]
- IP devices for two ethernets and two Pseudo IP networks.
- .IP /dev/tcp[0123]
- TCP devices for same four networks.
- .IP /dev/udp[0123]
- UDP devices.
- .IP "/dev/eth, /dev/psip, /dev/ip, /dev/tcp, /dev/udp"
- Devices for the default network, links to the devices above.
- .B Eth
- is only present if ethernet is the default,
- .B psip
- only for pseudo IP.
- .SH "SEE ALSO"
- .BR hton (3),
- .BR oneC_sum (3),
- .BR set_net_default (8),
- .BR boot (8).
- .SH DIAGNOSTICS
- Several errors may be returned by the TCP/IP server. The error code
- is found in the
- .B errno
- variable if the
- .BR read ,
- .BR write ,
- or
- .B ioctl
- call returns -1. The TCP/IP error codes defined in <errno.h> are:
- .IP EPACKSIZE 5c
- This indicates an attempt to read or write with a buffer that is too
- large or too small.
- .IP EOUTOFBUFS
- The TCP/IP server has insufficient memory to execute the request.
- .IP EBADIOCTL
- This indicates an attempt to execute a command the particular server
- does not understand.
- For example, a
- .B NWIOGTCPCONF
- on an ETH channel.
- .IP EBADMODE
- The request is refused because the channel is not fully configured, in the
- wrong state or the parameters are invalid.
- .IP EBADDEST
- This indicates an illegal destination address for a packet.
- .IP EDSTNORCH
- The destination is not reachable.
- .IP EISCONN
- The channel is already connected so a second request is refused.
- .IP EADDRINUSE
- This address is in use.
- .IP ECONNREFUSED
- The connection is refused by the other side.
- .IP ECONNRESET
- The connection is reset (non-gracefully terminated) by the other side.
- .IP ETIMEDOUT
- The connection is terminated due to an expired timer.
- .IP EURG
- Urgent data is present and the current receive mode does not allow urgent data
- to be transferred.
- .IP ENOURG
- No urgent data is present and a request came for urgent data.
- .IP ENOTCONN
- The request requires a connected channel and the channel is not connected.
- .IP ESHUTDOWN
- The connection is shut down.
- That is, a
- .B NWIOTCPSHUTDOWN
- has been executed so no more data can be transmitted.
- .IP ENOCONN
- The connection does not exist.
- .IP EGENERIC
- A generic error code for extremely weird cases.
- .SH AUTHOR
- Philip Homburg (philip@cs.vu.nl)