.TH IP 2
.SH NAME
eipconv, parseip, parseipmask, v4parseip, v4parsecidr, parseether, myipaddr, myetheraddr, maskip, equivip, defmask, isv4, v4tov6, v6tov4, nhgetl, nhgets, hnputl, hnputs, readipifc \- Internet protocol
.SH SYNOPSIS
.B #include <u.h>
.br
.B #include <libc.h>
.br
.B #include <ip.h>
.PP
.B
int	eipconv(void *o, int f1, int f2, int f3, int chr)
.PP
.B
ulong	parseip(uchar *ipaddr, char *str)
.PP
.B
ulong	parseipmask(uchar *ipaddr, char *str)
.PP
.B
ulong	v4parseip(uchar *ipaddr, char *str)
.PP
.B
ulong	v4parsecidr(uchar *addr, uchar *mask, char *str)
.PP
.B
int	parseether(uchar *eaddr, char *str)
.PP
.B
int	myetheraddr(uchar *eaddr, char *net)
.PP
.B
void	maskip(uchar *from, uchar *mask, uchar *to)
.PP
.B
int	equivip(uchar *ipaddr1, uchar *ipaddr2)
.PP
.B
uchar*	defmask(uchar *ipaddr)
.PP
.B
int	isv4(uchar *ipaddr)
.PP
.B
void	v4tov6(uchar *ipv6, uchar *ipv4)
.PP
.B
void	v6tov4(uchar *ipv4, uchar *ipv6)
.PP
.B
ushort	nhgets(void *p)
.PP
.B
uint	nhgetl(void *p)
.PP
.B
void	hnputs(void *p, ushort v)
.PP
.B
void	hnputl(void *p, uint v)
.PP
.B
Ipifc*	readipifc(char *net, Ipifc *ifc)
.PP
.B
uchar	IPv4bcast[IPaddrlen];
.PP
.B
uchar	IPv4allsys[IPaddrlen];
.PP
.B
uchar	IPv4allrouter[IPaddrlen];
.PP
.B
uchar	IPallbits[IPaddrlen];
.PP
.B
uchar	IPnoaddr[IPaddrlen];
.PP
.B
uchar	v4prefix[IPaddrlen];
.SH DESCRIPTION
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
.B unsigned
.BR chars ,
Ethernet
addresses as 6
.B unsigned
.BR chars .
Either V4 or V6 string representation can be used for IP addresses.
For V4 addresses, the representation can be (up to) 4 decimal
integers 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,
.B FFFF::1111
is equivalent to
.BR 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
.BR FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FF00 ,
.BR 255.255.255.0 ,
or
.BR /120.
The string representation of Ethernet addresses is exactly
12 hexadecimal digits.
.PP
.I Eipconv
is a
.IR print (2)
formatter for Ethernet (verb
.BR E )
addresses,
IP V6 (verb
.BR I )
addresses,
IP V4 (verb
.BR V )
addresses,
and IP V6 (verb
.BR M )
masks.
.PP
.I Parseip
converts a string pointed to by
.I str
to a 16-byte IP address starting at
.IR 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.
.I Parseipmask
converts a string pointed to by
.I str
to a 6-byte IP mask starting at
.IR ipaddr .
It too returns an unsigned long big-endian V4 address or 6.
Both routines return -1 on errors.
.PP
.I V4parseip
converts a string pointed to by
.I str
to a 4-byte V4 IP address starting at
.IR ipaddr .
.PP
.I V4parsecidr
converts a string of the form
addr/mask, pointed to by
.IR str ,
to a 4-byte V4 IP address starting at
.I ipaddr
and a 4-byte V4 IP mask starting at
.IR mask .
.PP
.I Parseether
converts a string pointed to by
.I str
to a 6-byte Ethernet address starting at
.IR eaddr .
.I Myetheraddr
reads the Ethernet address string from file
.IB net /1/stats
and parses it into
.IR eaddr .
Both routines return a negative number on errors.
.PP
.I 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.
.PP
.I Equivip
returns non-zero if the IP addresses pointed to by its two
arguments are equal.
.PP
.I Defmask
returns the standard class A, B, or C mask for
.IR ipaddr .
.PP
.I Isv4
returns non-zero if the V6 address is in the V4 space, that is,
if it starts with
.BR 0:0:0:0:0:0:FFFF .
.I V4tov6
converts the V4 address,
.IR v4ip ,
to a V6 address and puts the result in
.IR v6ip .
.I V6tov4
converts the V6 address,
.IR v6ip ,
to a V4 address and puts the result in
.IR v4ip .
.PP
.I Hnputs
and
.I hnputl
are used to store 16-bit and 32-bit integers into IP big-endian form.
.I Nhgets
and
.I nhgetl
convert big-endian 2 and 4 byte quantities into integers.
.PP
A number of standard IP addresses in V6 format are also defined.  They
are:
.IP \f5IPv4bcast
the V4 broadcast address
.IP \f5IPv4allsys
the V4 all systems multicast address
.IP \f5IPv4allrouter
the V4 all routers multicast address
.IP \f5IPallbits
the V6 all bits on address
.IP \f5IPnoaddr
the V6 null address, all zeros
.IP \f5v4prefix
the IP V6 prefix to all embedded V4 addresses
.PP
.I Readipifc
updates the linked list of IP
interfaces,
.IR ifc ,
with those currently configured under mountpoint
.IR net ,
default
.BR /net .
The new list is returned.
.I Ipifc
is:
.PP
.EX
typedef struct Ipifc
{
	char	dev[64];
	uchar	ip[IPaddrlen];
	uchar	mask[IPaddrlen];
	uchar	net[IPaddrlen];
	int	mtu;
	Ipifc	*next;
} Ipifc;
.EE
.PP
.I Dev
contains the first 64 bytes of the device configured with this
interface.
.I Net
is
.IB ip & mask
if the network is multipoint or
the remote address if the network is
point to point.
.SH SOURCE
.B /sys/src/libip
.SH SEE ALSO
.IR print (2)
