@@ -524,6 +524,9 @@ static void usage(const char *argv0)
524
524
printf (
525
525
"--cidr=CIDR specify network address CIDR (default=%s)\n" ,
526
526
DEFAULT_CIDR );
527
+ printf (
528
+ "--cidr6=CIDR specify network address CIDR (default=%s)\n" ,
529
+ DEFAULT_CIDR6 );
527
530
printf ("--disable-host-loopback prohibit connecting to 127.0.0.1:* on the "
528
531
"host namespace\n" );
529
532
/* v0.4.0 */
@@ -611,6 +614,10 @@ static void options_destroy(struct options *options)
611
614
free (options -> cidr );
612
615
options -> cidr = NULL ;
613
616
}
617
+ if (options -> cidr6 != NULL ) {
618
+ free (options -> cidr6 );
619
+ options -> cidr6 = NULL ;
620
+ }
614
621
if (options -> api_socket != NULL ) {
615
622
free (options -> api_socket );
616
623
options -> api_socket = NULL ;
@@ -649,13 +656,15 @@ static void parse_args(int argc, char *const argv[], struct options *options)
649
656
int opt ;
650
657
char * strtol_e = NULL ;
651
658
char * optarg_cidr = NULL ;
659
+ char * optarg_cidr6 = NULL ;
652
660
char * optarg_netns_type = NULL ;
653
661
char * optarg_userns_path = NULL ;
654
662
char * optarg_api_socket = NULL ;
655
663
char * optarg_outbound_addr = NULL ;
656
664
char * optarg_outbound_addr6 = NULL ;
657
665
char * optarg_macaddress = NULL ;
658
- #define CIDR -42
666
+ #define CIDR -41
667
+ #define CIDR6 -42
659
668
#define DISABLE_HOST_LOOPBACK -43
660
669
#define NETNS_TYPE -44
661
670
#define USERNS_PATH -45
@@ -675,6 +684,7 @@ static void parse_args(int argc, char *const argv[], struct options *options)
675
684
{ "ready-fd" , required_argument , NULL , 'r' },
676
685
{ "mtu" , required_argument , NULL , 'm' },
677
686
{ "cidr" , required_argument , NULL , CIDR },
687
+ { "cidr6" , required_argument , NULL , CIDR6 },
678
688
{ "disable-host-loopback" , no_argument , NULL , DISABLE_HOST_LOOPBACK },
679
689
{ "no-host-loopback" , no_argument , NULL , _DEPRECATED_NO_HOST_LOOPBACK },
680
690
{ "netns-type" , required_argument , NULL , NETNS_TYPE },
@@ -728,6 +738,9 @@ static void parse_args(int argc, char *const argv[], struct options *options)
728
738
case CIDR :
729
739
optarg_cidr = optarg ;
730
740
break ;
741
+ case CIDR6 :
742
+ optarg_cidr6 = optarg ;
743
+ break ;
731
744
case _DEPRECATED_NO_HOST_LOOPBACK :
732
745
// There was no tagged release with support for --no-host-loopback.
733
746
// So no one will be affected by removal of --no-host-loopback.
@@ -800,6 +813,9 @@ static void parse_args(int argc, char *const argv[], struct options *options)
800
813
if (optarg_cidr != NULL ) {
801
814
options -> cidr = strdup (optarg_cidr );
802
815
}
816
+ if (optarg_cidr6 != NULL ) {
817
+ options -> cidr6 = strdup (optarg_cidr6 );
818
+ }
803
819
if (optarg_netns_type != NULL ) {
804
820
options -> netns_type = strdup (optarg_netns_type );
805
821
}
@@ -825,6 +841,7 @@ static void parse_args(int argc, char *const argv[], struct options *options)
825
841
}
826
842
}
827
843
#undef CIDR
844
+ #undef CIDR6
828
845
#undef DISABLE_HOST_LOOPBACK
829
846
#undef NETNS_TYPE
830
847
#undef USERNS_PATH
@@ -940,10 +957,12 @@ static int parse_cidr6(struct in6_addr *network, struct in6_addr *netmask,
940
957
{
941
958
int rc = 0 ;
942
959
regex_t r ;
943
- regmatch_t matches [4 ];
960
+ regmatch_t matches [5 ];
944
961
size_t nmatch = sizeof (matches ) / sizeof (matches [0 ]);
945
- const char * cidr_regex = "^(([a-fA-F0-9]{1,4}):){1,4}:/([0-9]{1,3})" ;
946
- char snetwork [INET6_ADDRSTRLEN ], sprefix [INET6_ADDRSTRLEN ];
962
+ const char * cidr_regex = "^((([a-fA-F0-9]{1,4}):){1,4}):/([0-9]{1,3})" ;
963
+ char snetwork [INET6_ADDRSTRLEN ],
964
+ snetwork_end [INET6_ADDRSTRLEN ],
965
+ sprefix [INET6_ADDRSTRLEN ];
947
966
int prefix ;
948
967
const char * random ;
949
968
rc = regcomp (& r , cidr_regex , REG_EXTENDED );
@@ -963,19 +982,28 @@ static int parse_cidr6(struct in6_addr *network, struct in6_addr *netmask,
963
982
fprintf (stderr , "invalid CIDR: %s\n" , cidr );
964
983
goto finish ;
965
984
}
966
- rc = from_regmatch (sprefix , sizeof (sprefix ), matches [3 ], cidr );
985
+ rc = from_regmatch (snetwork_end , sizeof (snetwork_end ), matches [2 ], cidr );
967
986
if (rc < 0 ) {
968
987
fprintf (stderr , "invalid CIDR: %s\n" , cidr );
969
988
goto finish ;
970
989
}
971
- random = pseudo_random_global_id (NULL );
972
- if (random == NULL ) {
973
- fprintf (stderr , "cannot create pseudo random global id\n" );
974
- rc = -1 ;
990
+ rc = from_regmatch (sprefix , sizeof (sprefix ), matches [4 ], cidr );
991
+ if (rc < 0 ) {
992
+ fprintf (stderr , "invalid CIDR: %s\n" , cidr );
975
993
goto finish ;
976
994
}
977
- strcpy (snetwork , random );
978
- strcat (snetwork , "0" );
995
+ if (strcmp (snetwork , snetwork_end ) == 0 ) {
996
+ random = pseudo_random_global_id (NULL );
997
+ if (random == NULL ) {
998
+ fprintf (stderr , "cannot create pseudo random global id\n" );
999
+ rc = -1 ;
1000
+ goto finish ;
1001
+ }
1002
+ strcpy (snetwork , random );
1003
+ strcat (snetwork , "0" );
1004
+ } else {
1005
+ strcat (snetwork , ":0" );
1006
+ }
979
1007
980
1008
if (inet_pton (AF_INET6 , snetwork , network ) != 1 ) {
981
1009
fprintf (stderr , "invalid network address: %s\n" , snetwork );
0 commit comments