#include <config.h>
#include "ofproto-dpif-sflow.h"
#include <inttypes.h>
+#ifdef HAVE_NETLINK
#include <net/if.h>
+#endif /* HAVE_NETLINK */
#include <stdlib.h>
#include "collectors.h"
#include "compiler.h"
#include "ofproto.h"
#include "packets.h"
#include "poll-loop.h"
+#ifdef HAVE_NETLINK
#include "route-table.h"
+#endif /* HAVE_NETLINK */
#include "sflow_api.h"
#include "socket-util.h"
#include "timeval.h"
* specified then it is figured out by taking a look at the routing table based
* on 'targets'. */
static bool
+#ifndef HAVE_NETLINK
+sflow_choose_agent_address(const char *agent_device, const char *control_ip,
+ SFLAddress *agent_addr)
+#else
sflow_choose_agent_address(const char *agent_device,
const struct sset *targets,
const char *control_ip,
SFLAddress *agent_addr)
+#endif /* HAVE_NETLINK */
{
+#ifdef HAVE_NETLINK
const char *target;
+#endif /* HAVE_NETLINK */
struct in_addr in4;
memset(agent_addr, 0, sizeof *agent_addr);
agent_addr->type = SFLADDRESSTYPE_IP_V4;
if (agent_device) {
+#ifndef HAVE_NETLINK
+ struct netdev *netdev;
+
+ if (!netdev_open(agent_device, "system", &netdev)) {
+ int error = netdev_get_in4(netdev, &in4, NULL);
+ netdev_close(netdev);
+ if (!error) {
+ goto success;
+ }
+#else
if (!netdev_get_in4_by_name(agent_device, &in4)) {
goto success;
}
&& route_table_get_name(sin.sin_addr.s_addr, name)
&& !netdev_get_in4_by_name(name, &in4)) {
goto success;
+#endif /* HAVE_NETLINK */
}
}
ds->next_tick = time_now() + 1;
hmap_init(&ds->ports);
ds->probability = 0;
+#ifdef HAVE_NETLINK
route_table_register();
+#endif /* HAVE_NETLINK */
return ds;
}
if (ds) {
struct dpif_sflow_port *dsp, *next;
+#ifdef HAVE_NETLINK
route_table_unregister();
+#endif /* HAVE_NETLINK */
dpif_sflow_clear(ds);
HMAP_FOR_EACH_SAFE (dsp, next, hmap_node, &ds->ports) {
dpif_sflow_del_port__(ds, dsp);
}
}
+#ifdef HAVE_NETLINK
/* Choose agent IP address and agent device (if not yet setup) */
if (!sflow_choose_agent_address(options->agent_device,
&options->targets,
return;
}
+#endif /* HAVE_NETLINK */
/* Avoid reconfiguring if options didn't change. */
if (!options_changed) {
return;
ofproto_sflow_options_destroy(ds->options);
ds->options = ofproto_sflow_options_clone(options);
+#ifndef HAVE_NETLINK
+ /* Choose agent IP address. */
+ if (!sflow_choose_agent_address(options->agent_device,
+ options->control_ip, &agentIP)) {
+ dpif_sflow_clear(ds);
+ return;
+ }
+
+#endif /* HAVE_NETLINK */
/* Create agent. */
VLOG_INFO("creating sFlow agent %d", options->sub_id);
if (ds->sflow_agent) {
{
if (dpif_sflow_is_enabled(ds)) {
time_t now = time_now();
+#ifdef HAVE_NETLINK
route_table_run();
+#endif /* HAVE_NETLINK */
if (now >= ds->next_tick) {
sfl_agent_tick(ds->sflow_agent, time_wall());
ds->next_tick = now + 1;