diff options
| author | David M. Syzdek <syzdek@bindlebinaries.com> | 2013-12-05 13:28:22 -0900 |
|---|---|---|
| committer | David M. Syzdek <syzdek@bindlebinaries.com> | 2013-12-05 13:28:22 -0900 |
| commit | 29f4a768305f859e2d5ef141e4c639956d628bca (patch) | |
| tree | c38ba537714e1fce3646be4071cf3e7345a215c6 /src/macaddrinfo.c | |
| parent | 4687accf07b1bdb9392b1cb384fe656928b8a6c5 (diff) | |
| download | dmstools-29f4a768305f859e2d5ef141e4c639956d628bca.tar.gz dmstools-29f4a768305f859e2d5ef141e4c639956d628bca.tar.bz2 dmstools-29f4a768305f859e2d5ef141e4c639956d628bca.tar.xz dmstools-29f4a768305f859e2d5ef141e4c639956d628bca.zip | |
Updating macaddrinfo to parse IPv6 and EUI-64 input.
Diffstat (limited to 'src/macaddrinfo.c')
| -rw-r--r-- | src/macaddrinfo.c | 540 |
1 files changed, 400 insertions, 140 deletions
diff --git a/src/macaddrinfo.c b/src/macaddrinfo.c index 341cad6..822782d 100644 --- a/src/macaddrinfo.c +++ b/src/macaddrinfo.c | |||
| @@ -212,7 +212,7 @@ struct mau_command | |||
| 212 | int main(int argc, char * argv[]); | 212 | int main(int argc, char * argv[]); |
| 213 | 213 | ||
| 214 | 214 | ||
| 215 | int mau_cmd_format(mau_config * cnf, int argc, char * argv[]); | 215 | int mau_cmd_eui64(mau_config * cnf, int argc, char * argv[]); |
| 216 | 216 | ||
| 217 | // generate command | 217 | // generate command |
| 218 | int mau_cmd_generate(mau_config * cnf, int argc, char * argv[]); | 218 | int mau_cmd_generate(mau_config * cnf, int argc, char * argv[]); |
| @@ -222,9 +222,23 @@ void mau_cmd_generate_usage(void); | |||
| 222 | 222 | ||
| 223 | int mau_cmd_info(mau_config * cnf, int argc, char * argv[]); | 223 | int mau_cmd_info(mau_config * cnf, int argc, char * argv[]); |
| 224 | 224 | ||
| 225 | int mau_cmd_link_local(mau_config * cnf, int argc, char * argv[]); | ||
| 226 | |||
| 227 | int mau_cmd_macaddress(mau_config * cnf, int argc, char * argv[]); | ||
| 228 | |||
| 225 | int mau_cmd_test(mau_config * cnf, int argc, char * argv[]); | 229 | int mau_cmd_test(mau_config * cnf, int argc, char * argv[]); |
| 226 | void mau_cmd_update_usage(void); | 230 | void mau_cmd_update_usage(void); |
| 227 | 231 | ||
| 232 | int mau_conv_eui2sin(mau_config * cnf, const maueui64_t eui, struct sockaddr_in6 * sin); | ||
| 233 | int mau_conv_eui2str(mau_config * cnf, const maueui64_t eui, maustr_t str); | ||
| 234 | int mau_conv_mac2eui(mau_config * cnf, const mauaddr_t addr, maueui64_t eui); | ||
| 235 | int mau_conv_mac2str(mau_config * cnf, const mauaddr_t addr, maustr_t str); | ||
| 236 | int mau_conv_eui2mac(mau_config * cnf, const maueui64_t eui, mauaddr_t addr); | ||
| 237 | int mau_conv_sin2str(mau_config * cnf, const struct sockaddr_in6 * sin, maustr_t str); | ||
| 238 | int mau_conv_str2mac(mau_config * cnf, const maustr_t str, mauaddr_t addr); | ||
| 239 | int mau_conv_str2sin(mau_config * cnf, const maustr_t str, struct sockaddr_in6 * sin); | ||
| 240 | |||
| 241 | |||
| 228 | int mau_getopt(mau_config * cnf, int argc, char * const * argv, | 242 | int mau_getopt(mau_config * cnf, int argc, char * const * argv, |
| 229 | const char * short_opt, const struct option * long_opt, int * opt_index); | 243 | const char * short_opt, const struct option * long_opt, int * opt_index); |
| 230 | 244 | ||
| @@ -239,12 +253,6 @@ void mau_log_warn(mau_config * cnf, const char * fmt, ...); | |||
| 239 | 253 | ||
| 240 | void mau_logv(mau_config * cnf, const char * fmt, va_list args); | 254 | void mau_logv(mau_config * cnf, const char * fmt, va_list args); |
| 241 | 255 | ||
| 242 | int mau_eui2str(mau_config * cnf, const maueui64_t eui, maustr_t str); | ||
| 243 | int mau_mac2eui(mau_config * cnf, const mauaddr_t addr, maueui64_t eui); | ||
| 244 | int mau_mac2str(mau_config * cnf, const mauaddr_t addr, maustr_t str); | ||
| 245 | int mau_eui2mac(mau_config * cnf, const maueui64_t eui, mauaddr_t addr); | ||
| 246 | int mau_str2mac(mau_config * cnf, const maustr_t str, mauaddr_t addr); | ||
| 247 | |||
| 248 | //displays usage information | 256 | //displays usage information |
| 249 | void mau_usage(mau_config * cnf); | 257 | void mau_usage(mau_config * cnf); |
| 250 | 258 | ||
| @@ -274,11 +282,11 @@ const mau_command mau_cmdmap[] = | |||
| 274 | NULL, // "print entire OUI database" // command description | 282 | NULL, // "print entire OUI database" // command description |
| 275 | }, | 283 | }, |
| 276 | { | 284 | { |
| 277 | "format", // command name | 285 | "eui64", // command name |
| 278 | mau_cmd_format, // entry function | 286 | mau_cmd_eui64, // entry function |
| 279 | NULL, // help function | 287 | NULL, // help function |
| 280 | " address", // cli usage | 288 | " address", // cli usage |
| 281 | "reformat MAC address using notation flags" // command description | 289 | "display modified EUI-64 Identifier" // command description |
| 282 | }, | 290 | }, |
| 283 | { | 291 | { |
| 284 | "generate", // command name | 292 | "generate", // command name |
| @@ -295,6 +303,20 @@ const mau_command mau_cmdmap[] = | |||
| 295 | "display meta information about MAC address" // command description | 303 | "display meta information about MAC address" // command description |
| 296 | }, | 304 | }, |
| 297 | { | 305 | { |
| 306 | "link-local", // command name | ||
| 307 | mau_cmd_link_local, // entry function | ||
| 308 | NULL, // help function | ||
| 309 | " address", // cli usage | ||
| 310 | "display derived IPv6 link-local address" // command description | ||
| 311 | }, | ||
| 312 | { | ||
| 313 | "macaddress", // command name | ||
| 314 | mau_cmd_macaddress, // entry function | ||
| 315 | NULL, // help function | ||
| 316 | " address", // cli usage | ||
| 317 | "display MAC address using notation flags" // command description | ||
| 318 | }, | ||
| 319 | { | ||
| 298 | "update", // command name | 320 | "update", // command name |
| 299 | mau_cmd_test, // entry function | 321 | mau_cmd_test, // entry function |
| 300 | mau_cmd_update_usage, // help function | 322 | mau_cmd_update_usage, // help function |
| @@ -406,12 +428,13 @@ int main(int argc, char * argv[]) | |||
| 406 | } | 428 | } |
| 407 | 429 | ||
| 408 | 430 | ||
| 409 | int mau_cmd_format(mau_config * cnf, int argc, char * argv[]) | 431 | int mau_cmd_eui64(mau_config * cnf, int argc, char * argv[]) |
| 410 | { | 432 | { |
| 411 | int c; | 433 | int c; |
| 412 | int opt_index; | 434 | int opt_index; |
| 413 | maustr_t str; | ||
| 414 | mauaddr_t addr; | 435 | mauaddr_t addr; |
| 436 | maueui64_t eui; | ||
| 437 | maustr_t eui_str; | ||
| 415 | 438 | ||
| 416 | // getopt options | 439 | // getopt options |
| 417 | static char short_opt[] = MAU_GETOPT_SHORT; | 440 | static char short_opt[] = MAU_GETOPT_SHORT; |
| @@ -456,12 +479,12 @@ int mau_cmd_format(mau_config * cnf, int argc, char * argv[]) | |||
| 456 | return(1); | 479 | return(1); |
| 457 | }; | 480 | }; |
| 458 | 481 | ||
| 459 | if ((mau_str2mac(cnf, argv[optind], addr))) | 482 | if ((mau_conv_str2mac(cnf, argv[optind], addr))) |
| 460 | return(1); | 483 | return(1); |
| 484 | mau_conv_mac2eui(cnf, addr, eui); | ||
| 485 | mau_conv_eui2str(cnf, eui, eui_str); | ||
| 461 | 486 | ||
| 462 | mau_mac2str(cnf, addr, str); | 487 | printf("%s\n", eui_str); |
| 463 | |||
| 464 | printf("%s\n", str); | ||
| 465 | 488 | ||
| 466 | return(0); | 489 | return(0); |
| 467 | } | 490 | } |
| @@ -567,7 +590,7 @@ int mau_cmd_generate(mau_config * cnf, int argc, char * argv[]) | |||
| 567 | if ((use_oui)) | 590 | if ((use_oui)) |
| 568 | memcpy(addr, oui, 3); | 591 | memcpy(addr, oui, 3); |
| 569 | 592 | ||
| 570 | mau_mac2str(cnf, addr, str); | 593 | mau_conv_mac2str(cnf, addr, str); |
| 571 | printf("%s\n", str); | 594 | printf("%s\n", str); |
| 572 | 595 | ||
| 573 | return(0); | 596 | return(0); |
| @@ -595,7 +618,7 @@ int mau_cmd_info(mau_config * cnf, int argc, char * argv[]) | |||
| 595 | maustr_t addr_str; | 618 | maustr_t addr_str; |
| 596 | maueui64_t eui; | 619 | maueui64_t eui; |
| 597 | maustr_t eui_str; | 620 | maustr_t eui_str; |
| 598 | maustr_t ipv6_str; | 621 | maustr_t sin_str; |
| 599 | struct sockaddr_in6 sin; | 622 | struct sockaddr_in6 sin; |
| 600 | 623 | ||
| 601 | // getopt options | 624 | // getopt options |
| @@ -641,27 +664,146 @@ int mau_cmd_info(mau_config * cnf, int argc, char * argv[]) | |||
| 641 | return(1); | 664 | return(1); |
| 642 | }; | 665 | }; |
| 643 | 666 | ||
| 644 | if ((mau_str2mac(cnf, argv[optind], addr))) | 667 | if ((mau_conv_str2mac(cnf, argv[optind], addr))) |
| 645 | return(1); | 668 | return(1); |
| 646 | 669 | ||
| 647 | mau_mac2str(cnf, addr, addr_str); | 670 | mau_conv_mac2str(cnf, addr, addr_str); |
| 648 | mau_mac2eui(cnf, addr, eui); | 671 | mau_conv_mac2eui(cnf, addr, eui); |
| 649 | mau_eui2str(cnf, eui, eui_str); | 672 | mau_conv_eui2str(cnf, eui, eui_str); |
| 650 | 673 | mau_conv_eui2sin(cnf, eui, &sin); | |
| 651 | memset(&sin, 0, sizeof(sin)); | 674 | mau_conv_sin2str(cnf, &sin, sin_str); |
| 652 | sin.sin6_len = sizeof(sin); | ||
| 653 | sin.sin6_family = AF_INET6; | ||
| 654 | sin.sin6_addr.s6_addr[0] = 0xfe; | ||
| 655 | sin.sin6_addr.s6_addr[1] = 0x80; | ||
| 656 | memcpy(&sin.sin6_addr.s6_addr[8], eui, 8); | ||
| 657 | |||
| 658 | getnameinfo((struct sockaddr *)&sin, sin.sin6_len, ipv6_str, sizeof(ipv6_str), NULL, 0, NI_NUMERICHOST|NI_NUMERICSERV); | ||
| 659 | 675 | ||
| 660 | printf("MAC Address: %s\n", addr_str); | 676 | printf("MAC Address: %s\n", addr_str); |
| 661 | printf("U/L Bit: %s\n", ((addr[0] & 0x02) == 0x02) ? "1 (locally administered)" : "0 (universally administered)"); | 677 | printf("U/L Bit: %s\n", ((addr[0] & 0x02) == 0x02) ? "1 (locally administered)" : "0 (universally administered)"); |
| 662 | printf("Multicast Bit: %s\n", ((addr[0] & 0x01) == 0x01) ? "1 (multicast)" : "0 (unicast)"); | 678 | printf("Multicast Bit: %s\n", ((addr[0] & 0x01) == 0x01) ? "1 (multicast)" : "0 (unicast)"); |
| 663 | printf("Modified EUI-64: %s\n", eui_str); | 679 | printf("Modified EUI-64: %s\n", eui_str); |
| 664 | printf("IPv6 Link-local: %s\n", ipv6_str); | 680 | printf("IPv6 Link-local: %s\n", sin_str); |
| 681 | |||
| 682 | return(0); | ||
| 683 | } | ||
| 684 | |||
| 685 | |||
| 686 | int mau_cmd_link_local(mau_config * cnf, int argc, char * argv[]) | ||
| 687 | { | ||
| 688 | int c; | ||
| 689 | int opt_index; | ||
| 690 | mauaddr_t addr; | ||
| 691 | maueui64_t eui; | ||
| 692 | maustr_t sin_str; | ||
| 693 | struct sockaddr_in6 sin; | ||
| 694 | |||
| 695 | // getopt options | ||
| 696 | static char short_opt[] = MAU_GETOPT_SHORT; | ||
| 697 | static struct option long_opt[] = { MAU_GETOPT_LONG }; | ||
| 698 | |||
| 699 | |||
| 700 | while((c = mau_getopt(cnf, argc, argv, short_opt, long_opt, &opt_index)) != -1) | ||
| 701 | { | ||
| 702 | switch(c) | ||
| 703 | { | ||
| 704 | case -2: /* captured by common options */ | ||
| 705 | case -1: /* no more arguments */ | ||
| 706 | case 0: /* long options toggles */ | ||
| 707 | break; | ||
| 708 | |||
| 709 | case 1: | ||
| 710 | return(0); | ||
| 711 | case 2: | ||
| 712 | return(1); | ||
| 713 | |||
| 714 | case '?': | ||
| 715 | fprintf(stderr, "Try `%s info --help' for more information.\n", PROGRAM_NAME); | ||
| 716 | return(1); | ||
| 717 | |||
| 718 | default: | ||
| 719 | fprintf(stderr, "%s: unrecognized option `--%c'\n", PROGRAM_NAME, c); | ||
| 720 | fprintf(stderr, "Try `%s info --help' for more information.\n", PROGRAM_NAME); | ||
| 721 | return(1); | ||
| 722 | }; | ||
| 723 | }; | ||
| 724 | |||
| 725 | if ((argc - optind) < 1) | ||
| 726 | { | ||
| 727 | fprintf(stderr, "%s: missing MAC address\n", PROGRAM_NAME); | ||
| 728 | fprintf(stderr, "Try `%s info --help' for more information.\n", PROGRAM_NAME); | ||
| 729 | return(1); | ||
| 730 | }; | ||
| 731 | if ((optind+1) != argc) | ||
| 732 | { | ||
| 733 | fprintf(stderr, "%s: unrecognized argument `-- %s'\n", PROGRAM_NAME, argv[optind+1]); | ||
| 734 | fprintf(stderr, "Try `%s info --help' for more information.\n", PROGRAM_NAME); | ||
| 735 | return(1); | ||
| 736 | }; | ||
| 737 | |||
| 738 | if ((mau_conv_str2mac(cnf, argv[optind], addr))) | ||
| 739 | return(1); | ||
| 740 | |||
| 741 | mau_conv_mac2eui(cnf, addr, eui); | ||
| 742 | mau_conv_eui2sin(cnf, eui, &sin); | ||
| 743 | mau_conv_sin2str(cnf, &sin, sin_str); | ||
| 744 | |||
| 745 | printf("%s\n", sin_str); | ||
| 746 | |||
| 747 | return(0); | ||
| 748 | } | ||
| 749 | |||
| 750 | |||
| 751 | int mau_cmd_macaddress(mau_config * cnf, int argc, char * argv[]) | ||
| 752 | { | ||
| 753 | int c; | ||
| 754 | int opt_index; | ||
| 755 | maustr_t str; | ||
| 756 | mauaddr_t addr; | ||
| 757 | |||
| 758 | // getopt options | ||
| 759 | static char short_opt[] = MAU_GETOPT_SHORT; | ||
| 760 | static struct option long_opt[] = { MAU_GETOPT_LONG }; | ||
| 761 | |||
| 762 | |||
| 763 | while((c = mau_getopt(cnf, argc, argv, short_opt, long_opt, &opt_index)) != -1) | ||
| 764 | { | ||
| 765 | switch(c) | ||
| 766 | { | ||
| 767 | case -2: /* captured by common options */ | ||
| 768 | case -1: /* no more arguments */ | ||
| 769 | case 0: /* long options toggles */ | ||
| 770 | break; | ||
| 771 | |||
| 772 | case 1: | ||
| 773 | return(0); | ||
| 774 | case 2: | ||
| 775 | return(1); | ||
| 776 | |||
| 777 | case '?': | ||
| 778 | fprintf(stderr, "Try `%s format --help' for more information.\n", PROGRAM_NAME); | ||
| 779 | return(1); | ||
| 780 | |||
| 781 | default: | ||
| 782 | fprintf(stderr, "%s: unrecognized option `--%c'\n", PROGRAM_NAME, c); | ||
| 783 | fprintf(stderr, "Try `%s format --help' for more information.\n", PROGRAM_NAME); | ||
| 784 | return(1); | ||
| 785 | }; | ||
| 786 | }; | ||
| 787 | |||
| 788 | if ((argc - optind) < 1) | ||
| 789 | { | ||
| 790 | fprintf(stderr, "%s: missing MAC address\n", PROGRAM_NAME); | ||
| 791 | fprintf(stderr, "Try `%s format --help' for more information.\n", PROGRAM_NAME); | ||
| 792 | return(1); | ||
| 793 | }; | ||
| 794 | if ((optind+1) != argc) | ||
| 795 | { | ||
| 796 | fprintf(stderr, "%s: unrecognized argument `-- %s'\n", PROGRAM_NAME, argv[optind+1]); | ||
| 797 | fprintf(stderr, "Try `%s format --help' for more information.\n", PROGRAM_NAME); | ||
| 798 | return(1); | ||
| 799 | }; | ||
| 800 | |||
| 801 | if ((mau_conv_str2mac(cnf, argv[optind], addr))) | ||
| 802 | return(1); | ||
| 803 | |||
| 804 | mau_conv_mac2str(cnf, addr, str); | ||
| 805 | |||
| 806 | printf("%s\n", str); | ||
| 665 | 807 | ||
| 666 | return(0); | 808 | return(0); |
| 667 | } | 809 | } |
| @@ -741,6 +883,232 @@ void mau_cmd_update_usage(void) | |||
| 741 | } | 883 | } |
| 742 | 884 | ||
| 743 | 885 | ||
| 886 | int mau_conv_eui2mac(mau_config * cnf, const maueui64_t eui, maueui64_t addr) | ||
| 887 | { | ||
| 888 | assert(cnf != NULL); | ||
| 889 | addr[0] = (eui[0] ^ 0x02); | ||
| 890 | addr[1] = eui[1]; | ||
| 891 | addr[2] = eui[2]; | ||
| 892 | addr[3] = eui[5]; | ||
| 893 | addr[4] = eui[6]; | ||
| 894 | addr[5] = eui[7]; | ||
| 895 | return(0); | ||
| 896 | } | ||
| 897 | |||
| 898 | |||
| 899 | int mau_conv_eui2sin(mau_config * cnf, const maueui64_t eui, struct sockaddr_in6 * sin) | ||
| 900 | { | ||
| 901 | assert(cnf != NULL); | ||
| 902 | memset(sin, 0, sizeof(struct sockaddr_in6)); | ||
| 903 | sin->sin6_len = sizeof(struct sockaddr_in6); | ||
| 904 | sin->sin6_family = AF_INET6; | ||
| 905 | sin->sin6_addr.s6_addr[0] = 0xfe; | ||
| 906 | sin->sin6_addr.s6_addr[1] = 0x80; | ||
| 907 | memcpy(&sin->sin6_addr.s6_addr[8], eui, 8); | ||
| 908 | return(0); | ||
| 909 | } | ||
| 910 | |||
| 911 | |||
| 912 | int mau_conv_eui2str(mau_config * cnf, const maueui64_t eui, maustr_t str) | ||
| 913 | { | ||
| 914 | switch (cnf->notation & MAU_MASK_CASE) | ||
| 915 | { | ||
| 916 | case MAU_CASE_LOWER: | ||
| 917 | snprintf(str, sizeof(maustr_t), "%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x", eui[0],eui[1],eui[2],eui[3],eui[4],eui[5],eui[6],eui[7]); | ||
| 918 | break; | ||
| 919 | |||
| 920 | case MAU_CASE_UPPER: | ||
| 921 | default: | ||
| 922 | snprintf(str, sizeof(maustr_t), "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X", eui[0],eui[1],eui[2],eui[3],eui[4],eui[5],eui[6],eui[7]); | ||
| 923 | break; | ||
| 924 | } | ||
| 925 | return(0); | ||
| 926 | } | ||
| 927 | |||
| 928 | |||
| 929 | int mau_conv_mac2eui(mau_config * cnf, const mauaddr_t addr, maueui64_t eui) | ||
| 930 | { | ||
| 931 | assert(cnf != NULL); | ||
| 932 | assert(eui != NULL); | ||
| 933 | assert(addr != NULL); | ||
| 934 | |||
| 935 | eui[0] = (addr[0] ^ 0x02); | ||
| 936 | eui[1] = addr[1]; | ||
| 937 | eui[2] = addr[2]; | ||
| 938 | eui[3] = 0xff; | ||
| 939 | eui[4] = 0xfe; | ||
| 940 | eui[5] = addr[3]; | ||
| 941 | eui[6] = addr[4]; | ||
| 942 | eui[7] = addr[5]; | ||
| 943 | |||
| 944 | return(0); | ||
| 945 | } | ||
| 946 | |||
| 947 | |||
| 948 | int mau_conv_mac2str(mau_config * cnf, const mauaddr_t addr, maustr_t str) | ||
| 949 | { | ||
| 950 | switch (cnf->notation | (MAU_MASK_NOTATION & MAU_MASK_CASE)) | ||
| 951 | { | ||
| 952 | case (MAU_NOTATION_COLON | MAU_CASE_LOWER): | ||
| 953 | snprintf(str, sizeof(maustr_t), "%02x:%02x:%02x:%02x:%02x:%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 954 | break; | ||
| 955 | |||
| 956 | case (MAU_NOTATION_COLON | MAU_CASE_UPPER): | ||
| 957 | snprintf(str, sizeof(maustr_t), "%02X:%02X:%02X:%02X:%02X:%02X", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 958 | break; | ||
| 959 | |||
| 960 | case (MAU_NOTATION_DASH | MAU_CASE_LOWER): | ||
| 961 | snprintf(str, sizeof(maustr_t), "%02x-%02x-%02x-%02x-%02x-%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 962 | break; | ||
| 963 | |||
| 964 | case (MAU_NOTATION_DASH | MAU_CASE_UPPER): | ||
| 965 | snprintf(str, sizeof(maustr_t), "%02X-%02X-%02X-%02X-%02X-%02X", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 966 | break; | ||
| 967 | |||
| 968 | case (MAU_NOTATION_DOT | MAU_CASE_LOWER): | ||
| 969 | snprintf(str, sizeof(maustr_t), "%02x%02x.%02x%02x.%02x%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 970 | break; | ||
| 971 | |||
| 972 | case (MAU_NOTATION_DOT | MAU_CASE_UPPER): | ||
| 973 | snprintf(str, sizeof(maustr_t), "%02X%02X.%02X%02X.%02X%02X", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 974 | break; | ||
| 975 | |||
| 976 | case (MAU_NOTATION_RAW | MAU_CASE_LOWER): | ||
| 977 | snprintf(str, sizeof(maustr_t), "%02x%02x%02x%02x%02x%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 978 | break; | ||
| 979 | |||
| 980 | case (MAU_NOTATION_RAW | MAU_CASE_UPPER): | ||
| 981 | snprintf(str, sizeof(maustr_t), "%02X%02X%02X%02X%02X%02X", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 982 | break; | ||
| 983 | |||
| 984 | default: | ||
| 985 | snprintf(str, sizeof(maustr_t), "%02x:%02x:%02x:%02x:%02x:%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 986 | }; | ||
| 987 | return(0); | ||
| 988 | } | ||
| 989 | |||
| 990 | |||
| 991 | int mau_conv_sin2eui(mau_config * cnf, const struct sockaddr_in6 * sin, maueui64_t eui) | ||
| 992 | { | ||
| 993 | assert(cnf != NULL); | ||
| 994 | memcpy(eui, &sin->sin6_addr.s6_addr[8], 8); | ||
| 995 | return(0); | ||
| 996 | } | ||
| 997 | |||
| 998 | |||
| 999 | int mau_conv_sin2str(mau_config * cnf, const struct sockaddr_in6 * sin, maustr_t str) | ||
| 1000 | { | ||
| 1001 | assert(cnf != NULL); | ||
| 1002 | getnameinfo((struct sockaddr *)sin, sin->sin6_len, str, sizeof(maustr_t), NULL, 0, NI_NUMERICHOST|NI_NUMERICSERV); | ||
| 1003 | return(0); | ||
| 1004 | } | ||
| 1005 | |||
| 1006 | |||
| 1007 | int mau_conv_str2eui(mau_config * cnf, const maustr_t str, maueui64_t eui) | ||
| 1008 | { | ||
| 1009 | int buff[8]; | ||
| 1010 | size_t slen; | ||
| 1011 | int len; | ||
| 1012 | int i; | ||
| 1013 | struct sockaddr_in6 sin; | ||
| 1014 | |||
| 1015 | assert(cnf != NULL); | ||
| 1016 | assert(str != NULL); | ||
| 1017 | assert(eui != NULL); | ||
| 1018 | |||
| 1019 | if (!(mau_conv_str2sin(cnf, str, &sin))) | ||
| 1020 | { | ||
| 1021 | mau_conv_sin2eui(cnf, &sin, eui); | ||
| 1022 | return(0); | ||
| 1023 | }; | ||
| 1024 | |||
| 1025 | slen = strlen(str); | ||
| 1026 | len = 0; | ||
| 1027 | |||
| 1028 | if (slen == 23) | ||
| 1029 | len = sscanf(str, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5],&buff[6],&buff[7]); | ||
| 1030 | if ((slen == 23) && (len != 8)) | ||
| 1031 | len = sscanf(str, "%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5],&buff[6],&buff[7]); | ||
| 1032 | if ((slen == 19) && (len != 8)) | ||
| 1033 | len = sscanf(str, "%02X%02X.%02X%02X.%02X%02X.%02X%02X", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5],&buff[6],&buff[7]); | ||
| 1034 | if ((slen == 16) && (len != 8)) | ||
| 1035 | len = sscanf(str, "%02X%02X%02X%02X%02X%02X%02X%02X", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5],&buff[6],&buff[7]); | ||
| 1036 | if (len != 8) | ||
| 1037 | return(1); | ||
| 1038 | |||
| 1039 | for(i = 0; i < 8; i++) | ||
| 1040 | eui[i] = (uint8_t) buff[i]; | ||
| 1041 | |||
| 1042 | return(0); | ||
| 1043 | } | ||
| 1044 | |||
| 1045 | |||
| 1046 | int mau_conv_str2mac(mau_config * cnf, const maustr_t str, mauaddr_t addr) | ||
| 1047 | { | ||
| 1048 | maueui64_t eui; | ||
| 1049 | int buff[6]; | ||
| 1050 | size_t slen; | ||
| 1051 | int len; | ||
| 1052 | int i; | ||
| 1053 | |||
| 1054 | assert(str != NULL); | ||
| 1055 | assert(addr != NULL); | ||
| 1056 | |||
| 1057 | if (!(mau_conv_str2eui(cnf, str, eui))) | ||
| 1058 | { | ||
| 1059 | mau_conv_eui2mac(cnf, eui, addr); | ||
| 1060 | return(0); | ||
| 1061 | }; | ||
| 1062 | |||
| 1063 | slen = strlen(str); | ||
| 1064 | len = 0; | ||
| 1065 | |||
| 1066 | if (slen == 17) | ||
| 1067 | len = sscanf(str, "%02x:%02x:%02x:%02x:%02x:%02x", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5]); | ||
| 1068 | if ((slen == 17) && (len != 6)) | ||
| 1069 | len = sscanf(str, "%02x-%02x-%02x-%02x-%02x-%02x", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5]); | ||
| 1070 | if ((slen == 14) && (len != 6)) | ||
| 1071 | len = sscanf(str, "%02X%02X.%02X%02X.%02X%02X", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5]); | ||
| 1072 | if ((slen == 12) && (len != 6)) | ||
| 1073 | len = sscanf(str, "%02X%02X%02X%02X%02X%02X", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5]); | ||
| 1074 | if (len != 6) | ||
| 1075 | { | ||
| 1076 | mau_log_err(cnf, "invalid MAC address\n"); | ||
| 1077 | return(1); | ||
| 1078 | }; | ||
| 1079 | |||
| 1080 | for(i = 0; i < 6; i++) | ||
| 1081 | addr[i] = (uint8_t) buff[i]; | ||
| 1082 | |||
| 1083 | return(0); | ||
| 1084 | } | ||
| 1085 | |||
| 1086 | |||
| 1087 | int mau_conv_str2sin(mau_config * cnf, const maustr_t str, struct sockaddr_in6 * sin) | ||
| 1088 | { | ||
| 1089 | struct addrinfo hints; | ||
| 1090 | struct addrinfo * servinfo; | ||
| 1091 | |||
| 1092 | assert(cnf != NULL); | ||
| 1093 | assert(str != NULL); | ||
| 1094 | assert(sin != NULL); | ||
| 1095 | |||
| 1096 | memset(&hints, 0, sizeof(hints)); | ||
| 1097 | hints.ai_family = AF_INET6; // use AF_UNSPEC, AF_INET, or AF_INET6 | ||
| 1098 | hints.ai_socktype = SOCK_STREAM; | ||
| 1099 | hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE | AI_NUMERICSERV | AI_NUMERICHOST; | ||
| 1100 | if (getaddrinfo(str, NULL, &hints, &servinfo) != 0) | ||
| 1101 | return(1); | ||
| 1102 | |||
| 1103 | memset(sin, 0, sizeof(struct sockaddr_in6)); | ||
| 1104 | sin->sin6_len = sizeof(struct sockaddr_in6); | ||
| 1105 | sin->sin6_family = AF_INET6; | ||
| 1106 | memcpy(sin, servinfo->ai_addr, sizeof(struct sockaddr_in6)); | ||
| 1107 | |||
| 1108 | return(0); | ||
| 1109 | } | ||
| 1110 | |||
| 1111 | |||
| 744 | int mau_getopt(mau_config * cnf, int argc, char * const * argv, | 1112 | int mau_getopt(mau_config * cnf, int argc, char * const * argv, |
| 745 | const char * short_opt, const struct option * long_opt, int * opt_index) | 1113 | const char * short_opt, const struct option * long_opt, int * opt_index) |
| 746 | { | 1114 | { |
| @@ -848,114 +1216,6 @@ void mau_logv(mau_config * cnf, const char * fmt, va_list args) | |||
| 848 | } | 1216 | } |
| 849 | 1217 | ||
| 850 | 1218 | ||
| 851 | int mau_eui2str(mau_config * cnf, const maueui64_t eui, maustr_t str) | ||
| 852 | { | ||
| 853 | switch (cnf->notation | MAU_MASK_CASE) | ||
| 854 | { | ||
| 855 | case MAU_CASE_LOWER: | ||
| 856 | snprintf(str, sizeof(maustr_t), "%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x", eui[0],eui[1],eui[2],eui[3],eui[4],eui[5],eui[6],eui[7]); | ||
| 857 | break; | ||
| 858 | |||
| 859 | case MAU_CASE_UPPER: | ||
| 860 | default: | ||
| 861 | snprintf(str, sizeof(maustr_t), "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X", eui[0],eui[1],eui[2],eui[3],eui[4],eui[5],eui[6],eui[7]); | ||
| 862 | break; | ||
| 863 | } | ||
| 864 | return(0); | ||
| 865 | } | ||
| 866 | |||
| 867 | |||
| 868 | int mau_mac2eui(mau_config * cnf, const mauaddr_t addr, maueui64_t eui) | ||
| 869 | { | ||
| 870 | assert(cnf != NULL); | ||
| 871 | assert(eui != NULL); | ||
| 872 | assert(addr != NULL); | ||
| 873 | |||
| 874 | eui[0] = (addr[0] ^ 0x02); | ||
| 875 | eui[1] = addr[1]; | ||
| 876 | eui[2] = addr[2]; | ||
| 877 | eui[3] = 0xff; | ||
| 878 | eui[4] = 0xfe; | ||
| 879 | eui[5] = addr[3]; | ||
| 880 | eui[6] = addr[4]; | ||
| 881 | eui[7] = addr[5]; | ||
| 882 | |||
| 883 | return(0); | ||
| 884 | } | ||
| 885 | |||
| 886 | |||
| 887 | int mau_mac2str(mau_config * cnf, const mauaddr_t addr, maustr_t str) | ||
| 888 | { | ||
| 889 | switch (cnf->notation | (MAU_MASK_NOTATION & MAU_MASK_CASE)) | ||
| 890 | { | ||
| 891 | case (MAU_NOTATION_COLON | MAU_CASE_LOWER): | ||
| 892 | snprintf(str, sizeof(maustr_t), "%02x:%02x:%02x:%02x:%02x:%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 893 | break; | ||
| 894 | |||
| 895 | case (MAU_NOTATION_COLON | MAU_CASE_UPPER): | ||
| 896 | snprintf(str, sizeof(maustr_t), "%02X:%02X:%02X:%02X:%02X:%02X", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 897 | break; | ||
| 898 | |||
| 899 | case (MAU_NOTATION_DASH | MAU_CASE_LOWER): | ||
| 900 | snprintf(str, sizeof(maustr_t), "%02x-%02x-%02x-%02x-%02x-%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 901 | break; | ||
| 902 | |||
| 903 | case (MAU_NOTATION_DASH | MAU_CASE_UPPER): | ||
| 904 | snprintf(str, sizeof(maustr_t), "%02X-%02X-%02X-%02X-%02X-%02X", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 905 | break; | ||
| 906 | |||
| 907 | case (MAU_NOTATION_DOT | MAU_CASE_LOWER): | ||
| 908 | snprintf(str, sizeof(maustr_t), "%02x%02x.%02x%02x.%02x%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 909 | break; | ||
| 910 | |||
| 911 | case (MAU_NOTATION_DOT | MAU_CASE_UPPER): | ||
| 912 | snprintf(str, sizeof(maustr_t), "%02X%02X.%02X%02X.%02X%02X", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 913 | break; | ||
| 914 | |||
| 915 | case (MAU_NOTATION_RAW | MAU_CASE_LOWER): | ||
| 916 | snprintf(str, sizeof(maustr_t), "%02x%02x%02x%02x%02x%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 917 | break; | ||
| 918 | |||
| 919 | case (MAU_NOTATION_RAW | MAU_CASE_UPPER): | ||
| 920 | snprintf(str, sizeof(maustr_t), "%02X%02X%02X%02X%02X%02X", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 921 | break; | ||
| 922 | |||
| 923 | default: | ||
| 924 | snprintf(str, sizeof(maustr_t), "%02x:%02x:%02x:%02x:%02x:%02x", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); | ||
| 925 | }; | ||
| 926 | return(0); | ||
| 927 | } | ||
| 928 | |||
| 929 | |||
| 930 | int mau_str2mac(mau_config * cnf, const maustr_t str, mauaddr_t addr) | ||
| 931 | { | ||
| 932 | int buff[6]; | ||
| 933 | int len; | ||
| 934 | int i; | ||
| 935 | |||
| 936 | assert(str != NULL); | ||
| 937 | assert(addr != NULL); | ||
| 938 | |||
| 939 | len = sscanf(str, "%02x:%02x:%02x:%02x:%02x:%02x", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5]); | ||
| 940 | if (len != 6) | ||
| 941 | len = sscanf(str, "%02x-%02x-%02x-%02x-%02x-%02x", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5]); | ||
| 942 | if (len != 6) | ||
| 943 | len = sscanf(str, "%02X%02X.%02X%02X.%02X%02X", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5]); | ||
| 944 | if (len != 6) | ||
| 945 | len = sscanf(str, "%02X%02X%02X%02X%02X%02X", &buff[0],&buff[1],&buff[2],&buff[3],&buff[4],&buff[5]); | ||
| 946 | if (len != 6) | ||
| 947 | { | ||
| 948 | mau_log_err(cnf, "invalid MAC address\n"); | ||
| 949 | return(1); | ||
| 950 | }; | ||
| 951 | |||
| 952 | for(i = 0; i < 6; i++) | ||
| 953 | addr[i] = (uint8_t) buff[i]; | ||
| 954 | |||
| 955 | return(0); | ||
| 956 | } | ||
| 957 | |||
| 958 | |||
| 959 | /// displays usage information | 1219 | /// displays usage information |
| 960 | void mau_usage(mau_config * cnf) | 1220 | void mau_usage(mau_config * cnf) |
| 961 | { | 1221 | { |
