Commit 2ce12410 authored by Petr Machata's avatar Petr Machata Committed by David S. Miller

net: tc_skbedit: Make the skbedit priority offloadable

The skbedit action "priority" is used for adjusting SKB priority. Allow
drivers to offload the action by introducing two new skbedit getters and a
new flow action, and initializing appropriately in tc_setup_flow_action().
Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
Reviewed-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fe93f0b2
...@@ -137,6 +137,7 @@ enum flow_action_id { ...@@ -137,6 +137,7 @@ enum flow_action_id {
FLOW_ACTION_CSUM, FLOW_ACTION_CSUM,
FLOW_ACTION_MARK, FLOW_ACTION_MARK,
FLOW_ACTION_PTYPE, FLOW_ACTION_PTYPE,
FLOW_ACTION_PRIORITY,
FLOW_ACTION_WAKE, FLOW_ACTION_WAKE,
FLOW_ACTION_QUEUE, FLOW_ACTION_QUEUE,
FLOW_ACTION_SAMPLE, FLOW_ACTION_SAMPLE,
...@@ -211,6 +212,7 @@ struct flow_action_entry { ...@@ -211,6 +212,7 @@ struct flow_action_entry {
u32 csum_flags; /* FLOW_ACTION_CSUM */ u32 csum_flags; /* FLOW_ACTION_CSUM */
u32 mark; /* FLOW_ACTION_MARK */ u32 mark; /* FLOW_ACTION_MARK */
u16 ptype; /* FLOW_ACTION_PTYPE */ u16 ptype; /* FLOW_ACTION_PTYPE */
u32 priority; /* FLOW_ACTION_PRIORITY */
struct { /* FLOW_ACTION_QUEUE */ struct { /* FLOW_ACTION_QUEUE */
u32 ctx; u32 ctx;
u32 index; u32 index;
......
...@@ -77,4 +77,21 @@ static inline u32 tcf_skbedit_ptype(const struct tc_action *a) ...@@ -77,4 +77,21 @@ static inline u32 tcf_skbedit_ptype(const struct tc_action *a)
return ptype; return ptype;
} }
/* Return true iff action is priority */
static inline bool is_tcf_skbedit_priority(const struct tc_action *a)
{
return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY);
}
static inline u32 tcf_skbedit_priority(const struct tc_action *a)
{
u32 priority;
rcu_read_lock();
priority = rcu_dereference(to_skbedit(a)->params)->priority;
rcu_read_unlock();
return priority;
}
#endif /* __NET_TC_SKBEDIT_H */ #endif /* __NET_TC_SKBEDIT_H */
...@@ -3665,6 +3665,9 @@ int tc_setup_flow_action(struct flow_action *flow_action, ...@@ -3665,6 +3665,9 @@ int tc_setup_flow_action(struct flow_action *flow_action,
} else if (is_tcf_skbedit_ptype(act)) { } else if (is_tcf_skbedit_ptype(act)) {
entry->id = FLOW_ACTION_PTYPE; entry->id = FLOW_ACTION_PTYPE;
entry->ptype = tcf_skbedit_ptype(act); entry->ptype = tcf_skbedit_ptype(act);
} else if (is_tcf_skbedit_priority(act)) {
entry->id = FLOW_ACTION_PRIORITY;
entry->priority = tcf_skbedit_priority(act);
} else { } else {
err = -EOPNOTSUPP; err = -EOPNOTSUPP;
goto err_out_locked; goto err_out_locked;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment