Clarify semantics of c->v4 and c->v6 variables
The v4 and v6 fields of the context structure can be confusing, because they change meaning part way through the code: Before conf_ip(), they are booleans which indicate whether the -4 or -6 options have been given. After conf_ip() they are DISABLED|ENABLED|PROBE enums which indicate whether the IP version is available (which means both that it was allowed on the command line and we were able to configure it). The PROBE variant of the enum is only used locally within conf_ip() and since recent changes there it no longer has a real purpose different from ENABLED. Simplify this all by making the context fields always just a boolean indicating the availability of the IP version. They both default to 1, but can be set to 0 by either command line options or configuration failures. We use some local variables in conf() for tracking the state of the command line options on their own. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> [sbrivio: Minor coding style fix in conf.c] Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
4bc883aeab
commit
c984ee5afd
2 changed files with 20 additions and 45 deletions
59
conf.c
59
conf.c
|
@ -26,6 +26,7 @@
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
@ -615,40 +616,25 @@ static int conf_ns_opt(struct ctx *c,
|
||||||
*/
|
*/
|
||||||
static void conf_ip(struct ctx *c)
|
static void conf_ip(struct ctx *c)
|
||||||
{
|
{
|
||||||
int v4, v6;
|
|
||||||
|
|
||||||
if (c->v4) {
|
if (c->v4) {
|
||||||
c->v4 = IP_VERSION_ENABLED;
|
|
||||||
v4 = IP_VERSION_PROBE;
|
|
||||||
v6 = c->v6 = IP_VERSION_DISABLED;
|
|
||||||
} else if (c->v6) {
|
|
||||||
c->v6 = IP_VERSION_ENABLED;
|
|
||||||
v6 = IP_VERSION_PROBE;
|
|
||||||
v4 = c->v4 = IP_VERSION_DISABLED;
|
|
||||||
} else {
|
|
||||||
c->v4 = c->v6 = IP_VERSION_ENABLED;
|
|
||||||
v4 = v6 = IP_VERSION_PROBE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (v4 != IP_VERSION_DISABLED) {
|
|
||||||
if (!c->ifi4)
|
if (!c->ifi4)
|
||||||
c->ifi4 = nl_get_ext_if(AF_INET);
|
c->ifi4 = nl_get_ext_if(AF_INET);
|
||||||
if (!c->ifi4) {
|
if (!c->ifi4) {
|
||||||
warn("No external routable interface for IPv4");
|
warn("No external routable interface for IPv4");
|
||||||
v4 = IP_VERSION_DISABLED;
|
c->v4 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v6 != IP_VERSION_DISABLED) {
|
if (c->v6) {
|
||||||
if (!c->ifi6)
|
if (!c->ifi6)
|
||||||
c->ifi6 = nl_get_ext_if(AF_INET6);
|
c->ifi6 = nl_get_ext_if(AF_INET6);
|
||||||
if (!c->ifi6) {
|
if (!c->ifi6) {
|
||||||
warn("No external routable interface for IPv6");
|
warn("No external routable interface for IPv6");
|
||||||
v6 = IP_VERSION_DISABLED;
|
c->v6 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v4 != IP_VERSION_DISABLED) {
|
if (c->v4) {
|
||||||
if (!c->gw4)
|
if (!c->gw4)
|
||||||
nl_route(0, c->ifi4, AF_INET, &c->gw4);
|
nl_route(0, c->ifi4, AF_INET, &c->gw4);
|
||||||
|
|
||||||
|
@ -676,7 +662,7 @@ static void conf_ip(struct ctx *c)
|
||||||
nl_link(0, c->ifi4, c->mac, 0, 0);
|
nl_link(0, c->ifi4, c->mac, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v6 != IP_VERSION_DISABLED) {
|
if (c->v6) {
|
||||||
int prefix_len = 0;
|
int prefix_len = 0;
|
||||||
|
|
||||||
if (IN6_IS_ADDR_UNSPECIFIED(&c->gw6))
|
if (IN6_IS_ADDR_UNSPECIFIED(&c->gw6))
|
||||||
|
@ -694,25 +680,18 @@ static void conf_ip(struct ctx *c)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!c->gw4 || !c->addr4 || MAC_IS_ZERO(c->mac))
|
if (!c->gw4 || !c->addr4 || MAC_IS_ZERO(c->mac))
|
||||||
v4 = IP_VERSION_DISABLED;
|
c->v4 = 0;
|
||||||
else
|
|
||||||
v4 = IP_VERSION_ENABLED;
|
|
||||||
|
|
||||||
if (IN6_IS_ADDR_UNSPECIFIED(&c->gw6) ||
|
if (IN6_IS_ADDR_UNSPECIFIED(&c->gw6) ||
|
||||||
IN6_IS_ADDR_UNSPECIFIED(&c->addr6) ||
|
IN6_IS_ADDR_UNSPECIFIED(&c->addr6) ||
|
||||||
IN6_IS_ADDR_UNSPECIFIED(&c->addr6_ll) ||
|
IN6_IS_ADDR_UNSPECIFIED(&c->addr6_ll) ||
|
||||||
MAC_IS_ZERO(c->mac))
|
MAC_IS_ZERO(c->mac))
|
||||||
v6 = IP_VERSION_DISABLED;
|
c->v6 = 0;
|
||||||
else
|
|
||||||
v6 = IP_VERSION_ENABLED;
|
|
||||||
|
|
||||||
if ((v4 == IP_VERSION_DISABLED) && (v6 == IP_VERSION_DISABLED)) {
|
if (!c->v4 && !c->v6) {
|
||||||
err("External interface not usable");
|
err("External interface not usable");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
c->v4 = v4;
|
|
||||||
c->v6 = v6;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1054,8 +1033,8 @@ void conf(struct ctx *c, int argc, char **argv)
|
||||||
{"no-ndp", no_argument, &c->no_ndp, 1 },
|
{"no-ndp", no_argument, &c->no_ndp, 1 },
|
||||||
{"no-ra", no_argument, &c->no_ra, 1 },
|
{"no-ra", no_argument, &c->no_ra, 1 },
|
||||||
{"no-map-gw", no_argument, &c->no_map_gw, 1 },
|
{"no-map-gw", no_argument, &c->no_map_gw, 1 },
|
||||||
{"ipv4-only", no_argument, &c->v4, '4' },
|
{"ipv4-only", no_argument, NULL, '4' },
|
||||||
{"ipv6-only", no_argument, &c->v6, '6' },
|
{"ipv6-only", no_argument, NULL, '6' },
|
||||||
{"tcp-ports", required_argument, NULL, 't' },
|
{"tcp-ports", required_argument, NULL, 't' },
|
||||||
{"udp-ports", required_argument, NULL, 'u' },
|
{"udp-ports", required_argument, NULL, 'u' },
|
||||||
{"tcp-ns", required_argument, NULL, 'T' },
|
{"tcp-ns", required_argument, NULL, 'T' },
|
||||||
|
@ -1079,6 +1058,7 @@ void conf(struct ctx *c, int argc, char **argv)
|
||||||
char nsdir[PATH_MAX] = { 0 }, userns[PATH_MAX] = { 0 };
|
char nsdir[PATH_MAX] = { 0 }, userns[PATH_MAX] = { 0 };
|
||||||
enum conf_port_type tcp_tap = 0, tcp_init = 0;
|
enum conf_port_type tcp_tap = 0, tcp_init = 0;
|
||||||
enum conf_port_type udp_tap = 0, udp_init = 0;
|
enum conf_port_type udp_tap = 0, udp_init = 0;
|
||||||
|
bool v4_only = false, v6_only = false;
|
||||||
struct fqdn *dnss = c->dns_search;
|
struct fqdn *dnss = c->dns_search;
|
||||||
struct in6_addr *dns6 = c->dns6;
|
struct in6_addr *dns6 = c->dns6;
|
||||||
int name, ret, mask, b, i;
|
int name, ret, mask, b, i;
|
||||||
|
@ -1474,10 +1454,10 @@ void conf(struct ctx *c, int argc, char **argv)
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
break;
|
break;
|
||||||
case '4':
|
case '4':
|
||||||
c->v4 = 1;
|
v4_only = true;
|
||||||
break;
|
break;
|
||||||
case '6':
|
case '6':
|
||||||
c->v6 = 1;
|
v6_only = true;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
case 'u':
|
case 'u':
|
||||||
|
@ -1508,11 +1488,6 @@ void conf(struct ctx *c, int argc, char **argv)
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->v4 && c->v6) {
|
|
||||||
err("Options ipv4-only and ipv6-only are mutually exclusive");
|
|
||||||
usage(argv[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c->pasta_conf_ns)
|
if (c->pasta_conf_ns)
|
||||||
c->no_ra = 1;
|
c->no_ra = 1;
|
||||||
|
|
||||||
|
@ -1524,6 +1499,12 @@ void conf(struct ctx *c, int argc, char **argv)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (v4_only && v6_only) {
|
||||||
|
err("Options ipv4-only and ipv6-only are mutually exclusive");
|
||||||
|
usage(argv[0]);
|
||||||
|
}
|
||||||
|
c->v4 = !v6_only;
|
||||||
|
c->v6 = !v4_only;
|
||||||
conf_ip(c);
|
conf_ip(c);
|
||||||
|
|
||||||
/* Now we can process port configuration options */
|
/* Now we can process port configuration options */
|
||||||
|
|
6
util.h
6
util.h
|
@ -74,12 +74,6 @@ void trace_init(int enable);
|
||||||
#define V6 1
|
#define V6 1
|
||||||
#define IP_VERSIONS 2
|
#define IP_VERSIONS 2
|
||||||
|
|
||||||
enum {
|
|
||||||
IP_VERSION_DISABLED = 0,
|
|
||||||
IP_VERSION_ENABLED,
|
|
||||||
IP_VERSION_PROBE,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ARRAY_SIZE(a) ((int)(sizeof(a) / sizeof((a)[0])))
|
#define ARRAY_SIZE(a) ((int)(sizeof(a) / sizeof((a)[0])))
|
||||||
|
|
||||||
#define IN_INTERVAL(a, b, x) ((x) >= (a) && (x) <= (b))
|
#define IN_INTERVAL(a, b, x) ((x) >= (a) && (x) <= (b))
|
||||||
|
|
Loading…
Reference in a new issue