From patchwork Tue Apr 26 03:48:55 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Yongjun X-Patchwork-Id: 92841 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 913F6B6F29 for ; Tue, 26 Apr 2011 13:49:14 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758264Ab1DZDtJ (ORCPT ); Mon, 25 Apr 2011 23:49:09 -0400 Received: from cn.fujitsu.com ([222.73.24.84]:55207 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1758005Ab1DZDtI (ORCPT ); Mon, 25 Apr 2011 23:49:08 -0400 Received: from tang.cn.fujitsu.com (tang.cn.fujitsu.com [10.167.250.3]) by song.cn.fujitsu.com (Postfix) with ESMTP id D6DEE170121; Tue, 26 Apr 2011 11:49:06 +0800 (CST) Received: from mailserver.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id p3Q3n6C9029635; Tue, 26 Apr 2011 11:49:06 +0800 Received: from [10.167.226.141] ([10.167.226.141]) by mailserver.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.1FP4) with ESMTP id 2011042611493487-144706 ; Tue, 26 Apr 2011 11:49:34 +0800 Message-ID: <4DB640A7.9010802@cn.fujitsu.com> Date: Tue, 26 Apr 2011 11:48:55 +0800 From: Wei Yongjun User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Thunderbird/3.1.7 MIME-Version: 1.0 To: David Miller CC: "netdev@vger.kernel.org" , lksctp Subject: [PATCH net-next-2.6 6/7] sctp: clean up IPv6 route and XFRM lookups References: <4DB63F85.2090609@cn.fujitsu.com> In-Reply-To: <4DB63F85.2090609@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.1FP4|July 25, 2010) at 2011-04-26 11:49:34, Serialize by Router on mailserver/fnst(Release 8.5.1FP4|July 25, 2010) at 2011-04-26 11:49:35, Serialize complete at 2011-04-26 11:49:35 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Using ip6_dst_lookup_flow() instead of ip6_dst_lookup() and then do xfrm_lookup(). Signed-off-by: Wei Yongjun --- net/sctp/ipv6.c | 40 +++++++++------------------------------- 1 files changed, 9 insertions(+), 31 deletions(-) diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 60601f3..cbbfe20 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c @@ -244,30 +244,6 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport) return ip6_xmit(sk, skb, &fl6, np->opt); } -/* Small helper function that combines route and XFRM lookups. This is - * done since we might be looping through route lookups. - */ -static int sctp_v6_dst_lookup(struct sock *sk, struct dst_entry **dst, - struct flowi6 *fl6) -{ - int err; - - err = ip6_dst_lookup(sk, dst, fl6); - if (err) - goto done; - - err = xfrm_lookup(sock_net(sk), *dst, flowi6_to_flowi(fl6), sk, 0); - if (err) - goto done; - - return 0; - -done: - dst_release(*dst); - *dst = NULL; - return err; -} - /* Returns the dst cache entry for the given source and destination ip * addresses. */ @@ -285,7 +261,6 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, __u8 matchlen = 0; __u8 bmatchlen; sctp_scope_t scope; - int err = 0; memset(fl6, 0, sizeof(struct flowi6)); ipv6_addr_copy(&fl6->daddr, &daddr->v6.sin6_addr); @@ -304,7 +279,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, SCTP_DEBUG_PRINTK("SRC=%pI6 - ", &fl6->saddr); } - err = sctp_v6_dst_lookup(sk, &dst, fl6); + dst = ip6_dst_lookup_flow(sk, fl6, NULL, false); + if (!asoc || saddr) goto out; @@ -313,7 +289,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, /* ip6_dst_lookup has filled in the fl6->saddr for us. Check * to see if we can use it. */ - if (!err) { + if (!IS_ERR(dst)) { /* Walk through the bind address list and look for a bind * address that matches the source address of the returned dst. */ @@ -359,18 +335,20 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, if (baddr) { ipv6_addr_copy(&fl6->saddr, &baddr->v6.sin6_addr); fl6->fl6_sport = baddr->v6.sin6_port; - err = sctp_v6_dst_lookup(sk, &dst, fl6); + dst = ip6_dst_lookup_flow(sk, fl6, NULL, false); } out: - t->dst = dst; - if (dst) { + if (!IS_ERR(dst)) { struct rt6_info *rt; rt = (struct rt6_info *)dst; + t->dst = dst; SCTP_DEBUG_PRINTK("rt6_dst:%pI6 rt6_src:%pI6\n", &rt->rt6i_dst.addr, &fl6->saddr); - } else + } else { + t->dst = NULL; SCTP_DEBUG_PRINTK("NO ROUTE\n"); + } } /* Returns the number of consecutive initial bits that match in the 2 ipv6