mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
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>
This commit is contained in:
parent
96fbc13d7e
commit
cd8a6c3369
@ -838,6 +838,8 @@ struct ovs_action_push_eth {
|
||||
* @OVS_ACTION_ATTR_CT_CLEAR: Clear conntrack state from the packet.
|
||||
* @OVS_ACTION_ATTR_PUSH_NSH: push NSH header to the packet.
|
||||
* @OVS_ACTION_ATTR_POP_NSH: pop the outermost NSH header off the packet.
|
||||
* @OVS_ACTION_ATTR_METER: Run packet through a meter, which may drop the
|
||||
* packet, or modify the packet (e.g., change the DSCP field).
|
||||
*
|
||||
* Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all
|
||||
* fields within a header are modifiable, e.g. the IPv4 protocol and fragment
|
||||
@ -870,6 +872,7 @@ 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 ID. */
|
||||
|
||||
__OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted
|
||||
* from userspace. */
|
||||
|
@ -1330,6 +1330,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)) {
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "conntrack.h"
|
||||
#include "flow.h"
|
||||
#include "flow_table.h"
|
||||
#include "meter.h"
|
||||
#include "vport-internal_dev.h"
|
||||
|
||||
#define DP_MAX_PORTS USHRT_MAX
|
||||
|
@ -90,6 +90,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;
|
||||
}
|
||||
@ -2844,6 +2845,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);
|
||||
@ -3029,6 +3031,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;
|
||||
|
Loading…
Reference in New Issue
Block a user