diff --git a/TAP.c b/TAP.c index 6dbd37b..50fdbc4 100644 --- a/TAP.c +++ b/TAP.c @@ -14,6 +14,7 @@ extern int device_type; extern char if_name[IFNAMSIZ]; extern char* ipv4_addr; extern char* ipv6_addr; +extern long ipv6_prefixLen; extern char* netmask; extern void cleanup(); @@ -259,23 +260,6 @@ int open_tap(void) { exit(1); } - char* ipPart = strtok(ipv6_addr, "/"); - char* prefixPart_s = strtok(NULL, "/"); - printf("ip part: %s\n", ipPart); - - if(!prefixPart_s) - { - printf("No prefix length was provided\n"); // TODO: Move logic into arg parsing - close(inet6); - cleanup(); - exit(1); - } - printf("prefix part: %s\n", prefixPart_s); - - long prefixLen_l = strtol(prefixPart_s, NULL, 10); // TODO: Add handling here for errors (using errno) - - - // Convert ASCII IPv6 address to ABI structure struct in6_addr six_addr_itself; memset(&six_addr_itself, 0, sizeof(struct in6_addr)); @@ -288,7 +272,7 @@ int open_tap(void) { } // Add user's requested address - trySixSet(ifr.ifr_ifindex, six_addr_itself, prefixLen_l); + trySixSet(ifr.ifr_ifindex, six_addr_itself, ipv6_prefixLen); close(inet6); } diff --git a/tncattach.c b/tncattach.c index da3cdfa..6aa12f1 100644 --- a/tncattach.c +++ b/tncattach.c @@ -41,6 +41,7 @@ char* ipv4_addr; char* netmask; char* ipv6_addr; +long ipv6_prefixLen; char* tcp_host; int tcp_port; @@ -488,13 +489,32 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) { perror("Sorry, but you had noipv6 set yet want to use ipv6?\n"); exit(EXIT_FAILURE); } - arguments->ipv6 = arg; + + char* ipPart_s = strtok(arg, "/"); + char* prefixPart_s = strtok(NULL, "/"); + printf("ipPart_s: %s\n", ipPart_s); + + if(!prefixPart_s) + { + printf("No prefix length was provided\n"); + exit(1); + } + printf("prefixPart_s: %s\n", prefixPart_s); + + long prefixLen_l = strtol(prefixPart_s, NULL, 10); // TODO: Add handling here for errors (using errno) + + + arguments->ipv6 = ipPart_s; + arguments->set_ipv6 = true; - // Save to the global for other modules to access it + // Copy across global IPv6 address ipv6_addr = malloc(strlen(arguments->ipv6)+1); strcpy(ipv6_addr, arguments->ipv6); + // Set global IPv6 prefix length + ipv6_prefixLen = prefixLen_l; + printf("MTU was %d, setting to minimum of %d as is required for IPv6\n", arguments->mtu, 1280); arguments->mtu = 1280; break;