.TH IP 3
.SH NAME
eipfmt, parseip, parseipmask, v4parseip, v4parsecidr, parseether, myipaddr, myetheraddr, maskip, equivip, defmask, isv4, v4tov6, v6tov4, nhgetl, nhgets, nhgetv, hnputl, hnputs, hnputv, ptclbsum, readipifc \- Internet protocol
.SH SYNOPSIS
.B #include <u.h>
.br
.B #include <libc.h>
.br
.B #include <ip.h>
.PP
.B
int	eipfmt(Fmt*)
.PP
.B
ulong	parseip(uchar *ipaddr, char *str)
.PP
.B
ulong	parseipmask(uchar *ipaddr, char *str)
.PP
.B
char*	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 *dev)
.PP
.B
int	myipaddr(uchar *ipaddr, 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
uvlong	nhgetv(void *p)
.PP
.B
void	hnputs(void *p, ushort v)
.PP
.B
void	hnputl(void *p, uint v)
.PP
.B
void	hnputv(void *p, uvlong v)
.PP
.B
ushort	ptclbsum(uchar *a, int n)
.PP
.B
Ipifc*	readipifc(char *net, Ipifc *ifc, int index)
.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 Eipfmt
is a
.IR print (3)
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 Myipaddr
returns the first valid IP address in
the IP stack rooted at
.IR net .
.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 dev /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
.IR Hnputs ,
.IR hnputl ,
and
.I hnputv
are used to store 16-, 32-, and 64-bit integers into IP big-endian form.
.IR Nhgets ,
.IR nhgetl ,
and
.I nhgetv
convert big-endian 2-, 4-, and 8-byte quantities into integers.
.PP
.I Pctlbsum
returns the one's complement checksum used in IP protocols, typically invoked as
.EX
hnputs(hdr->cksum, ~ptclbsum(data, len) & 0xffff);
.EE
.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
returns information about
a particular interface  (\fIindex\fP >= 0)
or all IP interfaces (\fIindex\fP < 0)
configured under a
mount point
.IR net ,
default
.BR /net .
Each interface is described by one
.I Ipifc
structure which in turn points to a linked list of
.IR Iplifc
structures describing the addresses assigned
to this interface.
If the list
.IR ifc
is supplied,
that list is freed.
Thus, subsequent calls can be used
to free the list returned by the previous call.
.I Ipifc
is:
.PP
.EX
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 */

	long	validlt;	/* valid life time */
 	long	preflt;		/* preferred life time */
	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;
.EE
.PP
.I Iplifc
is:
.PP
.EX
struct Iplifc
{
	Iplifc	*next;

	uchar	ip[IPaddrlen];
	uchar	mask[IPaddrlen];
	uchar	net[IPaddrlen];		/* ip & mask */
	ulong	preflt;			/* preferred lifetime */
	ulong	validlt;		/* valid lifetime */
};
.EE
.PP
.I 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;	
};
.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 \*9/src/libip
.SH SEE ALSO
.IR print (3)
