3 058b0118 2005-01-03 devnull eipfmt, parseip, parseipmask, v4parseip, v4parsecidr, parseether, myipaddr, myetheraddr, maskip, equivip, defmask, isv4, v4tov6, v6tov4, nhgetl, nhgets, nhgetv, hnputl, hnputs, hnputv, ptclbsum, readipifc \- Internet protocol
4 cfa37a7b 2004-04-10 devnull .SH SYNOPSIS
5 cfa37a7b 2004-04-10 devnull .B #include <u.h>
7 cfa37a7b 2004-04-10 devnull .B #include <libc.h>
9 cfa37a7b 2004-04-10 devnull .B #include <ip.h>
12 cfa37a7b 2004-04-10 devnull int eipfmt(Fmt*)
15 cfa37a7b 2004-04-10 devnull ulong parseip(uchar *ipaddr, char *str)
18 cfa37a7b 2004-04-10 devnull ulong parseipmask(uchar *ipaddr, char *str)
21 cfa37a7b 2004-04-10 devnull char* v4parseip(uchar *ipaddr, char *str)
24 cfa37a7b 2004-04-10 devnull ulong v4parsecidr(uchar *addr, uchar *mask, char *str)
27 cfa37a7b 2004-04-10 devnull int parseether(uchar *eaddr, char *str)
30 cfa37a7b 2004-04-10 devnull int myetheraddr(uchar *eaddr, char *dev)
33 cfa37a7b 2004-04-10 devnull int myipaddr(uchar *ipaddr, char *net)
36 cfa37a7b 2004-04-10 devnull void maskip(uchar *from, uchar *mask, uchar *to)
39 cfa37a7b 2004-04-10 devnull int equivip(uchar *ipaddr1, uchar *ipaddr2)
42 cfa37a7b 2004-04-10 devnull uchar* defmask(uchar *ipaddr)
45 cfa37a7b 2004-04-10 devnull int isv4(uchar *ipaddr)
48 cfa37a7b 2004-04-10 devnull void v4tov6(uchar *ipv6, uchar *ipv4)
51 cfa37a7b 2004-04-10 devnull void v6tov4(uchar *ipv4, uchar *ipv6)
54 cfa37a7b 2004-04-10 devnull ushort nhgets(void *p)
57 cfa37a7b 2004-04-10 devnull uint nhgetl(void *p)
60 058b0118 2005-01-03 devnull uvlong nhgetv(void *p)
63 cfa37a7b 2004-04-10 devnull void hnputs(void *p, ushort v)
66 cfa37a7b 2004-04-10 devnull void hnputl(void *p, uint v)
69 058b0118 2005-01-03 devnull void hnputv(void *p, uvlong v)
72 cfa37a7b 2004-04-10 devnull ushort ptclbsum(uchar *a, int n)
75 cfa37a7b 2004-04-10 devnull Ipifc* readipifc(char *net, Ipifc *ifc, int index)
78 cfa37a7b 2004-04-10 devnull uchar IPv4bcast[IPaddrlen];
81 cfa37a7b 2004-04-10 devnull uchar IPv4allsys[IPaddrlen];
84 cfa37a7b 2004-04-10 devnull uchar IPv4allrouter[IPaddrlen];
87 cfa37a7b 2004-04-10 devnull uchar IPallbits[IPaddrlen];
90 cfa37a7b 2004-04-10 devnull uchar IPnoaddr[IPaddrlen];
93 cfa37a7b 2004-04-10 devnull uchar v4prefix[IPaddrlen];
94 cfa37a7b 2004-04-10 devnull .SH DESCRIPTION
95 cfa37a7b 2004-04-10 devnull These routines are used by Internet Protocol (IP) programs to
96 cfa37a7b 2004-04-10 devnull manipulate IP and Ethernet addresses.
97 cfa37a7b 2004-04-10 devnull Plan 9, by default, uses V6 format IP addresses. Since V4
98 cfa37a7b 2004-04-10 devnull addresses fit into the V6 space, all IP addresses can be represented.
99 cfa37a7b 2004-04-10 devnull IP addresses are stored as a string of 16
100 cfa37a7b 2004-04-10 devnull .B unsigned
101 cfa37a7b 2004-04-10 devnull .BR chars ,
102 cfa37a7b 2004-04-10 devnull Ethernet
103 cfa37a7b 2004-04-10 devnull addresses as 6
104 cfa37a7b 2004-04-10 devnull .B unsigned
105 cfa37a7b 2004-04-10 devnull .BR chars .
106 cfa37a7b 2004-04-10 devnull Either V4 or V6 string representation can be used for IP addresses.
107 cfa37a7b 2004-04-10 devnull For V4 addresses, the representation can be (up to) 4 decimal
108 cfa37a7b 2004-04-10 devnull integers from 0 to 255 separated by periods.
109 cfa37a7b 2004-04-10 devnull For V6 addresses, the representation is (up to) 8 hex integers
110 cfa37a7b 2004-04-10 devnull from 0x0 to 0xFFFF separated by colons.
111 cfa37a7b 2004-04-10 devnull Strings of 0 integers can be elided using two colons.
112 cfa37a7b 2004-04-10 devnull For example,
113 cfa37a7b 2004-04-10 devnull .B FFFF::1111
114 cfa37a7b 2004-04-10 devnull is equivalent to
115 cfa37a7b 2004-04-10 devnull .BR FFFF:0:0:0:0:0:0:1111 .
116 cfa37a7b 2004-04-10 devnull The string representation for IP masks is a superset of the
117 cfa37a7b 2004-04-10 devnull address representation. It includes slash notation that indicates
118 cfa37a7b 2004-04-10 devnull the number of leading 1 bits in the mask. Thus, a
119 cfa37a7b 2004-04-10 devnull V4 class C mask can be represented as
120 cfa37a7b 2004-04-10 devnull .BR FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FF00 ,
121 cfa37a7b 2004-04-10 devnull .BR 255.255.255.0 ,
123 cfa37a7b 2004-04-10 devnull .BR /120.
124 cfa37a7b 2004-04-10 devnull The string representation of Ethernet addresses is exactly
125 cfa37a7b 2004-04-10 devnull 12 hexadecimal digits.
127 cfa37a7b 2004-04-10 devnull .I Eipfmt
129 bf8a59fa 2004-04-11 devnull .IR print (3)
130 cfa37a7b 2004-04-10 devnull formatter for Ethernet (verb
132 cfa37a7b 2004-04-10 devnull addresses,
133 cfa37a7b 2004-04-10 devnull IP V6 (verb
135 cfa37a7b 2004-04-10 devnull addresses,
136 cfa37a7b 2004-04-10 devnull IP V4 (verb
138 cfa37a7b 2004-04-10 devnull addresses,
139 cfa37a7b 2004-04-10 devnull and IP V6 (verb
143 cfa37a7b 2004-04-10 devnull .I Parseip
144 cfa37a7b 2004-04-10 devnull converts a string pointed to by
146 cfa37a7b 2004-04-10 devnull to a 16-byte IP address starting at
147 cfa37a7b 2004-04-10 devnull .IR ipaddr .
148 cfa37a7b 2004-04-10 devnull As a concession to backwards compatibility,
149 cfa37a7b 2004-04-10 devnull if the string is a V4 address, the return value
150 cfa37a7b 2004-04-10 devnull is an unsigned long integer containing the big-endian V4 address.
151 cfa37a7b 2004-04-10 devnull If not, the return value is 6.
152 cfa37a7b 2004-04-10 devnull .I Parseipmask
153 cfa37a7b 2004-04-10 devnull converts a string pointed to by
155 cfa37a7b 2004-04-10 devnull to a 6-byte IP mask starting at
156 cfa37a7b 2004-04-10 devnull .IR ipaddr .
157 cfa37a7b 2004-04-10 devnull It too returns an unsigned long big-endian V4 address or 6.
158 cfa37a7b 2004-04-10 devnull Both routines return -1 on errors.
160 cfa37a7b 2004-04-10 devnull .I V4parseip
161 cfa37a7b 2004-04-10 devnull converts a string pointed to by
163 cfa37a7b 2004-04-10 devnull to a 4-byte V4 IP address starting at
164 cfa37a7b 2004-04-10 devnull .IR ipaddr .
166 cfa37a7b 2004-04-10 devnull .I V4parsecidr
167 cfa37a7b 2004-04-10 devnull converts a string of the form
168 cfa37a7b 2004-04-10 devnull addr/mask, pointed to by
169 cfa37a7b 2004-04-10 devnull .IR str ,
170 cfa37a7b 2004-04-10 devnull to a 4-byte V4 IP address starting at
171 cfa37a7b 2004-04-10 devnull .I ipaddr
172 cfa37a7b 2004-04-10 devnull and a 4-byte V4 IP mask starting at
173 cfa37a7b 2004-04-10 devnull .IR mask .
175 cfa37a7b 2004-04-10 devnull .I Myipaddr
176 cfa37a7b 2004-04-10 devnull returns the first valid IP address in
177 cfa37a7b 2004-04-10 devnull the IP stack rooted at
178 cfa37a7b 2004-04-10 devnull .IR net .
180 cfa37a7b 2004-04-10 devnull .I Parseether
181 cfa37a7b 2004-04-10 devnull converts a string pointed to by
183 cfa37a7b 2004-04-10 devnull to a 6-byte Ethernet address starting at
184 cfa37a7b 2004-04-10 devnull .IR eaddr .
185 cfa37a7b 2004-04-10 devnull .I Myetheraddr
186 cfa37a7b 2004-04-10 devnull reads the Ethernet address string from file
187 cfa37a7b 2004-04-10 devnull .IB dev /1/stats
188 cfa37a7b 2004-04-10 devnull and parses it into
189 cfa37a7b 2004-04-10 devnull .IR eaddr .
190 cfa37a7b 2004-04-10 devnull Both routines return a negative number on errors.
192 cfa37a7b 2004-04-10 devnull .I Maskip
193 cfa37a7b 2004-04-10 devnull places the bit-wise AND of the IP addresses pointed
194 cfa37a7b 2004-04-10 devnull to by its first two arguments into the buffer pointed
195 cfa37a7b 2004-04-10 devnull to by the third.
197 cfa37a7b 2004-04-10 devnull .I Equivip
198 cfa37a7b 2004-04-10 devnull returns non-zero if the IP addresses pointed to by its two
199 cfa37a7b 2004-04-10 devnull arguments are equal.
201 cfa37a7b 2004-04-10 devnull .I Defmask
202 cfa37a7b 2004-04-10 devnull returns the standard class A, B, or C mask for
203 cfa37a7b 2004-04-10 devnull .IR ipaddr .
206 cfa37a7b 2004-04-10 devnull returns non-zero if the V6 address is in the V4 space, that is,
207 cfa37a7b 2004-04-10 devnull if it starts with
208 cfa37a7b 2004-04-10 devnull .BR 0:0:0:0:0:0:FFFF .
209 cfa37a7b 2004-04-10 devnull .I V4tov6
210 cfa37a7b 2004-04-10 devnull converts the V4 address,
211 cfa37a7b 2004-04-10 devnull .IR v4ip ,
212 cfa37a7b 2004-04-10 devnull to a V6 address and puts the result in
213 cfa37a7b 2004-04-10 devnull .IR v6ip .
214 cfa37a7b 2004-04-10 devnull .I V6tov4
215 cfa37a7b 2004-04-10 devnull converts the V6 address,
216 cfa37a7b 2004-04-10 devnull .IR v6ip ,
217 cfa37a7b 2004-04-10 devnull to a V4 address and puts the result in
218 cfa37a7b 2004-04-10 devnull .IR v4ip .
220 058b0118 2005-01-03 devnull .IR Hnputs ,
221 058b0118 2005-01-03 devnull .IR hnputl ,
223 058b0118 2005-01-03 devnull .I hnputv
224 058b0118 2005-01-03 devnull are used to store 16-, 32-, and 64-bit integers into IP big-endian form.
225 058b0118 2005-01-03 devnull .IR Nhgets ,
226 058b0118 2005-01-03 devnull .IR nhgetl ,
228 058b0118 2005-01-03 devnull .I nhgetv
229 058b0118 2005-01-03 devnull convert big-endian 2-, 4-, and 8-byte quantities into integers.
231 cfa37a7b 2004-04-10 devnull .I Pctlbsum
232 cfa37a7b 2004-04-10 devnull returns the one's complement checksum used in IP protocols, typically invoked as
234 cfa37a7b 2004-04-10 devnull hnputs(hdr->cksum, ~ptclbsum(data, len) & 0xffff);
237 cfa37a7b 2004-04-10 devnull A number of standard IP addresses in V6 format are also defined. They
239 cfa37a7b 2004-04-10 devnull .IP \f5IPv4bcast
240 cfa37a7b 2004-04-10 devnull the V4 broadcast address
241 cfa37a7b 2004-04-10 devnull .IP \f5IPv4allsys
242 cfa37a7b 2004-04-10 devnull the V4 all systems multicast address
243 cfa37a7b 2004-04-10 devnull .IP \f5IPv4allrouter
244 cfa37a7b 2004-04-10 devnull the V4 all routers multicast address
245 cfa37a7b 2004-04-10 devnull .IP \f5IPallbits
246 cfa37a7b 2004-04-10 devnull the V6 all bits on address
247 cfa37a7b 2004-04-10 devnull .IP \f5IPnoaddr
248 cfa37a7b 2004-04-10 devnull the V6 null address, all zeros
249 cfa37a7b 2004-04-10 devnull .IP \f5v4prefix
250 cfa37a7b 2004-04-10 devnull the IP V6 prefix to all embedded V4 addresses
252 cfa37a7b 2004-04-10 devnull .I Readipifc
253 cfa37a7b 2004-04-10 devnull returns information about
254 cfa37a7b 2004-04-10 devnull a particular interface (\fIindex\fP >= 0)
255 cfa37a7b 2004-04-10 devnull or all IP interfaces (\fIindex\fP < 0)
256 cfa37a7b 2004-04-10 devnull configured under a
257 cfa37a7b 2004-04-10 devnull mount point
258 cfa37a7b 2004-04-10 devnull .IR net ,
260 cfa37a7b 2004-04-10 devnull .BR /net .
261 cfa37a7b 2004-04-10 devnull Each interface is described by one
262 cfa37a7b 2004-04-10 devnull .I Ipifc
263 cfa37a7b 2004-04-10 devnull structure which in turn points to a linked list of
264 cfa37a7b 2004-04-10 devnull .IR Iplifc
265 cfa37a7b 2004-04-10 devnull structures describing the addresses assigned
266 cfa37a7b 2004-04-10 devnull to this interface.
267 cfa37a7b 2004-04-10 devnull If the list
269 cfa37a7b 2004-04-10 devnull is supplied,
270 cfa37a7b 2004-04-10 devnull that list is freed.
271 cfa37a7b 2004-04-10 devnull Thus, subsequent calls can be used
272 cfa37a7b 2004-04-10 devnull to free the list returned by the previous call.
273 cfa37a7b 2004-04-10 devnull .I Ipifc
277 cfa37a7b 2004-04-10 devnull typedef struct Ipifc
279 cfa37a7b 2004-04-10 devnull Ipifc *next;
280 cfa37a7b 2004-04-10 devnull Iplifc *lifc; /* local addressses */
282 cfa37a7b 2004-04-10 devnull /* per ip interface */
283 cfa37a7b 2004-04-10 devnull int index; /* number of interface in ipifc dir */
284 cfa37a7b 2004-04-10 devnull char dev[64]; /* associated physical device */
285 cfa37a7b 2004-04-10 devnull int mtu; /* max transfer unit */
287 cfa37a7b 2004-04-10 devnull long validlt; /* valid life time */
288 cfa37a7b 2004-04-10 devnull long preflt; /* preferred life time */
289 cfa37a7b 2004-04-10 devnull uchar sendra6; /* on == send router adv */
290 cfa37a7b 2004-04-10 devnull uchar recvra6; /* on == rcv router adv */
292 cfa37a7b 2004-04-10 devnull ulong pktin; /* packets read */
293 cfa37a7b 2004-04-10 devnull ulong pktout; /* packets written */
294 cfa37a7b 2004-04-10 devnull ulong errin; /* read errors */
295 cfa37a7b 2004-04-10 devnull ulong errout; /* write errors */
296 cfa37a7b 2004-04-10 devnull Ipv6rp rp; /* route advertisement params */
297 cfa37a7b 2004-04-10 devnull } Ipifc;
300 cfa37a7b 2004-04-10 devnull .I Iplifc
304 cfa37a7b 2004-04-10 devnull struct Iplifc
306 cfa37a7b 2004-04-10 devnull Iplifc *next;
308 cfa37a7b 2004-04-10 devnull uchar ip[IPaddrlen];
309 cfa37a7b 2004-04-10 devnull uchar mask[IPaddrlen];
310 cfa37a7b 2004-04-10 devnull uchar net[IPaddrlen]; /* ip & mask */
311 cfa37a7b 2004-04-10 devnull ulong preflt; /* preferred lifetime */
312 cfa37a7b 2004-04-10 devnull ulong validlt; /* valid lifetime */
316 cfa37a7b 2004-04-10 devnull .I Ipv6rp
318 cfa37a7b 2004-04-10 devnull struct Ipv6rp
320 cfa37a7b 2004-04-10 devnull int mflag;
321 cfa37a7b 2004-04-10 devnull int oflag;
322 cfa37a7b 2004-04-10 devnull int maxraint; /* max route adv interval */
323 cfa37a7b 2004-04-10 devnull int minraint; /* min route adv interval */
324 cfa37a7b 2004-04-10 devnull int linkmtu;
325 cfa37a7b 2004-04-10 devnull int reachtime;
326 cfa37a7b 2004-04-10 devnull int rxmitra;
327 cfa37a7b 2004-04-10 devnull int ttl;
328 cfa37a7b 2004-04-10 devnull int routerlt;
332 cfa37a7b 2004-04-10 devnull contains the first 64 bytes of the device configured with this
333 cfa37a7b 2004-04-10 devnull interface.
336 cfa37a7b 2004-04-10 devnull .IB ip & mask
337 cfa37a7b 2004-04-10 devnull if the network is multipoint or
338 cfa37a7b 2004-04-10 devnull the remote address if the network is
339 cfa37a7b 2004-04-10 devnull point to point.
340 cfa37a7b 2004-04-10 devnull .SH SOURCE
341 c3674de4 2005-01-11 devnull .B \*9/src/libip
342 cfa37a7b 2004-04-10 devnull .SH SEE ALSO
343 bf8a59fa 2004-04-11 devnull .IR print (3)