IP.4
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:39k
源码类别:

操作系统开发

开发平台:

C/C++

  1. IP(4)                     Minix Programmer's Manual                      IP(4)
  2. NAME
  3.      ip,  eth,  psip,  udp,  tcp  -  Internet  Protocol  server  devices   and
  4.      definitions
  5. DESCRIPTION
  6.      The ip*, eth*, psip*, tcp*, and udp* devices give access to the  Internet
  7.      Protocol  (IP)  services  in  Minix.   There are 16 such devices for four
  8.      different networks, and four different ways of accessing them.  The  eth*
  9.      and psip* devices give direct access to the network packets at the lowest
  10.      level.  The ip*, tcp*, and udp* devices give access to IP,  TCP,  or  UDP
  11.      services.   See  set_net_default(8)  for  a  description  of  the default
  12.      network devices and environment variables.  The proper TCP device to  use
  13.      for instance is found by:
  14.           if ((tcp_device= getenv("TCP_DEVICE")) == NULL)
  15.                   tcp_device= "/dev/tcp";
  16.      Access to the IP services is provided using filedescriptors  to  open  IP
  17.      devices.   These  open IP channels can be configured with ioctl(2) calls,
  18.      and data can be transferred by calls to read(2), and write(2).
  19.   Types (general)
  20.      <sys/types.h>
  21.           defines u8_t, u16_t, u32_t and i32_t (and  U8_t,  U16_t,  U32_t  and
  22.           I32_t for use in prototypes).
  23.   Types (eth)
  24.      <net/gen/ether.h>
  25.           defines  struct  ether_addr  (ether_addr_t)  and  ether_type_t   and
  26.           Ether_type_t for use in prototypes.
  27.      <net/gen/eth_io.h>
  28.           defines struct nwio_ethopt (nwio_ethopt_t) and  struct  nwio_ethstat
  29.           (nwio_ethstat_t)
  30.      <net/gen/eth_hdr.h>
  31.           defines struct eth_hdr (eth_hdr_t)
  32.   Types (ip)
  33.      <net/gen/in.h>
  34.           defines ipaddr_t, ipproto_t and struct ip_hdropt (ip_hdropt_t).
  35.      <net/gen/ip_io.h>
  36.           defines struct nwio_ipconf  (nwio_ipconf_t)  and  struct  nwio_ipopt
  37.           (nwio_ipopt_t)
  38.                                                                              1
  39. IP(4)                     Minix Programmer's Manual                      IP(4)
  40.      <net/gen/ip_hdr.h>
  41.           defines struct ip_hdr (ip_hdr_t)
  42.      <net/gen/route.h>
  43.           defines struct nwio_route (nwio_route_t)
  44.   Types (tcp)
  45.      <net/gen/tcp.h>
  46.           defines tcpport_t and Tcpport_t for use in prototypes.
  47.      <net/gen/tcp_io.h>
  48.           defines  struct  nwio_tcpconf  (nwio_tcpconf_t),  struct  nwio_tcpcl
  49.           (nwio_tcpcl_t),   struct   nwio_tcpatt  (nwio_tcpatt_t)  and  struct
  50.           nwio_tcpopt (nwio_tcpopt_t).
  51.      <net/gen/tcp_hdr.h>
  52.           defines   struct   tcp_hdr   (tcp_hdr_t)   and   struct   tcp_hdropt
  53.           (tcp_hdropt_t).
  54.   Types (udp)
  55.      <net/gen/udp.h>
  56.           defines udpport_t and Udpport_t for use in prototypes.
  57.      <net/gen/udp_io.h>
  58.           defines struct nwio_udpopt (nwio_udpopt_t).
  59.      <net/gen/udp_hdr.h>
  60.           defines   struct   udp_hdr   (udp_hdr_t)   and   struct   udp_io_hdr
  61.           (udp_io_hdr_t).
  62.   Byte Order Conversion
  63.      All 16-bit and 32-bit quantities in IP headers must be  in  network  byte
  64.      order.   The  macros  described  in  hton(3) can be used to convert these
  65.      values to and from the byte order used by the host machine.
  66.   The Internet Checksum
  67.      The OneC_sum function (see oneC_sum(3)) is used to  calculate  the  one's
  68.      complement checksum needed for IP network packets.
  69.   General Functions
  70.      fd = open(tcpip_device, O_RDWR)
  71.      This is how one normally  obtains  a  filedescriptor  for  a  new  TCP/IP
  72.      channel.   tcpip_device names one of the TCP/IP devices.  The channel may
  73.      be used both to send or to receive data.
  74.                                                                              2
  75. IP(4)                     Minix Programmer's Manual                      IP(4)
  76.      n = read(fd, buf, size)
  77.      Receives one packet (low  level  devices)  or  a  number  of  bytes  (TCP
  78.      stream).   Returns the the number of bytes placed into buf, or returns -1
  79.      with an error code placed into errno.
  80.      n = write(fd, buf, size)
  81.      Sends one packet (low level devices) or a number of bytes  (TCP  stream).
  82.      Returns  size  or  -1  with the error code placed into errno.  The TCP/IP
  83.      read and write functions behave like reads and writes on  pipes  when  it
  84.      comes to signals.
  85.   ETH Functions
  86.      ioctl(fd, NWIOGETHSTAT, &struct nwio_ethstat)
  87.      The NWIOGETHSTAT ioctl returns the Ethernet address and  some  statistics
  88.      of  the Ethernet server of the channel fd.  The result is returned in the
  89.      nwio_ethstat  structure.   The  struct   nwio_ethstat   is   defined   in
  90.      <net/gen/eth_io.h>:
  91.           typedef struct nwio_ethstat
  92.           {
  93.                   ether_addr_t nwes_addr;
  94.                   eth_stat_t nwes_stat;
  95.           } nwio_ethstat_t;
  96.           typedef struct eth_stat
  97.           {
  98.               unsigned long ets_recvErr,  /* # receive errors */
  99.                   ets_sendErr,            /* # send error */
  100.                   ets_OVW,                /* # buffer overwrite warnings,
  101.                                              (packets arrive faster than
  102.                                               can be processed) */
  103.                   ets_CRCerr,             /* # crc errors of read */
  104.                   ets_frameAll,           /* # frames not aligned (# bits
  105.                                              not a multiple of 8) */
  106.                   ets_missedP,            /* # packets missed due to too
  107.                                              slow packet processing */
  108.                   ets_packetR,            /* # packets received */
  109.                   ets_packetT,            /* # packets transmitted */
  110.                   ets_transDef,           /* # transmission deferred (there
  111.                                              was a transmission of an
  112.                                              other station in progress */
  113.                   ets_collision,          /* # collisions */
  114.                   ets_transAb,            /* # transmissions aborted due
  115.                                              to excessive collisions */
  116.                   ets_carrSense,          /* # carrier sense lost */
  117.                   ets_fifoUnder,          /* # fifo underruns (processor
  118.                                                                              3
  119. IP(4)                     Minix Programmer's Manual                      IP(4)
  120.                                              is too busy) */
  121.                   ets_fifoOver,           /* # fifo overruns (processor is
  122.                                              too busy) */
  123.                   ets_CDheartbeat,        /* # times unable to transmit
  124.                                              collision signal */
  125.                   ets_OWC;                /* # times out of window
  126.                                              collision */
  127.           } eth_stat_t;
  128.      ioctl(fd, NWIOSETHOPT, &struct nwio_ethopt)
  129.      Before an Ethernet channel can  be  used  to  send  or  receive  Ethernet
  130.      packets,  it  has  to  be  configured  using  the NWIOSETHOPT ioctl.  The
  131.      structure nwio_ethopt is defined in <net/gen/eth_io.h>:
  132.           typedef struct nwio_ethopt
  133.           {
  134.                   u32_t nweo_flags;
  135.                   ether_addr_t nweo_multi, nweo_rem;
  136.                   ether_type_t nweo_type;
  137.           } nwio_ethopt_t;
  138.           #define NWEO_NOFLAGS    0x0000L
  139.           #define NWEO_ACC_MASK   0x0003L
  140.           #       define NWEO_EXCL        0x00000001L
  141.           #       define NWEO_SHARED      0x00000002L
  142.           #       define NWEO_COPY        0x00000003L
  143.           #define NWEO_LOC_MASK   0x0010L
  144.           #       define NWEO_EN_LOC      0x00000010L
  145.           #       define NWEO_DI_LOC      0x00100000L
  146.           #define NWEO_BROAD_MASK 0x0020L
  147.           #       define NWEO_EN_BROAD    0x00000020L
  148.           #       define NWEO_DI_BROAD    0x00200000L
  149.           #define NWEO_MULTI_MASK 0x0040L
  150.           #       define NWEO_EN_MULTI    0x00000040L
  151.           #       define NWEO_DI_MULTI    0x00400000L
  152.           #define NWEO_PROMISC_MASK 0x0080L
  153.           #       define NWEO_EN_PROMISC  0x00000080L
  154.           #       define NWEO_DI_PROMISC  0x00800000L
  155.           #define NWEO_REM_MASK   0x0100L
  156.           #       define NWEO_REMSPEC     0x00000100L
  157.           #       define NWEO_REMANY      0x01000000L
  158.           #define NWEO_TYPE_MASK  0x0200L
  159.           #       define NWEO_TYPESPEC    0x00000200L
  160.           #       define NWEO_TYPEANY     0x02000000L
  161.           #define NWEO_RW_MASK    0x1000L
  162.           #       define NWEO_RWDATONLY   0x00001000L
  163.           #       define NWEO_RWDATALL    0x10000000L
  164.                                                                              4
  165. IP(4)                     Minix Programmer's Manual                      IP(4)
  166.      The configuration is divided in a  number  of  section  (covered  by  the
  167.      xx_MASK  macros).  Options can be set in the nweo_flags field.  The first
  168.      section (NWEO_ACC_MASK) controls the access to a certain Ethernet  packet
  169.      type.   If  NWEO_EXCL  is selected then this is the only channel that can
  170.      send or receive Ethernet packets of the selected type.  If NWEO_SHARED is
  171.      selected  then  multiple  channels (which all have to select NWEO_SHARED)
  172.      can use the same Ethernet type, they all can send  packets  but  incoming
  173.      packets  will  be  delivered  to  at  most  one of them.  If NWEO_COPY is
  174.      selected then multiple channels have access to the same Ethernet type and
  175.      all receive a copy of an incoming packet.
  176.      The  NWEO_LOC_MASK  flags  control  the  delivery  of  packets   with   a
  177.      destination  address  equal  to  the Ethernet address of the machine.  If
  178.      NWEO_EN_LOC is selected then these packets will  be  delivered  and  with
  179.      NWEO_DI_LOC they will be discarded.
  180.      NWEO_BROAD_MASK, NWEO_MULTI_MASK, and NWEO_PROMISC_MASK do  the  same  to
  181.      broadcast  packets,  multicast  packets  and  promiscuous mode packets as
  182.      NWEO_LOC_MASK does for local packets.  Except that the precise  multicast
  183.      address is taken from the nweo_multi field.
  184.      The NWEO_REM_MASK flags control whether communication  is  restricted  to
  185.      single  destination or not.  NWEO_REMSPEC restricts sending and receiving
  186.      of packets to the single remote computer specified in the nweo_rem field.
  187.      NWEO_REMANY allows sending to and receiving from any remote computer.
  188.      NWEO_TYPESPEC restricts sending and receiving  of  packets  to  the  type
  189.      specified  in nweo_type.  The type has to be in network byte order (using
  190.      hton(3)).  NWEO_TYPEANY allows any type.
  191.      If the Ethernet header is completely specified by  the  nweo_flags  i.e.,
  192.      all   of   NWEO_EN_LOC,  NWEO_DI_BROAD,  NWEO_DI_MULTI,  NWEO_DI_PROMISC,
  193.      NWEO_REMSPEC and NWEO_TYPESPEC are specified, then NWEO_RWDATONLY can  be
  194.      used  to  send  and receive only the data part of an Ethernet packet.  If
  195.      NWEO_RWDATALL is specified then both Ethernet header and data are used.
  196.   PSIP Functions
  197.      [[[No description available yet.]]]
  198.   IP Functions
  199.      ioctl(fd, NWIOGIPCONF, &struct nwio_ipconf)
  200.      The NWIOGIPCONF ioctl reports the Internet Address and the netmask.   For
  201.      the nwio_ipconf structure see the NWIOSIPCONF ioctl below.
  202.      ioctl(fd, NWIOGIPOROUTE, &struct nwio_route)
  203.                                                                              5
  204. IP(4)                     Minix Programmer's Manual                      IP(4)
  205.      The NWIOGIPOROUTE ioctl can be used to  query  an  IP  server  about  its
  206.      routing  table.   [[[NWIODIPOROUTE, NWIOGIPIROUTE, NWIODIPIROUTE?]]]  The
  207.      structure nwio_route is defined in <net/gen/route.h>:
  208.           typedef struct nwio_route
  209.           {
  210.                   u32_t nwr_ent_no;
  211.                   u32_t nwr_ent_count;
  212.                   ipaddr_t nwr_dest;
  213.                   ipaddr_t nwr_netmask;
  214.                   ipaddr_t nwr_gateway;
  215.                   u32_t nwr_dist;
  216.                   u32_t nwr_flags;
  217.                   u32_t nwr_pref;
  218.           } nwio_route_t;
  219.           #define NWRF_EMPTY      0
  220.           #define NWRF_INUSE      1
  221.           #define NWRF_FIXED      2
  222.      The requested entry is taken from nwr_ent_no.  Entries are  counted  from
  223.      0,  so  the  value  0  can be used for an initial query.  The size of the
  224.      routing table is returned in nwr_ent_count.  The nwr_flags  indicates  if
  225.      the  entry  is in use (NWRF_INUSE) and if the entry was inserted manually
  226.      (using NWIOSIPOROUTE) or generated by the IP server itself.  The route is
  227.      described  by nwr_dest, nwr_netmask, nwr_gateway, nwr_dist, and nwr_pref.
  228.      Nwr_dest and nwr_netmask select the destination addresses.   A  value  of
  229.      0.0.0.0 (0x0) in both nwr_dest and nwr_netmask means every host.  A value
  230.      of 255.255.255.255 (0xffffffff)  in  nwr_netmask  means  a  single  host.
  231.      Other  values  of  nwr_netmask  are netmasks for the network specified by
  232.      nwr_dest.  Nwr_gateway is gateway that should be  used.   Nwr_dist  is  a
  233.      minimal distance.  Packets with a time to live smaller than nwr_dist will
  234.      not reach the destination.  If two routes have equal netmask and distance
  235.      fields  but  different  gateways  then  the gateway with highest value in
  236.      nwr_pref is used.
  237.      ioctl(fd, NWIOSIPCONF, &struct nwio_ipconf)
  238.      The NWIOSIPCONF ioctl can be used to  inform  the  IP  server  about  its
  239.      Internet Address and/or its netmask.  Normally an IP server will discover
  240.      its Internet Address using the RARP protocol.  NWIOSIPCONF can be used in
  241.      the  case  that  the RARP failed, or the netmask has to be changed.  Note
  242.      that higher level protocols  (TCP  and  UDP)  assume  that  the  Internet
  243.      Address  of  an  IP  device  does  not change, therefore TCP and UDP stop
  244.      functioning if the Internet Address is changed.
  245.      The structure nwio_ipconf is defined in <net/gen/ip_io.h>:
  246.                                                                              6
  247. IP(4)                     Minix Programmer's Manual                      IP(4)
  248.           typedef struct nwio_ipconf
  249.           {
  250.                   u32_t   nwic_flags;
  251.                   ipaddr_t nwic_ipaddr;
  252.                   ipaddr_t nwic_netmask;
  253.           } nwio_ipconf_t;
  254.           #define NWIC_NOFLAGS            0x0
  255.           #define NWIC_FLAGS              0x3
  256.           #       define NWIC_IPADDR_SET          0x1
  257.           #       define NWIC_NETMASK_SET         0x2
  258.      The function of nwio_ipconf depends  on  the  value  of  nwic_flags.   If
  259.      NWIC_IPADDR_SET  is  set  then  the  Internet  Address  will  be  set  to
  260.      nwic_ipaddr.  If NWIC_NETMASK_SET is set then the Internet  Address  will
  261.      be set to nwic_netmask.
  262.      ioctl(fd, NWIOSIPOPT, &struct nwio_ipopt)
  263.      Before an IP channel can be used, it  has  to  be  configured  using  the
  264.      NWIOSIPOPT    ioctl.     The   structure   nwio_ipopt   is   defined   in
  265.      <net/gen/ip_io.h>:
  266.           typedef struct nwio_ipopt
  267.           {
  268.                   u32_t nwio_flags;
  269.                   ipaddr_t nwio_rem;
  270.                   ip_hdropt_t nwio_hdropt;
  271.                   u8_t nwio_tos;
  272.                   u8_t nwio_ttl;
  273.                   u8_t nwio_df;
  274.                   ipproto_t nwio_proto;
  275.           } nwio_ipopt_t;
  276.           #define NWIO_NOFLAGS    0x0000L
  277.           #define NWIO_ACC_MASK   0x0003L
  278.           #       define NWIO_EXCL        0x00000001L
  279.           #       define NWIO_SHARED      0x00000002L
  280.           #       define NWIO_COPY        0x00000003L
  281.           #define NWIO_LOC_MASK   0x0010L
  282.           #       define NWIO_EN_LOC      0x00000010L
  283.           #       define NWIO_DI_LOC      0x00100000L
  284.           #define NWIO_BROAD_MASK 0x0020L
  285.           #       define NWIO_EN_BROAD    0x00000020L
  286.           #       define NWIO_DI_BROAD    0x00200000L
  287.           #define NWIO_REM_MASK   0x0100L
  288.           #       define NWIO_REMSPEC     0x00000100L
  289.           #       define NWIO_REMANY      0x01000000L
  290.           #define NWIO_PROTO_MASK 0x0200L
  291.           #       define NWIO_PROTOSPEC   0x00000200L
  292.                                                                              7
  293. IP(4)                     Minix Programmer's Manual                      IP(4)
  294.           #       define NWIO_PROTOANY    0x02000000L
  295.           #define NWIO_HDR_O_MASK 0x0400L
  296.           #       define NWIO_HDR_O_SPEC  0x00000400L
  297.           #       define NWIO_HDR_O_ANY   0x04000000L
  298.           #define NWIO_RW_MASK    0x1000L
  299.           #       define NWIO_RWDATONLY   0x00001000L
  300.           #       define NWIO_RWDATALL    0x10000000L
  301.      The  options  are  divided   in   several   categories:    NWIO_ACC_MASK,
  302.      NWIO_LOC_MASK,     NWIO_BROAD_MASK,    NWIO_REM_MASK,    NWIO_PROTO_MASK,
  303.      NWIO_HDR_O_MASK and NWIO_RW_MASK.   A  channel  is  configured  when  one
  304.      option of each category is set.
  305.      The options covered by NWIO_ACC_MASK control the number of channels  that
  306.      can  use  one  IP  protocol.   If  NWIO_EXCL  is specified then only that
  307.      channel can use a certain IP  protocol.   If  NWIO_SHARED  then  multiple
  308.      channels  that  all  have  to  specify  NWIO_SHARED  can  use the same IP
  309.      protocol, but incoming packets will be delivered to a most  one  channel.
  310.      NWIO_SHARED  does not impose any restrictions.  Every channel gets a copy
  311.      of an incoming packet.
  312.      NWIO_LOC_MASK and NWIO_BROAD_MASK control the delivery  of  packets.   If
  313.      NWIO_EN_LOC  is specified then packets that are explicitly send to the IP
  314.      server are delivered.   If  NWIO_EN_BROAD  is  specified  then  broadcast
  315.      packets  are  delivered.  Either one or both of them can be disabled with
  316.      NWIO_DI_LOC and NWIO_DI_BROAD.
  317.      NWIO_REMSPEC can be used to restrict communication to  one  remote  host.
  318.      This  host is taken from the nwio_rem field.  If any remote host is to be
  319.      allowed then NWIO_REMANY can be used.
  320.      NWIO_PROTOSPEC restricts communication to one IP protocol,  specified  in
  321.      nwio_proto.  NWIO_PROTOANY allows any protocol to be sent or received.
  322.      NWIO_HDR_O_SPEC specifies all IP header options in advance.   The  values
  323.      are taken from nwio_hdropt, nwio_tos, nwio_ttl, and nwio_df.  Nwio_hdropt
  324.      specifies the IP options that should be present in  an  outgoing  packet.
  325.      Ip_hdropt_t is defined in <net/gen/in.h>:
  326.           typedef struct ip_hdropt
  327.           {
  328.                   u8_t iho_opt_siz;
  329.                   u8_t iho_data[IP_MAX_HDR_SIZE-IP_MIN_HDR_SIZE];
  330.           } ip_hdropt_t;
  331.      The bytes of size iho_opt_siz in iho_data are appended to the IP  header.
  332.      Nwio_tos  specifies  the  value of the ``type of service'' bits, nwio_ttl
  333.      gives the value of the ``time  to  live''  field  and  nwio_df  specifies
  334.      whether  fragmentation  is  disallowed  or not.  NWIO_HDR_O_ANY specifies
  335.      that the header options should be specified at each write request.
  336.                                                                              8
  337. IP(4)                     Minix Programmer's Manual                      IP(4)
  338.      NWIO_RWDATONLY specifies that the header should be omitted from  a  write
  339.      request.   This  option  can  only  be  used  when  all header fields are
  340.      specified in previous options:  NWIO_EN_LOC, NWIO_DI_BROAD, NWIO_REMSPEC,
  341.      NWIO_PROTOSPEC  and  NWIO_HDR_O_SPEC.   A  read  operation will also only
  342.      return the data part, so the IP options will be lost.
  343.      ioctl(fd, NWIOSIPOROUTE, &struct nwio_route)
  344.      The  NWIOSIPOROUTE  ioctl  adds  a  route  to  the  routing  table.   See
  345.      NWIOGIPOROUTE  above  for a description of the nwio_route structure.  The
  346.      fields nwr_ent_no and nwr_ent_count are ignored.
  347.   TCP Functions
  348.      ioctl(fd, NWIOTCPCONN, &struct nwio_tcpcl)
  349.      The NWIOTCPCONN ioctl tries to setup a connection with  a  remote  TCP/IP
  350.      server.   The  channel  must  be  fully configured (see NWIOSTCPCONF) and
  351.      values for the local port, the remote port and the remote address have be
  352.      specified  using NWTC_LP_SET or NWTC_LP_SEL, NWTC_SET_RA and NWTC_SET_RP.
  353.      The struct nwio_tcpcl is defined in <net/gen/tcp_io.h> as:
  354.           typedef struct nwio_tcpcl
  355.           {
  356.                   long nwtcl_flags;
  357.                   long nwtcl_ttl;
  358.           } nwio_tcpcl_t;
  359.      Set the nwtcl_flags field to zero before  the  connect  or  listen  call.
  360.      [[[Further explanation of nwio_tcpcl?]]]
  361.      ioctl(fd, NWIOGTCPCONF, &struct nwio_tcpconf)
  362.      This call reports the  current  configuration  of  a  TCP  channel.   The
  363.      nwtc_flags  field  shows  the  status of the access, locport, remaddr and
  364.      remport fields.  Nwtc_locaddr contains the Internet address of the TCP/IP
  365.      server.   Remaddr  contains  the  Internet  address  of the remote TCP/IP
  366.      server when set with NWTC_SET_RA or after a successful connect or  listen
  367.      (see  NWIOTCPCONN  or  NWIOTCPLISTEN).   Nwio_locport  contains the local
  368.      TCP/IP  port  set  with  NWTC_LP_SET  or  the  selected  port  set   with
  369.      NWTC_LP_SEL.   Nwtc_remport  contains  the  TCP port of the remote TCP/IP
  370.      server as set with NWIO_SET_RP or after a successful connect or listen.
  371.      A value of  0  (zero)  is  reported  for  nwtc_remaddr,  nwtc_locport  or
  372.      nwtc_remport when no value is set either explicitly or implicitly.
  373.      ioctl(fd, NWIOTCPLISTEN, &struct nwio_tcpcl)
  374.                                                                              9
  375. IP(4)                     Minix Programmer's Manual                      IP(4)
  376.      The NWIOTCPLISTEN ioctl waits until  a  remote  TCP/IP  server  tries  to
  377.      connect  to  this  channel.   The  channel  has  to  be  configured  (see
  378.      NWIOSTCPCONF).  An additional restriction is that the local port must  be
  379.      set  (with  NWTC_LP_SET)  or  selected (with NWTC_LP_SEL).  When a remote
  380.      address is set only connections for that host are accepted,  and  when  a
  381.      remote port is set only connections from that port are accepted.  After a
  382.      successful listen NWIOGTCPCONF can be used to find out what  the  address
  383.      and port of the other side are.
  384.      ioctl(fd, NWIOSTCPCONF, &struct nwio_tcpconf)
  385.      Before  a  TCP  channel  can  be  used  it  must  configured  using   the
  386.      NWIOSTCPCONF  ioctl.  The parameters to NWIOSTCPCONF are the channel file
  387.      descriptor and a struct nwio_tcpconf as defined in <net/gen/tcp_io.h>:
  388.           typedef struct nwio_tcpconf
  389.           {
  390.                   u32_t nwtc_flags;
  391.                   ipaddr_t nwtc_locaddr;
  392.                   ipaddr_t nwtc_remaddr;
  393.                   tcpport_t nwtc_locport;
  394.                   tcpport_t nwtc_remport;
  395.           } nwio_tcpconf_t;
  396.           #define NWTC_NOFLAGS    0x0000L
  397.           #define NWTC_ACC_MASK   0x0003L
  398.           #       define NWTC_EXCL        0x00000001L
  399.           #       define NWTC_SHARED      0x00000002L
  400.           #       define NWTC_COPY        0x00000003L
  401.           #define NWTC_LOCPORT_MASK       0x0030L
  402.           #       define NWTC_LP_UNSET    0x00000010L
  403.           #       define NWTC_LP_SET      0x00000020L
  404.           #       define NWTC_LP_SEL      0x00000030L
  405.           #define NWTC_REMADDR_MASK       0x0100L
  406.           #       define NWTC_SET_RA      0x00000100L
  407.           #       define NWTC_UNSET_RA    0x01000000L
  408.           #define NWTC_REMPORT_MASK       0x0200L
  409.           #       define NWTC_SET_RP      0x00000200L
  410.           #       define NWTC_UNSET_RP    0x02000000L
  411.      A tcp channel is considered configured when one flag in each category has
  412.      been  selected.   Thus one of NWTC_EXCL, NWTC_SHARED or NWTC_COPY, one of
  413.      NWTC_LP_UNSET,  NWTC_LP_SET  or  NWTC_LP_SEL,  one  of   NWTC_SET_RA   or
  414.      NWTC_UNSET_RA, and one of NWTC_SET_RP or NWTC_UNSET_RP.
  415.      The acc flags control the access to a certain TCP port.  NWTC_EXCL  means
  416.      exclusive  access.   An  attempt to configure a channel will be denied if
  417.      the same port is specified as that of a channel that requested  exclusive
  418.      access.   NWTC_SHARED  indicates  that several channels use the same port
  419.      but cooperate.  If the shared mode is specified for one channel than  all
  420.                                                                             10
  421. IP(4)                     Minix Programmer's Manual                      IP(4)
  422.      other channel that use the same port should also be configured  with  the
  423.      NWTC_SHARED  flag.   NWTC_COPY  is specified when the programmer does not
  424.      care about other channels.  This is the default.
  425.      The locport flags control which  TCP  port  is  used  for  communication.
  426.      NWTC_LP_UNSET  indicates  the  absence  of  a  local  port.   This is the
  427.      default.  NWTC_LP_SET means that  the  nwtc_locport  field  contains  the
  428.      local  port  to be used by TCP.  This value must be in network byte order
  429.      (see hton(3).)  NWTC_LP_SEL requests the TCP server to pick a port.  This
  430.      port will be in the range from 32768 to 65535 and will be unique.
  431.      The remaddr flags specify which hosts  are  acceptable  for  connections.
  432.      NWTC_SET_RA  indicates  that  only  connection  to  the host specified in
  433.      nwtc_remaddr are acceptable.  Nwtc_remaddr  should  be  in  network  byte
  434.      order  (see  hton(3).)  NWTC_UNSET_RA allows every host on the other side
  435.      of a connection.  This is the default.
  436.      The  remport  flags  specify  which  remote  ports  are  acceptable   for
  437.      connections.   NWTC_SET_RP  indicates  that  only  the  port specified in
  438.      nwtc_remport is acceptable.  NWTC_UNSET_RP allows every port on the other
  439.      side of a connection.  This is the default.
  440.      ioctl(fd, NWIOTCPSHUTDOWN)
  441.      The NWIOTCPSHUTDOWN tells the TCP/IP server that no  more  data  will  be
  442.      sent  over  the channel specified by fd.  This command can be issued when
  443.      the channel is connected to a remote TCP/IP server.   The  TCP/IP  server
  444.      will  tell  the  remote TCP/IP server and the client of the remote TCP/IP
  445.      server will receive an end-of-file indication.
  446.      ioctl(fd, NWIOGTCPOPT, &struct nwio_tcpopt)
  447.      ioctl(fd, NWIOSTCPOPT, &struct nwio_tcpopt)
  448.      The behaviour of a TCP channel may be changed  by  setting  a  number  of
  449.      options.   The TCP options can be obtained with the NWIOGTCPOPT ioctl and
  450.      set with the NWIOSTCPOPT ioctl.  The  options  are  passed  in  a  struct
  451.      nwio_tcpopt as defined in <net/gen/tcp_io.h>:
  452.           typedef struct nwio_tcpopt
  453.           {
  454.                   u32_t nwto_flags;
  455.           } nwio_tcpconf_t;
  456.           #define NWTO_NOFLAG     0x0000L
  457.           #define NWTO_SND_URG_MASK       0x0001L
  458.           #       define NWTO_SND_URG     0x00000001L
  459.           #       define NWTO_SND_NOTURG  0x00010000L
  460.           #define NWTO_RCV_URG_MASK       0x0002L
  461.           #       define NWTO_RCV_URG     0x00000002L
  462.           #       define NWTO_RCV_NOTURG  0x00020000L
  463.                                                                             11
  464. IP(4)                     Minix Programmer's Manual                      IP(4)
  465.           #define NWTO_BSD_URG_MASK       0x0004L
  466.           #       define NWTO_BSD_URG     0x00000004L
  467.           #define NWTO_DEL_RST_MASK       0x0008L
  468.           #       define NWTO_DEL_RST     0x00000008L
  469.      The NWTO_SND_URG option causes bytes written to the channel  to  be  send
  470.      out  as  urgent data.  On receiving an EURG error the NWTO_RCV_URG option
  471.      must be set to switch over to reading urgent data.  When all urgent  data
  472.      has  been  read  an  ENOURG error will follow, indicating that the option
  473.      must be cleared with NWTO_RCV_NOTURG.  Alas  the  BSD  implementation  of
  474.      urgent  data  disagrees  with the RFC's, so to be BSD compatible one must
  475.      set the NWTO_BSD_URG option beforehand on a channel that is  to  send  or
  476.      receive  urgent  data.  Given that the BSD implementation is the regarded
  477.      as the TCP/IP  standard  one  should  always  use  the  BSD  style.   The
  478.      NWTO_DEL_RST  option  delays  a failure response on a connect to the same
  479.      port as the current open connection.  Without this option a connect would
  480.      fail  if  a server is not yet listening.  With this option a connect will
  481.      linger on until the server starts listening.  This option is useful for a
  482.      server  that  opens  a  connection,  tells  the remote end the local port
  483.      number and then listens (FTP), or for a program that  forks  off  servers
  484.      for incoming connections (TELNET).  A new connection may come in before a
  485.      new listen can be started, so it is nice if the new connect doesn't fail.
  486.      Use this option only when it is clearly needed.
  487.   UDP Functions
  488.      ioctl(fd, NWIOGUDPOPT, &struct nwio_udpopt)
  489.      The NWIOGUDPOPT ioctl returns the current options that  result  from  the
  490.      default  options  and the options set with NWIOSUDPOPT.  When NWUO_LP_SEL
  491.      or NWUO_LP_SET is selected the local port is  returned  in  nwuo_locport.
  492.      When NWUO_RP_SET is selected the remote port is returned in nwuo_remport.
  493.      The  local  address  is  always  returned  in  nwuo_locaddr,   and   when
  494.      NWUO_RA_SET is selected the remote address is returned in nwuo_remaddr.
  495.      ioctl(fd, NWIOSUDPOPT, &struct nwio_udpopt)
  496.      A UDP channel must be configured using the NWIOSUDPOPT ioctl  before  any
  497.      data  can  be  read or written.  NWIOSUDPOPT takes two parameters, a file
  498.      descriptor to an open UDP device and pointer to a  nwio_udpopt  structure
  499.      that describes the requested configuration.  The nwio_udpopt structure is
  500.      defined in <net/gen/udp_io.h> as:
  501.           typedef struct nwio_udpopt
  502.           {
  503.                   unsigned long nwuo_flags;
  504.                   udpport_t nwuo_locport;
  505.                   udpport_t nwuo_remport;
  506.                   ipaddr_t nwuo_locaddr;
  507.                   ipaddr_t nwuo_remaddr;
  508.                                                                             12
  509. IP(4)                     Minix Programmer's Manual                      IP(4)
  510.           } nwio_udpopt_t;
  511.           #define NWUO_NOFLAGS            0x0000L
  512.           #define NWUO_ACC_MASK           0x0003L
  513.           #define         NWUO_EXCL               0x00000001L
  514.           #define         NWUO_SHARED             0x00000002L
  515.           #define         NWUO_COPY               0x00000003L
  516.           #define NWUO_LOCPORT_MASK       0x000CL
  517.           #define         NWUO_LP_SEL             0x00000004L
  518.           #define         NWUO_LP_SET             0x00000008L
  519.           #define         NWUO_LP_ANY             0x0000000CL
  520.           #define NWUO_LOCADDR_MASK       0x0010L
  521.           #define         NWUO_EN_LOC             0x00000010L
  522.           #define         NWUO_DI_LOC             0x00100000L
  523.           #define NWUO_BROAD_MASK         0x0020L
  524.           #define         NWUO_EN_BROAD           0x00000020L
  525.           #define         NWUO_DI_BROAD           0x00200000L
  526.           #define NWUO_REMPORT_MASK       0x0100L
  527.           #define         NWUO_RP_SET             0x00000100L
  528.           #define         NWUO_RP_ANY             0x01000000L
  529.           #define NWUO_REMADDR_MASK       0x0200L
  530.           #define         NWUO_RA_SET             0x00000200L
  531.           #define         NWUO_RA_ANY             0x02000000L
  532.           #define NWUO_RW_MASK            0x1000L
  533.           #define         NWUO_RWDATONLY          0x00001000L
  534.           #define         NWUO_RWDATALL           0x10000000L
  535.           #define NWUO_IPOPT_MASK         0x2000L
  536.           #define         NWUO_EN_IPOPT           0x00002000L
  537.           #define         NWUO_DI_IPOPT           0x20000000L
  538.      A UDP channel is considered configured when one flag in each category has
  539.      been  selected.   Thus one of NWUO_EXCL, NWUO_SHARED or NWUO_COPY, one of
  540.      NWUO_LP_SEL,  NWUO_LP_SET  or  NWUO_LP_ANY,   one   of   NWUO_EN_LOC   or
  541.      NWUO_DI_LOC,  one of NWUO_EN_BROAD, or NWUO_DI_BROAD, one of NWUO_RP_SET,
  542.      or  NWUO_RP_ANY,   one   of   NWUO_RA_SET,   or   NWUO_RA_ANY,   one   of
  543.      NWUO_RWDATONLY,   or   NWUO_RWDATALL,   and   one  of  NWUO_EN_IPOPT,  or
  544.      NWUO_DI_IPOPT.  The acc flags control the access to a certain  UDP  port.
  545.      NWUO_EXCL  means  exclusive  access:  no other channel can use this port.
  546.      NWUO_SHARED means shared  access:   only  channels  that  specify  shared
  547.      access  can use this port and all packets that are received are handed to
  548.      at most one channel.  NWUO_COPY imposes no  access  restriction  and  all
  549.      channels get a copy of every received packet for that port.
  550.      The locport flags control the selection of the UDP port for this channel.
  551.      NWUO_LP_SEL requests the server to pick a port.  This port will be in the
  552.      range from 32768 to 65535 and it will be unique.   NWUO_LP_SET  sets  the
  553.      local  port to the value of the nwuo_locport field.  NWUO_LP_ANY does not
  554.      select a port.  Reception of data is therefore not  possible  but  it  is
  555.      possible to send data.  (See tcpip_read, and tcpip_write above).
  556.                                                                             13
  557. IP(4)                     Minix Programmer's Manual                      IP(4)
  558.      The locaddr flags control the reception of packets.  NWUO_EN_LOC  enables
  559.      the  reception  of  packets  with  the  local  IP address as destination.
  560.      NWUO_DI_LOC disables the reception of packet for the local IP address.
  561.      The  broad  flags   control   the   reception   of   broadcast   packets.
  562.      NWUO_EN_BROAD   enables   the   reception   of   broadcast   packets  and
  563.      NWUO_DI_BROAD disables the reception of broadcast packets.
  564.      The remport flags let the client to specify one specific remote UDP  port
  565.      or to allow any remote port.  NWUO_RP_SET sets the remote UDP port to the
  566.      value of nwuo_remport.  Only packets with a matching remote port will  be
  567.      delivered  and all packets will be sent to that port.  NWUO_RP_ANY allows
  568.      reception of packets form any port  and  when  transmitting  packets  the
  569.      remote port has to be specified.
  570.      The remaddr flags control the remote IP address.   NWUO_RA_SET  sets  the
  571.      remote  IP  address  the  value  of nwuo_remaddr.  Only packets from that
  572.      address will be delivered and all packets will be sent to  that  address.
  573.      NWUO_RA_ANY   allows   reception  of  packets  from  any  host  and  when
  574.      transmitting packets the remote host has to be specified.
  575.      The rw flags control the format of the data to be sent or received.  With
  576.      NWUO_RWDATONLY  only  the data part of a UDP packet is sent to the server
  577.      and only the data part is received from the  server.   The  NWUO_RWDATALL
  578.      mode  presents  the data part of a UDP packet with a header that contains
  579.      the source and destination IP address, source and destination UDP  ports,
  580.      the  IP  options,  etc.  The server expects such a header in front of the
  581.      data to be transmitted.
  582.      The ipopt flags control the delivery  and  transmission  of  IP  options.
  583.      When  NWUO_EN_IPOPT  is set IP, options will be delivered and sent.  When
  584.      NWUO_DI_IPOPT is set IP option will be stripped from received packets and
  585.      no IP options will be sent.
  586. FILES
  587.      /dev/eth[01]      First and second raw ethernet.
  588.      /dev/psip[01]     First and second Pseudo IP network.
  589.      /dev/ip[0123]     IP  devices  for  two  ethernets  and  two  Pseudo   IP
  590.                        networks.
  591.      /dev/tcp[0123]    TCP devices for same four networks.
  592.      /dev/udp[0123]    UDP devices.
  593.      /dev/eth, /dev/psip, /dev/ip, /dev/tcp, /dev/udp
  594.                        Devices for the default network, links to  the  devices
  595.                        above.  Eth is only present if ethernet is the default,
  596.                                                                             14
  597. IP(4)                     Minix Programmer's Manual                      IP(4)
  598.                        psip only for pseudo IP.
  599. SEE ALSO
  600.      hton(3), oneC_sum(3), set_net_default(8), boot(8).
  601. DIAGNOSTICS
  602.      Several errors may be returned by the TCP/IP server.  The error  code  is
  603.      found in the errno variable if the read, write, or ioctl call returns -1.
  604.      The TCP/IP error codes defined in <errno.h> are:
  605.      EPACKSIZE              This indicates an attempt to read or write with  a
  606.                             buffer that is too large or too small.
  607.      EOUTOFBUFS             The  TCP/IP  server  has  insufficient  memory  to
  608.                             execute the request.
  609.      EBADIOCTL              This indicates an attempt to execute a command the
  610.                             particular   server   does  not  understand.   For
  611.                             example, a NWIOGTCPCONF on an ETH channel.
  612.      EBADMODE               The request is refused because the channel is  not
  613.                             fully  configured,  in  the  wrong  state  or  the
  614.                             parameters are invalid.
  615.      EBADDEST               This indicates an illegal destination address  for
  616.                             a packet.
  617.      EDSTNORCH              The destination is not reachable.
  618.      EISCONN                The channel  is  already  connected  so  a  second
  619.                             request is refused.
  620.      EADDRINUSE             This address is in use.
  621.      ECONNREFUSED           The connection is refused by the other side.
  622.      ECONNRESET             The   connection    is    reset    (non-gracefully
  623.                             terminated) by the other side.
  624.      ETIMEDOUT              The connection is terminated  due  to  an  expired
  625.                             timer.
  626.      EURG                   Urgent data is present  and  the  current  receive
  627.                             mode does not allow urgent data to be transferred.
  628.      ENOURG                 No urgent data is present and a request  came  for
  629.                             urgent data.
  630.                                                                             15
  631. IP(4)                     Minix Programmer's Manual                      IP(4)
  632.      ENOTCONN               The request requires a connected channel  and  the
  633.                             channel is not connected.
  634.      ESHUTDOWN              The  connection  is  shut  down.    That   is,   a
  635.                             NWIOTCPSHUTDOWN  has been executed so no more data
  636.                             can be transmitted.
  637.      ENOCONN                The connection does not exist.
  638.      EGENERIC               A generic error code for extremely weird cases.
  639. AUTHOR
  640.      Philip Homburg (philip@cs.vu.nl)
  641.                                                                             16