Răsfoiți Sursa

Support IPv6 subnets in parent extip

z3apa3a 4 ani în urmă
părinte
comite
5861de176e
4 a modificat fișierele cu 31 adăugiri și 8 ștergeri
  1. 18 0
      src/auth.c
  2. 3 3
      src/common.c
  3. 8 4
      src/conf.c
  4. 2 1
      src/structures.h

+ 18 - 0
src/auth.c

@@ -253,6 +253,24 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
 			if(cur->type == R_EXTIP){
 			if(cur->type == R_EXTIP){
 				param->sinsl = cur->addr;
 				param->sinsl = cur->addr;
 				if(SAISNULL(&param->sinsl))param->sinsl = param->sincr;
 				if(SAISNULL(&param->sinsl))param->sinsl = param->sincr;
+#ifndef NOIPV6
+				else if(cur->cidr && *SAFAMILY(&param->sinsl) == AF_INET6){
+					char c;
+					int i;
+
+					for(i = 0; i < 16; i++){
+						if(i%8)myrand(&param->sincr, sizeof(param->sincr));
+						else if(i%4) myrand(&param->req, sizeof(param->req));
+
+						if(i*8 >= cur->cidr) ((char *)SAADDR(&param->sinsl))[i] = rand();
+						else if ((i+1)*8 >  cur->cidr){
+							c = rand();
+							c >>= (cur->cidr - (i*8));
+							((char *)SAADDR(&param->sinsl))[i] |= c;
+						}
+					}
+				}
+#endif
 				if(cur->next)continue;
 				if(cur->next)continue;
 				return 0;
 				return 0;
 			}
 			}

+ 3 - 3
src/common.c

@@ -141,13 +141,13 @@ char* NULLADDR="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
 
 
 int myrand(void * entropy, int len){
 int myrand(void * entropy, int len){
 	int i;
 	int i;
-	unsigned short init;
+	uint16_t init;
 
 
 	init = randomizer;
 	init = randomizer;
 	for(i=0; i < len/2; i++){
 	for(i=0; i < len/2; i++){
-		init ^= ((unsigned short *)entropy)[i];
+		init ^= ((uint16_t *)entropy)[i];
 	}
 	}
-	srand(init);
+	srand(rand()+init);
 	randomizer = rand();
 	randomizer = rand();
 	return rand();
 	return rand();
 	
 	

+ 8 - 4
src/conf.c

@@ -608,6 +608,7 @@ static int h_monitor(int argc, char **argv){
 static int h_parent(int argc, char **argv){
 static int h_parent(int argc, char **argv){
   struct ace *acl = NULL;
   struct ace *acl = NULL;
   struct chain *chains;
   struct chain *chains;
+  char * cidr;
 
 
 	acl = conf.acl;
 	acl = conf.acl;
 	while(acl && acl->next) acl = acl->next;
 	while(acl && acl->next) acl = acl->next;
@@ -646,13 +647,16 @@ static int h_parent(int argc, char **argv){
 		fprintf(stderr, "Chaining error: bad chain type (%s)\n", argv[2]);
 		fprintf(stderr, "Chaining error: bad chain type (%s)\n", argv[2]);
 		return(4);
 		return(4);
 	}
 	}
-#ifndef NOIPV6
-	if(!getip46(46, argv[3], (struct sockaddr *)&chains->addr)) return 5;
-#else
+	cidr = strchr(argv[3], '/');
+	if(cidr) *cidr = 0;
 	getip46(46, argv[3], (struct sockaddr *)&chains->addr);
 	getip46(46, argv[3], (struct sockaddr *)&chains->addr);
-#endif
 	chains->exthost = mystrdup((char *)argv[3]);
 	chains->exthost = mystrdup((char *)argv[3]);
+	chains->exthost = (unsigned char *)mystrdup((char *)argv[3]);
 	if(!chains->exthost) return 21;
 	if(!chains->exthost) return 21;
+	if(cidr){
+		*cidr = '/';
+		chains->cidr = atoi(cidr + 1);
+	}
 	*SAPORT(&chains->addr) = htons((unsigned short)atoi((char *)argv[4]));
 	*SAPORT(&chains->addr) = htons((unsigned short)atoi((char *)argv[4]));
 	if(argc > 5) chains->extuser = mystrdup((char *)argv[5]);
 	if(argc > 5) chains->extuser = mystrdup((char *)argv[5]);
 	if(argc > 6) chains->extpass = mystrdup((char *)argv[6]);
 	if(argc > 6) chains->extpass = mystrdup((char *)argv[6]);

+ 2 - 1
src/structures.h

@@ -294,10 +294,11 @@ struct chain {
 #else
 #else
 	struct sockaddr_in addr;
 	struct sockaddr_in addr;
 #endif
 #endif
-	unsigned short weight;
 	char * exthost;
 	char * exthost;
 	char * extuser;
 	char * extuser;
 	char * extpass;
 	char * extpass;
+	unsigned short weight;
+	unsigned short cidr;
 };
 };
 
 
 struct period {
 struct period {