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