| .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) |