X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=secchan%2Fsecchan.c;h=d0d64e3ec29b1362b329f3b12d68a2fae5ce9cae;hb=22b8fc08fb708145af34bc49c0f78e3ac1e98fc7;hp=3c96312f53b0eecb547b4002342865016550a474;hpb=8f1f1132e58f6bde39af343d15dfb8800bb4c8a8;p=sliver-openvswitch.git diff --git a/secchan/secchan.c b/secchan/secchan.c index 3c96312f5..d0d64e3ec 100644 --- a/secchan/secchan.c +++ b/secchan/secchan.c @@ -133,6 +133,10 @@ static struct dhclient *dhcp; 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; @@ -287,18 +291,20 @@ main(int argc, char *argv[]) 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); @@ -308,6 +314,7 @@ main(int argc, char *argv[]) } else if (controller_name) { VLOG_WARN("%s: discover controller no longer available", controller_name); + free(controller_name); controller_name = NULL; rconn_disconnect(remote_rconn); } @@ -599,7 +606,7 @@ local_hook(struct relay *r) return true; } -/* Causess 'r' to enter or leave fail-open mode, if appropriate. Returns true +/* Causes 'r' to enter or leave fail-open mode, if appropriate. Returns true * if 'r' is in fail-open fail, false otherwise. */ static bool failing_open(struct relay *r) @@ -665,6 +672,10 @@ validate_dhcp_offer(const struct dhcp_msg *msg, void *aux) 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; } @@ -674,12 +685,14 @@ parse_options(int argc, char *argv[]) { 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}, @@ -710,6 +723,10 @@ parse_options(int argc, char *argv[]) : xasprintf("^%s", optarg)); break; + case OPT_NO_RESOLV_CONF: + update_resolv_conf = false; + break; + case 'f': if (!strcmp(optarg, "open")) { fail_mode = FAIL_OPEN; @@ -797,8 +814,10 @@ usage(void) "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"