[IPv6 IRC-DEV] IP en formato base 64 en el IRCU de Undernet
Brought to you by:
zolty
From: <zo...@te...> - 2003-02-01 08:35:40
|
Como todos sabemos, en el comando NICK de servidor en protocolo P10 se incluye la IP en formato base64, bien, hay un problema que es lo siguiente y habr=EDa que pensar en como resolverlo ya que de todas las implementaciones existentes de IPv6 no hay ninguna en el ircu de undernet o en cualquiera de sus variantes como el ircd universal de Carlo Wood. La IP en formato base64 es un valor de 6 caracteres si se trata de una ip IPv4 (32 bits), pero para IPv6 (128 bits) hace falta 22 caracteres para garantizar la reversibilidad. Esto es muy necesario para las IPS virtuales que se calculan a partir de la ip num=E9rica, clones a la IP, glines a la IP, respuesta del USERIP, etc.. (OJO no es lo mismo el hostname que la IP). Se podr=EDa hacer que un nodo mande 22 caracteres si el usuario est=E1 = por una conexi=F3n de IPv6 y 6 en el resto. Y un nodo, aunque sea solo IPv4, ha de poderse parsear y guardar. Actualmente, el ircd manda con lo siguiente...=20 inttobase64(ip_base64, ntohl(sptr->ip.s_addr), 6) El nthol es para pasar a formato base2, o sea si mi ip es 80.59.255.83, seria 1010011111111111110111010000 y el inttobase64 es para pasar a base64 para hacerlo mas corto, en solo 6 caracteres en vez de 32. Y cuando recibe, hace lo siguiente=20 sptr->ip.s_addr =3D htonl(base64toint(parv[parc - 3])); El parv[parc - 3] se refiere a capturar el 3 par=E1metro a partir de la derecha, que en P10 es la ip en formato base64. Hab=E9is visto que la info esta en sptr->ip, siendo sptr un struct = Client, ahora mismo lo tengo en... #ifdef INET6 struct in6_addr ip; #else struct in_addr ip; #endif Para resolver el problema del IP-Base64, la soluci=F3n que meti no es la m=E1s adecuada, porque un nodo IPv4 ha de poder almacenar IPv6 de = usuarios remotos e viceversa. La mas adecuada seria lo siguiente... Definir un nuevo struct, llamado "irc_inaddr" (se usa en el hybrid de EFNet) para sustituir a struct "in_addr" y que estar=EDa definido de la siguiente forma: struct irc_inaddr =20 { union { struct in_addr sin; =20 #ifdef INET6 struct in6_addr sin6;=20 #else unsigned long ip6; =F3 char *ip6; =20 #endif } sins; }; El "if def" esta pensado para que los nodos que no compilan con INET6, que habr=E1 nodos con sistema operativo tan viejo que no tendr=E1 ni librer=EDas de IPv6 como el sunos de gaia, puedan tener algo para almacenar el valor. Dudo en un "unsigned long" o un "char *". =BFCual seria la mejor soluci=F3n? =BFComentarios? =BFOpiniones? Un saludo zoltan =20 |