diff --git a/configure.ac b/configure.ac index c695958..0e61729 100644 --- a/configure.ac +++ b/configure.ac @@ -131,6 +131,15 @@ AC_EGREP_HEADER(struct iphdr, netinet/ip.h, AC_DEFINE([HAVE_IPHDR])], AC_MSG_RESULT(no)) +# Address generation modes (enum) implemented in linux 3.17 (bc91b0f07ada5535427373a4e2050877bcc12218) +# /proc/sys/net/ipv6/conf/${iface}/addr_gen_mode was added in linux 4.11 (d35a00b8e33dab7385f724e713ae71c8be0a49f4) +AC_MSG_CHECKING(whether enum in6_addr_gen_mode.IN6_ADDR_GEN_MODE_NONE exists) +AH_TEMPLATE(HAVE_IN6_ADDR_GEN_MODE_NONE) +AC_EGREP_HEADER(IN6_ADDR_GEN_MODE_NONE, linux/if_link.h, +[AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_IN6_ADDR_GEN_MODE_NONE])], + AC_MSG_RESULT(no)) + # Checks for library functions. AC_PROG_GCC_TRADITIONAL # AC_FUNC_MALLOC diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c index c28df52..ea52da6 100644 --- a/sgsnemu/sgsnemu.c +++ b/sgsnemu/sgsnemu.c @@ -15,6 +15,8 @@ * */ +#include "config.h" + #ifdef __linux__ #define _GNU_SOURCE 1 /* strdup() prototype, broken arpa/inet.h */ #endif @@ -47,10 +49,11 @@ #include #if defined(__linux__) +#if defined(HAVE_IN6_ADDR_GEN_MODE_NONE) #include +#endif // HAVE_IN6_ADDR_GEN_MODE_NONE #endif -#include "config.h" #include "../lib/tun.h" #include "../lib/ippool.h" #include "../lib/syserr.h" @@ -1702,13 +1705,16 @@ int main(int argc, char **argv) exit(1); } -#if defined(__linux__) - /* Avoid tunnel setting its own link-local addr automatically, we don't need it. */ +#if defined(__linux__) && defined(HAVE_IN6_ADDR_GEN_MODE_NONE) + /* Avoid tunnel setting its own link-local addr automatically, + we don't need it. Don't exit on error since this sysctl is + only available starting with linux 4.11. */ snprintf(buf, sizeof(buf), "%u", IN6_ADDR_GEN_MODE_NONE); if (proc_ipv6_conf_write(options.tun_dev_name, "addr_gen_mode", buf) < 0) { SYS_ERR(DSGSN, LOGL_ERROR, errno, - "Failed to disable addr_gen_mode on %s\n", options.tun_dev_name); - exit(1); + "Failed to disable addr_gen_mode on %s, an extra link-local " + "ip address will appear on the tun device.\n", + options.tun_dev_name); } #endif