Currently tun_info is used for passing tunnel information on ingress and egress path, this cause confusion. Following patch removes its use on ingress path make it egress only parameter.
Signed-off-by: Pravin B Shelar <pshe...@nicira.com> --- datapath/actions.c | 2 +- datapath/datapath.c | 23 +++-------------------- datapath/datapath.h | 8 +++----- datapath/flow.c | 8 ++++---- datapath/flow.h | 3 ++- datapath/vport.c | 11 +++++++++-- 6 files changed, 22 insertions(+), 33 deletions(-) diff --git a/datapath/actions.c b/datapath/actions.c index 6de65d3..62d3ede 100644 --- a/datapath/actions.c +++ b/datapath/actions.c @@ -659,7 +659,7 @@ static int execute_recirc(struct datapath *dp, struct sk_buff *skb, } - ovs_dp_process_packet_with_key(skb, &recirc_key, true); + ovs_dp_process_packet(skb, true); return 0; } diff --git a/datapath/datapath.c b/datapath/datapath.c index 91c65a0..b662dd2 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -250,11 +250,11 @@ void ovs_dp_detach_port(struct vport *p) ovs_vport_del(p); } -void ovs_dp_process_packet_with_key(struct sk_buff *skb, - struct sw_flow_key *pkt_key, - bool recirc) +/* Must be called with rcu_read_lock. */ +void ovs_dp_process_packet(struct sk_buff *skb, bool recirc) { const struct vport *p = OVS_CB(skb)->input_vport; + struct sw_flow_key *pkt_key = OVS_CB(skb)->pkt_key; struct datapath *dp = p->dp; struct sw_flow *flow; struct dp_stats_percpu *stats; @@ -262,7 +262,6 @@ void ovs_dp_process_packet_with_key(struct sk_buff *skb, u32 n_mask_hit; stats = this_cpu_ptr(dp->stats_percpu); - OVS_CB(skb)->pkt_key = pkt_key; /* Look up flow. */ flow = ovs_flow_tbl_lookup_stats(&dp->table, pkt_key, skb_get_hash(skb), @@ -293,22 +292,6 @@ out: u64_stats_update_end(&stats->sync); } -/* Must be called with rcu_read_lock. */ -void ovs_dp_process_received_packet(struct sk_buff *skb) -{ - int error; - struct sw_flow_key key; - - /* Extract flow from 'skb' into 'key'. */ - error = ovs_flow_key_extract(skb, &key); - if (unlikely(error)) { - kfree_skb(skb); - return; - } - - ovs_dp_process_packet_with_key(skb, &key, false); -} - int ovs_dp_upcall(struct datapath *dp, struct sk_buff *skb, const struct dp_upcall_info *upcall_info) { diff --git a/datapath/datapath.h b/datapath/datapath.h index fb37fa1..684ac51 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -98,8 +98,8 @@ struct datapath { * struct ovs_skb_cb - OVS data in skb CB * @flow: The flow associated with this packet. May be %NULL if no flow. * @pkt_key: The flow information extracted from the packet. Must be nonnull. - * @tun_info: Tunnel information about this packet. NULL if the packet - * is not being tunneled. + * @tun_info: Tunnel information about this packet on egress path. NULL if the + * packet is not being tunneled. * @input_vport: The original vport packet came in on. This value is cached * when a packet is received by OVS. */ @@ -188,9 +188,7 @@ extern struct notifier_block ovs_dp_device_notifier; extern struct genl_family dp_vport_genl_family; extern struct genl_multicast_group ovs_dp_vport_multicast_group; -void ovs_dp_process_received_packet(struct sk_buff *); -void ovs_dp_process_packet_with_key(struct sk_buff *, - struct sw_flow_key *pkt_key, bool recirc); +void ovs_dp_process_packet(struct sk_buff *, bool recirc); void ovs_dp_detach_port(struct vport *); int ovs_dp_upcall(struct datapath *, struct sk_buff *, const struct dp_upcall_info *); diff --git a/datapath/flow.c b/datapath/flow.c index 1feca85..00819e7 100644 --- a/datapath/flow.c +++ b/datapath/flow.c @@ -669,16 +669,16 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) } } + OVS_CB(skb)->pkt_key = key; return 0; } -int ovs_flow_key_extract(struct sk_buff *skb, struct sw_flow_key *key) +int ovs_flow_key_extract(struct ovs_tunnel_info *tun_info, struct sk_buff *skb, + struct sw_flow_key *key) { /* Extract metadata from packet. */ - if (OVS_CB(skb)->tun_info) { - struct ovs_tunnel_info *tun_info = OVS_CB(skb)->tun_info; - + if (tun_info) { memcpy(&key->tun_key, &tun_info->tunnel, sizeof(key->tun_key)); BUILD_BUG_ON(((1 << (sizeof(tun_info->options_len) * 8)) - 1) > diff --git a/datapath/flow.h b/datapath/flow.h index ee63b8b..30a3c55 100644 --- a/datapath/flow.h +++ b/datapath/flow.h @@ -222,7 +222,8 @@ void ovs_flow_stats_get(const struct sw_flow *, struct ovs_flow_stats *, void ovs_flow_stats_clear(struct sw_flow *); u64 ovs_flow_used_time(unsigned long flow_jiffies); -int ovs_flow_key_extract(struct sk_buff *skb, struct sw_flow_key *key); +int ovs_flow_key_extract(struct ovs_tunnel_info *tun_info, + struct sk_buff *skb, struct sw_flow_key *key); /* Extract key from packet coming from userspace. */ int ovs_flow_key_extract_userspace(const struct nlattr *attr, struct sk_buff *skb, diff --git a/datapath/vport.c b/datapath/vport.c index 5d250aa..2b218e8 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -475,6 +475,8 @@ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb, struct ovs_tunnel_info *tun_info) { struct pcpu_sw_netstats *stats; + struct sw_flow_key key; + int error; stats = this_cpu_ptr(vport->percpu_stats); u64_stats_update_begin(&stats->syncp); @@ -483,9 +485,14 @@ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb, u64_stats_update_end(&stats->syncp); ovs_skb_init_inner_protocol(skb); - OVS_CB(skb)->tun_info = tun_info; OVS_CB(skb)->input_vport = vport; - ovs_dp_process_received_packet(skb); + error = ovs_flow_key_extract(tun_info, skb, &key); + if (unlikely(error)) { + kfree_skb(skb); + return; + } + + ovs_dp_process_packet(skb, false); } /** -- 1.7.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev