From 05bc0ae6ad2cdcfa36711bd78adbd82aa53cc2d0 Mon Sep 17 00:00:00 2001 From: Tristan Brice Velloza Kildaire Date: Sun, 15 Dec 2024 18:34:19 +0200 Subject: [PATCH] tncattach - Now parse IPv6 address and prefix in opt-args TAP - Removed parsing from here --- TAP.c | 20 ++------------------ tncattach.c | 24 ++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 20 deletions(-) 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;