Add hack to get around "." delimiter problem with policing vifs.
authorJustin Pettit <jpettit@nicira.com>
Mon, 6 Apr 2009 23:54:49 +0000 (16:54 -0700)
committerJustin Pettit <jpettit@nicira.com>
Tue, 7 Apr 2009 00:00:09 +0000 (17:00 -0700)
The vswitchd.conf format uses "." as a delimiter.  Unfortunately, vifs
use a "." in their name.  The port is specified as part of the key when
ingress policing is enabled, but the cfg parser balks at this.  For the
time-being, we check all valid ports to see if they have a policing
policy defined.  This is wasteful, but it works until we change the
delimiter.

vswitchd/bridge.c
vswitchd/bridge.h
vswitchd/port.c

index 1798ea0b07de0369e9fe57982883ce87aa2ebd06..11a08ff90a7be7d254bff37321783bf7c8d8b26f 100644 (file)
@@ -242,6 +242,34 @@ static struct ofhooks bridge_ofhooks;
 \f
 /* Public functions. */
 
+/* xxx Temporary to get around "." delimiter vswitchd.conf problem in 
+ * xxx port.c. */
+void
+bridge_get_ifaces(struct svec *svec) 
+{
+    struct bridge *br, *next;
+    size_t i, j;
+
+    LIST_FOR_EACH_SAFE (br, next, struct bridge, node, &all_bridges) {
+        bridge_fetch_dp_ifaces(br);
+        for (i = 0; i < br->n_ports; i++) {
+            struct port *port = br->ports[i];
+
+            for (j = 0; j < port->n_ifaces; j++) {
+                struct iface *iface = port->ifaces[j];
+                if (iface->dp_ifidx < 0) {
+                    VLOG_ERR("%s interface not in dp%u, ignoring",
+                             iface->name, dpif_id(&br->dpif));
+                } else {
+                    if (iface->dp_ifidx != ODPP_LOCAL) {
+                        svec_add(svec, iface->name);
+                    }
+                }
+            }
+        }
+    }
+}
+
 /* The caller must already have called cfg_read(). */
 void
 bridge_init(void)
index b6c600eeba22adecef7c6716b84a03c36eaeabd7..22dadf959a13bbce043216f32e6c8890020386a5 100644 (file)
 #include <stddef.h>
 #include "list.h"
 
+struct svec;
+
 void bridge_init(void);
 void bridge_reconfigure(void);
 int bridge_run(void);
 void bridge_wait(void);
 bool bridge_exists(const char *);
 uint64_t bridge_get_datapathid(const char *name);
+void bridge_get_ifaces(struct svec *svec);
 
 #endif /* bridge.h */
index 7b4a9e7b3232859dd4117dac8b4381e3f146de0d..419e832dc7c868ab3a88eea32e8fc5d31414fd72 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <config.h>
 
+#include "bridge.h"
 #include "cfg.h"
 #include "netdev.h"
 #include "port.h"
@@ -74,6 +75,19 @@ port_init(void)
 void
 port_reconfigure(void)
 {
+#if 1
+    /* xxx Hack to get around interfaces with a "." in their name, since
+     * xxx that is the delimiter in vswitchd.conf.  Once the delimiter
+     * xxx is changed, this portion of the code can be removed. */
+    struct svec ports;
+    int i;
+
+    svec_init(&ports);
+    bridge_get_ifaces(&ports);
+    for (i=0; i<ports.n; i++) {
+        set_ingress_policing(ports.names[i]);
+    }
+#else
     struct svec new_cfg;
     struct svec new_ports;
     int i;
@@ -104,4 +118,5 @@ port_reconfigure(void)
 
     svec_swap(&new_ports, &all_ports);
     svec_destroy(&new_ports);
+#endif
 }