fix compilation on FreeBSD
authorGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Fri, 11 May 2012 12:11:00 +0000 (14:11 +0200)
committerGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Fri, 11 May 2012 12:11:00 +0000 (14:11 +0200)
lib/vlandev.c
ofproto/ofproto-dpif-sflow.c

index 736b779..d6a7b56 100644 (file)
 #include <sys/stat.h>
 
 #include "hash.h"
-#include "rtnetlink-link.h"
 #include "shash.h"
 #include "vlog.h"
 
 VLOG_DEFINE_THIS_MODULE(vlandev);
 
 #ifdef __linux__
+#include "rtnetlink-link.h"
 #include <linux/if_vlan.h>
 #include <linux/sockios.h>
 #include "netdev-linux.h"
index 73da2af..3865ad8 100644 (file)
@@ -18,7 +18,9 @@
 #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"
@@ -31,7 +33,9 @@
 #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"
@@ -229,18 +233,35 @@ sflow_agent_get_counters(void *ds_, SFLPoller *poller,
  * 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;
         }
@@ -254,6 +275,7 @@ sflow_choose_agent_address(const char *agent_device,
             && route_table_get_name(sin.sin_addr.s_addr, name)
             && !netdev_get_in4_by_name(name, &in4)) {
             goto success;
+#endif /* HAVE_NETLINK */
         }
     }
 
@@ -301,8 +323,10 @@ dpif_sflow_create(struct dpif *dpif)
     ds->next_tick = time_now() + 1;
     hmap_init(&ds->ports);
     ds->probability = 0;
+#ifdef HAVE_NETLINK
     route_table_register();
 
+#endif /* HAVE_NETLINK */
     return ds;
 }
 
@@ -321,7 +345,9 @@ dpif_sflow_destroy(struct dpif_sflow *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);
@@ -433,6 +459,7 @@ dpif_sflow_set_options(struct dpif_sflow *ds,
         }
     }
 
+#ifdef HAVE_NETLINK
     /* Choose agent IP address and agent device (if not yet setup) */
     if (!sflow_choose_agent_address(options->agent_device,
                                     &options->targets,
@@ -441,6 +468,7 @@ dpif_sflow_set_options(struct dpif_sflow *ds,
         return;
     }
 
+#endif /* HAVE_NETLINK */
     /* Avoid reconfiguring if options didn't change. */
     if (!options_changed) {
         return;
@@ -448,6 +476,15 @@ dpif_sflow_set_options(struct dpif_sflow *ds,
     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) {
@@ -576,7 +613,9 @@ dpif_sflow_run(struct dpif_sflow *ds)
 {
     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;