Commit 47c697aa authored by andy zhou's avatar andy zhou Committed by David S. Miller

openvswitch: Deferred fifo API change.

add_deferred_actions() API currently requires actions to be passed in
as a fully encoded netlink message. So far both 'sample' and 'recirc'
actions happens to carry actions as fully encoded netlink messages.
However, this requirement is more restrictive than necessary, future
patch will need to pass in action lists that are not fully encoded
by themselves.
Signed-off-by: default avatarAndy Zhou <azhou@ovn.org>
Acked-by: default avatarJoe Stringer <joe@ovn.org>
Acked-by: default avatarPravin B Shelar <pshelar@ovn.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 29dd5ec0
...@@ -51,6 +51,7 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb, ...@@ -51,6 +51,7 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
struct deferred_action { struct deferred_action {
struct sk_buff *skb; struct sk_buff *skb;
const struct nlattr *actions; const struct nlattr *actions;
int actions_len;
/* Store pkt_key clone when creating deferred action. */ /* Store pkt_key clone when creating deferred action. */
struct sw_flow_key pkt_key; struct sw_flow_key pkt_key;
...@@ -120,7 +121,8 @@ static struct deferred_action *action_fifo_put(struct action_fifo *fifo) ...@@ -120,7 +121,8 @@ static struct deferred_action *action_fifo_put(struct action_fifo *fifo)
/* Return true if fifo is not full */ /* Return true if fifo is not full */
static struct deferred_action *add_deferred_actions(struct sk_buff *skb, static struct deferred_action *add_deferred_actions(struct sk_buff *skb,
const struct sw_flow_key *key, const struct sw_flow_key *key,
const struct nlattr *attr) const struct nlattr *actions,
const int actions_len)
{ {
struct action_fifo *fifo; struct action_fifo *fifo;
struct deferred_action *da; struct deferred_action *da;
...@@ -129,7 +131,8 @@ static struct deferred_action *add_deferred_actions(struct sk_buff *skb, ...@@ -129,7 +131,8 @@ static struct deferred_action *add_deferred_actions(struct sk_buff *skb,
da = action_fifo_put(fifo); da = action_fifo_put(fifo);
if (da) { if (da) {
da->skb = skb; da->skb = skb;
da->actions = attr; da->actions = actions;
da->actions_len = actions_len;
da->pkt_key = *key; da->pkt_key = *key;
} }
...@@ -966,7 +969,8 @@ static int sample(struct datapath *dp, struct sk_buff *skb, ...@@ -966,7 +969,8 @@ static int sample(struct datapath *dp, struct sk_buff *skb,
/* Skip the sample action when out of memory. */ /* Skip the sample action when out of memory. */
return 0; return 0;
if (!add_deferred_actions(skb, key, a)) { if (!add_deferred_actions(skb, key, nla_data(acts_list),
nla_len(acts_list))) {
if (net_ratelimit()) if (net_ratelimit())
pr_warn("%s: deferred actions limit reached, dropping sample action\n", pr_warn("%s: deferred actions limit reached, dropping sample action\n",
ovs_dp_name(dp)); ovs_dp_name(dp));
...@@ -1123,7 +1127,7 @@ static int execute_recirc(struct datapath *dp, struct sk_buff *skb, ...@@ -1123,7 +1127,7 @@ static int execute_recirc(struct datapath *dp, struct sk_buff *skb,
return 0; return 0;
} }
da = add_deferred_actions(skb, key, NULL); da = add_deferred_actions(skb, key, NULL, 0);
if (da) { if (da) {
da->pkt_key.recirc_id = nla_get_u32(a); da->pkt_key.recirc_id = nla_get_u32(a);
} else { } else {
...@@ -1278,10 +1282,10 @@ static void process_deferred_actions(struct datapath *dp) ...@@ -1278,10 +1282,10 @@ static void process_deferred_actions(struct datapath *dp)
struct sk_buff *skb = da->skb; struct sk_buff *skb = da->skb;
struct sw_flow_key *key = &da->pkt_key; struct sw_flow_key *key = &da->pkt_key;
const struct nlattr *actions = da->actions; const struct nlattr *actions = da->actions;
int actions_len = da->actions_len;
if (actions) if (actions)
do_execute_actions(dp, skb, key, actions, do_execute_actions(dp, skb, key, actions, actions_len);
nla_len(actions));
else else
ovs_dp_process_packet(skb, key); ovs_dp_process_packet(skb, key);
} while (!action_fifo_is_empty(fifo)); } while (!action_fifo_is_empty(fifo));
......
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