[ovs-dev] [PATCH] ofproto-dpif-sflow: avoid to specify agent device when configuring sFlow
Luca Giraudo
lgiraudo at nicira.com
Fri Dec 2 00:16:05 UTC 2011
---
ofproto/ofproto-dpif-sflow.c | 52 +++++++++++++++++++++++++++++++++++------
1 files changed, 44 insertions(+), 8 deletions(-)
diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c
index d17b0be..e22c89d 100644
--- a/ofproto/ofproto-dpif-sflow.c
+++ b/ofproto/ofproto-dpif-sflow.c
@@ -18,6 +18,7 @@
#include <config.h>
#include "ofproto-dpif-sflow.h"
#include <inttypes.h>
+#include <net/if.h>
#include <stdlib.h>
#include "collectors.h"
#include "compiler.h"
@@ -30,6 +31,7 @@
#include "ofproto.h"
#include "packets.h"
#include "poll-loop.h"
+#include "route-table.h"
#include "sflow_api.h"
#include "socket-util.h"
#include "timeval.h"
@@ -225,7 +227,9 @@ sflow_agent_get_counters(void *ds_, SFLPoller *poller,
* 'agent_device' is used if it has one, and otherwise 'control_ip', the IP
* address used to talk to the controller. */
static bool
-sflow_choose_agent_address(const char *agent_device, const char *control_ip,
+sflow_choose_agent_address(const char *agent_device,
+ const struct sset *targets,
+ const char *control_ip,
SFLAddress *agent_addr)
{
struct in_addr in4;
@@ -239,10 +243,37 @@ sflow_choose_agent_address(const char *agent_device, const char *control_ip,
if (!netdev_open(agent_device, "system", &netdev)) {
int error = netdev_get_in4(netdev, &in4, NULL);
netdev_close(netdev);
+
if (!error) {
goto success;
}
}
+ } else if (!sset_is_empty(targets)) {
+ const char *target = NULL;
+ struct sockaddr_in target_addr;
+ ovs_be32 target_ip = 0;
+ uint16_t default_port = SFL_DEFAULT_COLLECTOR_PORT;
+ char name[IFNAMSIZ];
+
+ SSET_FOR_EACH (target, targets) {
+ if (inet_parse_active(target, default_port, &target_addr)) {
+ target_ip = target_addr.sin_addr.s_addr;
+ continue;
+ }
+ }
+
+ if (target_ip && route_table_get_name(target_ip, name)) {
+ struct netdev *netdev;
+
+ if (!netdev_open(name, "system", &netdev)) {
+ int error = netdev_get_in4(netdev, &in4, NULL);
+ netdev_close(netdev);
+
+ if (!error) {
+ goto success;
+ }
+ }
+ }
}
if (control_ip && !lookup_ip(control_ip, &in4)) {
@@ -289,6 +320,8 @@ dpif_sflow_create(struct dpif *dpif)
ds->next_tick = time_now() + 1;
hmap_init(&ds->ports);
ds->probability = 0;
+ route_table_register();
+
return ds;
}
@@ -307,6 +340,7 @@ dpif_sflow_destroy(struct dpif_sflow *ds)
if (ds) {
struct dpif_sflow_port *dsp, *next;
+ route_table_unregister();
dpif_sflow_clear(ds);
HMAP_FOR_EACH_SAFE (dsp, next, hmap_node, &ds->ports) {
dpif_sflow_del_port__(ds, dsp);
@@ -430,6 +464,14 @@ dpif_sflow_set_options(struct dpif_sflow *ds,
}
}
+ /* Choose agent IP address and agent device (if not yet setup) */
+ if (!sflow_choose_agent_address(options->agent_device,
+ &options->targets,
+ options->control_ip, &agentIP)) {
+ dpif_sflow_clear(ds);
+ return;
+ }
+
/* Avoid reconfiguring if options didn't change. */
if (!options_changed) {
return;
@@ -437,13 +479,6 @@ dpif_sflow_set_options(struct dpif_sflow *ds,
ofproto_sflow_options_destroy(ds->options);
ds->options = ofproto_sflow_options_clone(options);
- /* Choose agent IP address. */
- if (!sflow_choose_agent_address(options->agent_device,
- options->control_ip, &agentIP)) {
- dpif_sflow_clear(ds);
- return;
- }
-
/* Create agent. */
VLOG_INFO("creating sFlow agent %d", options->sub_id);
if (ds->sflow_agent) {
@@ -572,6 +607,7 @@ dpif_sflow_run(struct dpif_sflow *ds)
{
if (dpif_sflow_is_enabled(ds)) {
time_t now = time_now();
+ route_table_run();
if (now >= ds->next_tick) {
sfl_agent_tick(ds->sflow_agent, time_wall());
ds->next_tick = now + 1;
--
1.7.2.5
More information about the dev
mailing list