On 6/19/2018 5:22 PM, Justin Pettit wrote:
From: Andy Zhou <[email protected]>

Upstream commit:
     commit cd8a6c33693c1b89d2737ffdbf9611564e9ac907
     Author: Andy Zhou <[email protected]>
     Date:   Fri Nov 10 12:09:43 2017 -0800

     openvswitch: Add meter action support

     Implements OVS kernel meter action support.

     Signed-off-by: Andy Zhou <[email protected]>
     Signed-off-by: David S. Miller <[email protected]>

Signed-off-by: Justin Pettit <[email protected]>
---
  NEWS                                              | 5 +++--
  datapath/actions.c                                | 6 ++++++
  datapath/datapath.h                               | 1 +
  datapath/flow_netlink.c                           | 6 ++++++
  datapath/linux/compat/include/linux/openvswitch.h | 2 +-
  5 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/NEWS b/NEWS
index 7f6589a46878..cd15a332c47e 100644
--- a/NEWS
+++ b/NEWS
@@ -19,8 +19,9 @@ Post-v2.9.0
       * New OpenFlow 1.0 extensions for group support.
       * Default selection method for select groups is now dp_hash with improved
         accuracy.
-   - Linux kernel 4.14
-     * Add support for compiling OVS with the latest Linux 4.14 kernel
+   - Linux datapath
+     * Add support for compiling OVS with the latest Linux 4.14 kernel.
+     * Added support for meters.
     - ovn:
       * implemented icmp4/icmp6/tcp_reset actions in order to drop the packet
         and reply with a RST for TCP or ICMPv4/ICMPv6 unreachable message for
diff --git a/datapath/actions.c b/datapath/actions.c
index eab147617c8b..56b013601393 100644
--- a/datapath/actions.c
+++ b/datapath/actions.c
@@ -1341,6 +1341,12 @@ static int do_execute_actions(struct datapath *dp, 
struct sk_buff *skb,
                case OVS_ACTION_ATTR_POP_NSH:
                        err = pop_nsh(skb, key);
                        break;
+
+               case OVS_ACTION_ATTR_METER:
+                       if (ovs_meter_execute(dp, skb, key, nla_get_u32(a))) {
+                               consume_skb(skb);
+                               return 0;
+                       }
                }
if (unlikely(err)) {
diff --git a/datapath/datapath.h b/datapath/datapath.h
index 93c9ed505448..c38286df75c7 100644
--- a/datapath/datapath.h
+++ b/datapath/datapath.h
@@ -31,6 +31,7 @@
  #include "compat.h"
  #include "flow.h"
  #include "flow_table.h"
+#include "meter.h"
  #include "vport-internal_dev.h"
#define DP_MAX_PORTS USHRT_MAX
diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
index 1b7bad8fe2ab..bea525a5dfcb 100644
--- a/datapath/flow_netlink.c
+++ b/datapath/flow_netlink.c
@@ -92,6 +92,7 @@ static bool actions_may_change_flow(const struct nlattr 
*actions)
                case OVS_ACTION_ATTR_SAMPLE:
                case OVS_ACTION_ATTR_SET:
                case OVS_ACTION_ATTR_SET_MASKED:
+               case OVS_ACTION_ATTR_METER:
                default:
                        return true;
                }
@@ -2853,6 +2854,7 @@ static int __ovs_nla_copy_actions(struct net *net, const 
struct nlattr *attr,
                        [OVS_ACTION_ATTR_POP_ETH] = 0,
                        [OVS_ACTION_ATTR_PUSH_NSH] = (u32)-1,
                        [OVS_ACTION_ATTR_POP_NSH] = 0,
+                       [OVS_ACTION_ATTR_METER] = sizeof(u32),
                };
                const struct ovs_action_push_vlan *vlan;
                int type = nla_type(a);
@@ -3038,6 +3040,10 @@ static int __ovs_nla_copy_actions(struct net *net, const 
struct nlattr *attr,
                        break;
                }
+ case OVS_ACTION_ATTR_METER:
+                       /* Non-existent meters are simply ignored.  */
+                       break;
+
                default:
                        OVS_NLERR(log, "Unknown Action type %d", type);
                        return -EINVAL;
diff --git a/datapath/linux/compat/include/linux/openvswitch.h 
b/datapath/linux/compat/include/linux/openvswitch.h
index 5c1e2383f4f9..8e5f3b6fbfb1 100644
--- a/datapath/linux/compat/include/linux/openvswitch.h
+++ b/datapath/linux/compat/include/linux/openvswitch.h
@@ -934,12 +934,12 @@ enum ovs_action_attr {
        OVS_ACTION_ATTR_CT_CLEAR,     /* No argument. */
        OVS_ACTION_ATTR_PUSH_NSH,     /* Nested OVS_NSH_KEY_ATTR_*. */
        OVS_ACTION_ATTR_POP_NSH,      /* No argument. */
+       OVS_ACTION_ATTR_METER,         /* u32 meter number. */
#ifndef __KERNEL__
        OVS_ACTION_ATTR_TUNNEL_PUSH,   /* struct ovs_action_push_tnl*/
        OVS_ACTION_ATTR_TUNNEL_POP,    /* u32 port number. */
        OVS_ACTION_ATTR_CLONE,         /* Nested OVS_CLONE_ATTR_*.  */
-       OVS_ACTION_ATTR_METER,         /* u32 meter number. */
  #endif
        __OVS_ACTION_ATTR_MAX,        /* Nothing past this will be accepted
                                       * from userspace. */

LGTM

Reviewed-by: Greg Rose <[email protected]>
Tested-by: Greg Rose <[email protected]>

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to