aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
authorDavid M. Syzdek <syzdek@bindlebinaries.com>2013-12-05 13:28:22 -0900
committerDavid M. Syzdek <syzdek@bindlebinaries.com>2013-12-05 13:28:22 -0900
commit29f4a768305f859e2d5ef141e4c639956d628bca (patch)
treec38ba537714e1fce3646be4071cf3e7345a215c6 /src
parent4687accf07b1bdb9392b1cb384fe656928b8a6c5 (diff)
downloaddmstools-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')
-rw-r--r--src/macaddrinfo.c540
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
212int main(int argc, char * argv[]); 212int main(int argc, char * argv[]);
213 213
214 214
215int mau_cmd_format(mau_config * cnf, int argc, char * argv[]); 215int mau_cmd_eui64(mau_config * cnf, int argc, char * argv[]);
216 216
217// generate command 217// generate command
218int mau_cmd_generate(mau_config * cnf, int argc, char * argv[]); 218int mau_cmd_generate(mau_config * cnf, int argc, char * argv[]);
@@ -222,9 +222,23 @@ void mau_cmd_generate_usage(void);
222 222
223int mau_cmd_info(mau_config * cnf, int argc, char * argv[]); 223int mau_cmd_info(mau_config * cnf, int argc, char * argv[]);
224 224
225int mau_cmd_link_local(mau_config * cnf, int argc, char * argv[]);
226
227int mau_cmd_macaddress(mau_config * cnf, int argc, char * argv[]);
228
225int mau_cmd_test(mau_config * cnf, int argc, char * argv[]); 229int mau_cmd_test(mau_config * cnf, int argc, char * argv[]);
226void mau_cmd_update_usage(void); 230void mau_cmd_update_usage(void);
227 231
232int mau_conv_eui2sin(mau_config * cnf, const maueui64_t eui, struct sockaddr_in6 * sin);
233int mau_conv_eui2str(mau_config * cnf, const maueui64_t eui, maustr_t str);
234int mau_conv_mac2eui(mau_config * cnf, const mauaddr_t addr, maueui64_t eui);
235int mau_conv_mac2str(mau_config * cnf, const mauaddr_t addr, maustr_t str);
236int mau_conv_eui2mac(mau_config * cnf, const maueui64_t eui, mauaddr_t addr);
237int mau_conv_sin2str(mau_config * cnf, const struct sockaddr_in6 * sin, maustr_t str);
238int mau_conv_str2mac(mau_config * cnf, const maustr_t str, mauaddr_t addr);
239int mau_conv_str2sin(mau_config * cnf, const maustr_t str, struct sockaddr_in6 * sin);
240
241
228int mau_getopt(mau_config * cnf, int argc, char * const * argv, 242int 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
240void mau_logv(mau_config * cnf, const char * fmt, va_list args); 254void mau_logv(mau_config * cnf, const char * fmt, va_list args);
241 255
242int mau_eui2str(mau_config * cnf, const maueui64_t eui, maustr_t str);
243int mau_mac2eui(mau_config * cnf, const mauaddr_t addr, maueui64_t eui);
244int mau_mac2str(mau_config * cnf, const mauaddr_t addr, maustr_t str);
245int mau_eui2mac(mau_config * cnf, const maueui64_t eui, mauaddr_t addr);
246int mau_str2mac(mau_config * cnf, const maustr_t str, mauaddr_t addr);
247
248//displays usage information 256//displays usage information
249void mau_usage(mau_config * cnf); 257void 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
409int mau_cmd_format(mau_config * cnf, int argc, char * argv[]) 431int 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
686int 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
751int 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
886int 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
899int 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
912int 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
929int 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
948int 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
991int 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
999int 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
1007int 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
1046int 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
1087int 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
744int mau_getopt(mau_config * cnf, int argc, char * const * argv, 1112int 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
851int 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
868int 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
887int 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
930int 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
960void mau_usage(mau_config * cnf) 1220void mau_usage(mau_config * cnf)
961{ 1221{