openvswitch: Additional logging for -EINVAL on flow setups.
authorJesse Gross <jesse@nicira.com>
Mon, 6 Oct 2014 12:08:38 +0000 (05:08 -0700)
committerPravin B Shelar <pshelar@nicira.com>
Thu, 6 Nov 2014 07:52:34 +0000 (23:52 -0800)
There are many possible ways that a flow can be invalid so we've
added logging for most of them. This adds logs for the remaining
possible cases so there isn't any ambiguity while debugging.

CC: Federico Iezzi <fiezzi@enter.it>
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Thomas Graf <tgraf@noironetworks.com>
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
net/openvswitch/datapath.c
net/openvswitch/flow_netlink.c

index a532a9c..04a26ae 100644 (file)
@@ -817,10 +817,14 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)
 
        /* Must have key and actions. */
        error = -EINVAL;
-       if (!a[OVS_FLOW_ATTR_KEY])
+       if (!a[OVS_FLOW_ATTR_KEY]) {
+               OVS_NLERR("Flow key attribute not present in new flow.\n");
                goto error;
-       if (!a[OVS_FLOW_ATTR_ACTIONS])
+       }
+       if (!a[OVS_FLOW_ATTR_ACTIONS]) {
+               OVS_NLERR("Flow actions attribute not present in new flow.\n");
                goto error;
+       }
 
        /* Most of the time we need to allocate a new flow, do it before
         * locking.
@@ -979,8 +983,10 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, struct genl_info *info)
 
        /* Extract key. */
        error = -EINVAL;
-       if (!a[OVS_FLOW_ATTR_KEY])
+       if (!a[OVS_FLOW_ATTR_KEY]) {
+               OVS_NLERR("Flow key attribute not present in set flow.\n");
                goto error;
+       }
 
        ovs_match_init(&match, &key, &mask);
        error = ovs_nla_get_match(&match,
index 5a91d79..1b29ea7 100644 (file)
@@ -581,10 +581,13 @@ static int metadata_from_nlattrs(struct sw_flow_match *match,  u64 *attrs,
        if (*attrs & (1 << OVS_KEY_ATTR_IN_PORT)) {
                u32 in_port = nla_get_u32(a[OVS_KEY_ATTR_IN_PORT]);
 
-               if (is_mask)
+               if (is_mask) {
                        in_port = 0xffffffff; /* Always exact match in_port. */
-               else if (in_port >= DP_MAX_PORTS)
+               } else if (in_port >= DP_MAX_PORTS) {
+                       OVS_NLERR("Port (%d) exceeds maximum allowable (%d).\n",
+                                 in_port, DP_MAX_PORTS);
                        return -EINVAL;
+               }
 
                SW_FLOW_KEY_PUT(match, phy.in_port, in_port, is_mask);
                *attrs &= ~(1 << OVS_KEY_ATTR_IN_PORT);
@@ -824,8 +827,11 @@ static int ovs_key_from_nlattrs(struct sw_flow_match *match, u64 attrs,
                attrs &= ~(1 << OVS_KEY_ATTR_ND);
        }
 
-       if (attrs != 0)
+       if (attrs != 0) {
+               OVS_NLERR("Unknown key attributes (%llx).\n",
+                         (unsigned long long)attrs);
                return -EINVAL;
+       }
 
        return 0;
 }
@@ -1250,8 +1256,10 @@ struct sw_flow_actions *ovs_nla_alloc_flow_actions(int size)
 {
        struct sw_flow_actions *sfa;
 
-       if (size > MAX_ACTIONS_BUFSIZE)
+       if (size > MAX_ACTIONS_BUFSIZE) {
+               OVS_NLERR("Flow action size (%u bytes) exceeds maximum", size);
                return ERR_PTR(-EINVAL);
+       }
 
        sfa = kmalloc(sizeof(*sfa) + size, GFP_KERNEL);
        if (!sfa)
@@ -1786,6 +1794,7 @@ static int ovs_nla_copy_actions__(const struct nlattr *attr,
                        break;
 
                default:
+                       OVS_NLERR("Unknown tunnel attribute (%d).\n", type);
                        return -EINVAL;
                }
                if (!skip_copy) {