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_CT_CLEAR: Clear conntrack state from the packet.
|
||||||
* @OVS_ACTION_ATTR_PUSH_NSH: push NSH header to 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_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
|
* 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
|
* 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_CT_CLEAR, /* No argument. */
|
||||||
OVS_ACTION_ATTR_PUSH_NSH, /* Nested OVS_NSH_KEY_ATTR_*. */
|
OVS_ACTION_ATTR_PUSH_NSH, /* Nested OVS_NSH_KEY_ATTR_*. */
|
||||||
OVS_ACTION_ATTR_POP_NSH, /* No argument. */
|
OVS_ACTION_ATTR_POP_NSH, /* No argument. */
|
||||||
|
OVS_ACTION_ATTR_METER, /* u32 meter ID. */
|
||||||
|
|
||||||
__OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted
|
__OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted
|
||||||
* from userspace. */
|
* from userspace. */
|
||||||
|
|
|
@ -1330,6 +1330,12 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
|
||||||
case OVS_ACTION_ATTR_POP_NSH:
|
case OVS_ACTION_ATTR_POP_NSH:
|
||||||
err = pop_nsh(skb, key);
|
err = pop_nsh(skb, key);
|
||||||
break;
|
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)) {
|
if (unlikely(err)) {
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "conntrack.h"
|
#include "conntrack.h"
|
||||||
#include "flow.h"
|
#include "flow.h"
|
||||||
#include "flow_table.h"
|
#include "flow_table.h"
|
||||||
|
#include "meter.h"
|
||||||
#include "vport-internal_dev.h"
|
#include "vport-internal_dev.h"
|
||||||
|
|
||||||
#define DP_MAX_PORTS USHRT_MAX
|
#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_SAMPLE:
|
||||||
case OVS_ACTION_ATTR_SET:
|
case OVS_ACTION_ATTR_SET:
|
||||||
case OVS_ACTION_ATTR_SET_MASKED:
|
case OVS_ACTION_ATTR_SET_MASKED:
|
||||||
|
case OVS_ACTION_ATTR_METER:
|
||||||
default:
|
default:
|
||||||
return true;
|
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_POP_ETH] = 0,
|
||||||
[OVS_ACTION_ATTR_PUSH_NSH] = (u32)-1,
|
[OVS_ACTION_ATTR_PUSH_NSH] = (u32)-1,
|
||||||
[OVS_ACTION_ATTR_POP_NSH] = 0,
|
[OVS_ACTION_ATTR_POP_NSH] = 0,
|
||||||
|
[OVS_ACTION_ATTR_METER] = sizeof(u32),
|
||||||
};
|
};
|
||||||
const struct ovs_action_push_vlan *vlan;
|
const struct ovs_action_push_vlan *vlan;
|
||||||
int type = nla_type(a);
|
int type = nla_type(a);
|
||||||
|
@ -3029,6 +3031,10 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case OVS_ACTION_ATTR_METER:
|
||||||
|
/* Non-existent meters are simply ignored. */
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
OVS_NLERR(log, "Unknown Action type %d", type);
|
OVS_NLERR(log, "Unknown Action type %d", type);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
Loading…
Reference in a new issue