IP(2)                                                       IP(2)

          eipfmt, parseip, parseipmask, parseipandmask, v4parseip,
          parseether, myipaddr, myetheraddr, maskip, equivip4,
          equivip6, defmask, isv4, v4tov6, v6tov4, nhgetv, nhgetl,
          nhgets, hnputv, hnputl, hnputs, ptclbsum, readipifc -
          Internet Protocol addressing

          #include <u.h>
          #include <libc.h>
          #include <ip.h>

          int  eipfmt(Fmt*)

          vlong     parseip(uchar *ipaddr, char *str)

          vlong     parseipmask(uchar *ipaddr, char *str, int v4)

          vlong     parseipandmask(uchar *ipaddr, uchar *ipmask, char
          *ipstr, char *maskstr)

          char*     v4parseip(uchar *ipaddr, char *str)

          int  parseether(uchar *eaddr, char *str)

          int  myetheraddr(uchar *eaddr, char *dev)

          int  myipaddr(uchar *ipaddr, char *net)

          void maskip(uchar *from, uchar *mask, uchar *to)

          int  equivip4(uchar *ipaddr1, uchar *ipaddr2)

          int  equivip6(uchar *ipaddr1, uchar *ipaddr2)

          uchar*    defmask(uchar *ipaddr)

          int  isv4(uchar *ipaddr)

          void v4tov6(uchar *ipv6, uchar *ipv4)

          int  v6tov4(uchar *ipv4, uchar *ipv6)

          ushort    nhgets(void *p)

          uint nhgetl(void *p)

          uvlong    nhgetv(void *p)

          void hnputs(void *p, ushort v)

     Page 1                       Plan 9             (printed 7/23/24)

     IP(2)                                                       IP(2)

          void hnputl(void *p, uint v)

          void hnputv(void *p, uvlong v)

          ushort    ptclbsum(uchar *a, int n)

          Ipifc*    readipifc(char *net, Ipifc *ifc, int index)

          uchar     IPv4bcast[IPaddrlen];

          uchar     IPv4allsys[IPaddrlen];

          uchar     IPv4allrouter[IPaddrlen];

          uchar     IPallbits[IPaddrlen];

          uchar     IPnoaddr[IPaddrlen];

          uchar     v4prefix[IPaddrlen];

          These routines are used by Internet Protocol (IP) programs
          to manipulate IP and Ethernet addresses.  Plan 9, by
          default, uses V6 format IP addresses.  Since V4 addresses
          fit into the V6 space, all IP addresses can be represented.
          IP addresses are stored as a string of 16 unsigned chars,
          Ethernet addresses as 6 unsigned chars.  Either V4 or V6
          string representation can be used for IP addresses.  For V4
          addresses, the representation can be (up to) 4 decimal inte-
          gers from 0 to 255 separated by periods.  For V6 addresses,
          the representation is (up to) 8 hex integers from 0x0 to
          0xFFFF separated by colons.  Strings of 0 integers can be
          elided using two colons.  For example, FFFF::1111 is equiva-
          lent to FFFF:0:0:0:0:0:0:1111.  The string representation
          for IP masks is a superset of the address representation.
          It includes slash notation that indicates the number of
          leading 1 bits in the mask.  Thus, a V4 class C mask can be
          represented as FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FF00,
