# #
#############################################################################*/
+#include <arpa/inet.h>
#include <getopt.h>
+#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#include "logging.h"
+static int parse_address(const char* string, struct in6_addr* address6) {
+ // Try parsing this address
+ int r = inet_pton(AF_INET6, string, address6);
+
+ // Success!
+ if (r == 1)
+ return 0;
+
+ // Try parsing this as an IPv4 address
+ struct in_addr address4;
+ r = inet_pton(AF_INET, string, &address4);
+ if (r == 1) {
+ // Convert to IPv6-mapped address
+ address6->s6_addr32[0] = htonl(0x0000);
+ address6->s6_addr32[1] = htonl(0x0000);
+ address6->s6_addr32[2] = htonl(0xffff);
+ address6->s6_addr32[3] = address4.s_addr;
+
+ return 0;
+ }
+
+ // Could not parse this
+ return 1;
+}
+
static int parse_argv(int argc, char* argv[], struct fireperf_config* conf) {
static struct option long_options[] = {
{"client", required_argument, 0, 'c'},
case 'c':
conf->mode = FIREPERF_MODE_CLIENT;
+
+ // Parse the given IP address
+ int r = parse_address(optarg, &conf->address);
+ if (r) {
+ fprintf(stderr, "Could not parse IP address %s\n", optarg);
+ return 2;
+ }
break;
case 'd':