/*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "discovery.h"
#include <errno.h>
#include <inttypes.h>
+#include <sys/socket.h>
#include <net/if.h>
#include <regex.h>
#include <stdlib.h>
#include "openflow/openflow.h"
#include "packets.h"
#include "status.h"
-#include "vconn-ssl.h"
-
-#define THIS_MODULE VLM_discovery
+#include "stream-ssl.h"
#include "vlog.h"
+VLOG_DEFINE_THIS_MODULE(discovery)
+
struct discovery {
+ char *dpif_name;
char *re;
bool update_resolv_conf;
regex_t *regex;
char local_name[IF_NAMESIZE];
int error;
- d = xcalloc(1, sizeof *d);
+ d = xzalloc(sizeof *d);
+
+ d->dpif_name = xstrdup(dpif_base_name(dpif));
/* Controller regular expression. */
error = discovery_set_accept_controller_re(d, re);
error = dpif_port_get_name(dpif, ODPP_LOCAL,
local_name, sizeof local_name);
if (error) {
- VLOG_ERR("failed to query datapath local port: %s", strerror(error));
+ VLOG_ERR("%s: failed to query datapath local port: %s",
+ d->dpif_name, strerror(error));
goto error_regfree;
}
error = dhclient_create(local_name, modify_dhcp_request,
validate_dhcp_offer, d, &d->dhcp);
if (error) {
- VLOG_ERR("failed to initialize DHCP client: %s", strerror(error));
+ VLOG_ERR("%s: failed to initialize DHCP client: %s",
+ d->dpif_name, strerror(error));
goto error_regfree;
}
dhclient_set_max_timeout(d->dhcp, 3);
regfree(d->regex);
free(d->regex);
error_free:
+ free(d->dpif_name);
free(d);
*discoveryp = 0;
return error;
free(d->regex);
dhclient_destroy(d->dhcp);
switch_status_unregister(d->ss_cat);
+ free(d->dpif_name);
free(d);
}
}
+bool
+discovery_get_update_resolv_conf(const struct discovery *d)
+{
+ return d->update_resolv_conf;
+}
+
void
discovery_set_update_resolv_conf(struct discovery *d,
bool update_resolv_conf)
d->update_resolv_conf = update_resolv_conf;
}
+const char *
+discovery_get_accept_controller_re(const struct discovery *d)
+{
+ return d->re;
+}
+
int
discovery_set_accept_controller_re(struct discovery *d, const char *re_)
{
int error;
char *re;
- re = (!re_ ? xstrdup(vconn_ssl_is_configured() ? "^ssl:.*" : "^tcp:.*")
+ re = (!re_ ? xstrdup(stream_ssl_is_configured() ? "^ssl:.*" : "^tcp:.*")
: re_[0] == '^' ? xstrdup(re_) : xasprintf("^%s", re_));
regex = xmalloc(sizeof *regex);
error = regcomp(regex, re, REG_NOSUB | REG_EXTENDED);
size_t length = regerror(error, regex, NULL, 0);
char *buffer = xmalloc(length);
regerror(error, regex, buffer, length);
- VLOG_WARN("%s: %s", re, buffer);
+ VLOG_WARN("%s: %s: %s", d->dpif_name, re, buffer);
free(regex);
free(re);
return EINVAL;
if (dhclient_is_bound(d->dhcp)) {
*controller_name = dhcp_msg_get_string(dhclient_get_config(d->dhcp),
DHCP_CODE_OFP_CONTROLLER_VCONN);
- VLOG_INFO("%s: discovered controller", *controller_name);
+ VLOG_INFO("%s: discovered controller %s",
+ d->dpif_name, *controller_name);
d->n_changes++;
} else {
*controller_name = NULL;
if (d->n_changes) {
- VLOG_INFO("discovered controller no longer available");
+ VLOG_INFO("%s: discovered controller no longer available",
+ d->dpif_name);
d->n_changes++;
}
}
}
static void
-modify_dhcp_request(struct dhcp_msg *msg, void *aux UNUSED)
+modify_dhcp_request(struct dhcp_msg *msg, void *aux OVS_UNUSED)
{
dhcp_msg_put_string(msg, DHCP_CODE_VENDOR_CLASS, "OpenFlow");
}
vconn_name = dhcp_msg_get_string(msg, DHCP_CODE_OFP_CONTROLLER_VCONN);
if (!vconn_name) {
- VLOG_WARN_RL(&rl, "rejecting DHCP offer missing controller vconn");
+ VLOG_WARN_RL(&rl, "%s: rejecting DHCP offer missing controller vconn",
+ d->dpif_name);
return false;
}
accept = !regexec(d->regex, vconn_name, 0, NULL, 0);
if (!accept) {
- VLOG_WARN_RL(&rl, "rejecting controller vconn that fails to match %s",
- d->re);
+ VLOG_WARN_RL(&rl, "%s: rejecting controller vconn that fails to "
+ "match %s", d->dpif_name, d->re);
}
free(vconn_name);
return accept;