, or /120.  The string representation of Ether-
          net addresses is exactly 12 hexadecimal digits.

          Eipfmt is a print(2) formatter for Ethernet (verb E)
          addresses, IP V6 (verb I) addresses, IP V4 (verb V)
          addresses, and IP V6 (verb M) masks.

          Parseip converts a string pointed to by str to a 16-byte IP
          address starting at ipaddr. As a concession to backwards
          compatibility, if the string is a V4 address, the return
          value is an unsigned long integer containing the big-endian
          V4 address.  If not, the return value is 6.

          Parseipmask converts a string pointed to by str to a 16-byte

     Page 2                       Plan 9             (printed 7/23/24)

     IP(2)                                                       IP(2)

          IP mask starting at ipaddr. It too returns an unsigned long
          big-endian V4 address or 6.  Parseipmask accepts a mask in
          /prefixlen slash notation. When the v4 argument is non-zero,
          then prefixlen in range [0..32] is offset by 96 to yield a
          mask for a V4 address.

          Parseipandmask combines parseip and parseipmask into a sin-
          gle call, interpreting the mask in context of the supplied
          IP address type.  The returned IP mask is /128 when maskstr
          is nil.

          All three functions return -1 on errors.

          V4parseip converts a string pointed to by str to a 4-byte V4
          IP address starting at ipaddr.

          Myipaddr returns the first valid IP address in the IP stack
          rooted at net.

          Parseether converts a string pointed to by str to a 6-byte
          Ethernet address starting at eaddr. Myetheraddr reads the
          Ethernet address string from file dev/addr and parses it
          into eaddr. Both routines return a negative number on

          Maskip places the bit-wise AND of the IP addresses pointed
          to by its first two arguments into the buffer pointed to by
          the third.

          Equivip returns non-zero if the IP addresses pointed to by
          its two arguments are equal.  Equivip4 operates on v4
          addresses, equivip6 operates on v6 addresses.

          Defmask returns the standard class A, B, or C mask for
          ipaddr .

          Isv4 returns non-zero if the V6 address is in the V4 space,
          that is, if it starts with 0:0:0:0:0:0:FFFF.  V4tov6 con-
          verts the 4-byte V4 address, v4ip, to a V6 address and puts
          the result in v6ip. V6tov4 converts the V6 address, v6ip, to
          a 4-byte V4 address and puts the result in v4ip.

          Hnputs, hnputl and hnputv are used to store 16-bit, 32-bit,
          and 64-bit integers, respectively, into IP big-endian form.
          Nhgets, nhgetl and nhgetv convert big-endian 2, 4 and 8 byte
          quantities into integers (or uvlongs).

          Pctlbsum returns the one's complement checksum used in IP
          protocols, typically invoked as

               hnputs(hdr->cksum, ~ptclbsum(data, len) & 0xffff);

     Page 3                       Plan 9             (printed 7/23/24)

     IP(2)                                                       IP(2)

          A number of standard IP addresses in V6 format are also
          defined.  They are:

          IPv4bcast      the V4 broadcast address
          IPv4allsys     the V4 all systems multicast address
          IPv4allrouter  the V4 all routers multicast address
          IPallbits      the V6 all bits on address
          IPnoaddr       the V6 null address, all zeros
          v4prefix       the IP V6 prefix to all embedded V4 addresses

          Readipifc returns information about a particular interface
          (index >= 0) or all IP interfaces (index < 0) configured
          under a mount point net, default /net.  Each interface is
          described by one Ipifc structure which in turn points to a
          linked list of Iplifc structures describing the addresses
          assigned to this interface.  If the list ifc is supplied,
          that list is freed.  Thus, subsequent calls can be used to
          free the list returned by the previous call.  Ipifc is:

          typedef struct Ipifc
               Ipifc     *next;
               Iplifc    *lifc;         /* local addressses */

               /* per ip interface */
               int  index;         /* number of interface in ipifc dir */
               char dev[64];  /* associated physical device */
               int  mtu;      /* max transfer unit */

               uchar     sendra6;  /* on == send router adv */
               uchar     recvra6;  /* on == rcv router adv */

               ulong     pktin;         /* packets read */
               ulong     pktout;        /* packets written */
               ulong     errin;         /* read errors */
               ulong     errout;        /* write errors */
               Ipv6rp    rp;       /* route advertisement params */
          } Ipifc;

          Iplifc is:

          struct Iplifc
               Iplifc    *next;

               uchar     ip[IPaddrlen];
               uchar     mask[IPaddrlen];
               uchar     net[IPaddrlen];          /* ip & mask */
               ulong     preflt;             /* preferred lifetime */
               ulong     validlt;       /* valid lifetime */

     Page 4                       Plan 9             (printed 7/23/24)

     IP(2)                                                       IP(2)

          Ipv6rp is:

          struct Ipv6rp
               int  mflag;
               int  oflag;
               int  maxraint; /* max route adv interval */
               int  minraint; /* min route adv interval */
               int  linkmtu;
               int  reachtime;
               int  rxmitra;
               int  ttl;
               int  routerlt;

          Dev contains the first 64 bytes of the device configured
          with this interface.  Net is ip&mask if the network is mul-
          tipoint or the remote address if the network is point to


          print(2), ip(3)

     Page 5                       Plan 9             (printed 7/23/24)