All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fan Du <fan.du@windriver.com>
To: Neil Horman <nhorman@tuxdriver.com>
Cc: Vlad Yasevich <vyasevich@gmail.com>, <nicolas.dichtel@6wind.com>,
	<davem@davemloft.net>, <netdev@vger.kernel.org>
Subject: Re: [RFC PATCH] sctp: Don't lookup dst if transport dst is still valid
Date: Wed, 3 Jul 2013 10:39:16 +0800	[thread overview]
Message-ID: <51D38ED4.1000000@windriver.com> (raw)
In-Reply-To: <20130702155545.GB324@hmsreliant.think-freely.org>



On 2013年07月02日 23:55, Neil Horman wrote:
> On Tue, Jul 02, 2013 at 10:29:28AM -0400, Vlad Yasevich wrote:
>> On 07/02/2013 02:39 AM, Fan Du wrote:
>>> When sctp sits on IPv6, sctp_transport_dst_check pass cookie as ZERO,
>>> as a result ip6_dst_check always fail out. This behaviour makes
>>> transport->dst useless, because every sctp_packet_transmit must look
>>> for valid dst(Is this what supposed to be?)
>>>
>>> One aggressive way is to call rt_genid_bump which invalid all dst to
>>> make new dst for transport, apparently it also hurts others.
>>> I'm sure this may not be the best for all, so any commnets?
>>>
>>> Signed-off-by: Fan Du<fan.du@windriver.com>
>>> ---
>>>   include/net/sctp/sctp.h |   18 ++++++++++++------
>>>   net/sctp/ipv6.c         |    2 ++
>>>   2 files changed, 14 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
>>> index cd89510..f05af01 100644
>>> --- a/include/net/sctp/sctp.h
>>> +++ b/include/net/sctp/sctp.h
>>> @@ -719,14 +719,20 @@ static inline void sctp_v4_map_v6(union sctp_addr *addr)
>>>   	addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff);
>>>   }
>>>
>>> -/* The cookie is always 0 since this is how it's used in the
>>> - * pmtu code.
>>> - */
>>> +/* Set cookie with the right one for IPv6 and zero for others */
>>>   static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t)
>>>   {
>>> -	if (t->dst&&  !dst_check(t->dst, 0)) {
>>> -		dst_release(t->dst);
>>> -		t->dst = NULL;
>>> +
>>> +	if (t->dst) {
>>> +		struct rt6_info *rt = (struct rt6_info *)t->dst;
>>> +		u32 cookie = 0;
>>> +
>>> +		if ((t->af_specific->sa_family == AF_INET6)&&  rt->rt6i_node)	
>>> +			cookie = rt->rt6i_node->fn_sernum;	
>>> +		if (!dst_check(t->dst, cookie)) {
>>> +			dst_release(t->dst);
>>> +			t->dst = NULL;
>>> +		}
>>>   	}
>>
>> I think it would be better if we stored the dst_cookie in the
>> transport structure and initialized it at lookup time.   If you do
>> that, then if the route table changes, we'd correctly detect it
>> without artificially bumping rt_genid (and hurting ipv4).
>>
> Agreed, thats how we do it for ipv4, IIRC
                                  ^^^^
Hello Neil

I'm sorry I didn't find such things about IPv4.

sctp_transport_dst_check
  -> ipv4_dst_check
    -> rt_is_expired
            ^^^^^^^^^
By "expired", currently we *do* check rt->rt_genid against net->rt_genid,
and for IPv4, every adding/deleting an IPv4 address will bump net->rt_genid,
(this does impact IPv6 dst checking as well) so when I delete an IPv4 address,
ipv4_dst_check failed as expected to look for new dst, basically that's what
I find after checking the code for IPv4 cookie things as mentioned above.
Am I missing something here?


> Neil
>
>> -vlad
>>
>>>
>>>   	return t->dst;
>>> diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
>>> index 8ee553b..cfae77e 100644
>>> --- a/net/sctp/ipv6.c
>>> +++ b/net/sctp/ipv6.c
>>> @@ -137,6 +137,8 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev,
>>>   		break;
>>>   	}
>>>
>>> +	/* invalid all transport dst forcing to look up new dst */
>>> +	rt_genid_bump(net);
>>>   	return NOTIFY_DONE;
>>>   }
>>>
>>>
>>
>>
>

-- 
浮沉随浪只记今朝笑

--fan

  reply	other threads:[~2013-07-03  2:41 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-02  6:39 [RFC PATCH] sctp: Don't lookup dst if transport dst is still valid Fan Du
2013-07-02 14:29 ` Vlad Yasevich
2013-07-02 15:55   ` Neil Horman
2013-07-03  2:39     ` Fan Du [this message]
2013-07-03 13:48       ` Vlad Yasevich
2013-07-02 19:47   ` David Miller
2013-07-03  2:18   ` Fan Du
2013-07-03 13:23     ` Vlad Yasevich
2013-07-03 14:11       ` Vlad Yasevich
2013-07-04  2:33       ` Fan Du
2013-07-05 13:03         ` Neil Horman
2013-07-09  7:11           ` Fan Du
2013-07-09 11:38             ` Neil Horman
2013-07-05 14:09         ` Vlad Yasevich
2013-07-09 15:11           ` Vlad Yasevich
2013-07-10  5:26             ` Fan Du
2013-07-12 11:19               ` Neil Horman
2013-07-16  9:13                 ` Fan Du
2013-07-13 12:21               ` Vlad Yasevich
2013-07-17  7:04                 ` Fan Du
2013-07-12  3:15             ` Fan Du
2013-07-12 22:58               ` David Miller
2013-07-13 12:18                 ` Vlad Yasevich
2013-07-16  9:58                 ` Fan Du

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51D38ED4.1000000@windriver.com \
    --to=fan.du@windriver.com \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    --cc=nhorman@tuxdriver.com \
    --cc=nicolas.dichtel@6wind.com \
    --cc=vyasevich@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.