diff --git a/conf.c b/conf.c index 3211daef..c6280bdf 100644 --- a/conf.c +++ b/conf.c @@ -599,10 +599,13 @@ int conf_ifaddr_dhcp(FILE *output, char *ifname, int flags) void conf_vnetid(FILE *output, int ifs, char *ifname) { - int vnetid; + int64_t vnetid; if (((vnetid = get_vnetid(ifs, ifname)) != 0)) - fprintf(output, " vnetid %i\n", vnetid); + if (vnetid < 0) + fprintf(output, " vnetid any\n", vnetid); + else + fprintf(output, " vnetid %lld\n", vnetid); } void conf_patch(FILE *output, int ifs, char *ifname) diff --git a/externs.h b/externs.h index 77918e34..ca8b7b93 100644 --- a/externs.h +++ b/externs.h @@ -448,7 +448,7 @@ int inttunnel(char *, int, int, char **); int intvnetid(char *, int, int, char **); int get_physrtable(int, char *); int get_physttl(int, char *); -int get_vnetid(int, char *); +int64_t get_vnetid(int, char *); /* media.c */ #define DEFAULT_MEDIA_TYPE "autoselect" diff --git a/tunnel.c b/tunnel.c index f668ad39..72878a89 100644 --- a/tunnel.c +++ b/tunnel.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -245,24 +246,27 @@ void setvnetid(int ifs, char *ifname, char *vnetida) { const char *errmsg = NULL; - int vnetid; + int64_t vnetid; struct ifreq ifr; if (vnetida == NULL) return; - /* vxlan 2^24 is the upper limit user of vnetid as of OpenBSD 6.0 */ - vnetid = strtonum(vnetida, 0, 0xffffff, &errmsg); - if (errmsg) { - printf("%% vnetid %s out of range for %s: %s\n", vnetida, - ifname, errmsg); - return; + if (isprefix("any", vnetida)) { + vnetid = -1; + } else { + vnetid = strtonum(vnetida, 0, INT64_MAX, &errmsg); + if (errmsg) { + printf("%% vnetid %s out of range: %s\n", vnetida, + errmsg); + return; + } } strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); ifr.ifr_vnetid = vnetid; if (ioctl(ifs, SIOCSVNETID, (caddr_t)&ifr) < 0) { if (errno == EINVAL) { - printf("%% vnetid %d out of range for %s\n", + printf("%% vnetid %lld out of range for %s\n", vnetid, ifname); } else { printf("%% setvnetid SIOCSVNETID: %s\n", @@ -321,7 +325,7 @@ int get_physttl(int s, char *ifname) return ifr.ifr_ttl; } -int get_vnetid(int s, char *ifname) +int64_t get_vnetid(int s, char *ifname) { struct ifreq ifr;