diff options
author | Andy Zhou <azhou@ovn.org> | 2018-06-18 09:53:18 -0700 |
---|---|---|
committer | Justin Pettit <jpettit@ovn.org> | 2018-06-20 10:16:51 -0700 |
commit | e02b6f8106929de0c2cc673052c9ea9aa5c221b9 (patch) | |
tree | e4f2d7360b4d4ac310d507f952bd56c39f457c23 /datapath | |
parent | b59974806c2c84f1a37262aae23762020c66f8dc (diff) | |
download | openvswitch-e02b6f8106929de0c2cc673052c9ea9aa5c221b9.tar.gz |
datapath: Add meter action support.
Upstream commit:
commit cd8a6c33693c1b89d2737ffdbf9611564e9ac907
Author: Andy Zhou <azhou@ovn.org>
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 <azhou@ovn.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Justin Pettit <jpettit@ovn.org>
Reviewed-by: Greg Rose <gvrose8192@gmail.com>
Tested-by: Greg Rose <gvrose8192@gmail.com>
Diffstat (limited to 'datapath')
-rw-r--r-- | datapath/actions.c | 6 | ||||
-rw-r--r-- | datapath/datapath.h | 1 | ||||
-rw-r--r-- | datapath/flow_netlink.c | 6 | ||||
-rw-r--r-- | datapath/linux/compat/include/linux/openvswitch.h | 2 |
4 files changed, 14 insertions, 1 deletions
diff --git a/datapath/actions.c b/datapath/actions.c index eab147617..56b013601 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 93c9ed505..c38286df7 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 1b7bad8fe..bea525a5d 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 5c1e2383f..8e5f3b6fb 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. */ |