Changes in uspace/lib/c/generic/inet/addr.c [26de91a:695b6ff] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/inet/addr.c
r26de91a r695b6ff 33 33 */ 34 34 35 #include <assert.h>36 35 #include <errno.h> 37 36 #include <unistd.h> … … 60 59 61 60 static const inet_addr_t inet_addr_any_addr = { 62 . version = ip_v4,61 .family = AF_INET, 63 62 .addr = 0 64 63 }; 65 64 66 65 static const inet_addr_t inet_addr_any_addr6 = { 67 . version = ip_v6,66 .family = AF_INET6, 68 67 .addr6 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 69 68 }; … … 79 78 } 80 79 81 /** Compare addr48.82 *83 * @return Non-zero if equal, zero if not equal.84 */85 80 int addr48_compare(const addr48_t a, const addr48_t b) 86 81 { 87 return memcmp(a, b, 6) == 0; 88 } 89 90 /** Compare addr128. 91 * 92 * @return Non-zero if equal, zero if not equal. 93 */ 82 return memcmp(a, b, 6); 83 } 84 94 85 int addr128_compare(const addr128_t a, const addr128_t b) 95 86 { 96 return memcmp(a, b, 16) == 0;87 return memcmp(a, b, 16); 97 88 } 98 89 … … 111 102 void host2addr128_t_be(const addr128_t host, addr128_t be) 112 103 { 104 #ifdef __BE__ 113 105 memcpy(be, host, 16); 106 #else 107 be[0] = host[15]; 108 be[1] = host[14]; 109 be[2] = host[13]; 110 be[3] = host[12]; 111 be[4] = host[11]; 112 be[5] = host[10]; 113 be[6] = host[9]; 114 be[7] = host[8]; 115 be[8] = host[7]; 116 be[9] = host[6]; 117 be[10] = host[5]; 118 be[11] = host[4]; 119 be[12] = host[3]; 120 be[13] = host[2]; 121 be[14] = host[1]; 122 be[15] = host[0]; 123 #endif 114 124 } 115 125 116 126 void addr128_t_be2host(const addr128_t be, addr128_t host) 117 127 { 128 #ifdef __BE__ 118 129 memcpy(host, be, 16); 130 #else 131 host[0] = be[15]; 132 host[1] = be[14]; 133 host[2] = be[13]; 134 host[3] = be[12]; 135 host[4] = be[11]; 136 host[5] = be[10]; 137 host[6] = be[9]; 138 host[7] = be[8]; 139 host[8] = be[7]; 140 host[9] = be[6]; 141 host[10] = be[5]; 142 host[11] = be[4]; 143 host[12] = be[3]; 144 host[13] = be[2]; 145 host[14] = be[1]; 146 host[15] = be[0]; 147 #endif 119 148 } 120 149 121 150 void inet_addr(inet_addr_t *addr, uint8_t a, uint8_t b, uint8_t c, uint8_t d) 122 151 { 123 addr-> version = ip_v4;152 addr->family = AF_INET; 124 153 addr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) | 125 154 ((addr32_t) c << 8) | ((addr32_t) d); … … 129 158 uint8_t prefix) 130 159 { 131 naddr-> version = ip_v4;160 naddr->family = AF_INET; 132 161 naddr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) | 133 162 ((addr32_t) c << 8) | ((addr32_t) d); … … 138 167 uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h) 139 168 { 140 addr-> version = ip_v6;169 addr->family = AF_INET6; 141 170 addr->addr6[0] = (a >> 8) & 0xff; 142 171 addr->addr6[1] = a & 0xff; … … 160 189 uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h, uint8_t prefix) 161 190 { 162 naddr-> version = ip_v6;191 naddr->family = AF_INET6; 163 192 naddr->addr6[0] = (a >> 8) & 0xff; 164 193 naddr->addr6[1] = a & 0xff; … … 180 209 } 181 210 182 /** Determine address version.183 * 184 * @param text Address in common notation.185 * @param af Place to store address version.211 /** Parse network address family. 212 * 213 * @param text Network address in common notation. 214 * @param af Place to store network address family. 186 215 * 187 216 * @return EOK on success, EINVAL if input is not in valid format. 188 217 * 189 218 */ 190 static int inet_addr_version(const char *text, ip_ver_t *ver)219 int inet_addr_family(const char *text, uint16_t *af) 191 220 { 192 221 char *dot = str_chr(text, '.'); 193 222 if (dot != NULL) { 194 * ver = ip_v4;223 *af = AF_INET; 195 224 return EOK; 196 225 } 197 226 198 227 char *collon = str_chr(text, ':'); 199 228 if (collon != NULL) { 200 * ver = ip_v6;229 *af = AF_INET6; 201 230 return EOK; 202 231 } 203 232 204 233 return EINVAL; 205 234 } 206 235 207 static int ipver_af(ip_ver_t ver)208 {209 switch (ver) {210 case ip_any:211 return AF_NONE;212 case ip_v4:213 return AF_INET;214 case ip_v6:215 return AF_INET6;216 default:217 assert(false);218 return EINVAL;219 }220 }221 222 ip_ver_t ipver_from_af(int af)223 {224 switch (af) {225 case AF_NONE:226 return ip_any;227 case AF_INET:228 return ip_v4;229 case AF_INET6:230 return ip_v6;231 default:232 assert(false);233 return EINVAL;234 }235 }236 237 236 void inet_naddr_addr(const inet_naddr_t *naddr, inet_addr_t *addr) 238 237 { 239 addr-> version = naddr->version;238 addr->family = naddr->family; 240 239 memcpy(addr->addr6, naddr->addr6, 16); 241 240 } … … 244 243 inet_naddr_t *naddr) 245 244 { 246 naddr-> version = addr->version;245 naddr->family = addr->family; 247 246 memcpy(naddr->addr6, addr->addr6, 16); 248 247 naddr->prefix = prefix; … … 251 250 void inet_addr_any(inet_addr_t *addr) 252 251 { 253 addr-> version = ip_any;252 addr->family = AF_NONE; 254 253 memset(addr->addr6, 0, 16); 255 254 } … … 257 256 void inet_naddr_any(inet_naddr_t *naddr) 258 257 { 259 naddr-> version = ip_any;258 naddr->family = AF_NONE; 260 259 memset(naddr->addr6, 0, 16); 261 260 naddr->prefix = 0; … … 264 263 int inet_addr_compare(const inet_addr_t *a, const inet_addr_t *b) 265 264 { 266 if (a-> version != b->version)265 if (a->family != b->family) 267 266 return 0; 268 269 switch (a-> version) {270 case ip_v4:267 268 switch (a->family) { 269 case AF_INET: 271 270 return (a->addr == b->addr); 272 case ip_v6:271 case AF_INET6: 273 272 return addr128_compare(a->addr6, b->addr6); 274 273 default: … … 279 278 int inet_addr_is_any(const inet_addr_t *addr) 280 279 { 281 return ((addr-> version == ip_any) ||280 return ((addr->family == 0) || 282 281 (inet_addr_compare(addr, &inet_addr_any_addr)) || 283 282 (inet_addr_compare(addr, &inet_addr_any_addr6))); … … 286 285 int inet_naddr_compare(const inet_naddr_t *naddr, const inet_addr_t *addr) 287 286 { 288 if (naddr-> version != addr->version)287 if (naddr->family != addr->family) 289 288 return 0; 290 289 291 switch (naddr-> version) {292 case ip_v4:290 switch (naddr->family) { 291 case AF_INET: 293 292 return (naddr->addr == addr->addr); 294 case ip_v6:293 case AF_INET6: 295 294 return addr128_compare(naddr->addr6, addr->addr6); 296 295 default: … … 301 300 int inet_naddr_compare_mask(const inet_naddr_t *naddr, const inet_addr_t *addr) 302 301 { 303 if (naddr-> version != addr->version)302 if (naddr->family != addr->family) 304 303 return 0; 305 306 switch (naddr-> version) {307 case ip_v4:304 305 switch (naddr->family) { 306 case AF_INET: 308 307 if (naddr->prefix > 32) 309 308 return 0; 310 309 311 310 addr32_t mask = 312 311 BIT_RANGE(addr32_t, 31, 31 - (naddr->prefix - 1)); 313 312 return ((naddr->addr & mask) == (addr->addr & mask)); 314 case ip_v6:313 case AF_INET6: 315 314 if (naddr->prefix > 128) 316 315 return 0; … … 353 352 int inet_addr_parse(const char *text, inet_addr_t *addr) 354 353 { 355 int rc = inet_addr_ version(text, &addr->version);354 int rc = inet_addr_family(text, &addr->family); 356 355 if (rc != EOK) 357 356 return rc; 358 357 359 358 uint8_t buf[16]; 360 rc = inet_pton( ipver_af(addr->version), text, buf);359 rc = inet_pton(addr->family, text, buf); 361 360 if (rc != EOK) 362 361 return rc; 363 362 364 switch (addr-> version) {365 case ip_v4:363 switch (addr->family) { 364 case AF_INET: 366 365 addr->addr = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | 367 366 buf[3]; 368 367 break; 369 case ip_v6:368 case AF_INET6: 370 369 memcpy(addr->addr6, buf, 16); 371 370 break; … … 393 392 *slash = 0; 394 393 395 int rc = inet_addr_ version(text, &naddr->version);394 int rc = inet_addr_family(text, &naddr->family); 396 395 if (rc != EOK) 397 396 return rc; 398 397 399 398 uint8_t buf[16]; 400 rc = inet_pton( ipver_af(naddr->version), text, buf);399 rc = inet_pton(naddr->family, text, buf); 401 400 *slash = '/'; 402 401 … … 407 406 uint8_t prefix; 408 407 409 switch (naddr-> version) {410 case ip_v4:408 switch (naddr->family) { 409 case AF_INET: 411 410 prefix = strtoul(slash, &slash, 10); 412 411 if (prefix > 32) … … 418 417 419 418 break; 420 case ip_v6:419 case AF_INET6: 421 420 prefix = strtoul(slash, &slash, 10); 422 421 if (prefix > 128) … … 448 447 int rc = 0; 449 448 450 switch (addr-> version) {451 case ip_any:449 switch (addr->family) { 450 case AF_NONE: 452 451 rc = asprintf(bufp, "none"); 453 452 break; 454 case ip_v4:453 case AF_INET: 455 454 rc = asprintf(bufp, "%u.%u.%u.%u", (addr->addr >> 24) & 0xff, 456 455 (addr->addr >> 16) & 0xff, (addr->addr >> 8) & 0xff, 457 456 addr->addr & 0xff); 458 457 break; 459 case ip_v6:458 case AF_INET6: 460 459 *bufp = (char *) malloc(INET6_ADDRSTRLEN); 461 460 if (*bufp == NULL) … … 488 487 char prefix[INET_PREFIXSTRSIZE]; 489 488 490 switch (naddr-> version) {491 case ip_any:489 switch (naddr->family) { 490 case AF_NONE: 492 491 rc = asprintf(bufp, "none"); 493 492 break; 494 case ip_v4:493 case AF_INET: 495 494 rc = asprintf(bufp, "%" PRIu8 ".%" PRIu8 ".%" PRIu8 ".%" PRIu8 496 495 "/%" PRIu8, (naddr->addr >> 24) & 0xff, … … 498 497 naddr->addr & 0xff, naddr->prefix); 499 498 break; 500 case ip_v6:499 case AF_INET6: 501 500 *bufp = (char *) malloc(INET6_ADDRSTRLEN + INET_PREFIXSTRSIZE); 502 501 if (*bufp == NULL) … … 530 529 } 531 530 532 ip_ver_t inet_addr_get(const inet_addr_t *addr, addr32_t *v4, addr128_t *v6)533 { 534 switch (addr-> version) {535 case ip_v4:531 uint16_t inet_addr_get(const inet_addr_t *addr, addr32_t *v4, addr128_t *v6) 532 { 533 switch (addr->family) { 534 case AF_INET: 536 535 if (v4 != NULL) 537 536 *v4 = addr->addr; 538 break; 539 case ip_v6: 537 538 break; 539 case AF_INET6: 540 540 if (v6 != NULL) 541 541 memcpy(*v6, addr->addr6, 16); 542 break; 543 default: 544 assert(false); 545 break; 546 } 547 548 return addr->version; 549 } 550 551 ip_ver_t inet_naddr_get(const inet_naddr_t *naddr, addr32_t *v4, addr128_t *v6, 542 543 break; 544 } 545 546 return addr->family; 547 } 548 549 uint16_t inet_naddr_get(const inet_naddr_t *naddr, addr32_t *v4, addr128_t *v6, 552 550 uint8_t *prefix) 553 551 { 554 switch (naddr-> version) {555 case ip_v4:552 switch (naddr->family) { 553 case AF_INET: 556 554 if (v4 != NULL) 557 555 *v4 = naddr->addr; 556 558 557 if (prefix != NULL) 559 558 *prefix = naddr->prefix; 560 break; 561 case ip_v6: 559 560 break; 561 case AF_INET6: 562 562 if (v6 != NULL) 563 563 memcpy(*v6, naddr->addr6, 16); 564 564 565 if (prefix != NULL) 565 566 *prefix = naddr->prefix; 566 break; 567 default: 568 assert(false); 569 break; 570 } 571 572 return naddr->version; 567 568 break; 569 } 570 571 return naddr->family; 573 572 } 574 573 575 574 void inet_addr_set(addr32_t v4, inet_addr_t *addr) 576 575 { 577 addr-> version = ip_v4;576 addr->family = AF_INET; 578 577 addr->addr = v4; 579 578 } … … 581 580 void inet_naddr_set(addr32_t v4, uint8_t prefix, inet_naddr_t *naddr) 582 581 { 583 naddr-> version = ip_v4;582 naddr->family = AF_INET; 584 583 naddr->addr = v4; 585 584 naddr->prefix = prefix; … … 588 587 void inet_sockaddr_in_addr(const sockaddr_in_t *sockaddr_in, inet_addr_t *addr) 589 588 { 590 addr-> version = ip_v4;589 addr->family = AF_INET; 591 590 addr->addr = uint32_t_be2host(sockaddr_in->sin_addr.s_addr); 592 591 } … … 594 593 void inet_addr_set6(addr128_t v6, inet_addr_t *addr) 595 594 { 596 addr-> version = ip_v6;595 addr->family = AF_INET6; 597 596 memcpy(addr->addr6, v6, 16); 598 597 } … … 600 599 void inet_naddr_set6(addr128_t v6, uint8_t prefix, inet_naddr_t *naddr) 601 600 { 602 naddr-> version = ip_v6;601 naddr->family = AF_INET6; 603 602 memcpy(naddr->addr6, v6, 16); 604 603 naddr->prefix = prefix; … … 608 607 inet_addr_t *addr) 609 608 { 610 addr-> version = ip_v6;609 addr->family = AF_INET6; 611 610 addr128_t_be2host(sockaddr_in6->sin6_addr.s6_addr, addr->addr6); 612 611 } … … 615 614 sockaddr_in_t *sockaddr_in, sockaddr_in6_t *sockaddr_in6) 616 615 { 617 switch (addr-> version) {618 case ip_v4:616 switch (addr->family) { 617 case AF_INET: 619 618 if (sockaddr_in != NULL) { 620 619 sockaddr_in->sin_family = AF_INET; 621 620 sockaddr_in->sin_addr.s_addr = host2uint32_t_be(addr->addr); 622 621 } 623 break; 624 case ip_v6: 622 623 break; 624 case AF_INET6: 625 625 if (sockaddr_in6 != NULL) { 626 626 sockaddr_in6->sin6_family = AF_INET6; 627 627 host2addr128_t_be(addr->addr6, sockaddr_in6->sin6_addr.s6_addr); 628 628 } 629 break; 630 default: 631 assert(false); 632 break; 633 } 634 635 return ipver_af(addr->version); 636 } 637 638 int inet_addr_sockaddr(const inet_addr_t *addr, uint16_t port, 639 sockaddr_t **nsockaddr, socklen_t *naddrlen) 640 { 641 sockaddr_in_t *sa4; 642 sockaddr_in6_t *sa6; 643 644 switch (addr->version) { 645 case ip_v4: 646 sa4 = calloc(1, sizeof(sockaddr_in_t)); 647 if (sa4 == NULL) 648 return ENOMEM; 649 650 sa4->sin_family = AF_INET; 651 sa4->sin_port = host2uint16_t_be(port); 652 sa4->sin_addr.s_addr = host2uint32_t_be(addr->addr); 653 if (nsockaddr != NULL) 654 *nsockaddr = (sockaddr_t *)sa4; 655 if (naddrlen != NULL) 656 *naddrlen = sizeof(*sa4); 657 break; 658 case ip_v6: 659 sa6 = calloc(1, sizeof(sockaddr_in6_t)); 660 if (sa6 == NULL) 661 return ENOMEM; 662 663 sa6->sin6_family = AF_INET6; 664 sa6->sin6_port = host2uint16_t_be(port); 665 host2addr128_t_be(addr->addr6, sa6->sin6_addr.s6_addr); 666 if (nsockaddr != NULL) 667 *nsockaddr = (sockaddr_t *)sa6; 668 if (naddrlen != NULL) 669 *naddrlen = sizeof(*sa6); 670 break; 671 default: 672 assert(false); 673 break; 674 } 675 676 return EOK; 629 630 break; 631 } 632 633 return addr->family; 677 634 } 678 635
Note:
See TracChangeset
for help on using the changeset viewer.