lacp: Transmit more judiciously.
[openvswitch] / lib / netdev-vport.c
index ae043c266a8df9bc2d6c2c3060bf9a37d4409a86..39a1bb94d47604105a5e56f21e07554ef6e76749 100644 (file)
@@ -26,6 +26,8 @@
 #include <sys/ioctl.h>
 
 #include "byte-order.h"
+#include "daemon.h"
+#include "dirs.h"
 #include "dpif-linux.h"
 #include "hash.h"
 #include "hmap.h"
@@ -502,7 +504,7 @@ netdev_vport_poll_add(struct netdev *netdev,
     struct list *list;
     struct shash_node *shash_node;
 
-    shash_node = shash_find_data(&netdev_vport_notifiers, poll_name);
+    shash_node = shash_find(&netdev_vport_notifiers, poll_name);
     if (!shash_node) {
         list = xmalloc(sizeof *list);
         list_init(list);
@@ -693,8 +695,8 @@ parse_tunnel_config(const char *name, const char *type,
                  */
                 use_ssl_cert = shash_find_data(args, "use_ssl_cert");
                 if (!use_ssl_cert || strcmp(use_ssl_cert, "true")) {
-                    VLOG_WARN("%s: 'peer_cert' requires 'certificate' argument",
-                              name);
+                    VLOG_ERR("%s: 'peer_cert' requires 'certificate' argument",
+                             name);
                     return EINVAL;
                 }
                 ipsec_mech_set = true;
@@ -706,8 +708,8 @@ parse_tunnel_config(const char *name, const char *type,
                     || !strcmp(node->name, "private_key")
                     || !strcmp(node->name, "use_ssl_cert"))) {
             /* Ignore options not used by the netdev. */
-        } else if (is_gre && (!strcmp(node->name, "key") &&
-                              !strcmp(node->name, "in_key") &&
+        } else if (is_gre && (!strcmp(node->name, "key") ||
+                              !strcmp(node->name, "in_key") ||
                               !strcmp(node->name, "out_key"))) {
             /* Handled separately below. */
         } else {
@@ -716,14 +718,24 @@ parse_tunnel_config(const char *name, const char *type,
     }
 
     if (is_ipsec) {
+        char *file_name = xasprintf("%s/%s", ovs_rundir(),
+                "ovs-monitor-ipsec.pid");
+        pid_t pid = read_pidfile(file_name);
+        free(file_name);
+        if (pid < 0) {
+            VLOG_ERR("%s: IPsec requires the ovs-monitor-ipsec daemon",
+                     name);
+            return EINVAL;
+        }
+
         if (shash_find(args, "peer_cert") && shash_find(args, "psk")) {
-            VLOG_WARN("%s: cannot define both 'peer_cert' and 'psk'", name);
+            VLOG_ERR("%s: cannot define both 'peer_cert' and 'psk'", name);
             return EINVAL;
         }
 
         if (!ipsec_mech_set) {
-            VLOG_WARN("%s: IPsec requires an 'peer_cert' or psk' argument",
-                      name);
+            VLOG_ERR("%s: IPsec requires an 'peer_cert' or psk' argument",
+                     name);
             return EINVAL;
         }
     }
@@ -734,8 +746,8 @@ parse_tunnel_config(const char *name, const char *type,
     }
 
     if (!daddr) {
-        VLOG_WARN("%s: %s type requires valid 'remote_ip' argument",
-                  name, type);
+        VLOG_ERR("%s: %s type requires valid 'remote_ip' argument",
+                 name, type);
         return EINVAL;
     }
     nl_msg_put_be32(options, ODP_TUNNEL_ATTR_DST_IPV4, daddr);
@@ -858,22 +870,22 @@ parse_patch_config(const char *name, const char *type OVS_UNUSED,
 
     peer = shash_find_data(args, "peer");
     if (!peer) {
-        VLOG_WARN("%s: patch type requires valid 'peer' argument", name);
+        VLOG_ERR("%s: patch type requires valid 'peer' argument", name);
         return EINVAL;
     }
 
     if (shash_count(args) > 1) {
-        VLOG_WARN("%s: patch type takes only a 'peer' argument", name);
+        VLOG_ERR("%s: patch type takes only a 'peer' argument", name);
         return EINVAL;
     }
 
     if (strlen(peer) >= IFNAMSIZ) {
-        VLOG_WARN("%s: patch 'peer' arg too long", name);
+        VLOG_ERR("%s: patch 'peer' arg too long", name);
         return EINVAL;
     }
 
     if (!strcmp(name, peer)) {
-        VLOG_WARN("%s: patch peer must not be self", name);
+        VLOG_ERR("%s: patch peer must not be self", name);
         return EINVAL;
     }