3 cfa37a7b 2004-04-10 devnull eipfmt, parseip, parseipmask, v4parseip, v4parsecidr, parseether, myipaddr, myetheraddr, maskip, equivip, defmask, isv4, v4tov6, v6tov4, nhgetl, nhgets, hnputl, hnputs, 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 cfa37a7b 2004-04-10 devnull void hnputs(void *p, ushort v)
63 cfa37a7b 2004-04-10 devnull void hnputl(void *p, uint v)
66 cfa37a7b 2004-04-10 devnull ushort ptclbsum(uchar *a, int n)
69 cfa37a7b 2004-04-10 devnull Ipifc* readipifc(char *net, Ipifc *ifc, int index)
72 cfa37a7b 2004-04-10 devnull uchar IPv4bcast[IPaddrlen];
75 cfa37a7b 2004-04-10 devnull uchar IPv4allsys[IPaddrlen];
78 cfa37a7b 2004-04-10 devnull uchar IPv4allrouter[IPaddrlen];
81 cfa37a7b 2004-04-10 devnull uchar IPallbits[IPaddrlen];
84 cfa37a7b 2004-04-10 devnull uchar IPnoaddr[IPaddrlen];
87 cfa37a7b 2004-04-10 devnull uchar v4prefix[IPaddrlen];
88 cfa37a7b 2004-04-10 devnull .SH DESCRIPTION
89 cfa37a7b 2004-04-10 devnull These routines are used by Internet Protocol (IP) programs to
90 cfa37a7b 2004-04-10 devnull manipulate IP and Ethernet addresses.
91 cfa37a7b 2004-04-10 devnull Plan 9, by default, uses V6 format IP addresses. Since V4
92 cfa37a7b 2004-04-10 devnull addresses fit into the V6 space, all IP addresses can be represented.
93 cfa37a7b 2004-04-10 devnull IP addresses are stored as a string of 16
94 cfa37a7b 2004-04-10 devnull .B unsigned
95 cfa37a7b 2004-04-10 devnull .BR chars ,
97 cfa37a7b 2004-04-10 devnull addresses as 6
98 cfa37a7b 2004-04-10 devnull .B unsigned
99 cfa37a7b 2004-04-10 devnull .BR chars .
100 cfa37a7b 2004-04-10 devnull Either V4 or V6 string representation can be used for IP addresses.
101 cfa37a7b 2004-04-10 devnull For V4 addresses, the representation can be (up to) 4 decimal
102 cfa37a7b 2004-04-10 devnull integers from 0 to 255 separated by periods.
103 cfa37a7b 2004-04-10 devnull For V6 addresses, the representation is (up to) 8 hex integers
104 cfa37a7b 2004-04-10 devnull from 0x0 to 0xFFFF separated by colons.
105 cfa37a7b 2004-04-10 devnull Strings of 0 integers can be elided using two colons.
106 cfa37a7b 2004-04-10 devnull For example,
107 cfa37a7b 2004-04-10 devnull .B FFFF::1111
108 cfa37a7b 2004-04-10 devnull is equivalent to
109 cfa37a7b 2004-04-10 devnull .BR FFFF:0:0:0:0:0:0:1111 .
110 cfa37a7b 2004-04-10 devnull The string representation for IP masks is a superset of the
111 cfa37a7b 2004-04-10 devnull address representation. It includes slash notation that indicates
112 cfa37a7b 2004-04-10 devnull the number of leading 1 bits in the mask. Thus, a
113 cfa37a7b 2004-04-10 devnull V4 class C mask can be represented as
114 cfa37a7b 2004-04-10 devnull .BR FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FF00 ,
115 cfa37a7b 2004-04-10 devnull .BR 255.255.255.0 ,
117 cfa37a7b 2004-04-10 devnull .BR /120.
118 cfa37a7b 2004-04-10 devnull The string representation of Ethernet addresses is exactly
119 cfa37a7b 2004-04-10 devnull 12 hexadecimal digits.
121 cfa37a7b 2004-04-10 devnull .I Eipfmt
123 bf8a59fa 2004-04-11 devnull .IR print (3)
124 cfa37a7b 2004-04-10 devnull formatter for Ethernet (verb
126 cfa37a7b 2004-04-10 devnull addresses,
127 cfa37a7b 2004-04-10 devnull IP V6 (verb
129 cfa37a7b 2004-04-10 devnull addresses,
130 cfa37a7b 2004-04-10 devnull IP V4 (verb
132 cfa37a7b 2004-04-10 devnull addresses,
133 cfa37a7b 2004-04-10 devnull and IP V6 (verb
137 cfa37a7b 2004-04-10 devnull .I Parseip
138 cfa37a7b 2004-04-10 devnull converts a string pointed to by
140 cfa37a7b 2004-04-10 devnull to a 16-byte IP address starting at
141 cfa37a7b 2004-04-10 devnull .IR ipaddr .
142 cfa37a7b 2004-04-10 devnull As a concession to backwards compatibility,
143 cfa37a7b 2004-04-10 devnull if the string is a V4 address, the return value
144 cfa37a7b 2004-04-10 devnull is an unsigned long integer containing the big-endian V4 address.
145 cfa37a7b 2004-04-10 devnull If not, the return value is 6.
146 cfa37a7b 2004-04-10 devnull .I Parseipmask
147 cfa37a7b 2004-04-10 devnull converts a string pointed to by
149 cfa37a7b 2004-04-10 devnull to a 6-byte IP mask starting at
150 cfa37a7b 2004-04-10 devnull .IR ipaddr .
151 cfa37a7b 2004-04-10 devnull It too returns an unsigned long big-endian V4 address or 6.
152 cfa37a7b 2004-04-10 devnull Both routines return -1 on errors.
154 cfa37a7b 2004-04-10 devnull .I V4parseip
155 cfa37a7b 2004-04-10 devnull converts a string pointed to by
157 cfa37a7b 2004-04-10 devnull to a 4-byte V4 IP address starting at
158 cfa37a7b 2004-04-10 devnull .IR ipaddr .
160 cfa37a7b 2004-04-10 devnull .I V4parsecidr
161 cfa37a7b 2004-04-10 devnull converts a string of the form
162 cfa37a7b 2004-04-10 devnull addr/mask, pointed to by
163 cfa37a7b 2004-04-10 devnull .IR str ,
164 cfa37a7b 2004-04-10 devnull to a 4-byte V4 IP address starting at
165 cfa37a7b 2004-04-10 devnull .I ipaddr
166 cfa37a7b 2004-04-10 devnull and a 4-byte V4 IP mask starting at
167 cfa37a7b 2004-04-10 devnull .IR mask .
169 cfa37a7b 2004-04-10 devnull .I Myipaddr
170 cfa37a7b 2004-04-10 devnull returns the first valid IP address in
171 cfa37a7b 2004-04-10 devnull the IP stack rooted at
172 cfa37a7b 2004-04-10 devnull .IR net .
174 cfa37a7b 2004-04-10 devnull .I Parseether
175 cfa37a7b 2004-04-10 devnull converts a string pointed to by
177 cfa37a7b 2004-04-10 devnull to a 6-byte Ethernet address starting at
178 cfa37a7b 2004-04-10 devnull .IR eaddr .
179 cfa37a7b 2004-04-10 devnull .I Myetheraddr
180 cfa37a7b 2004-04-10 devnull reads the Ethernet address string from file
181 cfa37a7b 2004-04-10 devnull .IB dev /1/stats
182 cfa37a7b 2004-04-10 devnull and parses it into
183 cfa37a7b 2004-04-10 devnull .IR eaddr .
184 cfa37a7b 2004-04-10 devnull Both routines return a negative number on errors.
186 cfa37a7b 2004-04-10 devnull .I Maskip
187 cfa37a7b 2004-04-10 devnull places the bit-wise AND of the IP addresses pointed
188 cfa37a7b 2004-04-10 devnull to by its first two arguments into the buffer pointed
189 cfa37a7b 2004-04-10 devnull to by the third.
191 cfa37a7b 2004-04-10 devnull .I Equivip
192 cfa37a7b 2004-04-10 devnull returns non-zero if the IP addresses pointed to by its two
193 cfa37a7b 2004-04-10 devnull arguments are equal.
195 cfa37a7b 2004-04-10 devnull .I Defmask
196 cfa37a7b 2004-04-10 devnull returns the standard class A, B, or C mask for
197 cfa37a7b 2004-04-10 devnull .IR ipaddr .
200 cfa37a7b 2004-04-10 devnull returns non-zero if the V6 address is in the V4 space, that is,
201 cfa37a7b 2004-04-10 devnull if it starts with
202 cfa37a7b 2004-04-10 devnull .BR 0:0:0:0:0:0:FFFF .
203 cfa37a7b 2004-04-10 devnull .I V4tov6
204 cfa37a7b 2004-04-10 devnull converts the V4 address,
205 cfa37a7b 2004-04-10 devnull .IR v4ip ,
206 cfa37a7b 2004-04-10 devnull to a V6 address and puts the result in
207 cfa37a7b 2004-04-10 devnull .IR v6ip .
208 cfa37a7b 2004-04-10 devnull .I V6tov4
209 cfa37a7b 2004-04-10 devnull converts the V6 address,
210 cfa37a7b 2004-04-10 devnull .IR v6ip ,
211 cfa37a7b 2004-04-10 devnull to a V4 address and puts the result in
212 cfa37a7b 2004-04-10 devnull .IR v4ip .
214 cfa37a7b 2004-04-10 devnull .I Hnputs
216 cfa37a7b 2004-04-10 devnull .I hnputl
217 cfa37a7b 2004-04-10 devnull are used to store 16-bit and 32-bit integers into IP big-endian form.
218 cfa37a7b 2004-04-10 devnull .I Nhgets
220 cfa37a7b 2004-04-10 devnull .I nhgetl
221 cfa37a7b 2004-04-10 devnull convert big-endian 2 and 4 byte quantities into integers.
223 cfa37a7b 2004-04-10 devnull .I Pctlbsum
224 cfa37a7b 2004-04-10 devnull returns the one's complement checksum used in IP protocols, typically invoked as
226 cfa37a7b 2004-04-10 devnull hnputs(hdr->cksum, ~ptclbsum(data, len) & 0xffff);
229 cfa37a7b 2004-04-10 devnull A number of standard IP addresses in V6 format are also defined. They
231 cfa37a7b 2004-04-10 devnull .IP \f5IPv4bcast
232 cfa37a7b 2004-04-10 devnull the V4 broadcast address
233 cfa37a7b 2004-04-10 devnull .IP \f5IPv4allsys
234 cfa37a7b 2004-04-10 devnull the V4 all systems multicast address
235 cfa37a7b 2004-04-10 devnull .IP \f5IPv4allrouter
236 cfa37a7b 2004-04-10 devnull the V4 all routers multicast address
237 cfa37a7b 2004-04-10 devnull .IP \f5IPallbits
238 cfa37a7b 2004-04-10 devnull the V6 all bits on address
239 cfa37a7b 2004-04-10 devnull .IP \f5IPnoaddr
240 cfa37a7b 2004-04-10 devnull the V6 null address, all zeros
241 cfa37a7b 2004-04-10 devnull .IP \f5v4prefix
242 cfa37a7b 2004-04-10 devnull the IP V6 prefix to all embedded V4 addresses
244 cfa37a7b 2004-04-10 devnull .I Readipifc
245 cfa37a7b 2004-04-10 devnull returns information about
246 cfa37a7b 2004-04-10 devnull a particular interface (\fIindex\fP >= 0)
247 cfa37a7b 2004-04-10 devnull or all IP interfaces (\fIindex\fP < 0)
248 cfa37a7b 2004-04-10 devnull configured under a
249 cfa37a7b 2004-04-10 devnull mount point
250 cfa37a7b 2004-04-10 devnull .IR net ,
252 cfa37a7b 2004-04-10 devnull .BR /net .
253 cfa37a7b 2004-04-10 devnull Each interface is described by one
254 cfa37a7b 2004-04-10 devnull .I Ipifc
255 cfa37a7b 2004-04-10 devnull structure which in turn points to a linked list of
256 cfa37a7b 2004-04-10 devnull .IR Iplifc
257 cfa37a7b 2004-04-10 devnull structures describing the addresses assigned
258 cfa37a7b 2004-04-10 devnull to this interface.
259 cfa37a7b 2004-04-10 devnull If the list
261 cfa37a7b 2004-04-10 devnull is supplied,
262 cfa37a7b 2004-04-10 devnull that list is freed.
263 cfa37a7b 2004-04-10 devnull Thus, subsequent calls can be used
264 cfa37a7b 2004-04-10 devnull to free the list returned by the previous call.
265 cfa37a7b 2004-04-10 devnull .I Ipifc
269 cfa37a7b 2004-04-10 devnull typedef struct Ipifc
271 cfa37a7b 2004-04-10 devnull Ipifc *next;
272 cfa37a7b 2004-04-10 devnull Iplifc *lifc; /* local addressses */
274 cfa37a7b 2004-04-10 devnull /* per ip interface */
275 cfa37a7b 2004-04-10 devnull int index; /* number of interface in ipifc dir */
276 cfa37a7b 2004-04-10 devnull char dev[64]; /* associated physical device */
277 cfa37a7b 2004-04-10 devnull int mtu; /* max transfer unit */
279 cfa37a7b 2004-04-10 devnull long validlt; /* valid life time */
280 cfa37a7b 2004-04-10 devnull long preflt; /* preferred life time */
281 cfa37a7b 2004-04-10 devnull uchar sendra6; /* on == send router adv */
282 cfa37a7b 2004-04-10 devnull uchar recvra6; /* on == rcv router adv */
284 cfa37a7b 2004-04-10 devnull ulong pktin; /* packets read */
285 cfa37a7b 2004-04-10 devnull ulong pktout; /* packets written */
286 cfa37a7b 2004-04-10 devnull ulong errin; /* read errors */
287 cfa37a7b 2004-04-10 devnull ulong errout; /* write errors */
288 cfa37a7b 2004-04-10 devnull Ipv6rp rp; /* route advertisement params */
289 cfa37a7b 2004-04-10 devnull } Ipifc;
292 cfa37a7b 2004-04-10 devnull .I Iplifc
296 cfa37a7b 2004-04-10 devnull struct Iplifc
298 cfa37a7b 2004-04-10 devnull Iplifc *next;
300 cfa37a7b 2004-04-10 devnull uchar ip[IPaddrlen];
301 cfa37a7b 2004-04-10 devnull uchar mask[IPaddrlen];
302 cfa37a7b 2004-04-10 devnull uchar net[IPaddrlen]; /* ip & mask */
303 cfa37a7b 2004-04-10 devnull ulong preflt; /* preferred lifetime */
304 cfa37a7b 2004-04-10 devnull ulong validlt; /* valid lifetime */
308 cfa37a7b 2004-04-10 devnull .I Ipv6rp
310 cfa37a7b 2004-04-10 devnull struct Ipv6rp
312 cfa37a7b 2004-04-10 devnull int mflag;
313 cfa37a7b 2004-04-10 devnull int oflag;
314 cfa37a7b 2004-04-10 devnull int maxraint; /* max route adv interval */
315 cfa37a7b 2004-04-10 devnull int minraint; /* min route adv interval */
316 cfa37a7b 2004-04-10 devnull int linkmtu;
317 cfa37a7b 2004-04-10 devnull int reachtime;
318 cfa37a7b 2004-04-10 devnull int rxmitra;
319 cfa37a7b 2004-04-10 devnull int ttl;
320 cfa37a7b 2004-04-10 devnull int routerlt;
324 cfa37a7b 2004-04-10 devnull contains the first 64 bytes of the device configured with this
325 cfa37a7b 2004-04-10 devnull interface.
328 cfa37a7b 2004-04-10 devnull .IB ip & mask
329 cfa37a7b 2004-04-10 devnull if the network is multipoint or
330 cfa37a7b 2004-04-10 devnull the remote address if the network is
331 cfa37a7b 2004-04-10 devnull point to point.
332 cfa37a7b 2004-04-10 devnull .SH SOURCE
333 b5fdffee 2004-04-19 devnull .B /usr/local/plan9/src/libip
334 cfa37a7b 2004-04-10 devnull .SH SEE ALSO
335 bf8a59fa 2004-04-11 devnull .IR print (3)