#include "vlog.h"
#define THIS_MODULE VLM_secchan
-#include "ofp-print.h"
-
static const char *listen_vconn_name;
struct half {
static const char *accept_controller_re;
static regex_t accept_controller_regex;
+/* --no-resolv-conf: Update resolv.conf upon successful controller
+ * discovery? */
+static bool update_resolv_conf = true;
+
static void parse_options(int argc, char *argv[]);
static void usage(void) NO_RETURN;
new_management_connection(nl_name, new_remote);
}
}
- if (controller_relay) {
- /* FIXME: should also fail open when controller_relay is NULL. */
- failing_open(controller_relay);
- }
+ failing_open(controller_relay);
if (dhcp) {
if (rconn_is_connectivity_questionable(remote_rconn)) {
dhclient_force_renew(dhcp, 15);
}
dhclient_run(dhcp);
if (dhclient_changed(dhcp)) {
- free(controller_name);
+ dhclient_configure_netdev(dhcp);
+ if (update_resolv_conf) {
+ dhclient_update_resolv_conf(dhcp);
+ }
+
if (dhclient_is_bound(dhcp)) {
+ free(controller_name);
controller_name = dhcp_msg_get_string(
dhclient_get_config(dhcp),
DHCP_CODE_OFP_CONTROLLER_VCONN);
} else if (controller_name) {
VLOG_WARN("%s: discover controller no longer available",
controller_name);
+ free(controller_name);
controller_name = NULL;
rconn_disconnect(remote_rconn);
}
return false;
}
accept = !regexec(&accept_controller_regex, vconn_name, 0, NULL, 0);
+ if (!accept) {
+ VLOG_WARN("rejecting controller vconn that fails to match %s",
+ accept_controller_re);
+ }
free(vconn_name);
return accept;
}
{
enum {
OPT_ACCEPT_VCONN = UCHAR_MAX + 1,
+ OPT_NO_RESOLV_CONF,
OPT_INACTIVITY_PROBE,
OPT_MAX_IDLE,
OPT_MAX_BACKOFF
};
static struct option long_options[] = {
{"accept-vconn", required_argument, 0, OPT_ACCEPT_VCONN},
+ {"no-resolv-conf", no_argument, 0, OPT_NO_RESOLV_CONF},
{"fail", required_argument, 0, 'f'},
{"inactivity-probe", required_argument, 0, OPT_INACTIVITY_PROBE},
{"max-idle", required_argument, 0, OPT_MAX_IDLE},
: xasprintf("^%s", optarg));
break;
+ case OPT_NO_RESOLV_CONF:
+ update_resolv_conf = false;
+ break;
+
case 'f':
if (!strcmp(optarg, "open")) {
fail_mode = FAIL_OPEN;
break;
case 'P':
- set_pidfile(optarg ? optarg : "secchan.pid");
+ set_pidfile(optarg);
break;
case 'l':
"omitted, then secchan performs controller autodiscovery.\n",
program_name, program_name);
vconn_usage(true, true);
- printf("\nNetworking options:\n"
+ printf("\nController discovery options:\n"
" --accept-vconn=REGEX accept matching discovered controllers\n"
+ " --no-resolv-conf do not update /etc/resolv.conf\n"
+ "\nNetworking options:\n"
" -f, --fail=open|closed when controller connection fails:\n"
" closed: drop all packets\n"
" open (default): act as learning switch\n"