From patchwork Tue Apr 26 03:47:05 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Yongjun X-Patchwork-Id: 92838 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 ECC57B6F17 for ; Tue, 26 Apr 2011 13:47:23 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758229Ab1DZDrT (ORCPT ); Mon, 25 Apr 2011 23:47:19 -0400 Received: from cn.fujitsu.com ([222.73.24.84]:49719 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1758098Ab1DZDrS (ORCPT ); Mon, 25 Apr 2011 23:47:18 -0400 Received: from tang.cn.fujitsu.com (tang.cn.fujitsu.com [10.167.250.3]) by song.cn.fujitsu.com (Postfix) with ESMTP id E099A170116; Tue, 26 Apr 2011 11:47:16 +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 p3Q3lGTt029520; Tue, 26 Apr 2011 11:47:16 +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 2011042611474525-144682 ; Tue, 26 Apr 2011 11:47:45 +0800 Message-ID: <4DB64039.20008@cn.fujitsu.com> Date: Tue, 26 Apr 2011 11:47:05 +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 3/7] sctp: make sctp over IPv6 work with IPsec 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:47:45, Serialize by Router on mailserver/fnst(Release 8.5.1FP4|July 25, 2010) at 2011-04-26 11:47:45, Serialize complete at 2011-04-26 11:47:45 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Vlad Yasevich SCTP never called xfrm_output after it's v6 route lookups so that never really worked with ipsec. Additioanlly, we never passed port nubmers in the flowi, so any port based policies were never applied as well. Now that we can fixed ipv6 routing lookup code, we can add xfrm_output calls and pass port numbers. Signed-off-by: Vlad Yasevich Signed-off-by: Wei Yongjun --- net/sctp/ipv6.c | 34 ++++++++++++++++++++++++++++++++-- 1 files changed, 32 insertions(+), 2 deletions(-) diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index cc9ea37..74fe28c 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c @@ -244,6 +244,30 @@ 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. */ @@ -266,18 +290,23 @@ static struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc, memset(fl6, 0, sizeof(struct flowi6)); ipv6_addr_copy(&fl6->daddr, &daddr->v6.sin6_addr); + fl6->fl6_dport = daddr->v6.sin6_port; if (ipv6_addr_type(&daddr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) fl6->flowi6_oif = daddr->v6.sin6_scope_id; SCTP_DEBUG_PRINTK("%s: DST=%pI6 ", __func__, &fl6->daddr); + if (asoc) + fl6->fl6_sport = htons(asoc->base.bind_addr.port); + if (saddr) { ipv6_addr_copy(&fl6->saddr, &saddr->v6.sin6_addr); + fl6->fl6_sport = saddr->v6.sin6_port; SCTP_DEBUG_PRINTK("SRC=%pI6 - ", &fl6->saddr); } - err = ip6_dst_lookup(sk, &dst, fl6); + err = sctp_v6_dst_lookup(sk, &dst, fl6); if (!asoc || saddr) goto out; @@ -331,7 +360,8 @@ static struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc, rcu_read_unlock(); if (baddr) { ipv6_addr_copy(&fl6->saddr, &baddr->v6.sin6_addr); - err = ip6_dst_lookup(sk, &dst, fl6); + fl6->fl6_sport = baddr->v6.sin6_port; + err = sctp_v6_dst_lookup(sk, &dst, fl6); } out: