IP(2)IP(2)
NAME
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
SYNOPSIS
#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)
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];
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
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
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,
FFFF::1111
is equivalent 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,
255.255.255.0,
or
/120.
The string representation of Ethernet 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 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 single 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 errors.
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
converts 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);
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 */
};
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 multipoint or
the remote address if the network is
point to point.
SOURCE
/sys/src/libip
SEE
print(2),
ip(3)