openvswitch: refactor ovs flow extract API.
OVS flow extract is called on packet receive or packet execute code path. Following patch defines separate API for extracting flow-key in packet execute code path. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Acked-by: Andy Zhou <azhou@nicira.com>
This commit is contained in:
@@ -237,8 +237,9 @@ void ovs_dp_detach_port(struct vport *p)
|
||||
}
|
||||
|
||||
/* Must be called with rcu_read_lock. */
|
||||
void ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb)
|
||||
void ovs_dp_process_received_packet(struct sk_buff *skb)
|
||||
{
|
||||
const struct vport *p = OVS_CB(skb)->input_vport;
|
||||
struct datapath *dp = p->dp;
|
||||
struct sw_flow *flow;
|
||||
struct dp_stats_percpu *stats;
|
||||
@@ -250,7 +251,7 @@ void ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb)
|
||||
stats = this_cpu_ptr(dp->stats_percpu);
|
||||
|
||||
/* Extract flow from 'skb' into 'key'. */
|
||||
error = ovs_flow_extract(skb, p->port_no, &key);
|
||||
error = ovs_flow_key_extract(skb, &key);
|
||||
if (unlikely(error)) {
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
@@ -514,6 +515,7 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)
|
||||
struct sw_flow *flow;
|
||||
struct datapath *dp;
|
||||
struct ethhdr *eth;
|
||||
struct vport *input_vport;
|
||||
int len;
|
||||
int err;
|
||||
|
||||
@@ -548,13 +550,11 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)
|
||||
if (IS_ERR(flow))
|
||||
goto err_kfree_skb;
|
||||
|
||||
err = ovs_flow_extract(packet, -1, &flow->key);
|
||||
err = ovs_flow_key_extract_userspace(a[OVS_PACKET_ATTR_KEY], packet,
|
||||
&flow->key);
|
||||
if (err)
|
||||
goto err_flow_free;
|
||||
|
||||
err = ovs_nla_get_flow_metadata(flow, a[OVS_PACKET_ATTR_KEY]);
|
||||
if (err)
|
||||
goto err_flow_free;
|
||||
acts = ovs_nla_alloc_flow_actions(nla_len(a[OVS_PACKET_ATTR_ACTIONS]));
|
||||
err = PTR_ERR(acts);
|
||||
if (IS_ERR(acts))
|
||||
@@ -576,6 +576,15 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)
|
||||
if (!dp)
|
||||
goto err_unlock;
|
||||
|
||||
input_vport = ovs_vport_rcu(dp, flow->key.phy.in_port);
|
||||
if (!input_vport)
|
||||
input_vport = ovs_vport_rcu(dp, OVSP_LOCAL);
|
||||
|
||||
if (!input_vport)
|
||||
goto err_unlock;
|
||||
|
||||
OVS_CB(packet)->input_vport = input_vport;
|
||||
|
||||
local_bh_disable();
|
||||
err = ovs_execute_actions(dp, packet, &flow->key);
|
||||
local_bh_enable();
|
||||
|
Reference in New Issue
Block a user