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