Message ID | 1421054087-25632-1-git-send-email-fan.du@intel.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Mon, Jan 12, 2015 at 1:14 AM, Fan Du <fan.du@intel.com> wrote: > Introduce vport_route_lookup to consolidate route lookup > shared by vxlan, gre, and geneve ports. > > Signed-off-by: Fan Du <fan.du@intel.com> > --- ... > } > + > +struct rtable *vport_route_lookup(struct ovs_key_ipv4_tunnel *tun_key, > + struct sk_buff *skb, > + struct flowi4 *fl, > + struct net *net, > + u8 protocol) > +{ > + struct rtable *rt; > + > + memset(fl, 0, sizeof(*fl)); > + fl->daddr = tun_key->ipv4_dst; > + fl->saddr = tun_key->ipv4_src; > + fl->flowi4_tos = RT_TOS(tun_key->ipv4_tos); > + fl->flowi4_mark = skb->mark; > + fl->flowi4_proto = protocol; > + > + rt = ip_route_output_key(net, fl); > + return rt; > +} > +EXPORT_SYMBOL_GPL(vport_route_lookup); This is small function and it is in fast path, So can you inline it? > diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h > index 99c8e71..4487a97 100644 > --- a/net/openvswitch/vport.h > +++ b/net/openvswitch/vport.h > @@ -68,6 +68,12 @@ int ovs_tunnel_get_egress_info(struct ovs_tunnel_info *egress_tun_info, > int ovs_vport_get_egress_tun_info(struct vport *vport, struct sk_buff *skb, > struct ovs_tunnel_info *info); > > +struct rtable *vport_route_lookup(struct ovs_key_ipv4_tunnel *tun_key, > + struct sk_buff *skb, > + struct flowi4 *fl, > + struct net *net, > + u8 protocol); > + > /* The following definitions are for implementers of vport devices: */ > Generally net is first parameter for networking functions. Tunnel is better prefix rather than vport for the function name. You can use new function in ovs_tunnel_get_egress_info(). > struct vport_err_stats { > -- > 1.7.1 > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/openvswitch/vport-geneve.c b/net/openvswitch/vport-geneve.c index 484864d..8eef7f6 100644 --- a/net/openvswitch/vport-geneve.c +++ b/net/openvswitch/vport-geneve.c @@ -191,16 +191,7 @@ static int geneve_tnl_send(struct vport *vport, struct sk_buff *skb) } tun_key = &tun_info->tunnel; - - /* Route lookup */ - memset(&fl, 0, sizeof(fl)); - fl.daddr = tun_key->ipv4_dst; - fl.saddr = tun_key->ipv4_src; - fl.flowi4_tos = RT_TOS(tun_key->ipv4_tos); - fl.flowi4_mark = skb->mark; - fl.flowi4_proto = IPPROTO_UDP; - - rt = ip_route_output_key(net, &fl); + rt = vport_route_lookup(tun_key, skb, &fl, net, IPPROTO_UDP); if (IS_ERR(rt)) { err = PTR_ERR(rt); goto error; diff --git a/net/openvswitch/vport-gre.c b/net/openvswitch/vport-gre.c index d4168c4..2f8fdbe 100644 --- a/net/openvswitch/vport-gre.c +++ b/net/openvswitch/vport-gre.c @@ -148,15 +148,7 @@ static int gre_tnl_send(struct vport *vport, struct sk_buff *skb) } tun_key = &OVS_CB(skb)->egress_tun_info->tunnel; - /* Route lookup */ - memset(&fl, 0, sizeof(fl)); - fl.daddr = tun_key->ipv4_dst; - fl.saddr = tun_key->ipv4_src; - fl.flowi4_tos = RT_TOS(tun_key->ipv4_tos); - fl.flowi4_mark = skb->mark; - fl.flowi4_proto = IPPROTO_GRE; - - rt = ip_route_output_key(net, &fl); + rt = vport_route_lookup(tun_key, skb, &fl, net, IPPROTO_GRE); if (IS_ERR(rt)) { err = PTR_ERR(rt); goto err_free_skb; diff --git a/net/openvswitch/vport-vxlan.c b/net/openvswitch/vport-vxlan.c index d7c46b3..13a64ae 100644 --- a/net/openvswitch/vport-vxlan.c +++ b/net/openvswitch/vport-vxlan.c @@ -158,15 +158,7 @@ static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb) } tun_key = &OVS_CB(skb)->egress_tun_info->tunnel; - /* Route lookup */ - memset(&fl, 0, sizeof(fl)); - fl.daddr = tun_key->ipv4_dst; - fl.saddr = tun_key->ipv4_src; - fl.flowi4_tos = RT_TOS(tun_key->ipv4_tos); - fl.flowi4_mark = skb->mark; - fl.flowi4_proto = IPPROTO_UDP; - - rt = ip_route_output_key(net, &fl); + rt = vport_route_lookup(tun_key, skb, &fl, net, IPPROTO_UDP); if (IS_ERR(rt)) { err = PTR_ERR(rt); goto error; diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index 2034c6d..32b0edf 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c @@ -633,3 +633,23 @@ int ovs_vport_get_egress_tun_info(struct vport *vport, struct sk_buff *skb, return vport->ops->get_egress_tun_info(vport, skb, info); } + +struct rtable *vport_route_lookup(struct ovs_key_ipv4_tunnel *tun_key, + struct sk_buff *skb, + struct flowi4 *fl, + struct net *net, + u8 protocol) +{ + struct rtable *rt; + + memset(fl, 0, sizeof(*fl)); + fl->daddr = tun_key->ipv4_dst; + fl->saddr = tun_key->ipv4_src; + fl->flowi4_tos = RT_TOS(tun_key->ipv4_tos); + fl->flowi4_mark = skb->mark; + fl->flowi4_proto = protocol; + + rt = ip_route_output_key(net, fl); + return rt; +} +EXPORT_SYMBOL_GPL(vport_route_lookup); diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h index 99c8e71..4487a97 100644 --- a/net/openvswitch/vport.h +++ b/net/openvswitch/vport.h @@ -68,6 +68,12 @@ int ovs_tunnel_get_egress_info(struct ovs_tunnel_info *egress_tun_info, int ovs_vport_get_egress_tun_info(struct vport *vport, struct sk_buff *skb, struct ovs_tunnel_info *info); +struct rtable *vport_route_lookup(struct ovs_key_ipv4_tunnel *tun_key, + struct sk_buff *skb, + struct flowi4 *fl, + struct net *net, + u8 protocol); + /* The following definitions are for implementers of vport devices: */ struct vport_err_stats {
Introduce vport_route_lookup to consolidate route lookup shared by vxlan, gre, and geneve ports. Signed-off-by: Fan Du <fan.du@intel.com> --- net/openvswitch/vport-geneve.c | 11 +---------- net/openvswitch/vport-gre.c | 10 +--------- net/openvswitch/vport-vxlan.c | 10 +--------- net/openvswitch/vport.c | 20 ++++++++++++++++++++ net/openvswitch/vport.h | 6 ++++++ 5 files changed, 29 insertions(+), 28 deletions(-)