Changeset f023251 in mainline for uspace/lib/c/generic/inet/addr.c
- Timestamp:
- 2013-09-29T21:06:10Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e948fde
- Parents:
- 13be2583
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/inet/addr.c
r13be2583 rf023251 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 }; … … 150 151 void inet_addr(inet_addr_t *addr, uint8_t a, uint8_t b, uint8_t c, uint8_t d) 151 152 { 152 addr-> family = AF_INET;153 addr->version = ip_v4; 153 154 addr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) | 154 155 ((addr32_t) c << 8) | ((addr32_t) d); … … 158 159 uint8_t prefix) 159 160 { 160 naddr-> family = AF_INET;161 naddr->version = ip_v4; 161 162 naddr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) | 162 163 ((addr32_t) c << 8) | ((addr32_t) d); … … 167 168 uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h) 168 169 { 169 addr-> family = AF_INET6;170 addr->version = ip_v6; 170 171 addr->addr6[0] = (a >> 8) & 0xff; 171 172 addr->addr6[1] = a & 0xff; … … 189 190 uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h, uint8_t prefix) 190 191 { 191 naddr-> family = AF_INET6;192 naddr->version = ip_v6; 192 193 naddr->addr6[0] = (a >> 8) & 0xff; 193 194 naddr->addr6[1] = a & 0xff; … … 209 210 } 210 211 211 /** Parse network address family.212 * 213 * @param text Network address in common notation.214 * @param af Place to store network address family.212 /** Determine address version. 213 * 214 * @param text Address in common notation. 215 * @param af Place to store address version. 215 216 * 216 217 * @return EOK on success, EINVAL if input is not in valid format. 217 218 * 218 219 */ 219 int inet_addr_family(const char *text, uint16_t *af)220 static int inet_addr_version(const char *text, ip_ver_t *ver) 220 221 { 221 222 char *dot = str_chr(text, '.'); 222 223 if (dot != NULL) { 223 * af = AF_INET;224 *ver = ip_v4; 224 225 return EOK; 225 226 } 226 227 227 228 char *collon = str_chr(text, ':'); 228 229 if (collon != NULL) { 229 * af = AF_INET6;230 *ver = ip_v6; 230 231 return EOK; 231 232 } 232 233 233 234 return EINVAL; 234 235 } 235 236 237 static int ipver_af(ip_ver_t ver) 238 { 239 switch (ver) { 240 case ip_any: 241 return AF_NONE; 242 case ip_v4: 243 return AF_INET; 244 case ip_v6: 245 return AF_INET6; 246 default: 247 assert(false); 248 return EINVAL; 249 } 250 } 251 236 252 void inet_naddr_addr(const inet_naddr_t *naddr, inet_addr_t *addr) 237 253 { 238 addr-> family = naddr->family;254 addr->version = naddr->version; 239 255 memcpy(addr->addr6, naddr->addr6, 16); 240 256 } … … 243 259 inet_naddr_t *naddr) 244 260 { 245 naddr-> family = addr->family;261 naddr->version = addr->version; 246 262 memcpy(naddr->addr6, addr->addr6, 16); 247 263 naddr->prefix = prefix; … … 250 266 void inet_addr_any(inet_addr_t *addr) 251 267 { 252 addr-> family = AF_NONE;268 addr->version = ip_any; 253 269 memset(addr->addr6, 0, 16); 254 270 } … … 256 272 void inet_naddr_any(inet_naddr_t *naddr) 257 273 { 258 naddr-> family = AF_NONE;274 naddr->version = ip_any; 259 275 memset(naddr->addr6, 0, 16); 260 276 naddr->prefix = 0; … … 263 279 int inet_addr_compare(const inet_addr_t *a, const inet_addr_t *b) 264 280 { 265 if (a-> family != b->family)281 if (a->version != b->version) 266 282 return 0; 267 268 switch (a-> family) {269 case AF_INET:283 284 switch (a->version) { 285 case ip_v4: 270 286 return (a->addr == b->addr); 271 case AF_INET6:287 case ip_v6: 272 288 return addr128_compare(a->addr6, b->addr6); 273 289 default: … … 278 294 int inet_addr_is_any(const inet_addr_t *addr) 279 295 { 280 return ((addr-> family == 0) ||296 return ((addr->version == ip_any) || 281 297 (inet_addr_compare(addr, &inet_addr_any_addr)) || 282 298 (inet_addr_compare(addr, &inet_addr_any_addr6))); … … 285 301 int inet_naddr_compare(const inet_naddr_t *naddr, const inet_addr_t *addr) 286 302 { 287 if (naddr-> family != addr->family)303 if (naddr->version != addr->version) 288 304 return 0; 289 305 290 switch (naddr-> family) {291 case AF_INET:306 switch (naddr->version) { 307 case ip_v4: 292 308 return (naddr->addr == addr->addr); 293 case AF_INET6:309 case ip_v6: 294 310 return addr128_compare(naddr->addr6, addr->addr6); 295 311 default: … … 300 316 int inet_naddr_compare_mask(const inet_naddr_t *naddr, const inet_addr_t *addr) 301 317 { 302 if (naddr-> family != addr->family)318 if (naddr->version != addr->version) 303 319 return 0; 304 305 switch (naddr-> family) {306 case AF_INET:320 321 switch (naddr->version) { 322 case ip_v4: 307 323 if (naddr->prefix > 32) 308 324 return 0; 309 325 310 326 addr32_t mask = 311 327 BIT_RANGE(addr32_t, 31, 31 - (naddr->prefix - 1)); 312 328 return ((naddr->addr & mask) == (addr->addr & mask)); 313 case AF_INET6:329 case ip_v6: 314 330 if (naddr->prefix > 128) 315 331 return 0; … … 352 368 int inet_addr_parse(const char *text, inet_addr_t *addr) 353 369 { 354 int rc = inet_addr_ family(text, &addr->family);370 int rc = inet_addr_version(text, &addr->version); 355 371 if (rc != EOK) 356 372 return rc; 357 373 358 374 uint8_t buf[16]; 359 rc = inet_pton( addr->family, text, buf);375 rc = inet_pton(ipver_af(addr->version), text, buf); 360 376 if (rc != EOK) 361 377 return rc; 362 378 363 switch (addr-> family) {364 case AF_INET:379 switch (addr->version) { 380 case ip_v4: 365 381 addr->addr = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | 366 382 buf[3]; 367 383 break; 368 case AF_INET6:384 case ip_v6: 369 385 memcpy(addr->addr6, buf, 16); 370 386 break; … … 392 408 *slash = 0; 393 409 394 int rc = inet_addr_ family(text, &naddr->family);410 int rc = inet_addr_version(text, &naddr->version); 395 411 if (rc != EOK) 396 412 return rc; 397 413 398 414 uint8_t buf[16]; 399 rc = inet_pton( naddr->family, text, buf);415 rc = inet_pton(ipver_af(naddr->version), text, buf); 400 416 *slash = '/'; 401 417 … … 406 422 uint8_t prefix; 407 423 408 switch (naddr-> family) {409 case AF_INET:424 switch (naddr->version) { 425 case ip_v4: 410 426 prefix = strtoul(slash, &slash, 10); 411 427 if (prefix > 32) … … 417 433 418 434 break; 419 case AF_INET6:435 case ip_v6: 420 436 prefix = strtoul(slash, &slash, 10); 421 437 if (prefix > 128) … … 447 463 int rc = 0; 448 464 449 switch (addr-> family) {450 case AF_NONE:465 switch (addr->version) { 466 case ip_any: 451 467 rc = asprintf(bufp, "none"); 452 468 break; 453 case AF_INET:469 case ip_v4: 454 470 rc = asprintf(bufp, "%u.%u.%u.%u", (addr->addr >> 24) & 0xff, 455 471 (addr->addr >> 16) & 0xff, (addr->addr >> 8) & 0xff, 456 472 addr->addr & 0xff); 457 473 break; 458 case AF_INET6:474 case ip_v6: 459 475 *bufp = (char *) malloc(INET6_ADDRSTRLEN); 460 476 if (*bufp == NULL) … … 487 503 char prefix[INET_PREFIXSTRSIZE]; 488 504 489 switch (naddr-> family) {490 case AF_NONE:505 switch (naddr->version) { 506 case ip_any: 491 507 rc = asprintf(bufp, "none"); 492 508 break; 493 case AF_INET:509 case ip_v4: 494 510 rc = asprintf(bufp, "%" PRIu8 ".%" PRIu8 ".%" PRIu8 ".%" PRIu8 495 511 "/%" PRIu8, (naddr->addr >> 24) & 0xff, … … 497 513 naddr->addr & 0xff, naddr->prefix); 498 514 break; 499 case AF_INET6:515 case ip_v6: 500 516 *bufp = (char *) malloc(INET6_ADDRSTRLEN + INET_PREFIXSTRSIZE); 501 517 if (*bufp == NULL) … … 529 545 } 530 546 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:547 ip_ver_t inet_addr_get(const inet_addr_t *addr, addr32_t *v4, addr128_t *v6) 548 { 549 switch (addr->version) { 550 case ip_v4: 535 551 if (v4 != NULL) 536 552 *v4 = addr->addr; 537 538 break; 539 case AF_INET6: 553 break; 554 case ip_v6: 540 555 if (v6 != NULL) 541 556 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, 557 break; 558 default: 559 assert(false); 560 break; 561 } 562 563 return addr->version; 564 } 565 566 ip_ver_t inet_naddr_get(const inet_naddr_t *naddr, addr32_t *v4, addr128_t *v6, 550 567 uint8_t *prefix) 551 568 { 552 switch (naddr-> family) {553 case AF_INET:569 switch (naddr->version) { 570 case ip_v4: 554 571 if (v4 != NULL) 555 572 *v4 = naddr->addr; 556 557 573 if (prefix != NULL) 558 574 *prefix = naddr->prefix; 559 560 break; 561 case AF_INET6: 575 break; 576 case ip_v6: 562 577 if (v6 != NULL) 563 578 memcpy(*v6, naddr->addr6, 16); 564 565 579 if (prefix != NULL) 566 580 *prefix = naddr->prefix; 567 568 break; 569 } 570 571 return naddr->family; 581 break; 582 default: 583 assert(false); 584 break; 585 } 586 587 return naddr->version; 572 588 } 573 589 574 590 void inet_addr_set(addr32_t v4, inet_addr_t *addr) 575 591 { 576 addr-> family = AF_INET;592 addr->version = ip_v4; 577 593 addr->addr = v4; 578 594 } … … 580 596 void inet_naddr_set(addr32_t v4, uint8_t prefix, inet_naddr_t *naddr) 581 597 { 582 naddr-> family = AF_INET;598 naddr->version = ip_v4; 583 599 naddr->addr = v4; 584 600 naddr->prefix = prefix; … … 587 603 void inet_sockaddr_in_addr(const sockaddr_in_t *sockaddr_in, inet_addr_t *addr) 588 604 { 589 addr-> family = AF_INET;605 addr->version = ip_v4; 590 606 addr->addr = uint32_t_be2host(sockaddr_in->sin_addr.s_addr); 591 607 } … … 593 609 void inet_addr_set6(addr128_t v6, inet_addr_t *addr) 594 610 { 595 addr-> family = AF_INET6;611 addr->version = ip_v6; 596 612 memcpy(addr->addr6, v6, 16); 597 613 } … … 599 615 void inet_naddr_set6(addr128_t v6, uint8_t prefix, inet_naddr_t *naddr) 600 616 { 601 naddr-> family = AF_INET6;617 naddr->version = ip_v6; 602 618 memcpy(naddr->addr6, v6, 16); 603 619 naddr->prefix = prefix; … … 607 623 inet_addr_t *addr) 608 624 { 609 addr-> family = AF_INET6;625 addr->version = ip_v6; 610 626 addr128_t_be2host(sockaddr_in6->sin6_addr.s6_addr, addr->addr6); 611 627 } … … 614 630 sockaddr_in_t *sockaddr_in, sockaddr_in6_t *sockaddr_in6) 615 631 { 616 switch (addr-> family) {617 case AF_INET:632 switch (addr->version) { 633 case ip_v4: 618 634 if (sockaddr_in != NULL) { 619 635 sockaddr_in->sin_family = AF_INET; 620 636 sockaddr_in->sin_addr.s_addr = host2uint32_t_be(addr->addr); 621 637 } 622 623 break; 624 case AF_INET6: 638 break; 639 case ip_v6: 625 640 if (sockaddr_in6 != NULL) { 626 641 sockaddr_in6->sin6_family = AF_INET6; 627 642 host2addr128_t_be(addr->addr6, sockaddr_in6->sin6_addr.s6_addr); 628 643 } 629 630 break; 631 } 632 633 return addr->family; 644 break; 645 default: 646 assert(false); 647 break; 648 } 649 650 return ipver_af(addr->version); 634 651 } 635 652
Note:
See TracChangeset
for help on using the changeset viewer.