From hadi@cyberus.ca Tue Oct 1 02:58:45 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 02:58:48 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g919wjtG021237 for ; Tue, 1 Oct 2002 02:58:45 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id FAA06726; Tue, 1 Oct 2002 05:58:39 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g919pTl17793; Tue, 1 Oct 2002 05:51:29 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Tue, 1 Oct 2002 05:51:28 -0400 (EDT) From: jamal To: Eric Lemoine cc: Eric Lemoine , Subject: Re: PATCH Re: udp weirdness In-Reply-To: <20021001063557.GA331@hookipa> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 447 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Tue, 1 Oct 2002, Eric Lemoine wrote: > Jamal, > > Have you posted the right patch? ;-> I dont know what happened; patch below is what i was trying to post I deleted all the old patches this time to make sure ;-> > I see that sk->protinfo.af_inet.recverr is > still around. Here follows the patch that I think is the correct one. > Please confirm. Thx. > Yes it is correct but was missing one more bit from v6 added below. Alexey/Dave this is the correct version ;-> cheers, jamal --- linux/net/ipv4/ip_output.c 2002/09/29 08:50:36 1.1 +++ linux/net/ipv4/ip_output.c 2002/09/30 09:11:15 @@ -603,8 +603,8 @@ err = NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dst->dev, output_maybe_reroute); if (err) { - if (err > 0) - err = sk->protinfo.af_inet.recverr ? net_xmit_errno(err) : 0; + if (err > 0) + err = net_xmit_errno(err); if (err) goto error; } @@ -713,8 +713,8 @@ err = NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev, output_maybe_reroute); - if (err > 0) - err = sk->protinfo.af_inet.recverr ? net_xmit_errno(err) : 0; + if (err > 0) + err = net_xmit_errno(err); if (err) goto error; out: --- linux/net/ipv6/ip6_output.c 2002/09/30 18:30:52 1.1 +++ linux/net/ipv6/ip6_output.c 2002/09/30 18:31:30 @@ -684,7 +684,7 @@ out: ip6_dst_store(sk, dst, fl->nl_u.ip6_u.daddr == &np->daddr ? &np->daddr : NULL); if (err > 0) - err = np->recverr ? net_xmit_errno(err) : 0; + err = net_xmit_errno(err); return err; } From kuznet@ms2.inr.ac.ru Tue Oct 1 06:54:23 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 06:54:25 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91DsLtG012338 for ; Tue, 1 Oct 2002 06:54:22 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id RAA19504; Tue, 1 Oct 2002 17:53:13 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200210011353.RAA19504@sex.inr.ac.ru> Subject: Re: PATCH Re: udp weirdness To: hadi@cyberus.CA (jamal) Date: Tue, 1 Oct 2002 17:53:13 +0400 (MSD) Cc: netdev@oss.sgi.com In-Reply-To: from "jamal" at Oct 1, 2 04:45:01 am X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 448 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > be propagated back to the socket level; please review and probably > apply: That was tried and failed miserably ages ago. Applications become insane when getting this error from logging tons of useless messages to abort()ing and cpu hogging. From the other hand silent reaction to loss is almost exactly desired behaviour in presence of congestion in the most of cases. I have no idea, why that OSes work. Probably, they are so great that never lose packets. We do. Probably, the world has changed since that time, but I have no desire to repeat the experiment to be honest. Alexey From hadi@cyberus.ca Tue Oct 1 07:21:18 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 07:21:20 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91ELHtG012986 for ; Tue, 1 Oct 2002 07:21:17 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id KAA00161; Tue, 1 Oct 2002 10:21:16 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g91EE4618484; Tue, 1 Oct 2002 10:14:05 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Tue, 1 Oct 2002 10:14:04 -0400 (EDT) From: jamal To: cc: Eric Lemoine , Eric Lemoine , Subject: Re: PATCH Re: udp weirdness In-Reply-To: <200210011353.RAA19504@sex.inr.ac.ru> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 449 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Alexey, I agree; so just ignore the patch. You know you could have saved me about an hour if you spoke earlier ;-> Eric, note what Alexey says. So to get enobufs please use the sockoption to set IP_RECVERR Someone should document this in the manpages. cheers, jamal On Tue, 1 Oct 2002 kuznet@ms2.inr.ac.ru wrote: > Hello! > > > be propagated back to the socket level; please review and probably > > apply: > > That was tried and failed miserably ages ago. Applications become > insane when getting this error from logging tons of useless messages > to abort()ing and cpu hogging. From the other hand silent reaction > to loss is almost exactly desired behaviour in presence of congestion > in the most of cases. > > I have no idea, why that OSes work. Probably, they are so great that > never lose packets. We do. > > Probably, the world has changed since that time, but I have no desire > to repeat the experiment to be honest. > > Alexey > > > From cfriesen@nortelnetworks.com Tue Oct 1 07:26:55 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 07:26:58 -0700 (PDT) Received: from zcars04e.ca.nortel.com (zcars04e.nortelnetworks.com [47.129.242.56]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91EQstG013395 for ; Tue, 1 Oct 2002 07:26:55 -0700 Received: from zcard309.ca.nortel.com (zcard309.ca.nortel.com [47.129.242.69]) by zcars04e.ca.nortel.com (Switch-2.2.0/Switch-2.2.0) with ESMTP id g91EQ1b05317; Tue, 1 Oct 2002 10:26:01 -0400 (EDT) Received: from zcard0k6.ca.nortel.com ([47.129.242.158]) by zcard309.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLKB8Y36; Tue, 1 Oct 2002 10:26:05 -0400 Received: from pcard0ks.ca.nortel.com ([47.129.117.131]) by zcard0k6.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLK1S392; Tue, 1 Oct 2002 10:26:05 -0400 Received: from nortelnetworks.com (localhost.localdomain [127.0.0.1]) by pcard0ks.ca.nortel.com (Postfix) with ESMTP id E6BAB2E112; Tue, 1 Oct 2002 10:26:03 -0400 (EDT) Message-ID: <3D99B07B.7050901@nortelnetworks.com> Date: Tue, 01 Oct 2002 10:26:03 -0400 X-Sybari-Space: 00000000 00000000 00000000 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: kuznet@ms2.inr.ac.ru Cc: jamal , netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: <200210011353.RAA19504@sex.inr.ac.ru> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 450 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cfriesen@nortelnetworks.com Precedence: bulk X-list: netdev kuznet@ms2.inr.ac.ru wrote: > That was tried and failed miserably ages ago. Applications become > insane when getting this error from logging tons of useless messages > to abort()ing and cpu hogging. From the other hand silent reaction > to loss is almost exactly desired behaviour in presence of congestion > in the most of cases. > > I have no idea, why that OSes work. Probably, they are so great that > never lose packets. We do. One of the principles of software design that I was taught was the principle of least surprise. If I'm looping on a sendto() with a blocking socket, I would expect the syscall to block until the packet has been handed off to the device driver. This may mean blocking until local congestion backs off. If I'm using non-blocking IO and there is local congestion, I would expect to get ENOBUFS or maybe EAGAIN/EWOULDBLOCK. The way we do it now means that we can chew up massive amounts of cpu creating packets in userspace and throwing them away in the kernel, with no way of knowing from userspace that it is happening. This just doesn't seem like the right thing to do. Chris From kuznet@ms2.inr.ac.ru Tue Oct 1 07:41:25 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 07:41:31 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91EfNtG013926 for ; Tue, 1 Oct 2002 07:41:24 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id SAA19721; Tue, 1 Oct 2002 18:40:12 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200210011440.SAA19721@sex.inr.ac.ru> Subject: Re: PATCH Re: udp weirdness To: cfriesen@nortelnetworks.com (Chris Friesen) Date: Tue, 1 Oct 2002 18:40:12 +0400 (MSD) Cc: hadi@cyberus.CA, netdev@oss.sgi.com In-Reply-To: <3D99B07B.7050901@nortelnetworks.com> from "Chris Friesen" at Oct 1, 2 10:26:03 am X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 451 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > If I'm looping on a sendto() with a blocking socket, I would expect the > syscall to block until the packet has been handed off to the device > driver. This may mean blocking until local congestion backs off. Feel free to implement. :-) > The way we do it now means that we can chew up massive amounts of cpu > creating packets in userspace and throwing them away in the kernel, with > no way of knowing from userspace that it is happening. What? If your applications is enough clever to handle ENOBUFS right, set IP_RECVERR and live in peace. Alexey From cfriesen@nortelnetworks.com Tue Oct 1 07:53:38 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 07:53:39 -0700 (PDT) Received: from zcars04e.ca.nortel.com (zcars04e.nortelnetworks.com [47.129.242.56]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91ErbtG014599 for ; Tue, 1 Oct 2002 07:53:37 -0700 Received: from zcard309.ca.nortel.com (zcard309.ca.nortel.com [47.129.242.69]) by zcars04e.ca.nortel.com (Switch-2.2.0/Switch-2.2.0) with ESMTP id g91Eqqb08453; Tue, 1 Oct 2002 10:52:52 -0400 (EDT) Received: from zcard0k6.ca.nortel.com ([47.129.242.158]) by zcard309.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLKB8ZRM; Tue, 1 Oct 2002 10:52:56 -0400 Received: from pcard0ks.ca.nortel.com ([47.129.117.131]) by zcard0k6.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLK1SPC7; Tue, 1 Oct 2002 10:52:56 -0400 Received: from nortelnetworks.com (localhost.localdomain [127.0.0.1]) by pcard0ks.ca.nortel.com (Postfix) with ESMTP id 7A7EE2E112; Tue, 1 Oct 2002 10:52:55 -0400 (EDT) Message-ID: <3D99B6C7.3010302@nortelnetworks.com> Date: Tue, 01 Oct 2002 10:52:55 -0400 X-Sybari-Space: 00000000 00000000 00000000 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: kuznet@ms2.inr.ac.ru Cc: hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: <200210011440.SAA19721@sex.inr.ac.ru> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 452 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cfriesen@nortelnetworks.com Precedence: bulk X-list: netdev kuznet@ms2.inr.ac.ru wrote: > Feel free to implement. :-) I may have to poke around...if nothing else I'll learn more about the networking code... > What? If your applications is enough clever to handle ENOBUFS right, > set IP_RECVERR and live in peace. The original poster was complaining about messages being silently dropped when there is congestion. If IP_RECVERR is turned on, would sendto() then return -1 so I know to try and read the error messages? I'm assuming I get ENOBUFS back in the ee_code field? Or can I get away with reading errno and ignoring the error queue? I've never used IP_RECVERR and there doesn't seem to be a lot of documentation about it. Chris From kuznet@ms2.inr.ac.ru Tue Oct 1 08:32:56 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 08:33:00 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91FWstG016070 for ; Tue, 1 Oct 2002 08:32:55 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id TAA19943; Tue, 1 Oct 2002 19:31:37 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200210011531.TAA19943@sex.inr.ac.ru> Subject: Re: PATCH Re: udp weirdness To: cfriesen@nortelnetworks.com (Chris Friesen) Date: Tue, 1 Oct 2002 19:31:37 +0400 (MSD) Cc: hadi@cyberus.CA, netdev@oss.sgi.com In-Reply-To: <3D99B6C7.3010302@nortelnetworks.com> from "Chris Friesen" at Oct 1, 2 10:52:55 am X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 453 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > > Feel free to implement. :-) > > I may have to poke around...if nothing else I'll learn more about the > networking code... It is difficult task, if possible at all. The main obstacle is that we must not block after select() succeeded, otherwise applications will lockup. Taking into account nature of datagram services (and generally of networking services, where routes change et al.) you do not know at time of select(), where the datagram will go. So, blocking can be made only based on a criterium not depending on this. We use sndbuf (like all the OSes). Actually, the problem with silent losses is solved by tuning SO_SNDBUF. Though it is not a complete solution (failing whith lots of senders), it solves all those bullshit problems with silent losses. People just do not care about this, so they get the thing which they deserve. > dropped when there is congestion. If IP_RECVERR is turned on, would > sendto() then return -1 so I know to try and read the error messages? Yes. > I'm assuming I get ENOBUFS back in the ee_code field? Or can I get away > with reading errno and ignoring the error queue? No, error queue should be read. But not all the errors are queued, only those which are supported asynchronously. ENOBUFS is still not. F.e. when packet is dropped lately (some qdiscs do this, dropping already queued packets to give place for another ones) ENOBUFS is not sent back. > there doesn't seem to be a lot of > documentation about it. Damn! (I'm sorry) It is documented _very_ well, thanks to Andi. I really hate this mode when people do not worrying even to look to manpages before pronouncing such statements. man recvmsg man ip Alexey From cfriesen@nortelnetworks.com Tue Oct 1 09:17:27 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 09:17:30 -0700 (PDT) Received: from zcars04f.ca.nortel.com (zcars04f.nortelnetworks.com [47.129.242.57]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91GHQtG023810 for ; Tue, 1 Oct 2002 09:17:27 -0700 Received: from zcard309.ca.nortel.com (zcard309.ca.nortel.com [47.129.242.69]) by zcars04f.ca.nortel.com (Switch-2.2.0/Switch-2.2.0) with ESMTP id g91GGie23826; Tue, 1 Oct 2002 12:16:44 -0400 (EDT) Received: from zcard0k6.ca.nortel.com ([47.129.242.158]) by zcard309.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLKB872A; Tue, 1 Oct 2002 12:16:47 -0400 Received: from pcard0ks.ca.nortel.com ([47.129.117.131]) by zcard0k6.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLK1SPNY; Tue, 1 Oct 2002 12:16:46 -0400 Received: from nortelnetworks.com (localhost.localdomain [127.0.0.1]) by pcard0ks.ca.nortel.com (Postfix) with ESMTP id CCE512E112; Tue, 1 Oct 2002 12:16:45 -0400 (EDT) Message-ID: <3D99CA6D.5020808@nortelnetworks.com> Date: Tue, 01 Oct 2002 12:16:45 -0400 X-Sybari-Space: 00000000 00000000 00000000 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: kuznet@ms2.inr.ac.ru Cc: hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: <200210011531.TAA19943@sex.inr.ac.ru> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 454 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cfriesen@nortelnetworks.com Precedence: bulk X-list: netdev kuznet@ms2.inr.ac.ru wrote: > But not all the errors are queued, > only those which are supported asynchronously. ENOBUFS is still not. > F.e. when packet is dropped lately (some qdiscs do this, dropping already > queued packets to give place for another ones) ENOBUFS is not sent back. Hmm...so even with IP_RECVERR I may not be notified if the packet is dropped? >> there doesn't seem to be a lot of >>documentation about it. >> > > Damn! (I'm sorry) It is documented _very_ well, thanks to Andi. > I really hate this mode when people do not worrying even to look to manpages > before pronouncing such statements. > > man recvmsg > man ip Yes, I looked at both of those, and man udp as well. My point about a lack of documentation was more related to corner cases and exactly what gets returned when. The example above (where there are cases where no errors are returned even with IP_RECVERR turned on) is not mentioned anywhere in the documentation. I write code for a telephony softswitch. We are running a legacy app on top of an emulator on top of linux. I want to ensure that my packets either a) got out onto the wire, or b) my app got an error message back explaining why the message didn't get onto the wire so that it can decide how to proceed. Now my overall bandwidth requirements aren't too bad, but the traffic is bursty, with a batch of messages being sent in a tight sendto() loop. I do NOT want messages to be silently dropped in the kernel with no error returned. Chris From kuznet@ms2.inr.ac.ru Tue Oct 1 09:43:07 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 09:43:11 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91Gh6tG024457 for ; Tue, 1 Oct 2002 09:43:06 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id UAA20171; Tue, 1 Oct 2002 20:41:48 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200210011641.UAA20171@sex.inr.ac.ru> Subject: Re: PATCH Re: udp weirdness To: cfriesen@nortelnetworks.com (Chris Friesen) Date: Tue, 1 Oct 2002 20:41:48 +0400 (MSD) Cc: hadi@cyberus.CA, netdev@oss.sgi.com In-Reply-To: <3D99CA6D.5020808@nortelnetworks.com> from "Chris Friesen" at Oct 1, 2 12:16:45 pm X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 455 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > Hmm...so even with IP_RECVERR I may not be notified if the packet is > dropped? Do you not jest occasionally? :-) "Even" sounds interesting, because this kind of errors cannot be reported _principially_ without IP_RECVERR, providing asynchronous error reporting. Packet can be dropped, damaged _after_ they are successfully queued to the device. And this need not to be emphasized in documentation on IP_RECVERR, except for a section "FUTURE DEVELOPMENT". > either a) got out onto the wire, or b) my app got an error message back > explaining why the message didn't get onto the wire so that it can > decide how to proceed. Then use IP_RECVERR. It reports all the errors which are detectable. Alexey From greearb@candelatech.com Tue Oct 1 09:43:15 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 09:43:16 -0700 (PDT) Received: from grok.yi.org (IDENT:+3kPCMZcqQIMGRTtx1WUDUzg3EUpwKJq@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91GhEtG024506 for ; Tue, 1 Oct 2002 09:43:14 -0700 Received: from candelatech.com (IDENT:Z1MlOQXjxRPsv8IjHRwTjKgD/07ZMtNR@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g91Gg9v13318; Tue, 1 Oct 2002 09:42:09 -0700 Message-ID: <3D99D061.1090208@candelatech.com> Date: Tue, 01 Oct 2002 09:42:09 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722 X-Accept-Language: en-us, en MIME-Version: 1.0 To: kuznet@ms2.inr.ac.ru CC: Chris Friesen , hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: <200210011531.TAA19943@sex.inr.ac.ru> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 456 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev kuznet@ms2.inr.ac.ru wrote: > Hello! > > >>>Feel free to implement. :-) >> >>I may have to poke around...if nothing else I'll learn more about the >>networking code... > > > It is difficult task, if possible at all. > > The main obstacle is that we must not block after select() succeeded, > otherwise applications will lockup. Taking into account nature of datagram > services (and generally of networking services, where routes change et al.) > you do not know at time of select(), where the datagram will go. > So, blocking can be made only based on a criterium not depending on this. > > We use sndbuf (like all the OSes). Actually, the problem with silent > losses is solved by tuning SO_SNDBUF. Though it is not a complete > solution (failing whith lots of senders), it solves all those bullshit > problems with silent losses. People just do not care about this, so > they get the thing which they deserve. Changing the size of the sending buffer will make you able to drop fewer packets in bursty behaviour, but it does not guarantee you anything, does it? For those of us wanting to write programs with very little slop in their behaviour, 'most of the time' is not good enough. I have not yet looked at the UDP code in detail, but it does appear we can know if a NIC accepts the packet for transmit or not. If it does not, then just don't dequeue off of the send list, retry it next time. I cannot see any logical reason that we cannot ensure that a packet is not at least given to the driver when accepted by sendto. As soon as I get my pktgen and send-to-self code cleaned up, I am planning to start working on making UDP reliably send packets, or return an error to the calling code. I will, of course, keep you informed if I actually get something working... Enjoy, Ben > > > >>dropped when there is congestion. If IP_RECVERR is turned on, would >>sendto() then return -1 so I know to try and read the error messages? > > > Yes. > > > >>I'm assuming I get ENOBUFS back in the ee_code field? Or can I get away >>with reading errno and ignoring the error queue? > > > No, error queue should be read. But not all the errors are queued, > only those which are supported asynchronously. ENOBUFS is still not. > F.e. when packet is dropped lately (some qdiscs do this, dropping already > queued packets to give place for another ones) ENOBUFS is not sent back. > > > >> there doesn't seem to be a lot of >>documentation about it. > > > Damn! (I'm sorry) It is documented _very_ well, thanks to Andi. > I really hate this mode when people do not worrying even to look to manpages > before pronouncing such statements. > > man recvmsg > man ip > > Alexey > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From cfriesen@nortelnetworks.com Tue Oct 1 09:59:49 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 09:59:51 -0700 (PDT) Received: from zcars04e.ca.nortel.com (zcars04e.nortelnetworks.com [47.129.242.56]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91GxntG025765 for ; Tue, 1 Oct 2002 09:59:49 -0700 Received: from zcard309.ca.nortel.com (zcard309.ca.nortel.com [47.129.242.69]) by zcars04e.ca.nortel.com (Switch-2.2.0/Switch-2.2.0) with ESMTP id g91Gwrb02265; Tue, 1 Oct 2002 12:58:53 -0400 (EDT) Received: from zcard0k6.ca.nortel.com ([47.129.242.158]) by zcard309.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLKB88KP; Tue, 1 Oct 2002 12:58:57 -0400 Received: from pcard0ks.ca.nortel.com ([47.129.117.131]) by zcard0k6.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLK1SPS1; Tue, 1 Oct 2002 12:58:56 -0400 Received: from nortelnetworks.com (localhost.localdomain [127.0.0.1]) by pcard0ks.ca.nortel.com (Postfix) with ESMTP id 25E732E112; Tue, 1 Oct 2002 12:58:56 -0400 (EDT) Message-ID: <3D99D44F.2010001@nortelnetworks.com> Date: Tue, 01 Oct 2002 12:58:55 -0400 X-Sybari-Space: 00000000 00000000 00000000 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: Ben Greear Cc: kuznet@ms2.inr.ac.ru, hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: <200210011531.TAA19943@sex.inr.ac.ru> <3D99D061.1090208@candelatech.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 457 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cfriesen@nortelnetworks.com Precedence: bulk X-list: netdev Ben Greear wrote: > I cannot see any logical reason that we cannot ensure that a packet is > not at least given to the driver when accepted by sendto. As soon as I > get my pktgen and send-to-self code cleaned up, I am planning to start > working on making UDP reliably send packets, or return an error to > the calling code. I will, of course, keep you informed if I actually > get something working... That would be fantastic. Chris From cfriesen@nortelnetworks.com Tue Oct 1 10:18:16 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 10:18:21 -0700 (PDT) Received: from zcars04e.ca.nortel.com (zcars04e.nortelnetworks.com [47.129.242.56]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91HIGtG026866 for ; Tue, 1 Oct 2002 10:18:16 -0700 Received: from zcard307.ca.nortel.com (americasm07.nt.com [47.129.242.67]) by zcars04e.ca.nortel.com (Switch-2.2.0/Switch-2.2.0) with ESMTP id g91HHWb08141; Tue, 1 Oct 2002 13:17:32 -0400 (EDT) Received: from zcard0k6.ca.nortel.com ([47.129.242.158]) by zcard307.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id T9BXJP9K; Tue, 1 Oct 2002 13:17:35 -0400 Received: from pcard0ks.ca.nortel.com ([47.129.117.131]) by zcard0k6.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLK1SPT6; Tue, 1 Oct 2002 13:17:35 -0400 Received: from nortelnetworks.com (localhost.localdomain [127.0.0.1]) by pcard0ks.ca.nortel.com (Postfix) with ESMTP id E71F62E112; Tue, 1 Oct 2002 13:17:34 -0400 (EDT) Message-ID: <3D99D8AE.3070205@nortelnetworks.com> Date: Tue, 01 Oct 2002 13:17:34 -0400 X-Sybari-Space: 00000000 00000000 00000000 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: kuznet@ms2.inr.ac.ru Cc: hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: <200210011641.UAA20171@sex.inr.ac.ru> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 458 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cfriesen@nortelnetworks.com Precedence: bulk X-list: netdev kuznet@ms2.inr.ac.ru wrote: >>Hmm...so even with IP_RECVERR I may not be notified if the packet is >>dropped? >> > > Do you not jest occasionally? :-) "Even" sounds interesting, because > this kind of errors cannot be reported _principially_ without IP_RECVERR, > providing asynchronous error reporting. The point that I fundamentally need IP_RECVERR for async errors is interesting, I'll have to look into that. Thanks for the pointer. > Packet can be dropped, damaged _after_ they are successfully queued > to the device. And this need not to be emphasized in documentation > on IP_RECVERR, except for a section "FUTURE DEVELOPMENT". This is certainly true, but I would hope that packets being damaged or dropped after being queued to the device would be a rare event. It would still be good to have them reported though. I understand the problems with regards to blocking sockets, since you can't block after the select() passes and select() doesn't know where the packet is going. It seems that it should be pretty straightforward to enable ENOBUFS for nonblocking sockets though--am I missing something? For now I'll play with SO_SNDBUF and IP_RECVERR. Thanks, Chris From hadi@cyberus.ca Tue Oct 1 11:02:46 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 11:02:52 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91I2jtG027586 for ; Tue, 1 Oct 2002 11:02:46 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id OAA16508; Tue, 1 Oct 2002 14:02:44 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g91HtQM19334; Tue, 1 Oct 2002 13:55:34 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Tue, 1 Oct 2002 13:55:24 -0400 (EDT) From: jamal To: Ben Greear cc: , Chris Friesen , Subject: Re: PATCH Re: udp weirdness In-Reply-To: <3D99D061.1090208@candelatech.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 459 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Tue, 1 Oct 2002, Ben Greear wrote: > get my pktgen and send-to-self code cleaned up, I am planning to start > working on making UDP reliably send packets, or return an error to > the calling code. I will, of course, keep you informed if I actually > get something working... If you want realibility then thats what TCP is for. I am curious why you would even want to retransmit a voice packet or why a local drop should be treated any different from a remote/network drop in a voice application ... When you fail in sendto/sendmsg, errno is set to ENOBUFS as long as you set IP_RECVERR in the socket options; you can also receive ICMP errors as described in the manpages (use a msg_control buffer and call recvmsg with MSG_ERRQUEUE). BTW, a good sample of an app that makes good use of ENOBUFS to do congestion control, IP_RECVERR and MSG_ERRQUEUE is the ping app in Alexeys iputils package. Why did i not remember all this before chasing the phantom with Eric is an indication i need to increase my cafeine consumption. cheers, jamal From cfriesen@nortelnetworks.com Tue Oct 1 11:37:35 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 11:37:39 -0700 (PDT) Received: from zcars04e.ca.nortel.com (zcars04e.nortelnetworks.com [47.129.242.56]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91IbYtG028930 for ; Tue, 1 Oct 2002 11:37:35 -0700 Received: from zcard307.ca.nortel.com (americasm01.nt.com [47.129.242.67]) by zcars04e.ca.nortel.com (Switch-2.2.0/Switch-2.2.0) with ESMTP id g91Iajb20474; Tue, 1 Oct 2002 14:36:45 -0400 (EDT) Received: from zcard0k6.ca.nortel.com ([47.129.242.158]) by zcard307.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id T9BXJX0D; Tue, 1 Oct 2002 14:36:49 -0400 Received: from pcard0ks.ca.nortel.com ([47.129.117.131]) by zcard0k6.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLK1SP8Y; Tue, 1 Oct 2002 14:36:49 -0400 Received: from nortelnetworks.com (localhost.localdomain [127.0.0.1]) by pcard0ks.ca.nortel.com (Postfix) with ESMTP id 73BC42E112; Tue, 1 Oct 2002 14:36:48 -0400 (EDT) Message-ID: <3D99EB40.8030006@nortelnetworks.com> Date: Tue, 01 Oct 2002 14:36:48 -0400 X-Sybari-Space: 00000000 00000000 00000000 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: jamal Cc: Ben Greear , kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 460 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cfriesen@nortelnetworks.com Precedence: bulk X-list: netdev jamal wrote: > > On Tue, 1 Oct 2002, Ben Greear wrote: > > >>get my pktgen and send-to-self code cleaned up, I am planning to start >>working on making UDP reliably send packets, or return an error to >>the calling code. I will, of course, keep you informed if I actually >>get something working... >> > > If you want realibility then thats what TCP is for. There is a requirement to interwork with other equipment using UDP. > I am curious why you would even want to retransmit a voice packet or > why a local drop should be treated any different from a remote/network > drop in a voice application ... The legacy app generates batches of messages, and the emulator layer then sends them out in a tight loop on sendto(). I don't want packets to be silently dropped by the kernel because userspace is sending faster than they can get onto the wire during that tight loop. Eric's original testcase was a tight loop on sendto() resulting in userspace sending at a way higher rate than could be put onto the wire, so the kernel was silently dropping them. This is exactly what I want to avoid. > When you fail in sendto/sendmsg, errno is set to ENOBUFS as long as you > set IP_RECVERR in the socket options; you can also receive ICMP errors > as described in the manpages (use a msg_control buffer and call recvmsg > with MSG_ERRQUEUE). Okay, so with IP_RECVERR set the case that Eric saw will not happen? I mean that sendto() will return with -1 and errno set to ENOBUFS? > BTW, a good sample of an app that makes good use of ENOBUFS to do > congestion control, IP_RECVERR and MSG_ERRQUEUE is the ping app in Alexeys > iputils package. Why did i not remember all this before chasing the > phantom with Eric is an indication i need to increase my cafeine > consumption I'll take a look and try things out. Chris From hadi@cyberus.ca Tue Oct 1 11:42:50 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 11:42:52 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91IgntG029439 for ; Tue, 1 Oct 2002 11:42:50 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id OAA06351; Tue, 1 Oct 2002 14:42:49 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g91IZen19527; Tue, 1 Oct 2002 14:35:40 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Tue, 1 Oct 2002 14:35:39 -0400 (EDT) From: jamal To: Chris Friesen cc: Ben Greear , , Subject: Re: PATCH Re: udp weirdness In-Reply-To: <3D99EB40.8030006@nortelnetworks.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 461 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Tue, 1 Oct 2002, Chris Friesen wrote: > to be silently dropped by the kernel because userspace is sending faster > than they can get onto the wire during that tight loop. > So what happens when you find packets being dropped? AFAIK, a dropped voice packet is as good as dead whether local or remote. > Okay, so with IP_RECVERR set the case that Eric saw will not happen? I > mean that sendto() will return with -1 and errno set to ENOBUFS? yes cheers, jamal From greearb@candelatech.com Tue Oct 1 11:55:17 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 11:55:22 -0700 (PDT) Received: from grok.yi.org (IDENT:7j8GuCDOJPZpaMqyYBhAHz5ipY6DCEta@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91ItCtG026093 for ; Tue, 1 Oct 2002 11:55:17 -0700 Received: from candelatech.com (IDENT:7ZM3In3GMZHz9sCBGglawMjMH4SHKx+p@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g91Iq2v00861; Tue, 1 Oct 2002 11:52:03 -0700 Message-ID: <3D99EED2.7020301@candelatech.com> Date: Tue, 01 Oct 2002 11:52:02 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722 X-Accept-Language: en-us, en MIME-Version: 1.0 To: jamal CC: kuznet@ms2.inr.ac.ru, Chris Friesen , netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 462 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev jamal wrote: > > On Tue, 1 Oct 2002, Ben Greear wrote: > > >>get my pktgen and send-to-self code cleaned up, I am planning to start >>working on making UDP reliably send packets, or return an error to >>the calling code. I will, of course, keep you informed if I actually >>get something working... > > > If you want realibility then thats what TCP is for. > I am curious why you would even want to retransmit a voice packet or > why a local drop should be treated any different from a remote/network > drop in a voice application ... Don't worry so much about why I want to do this, just assume that I do! :) I have explained in the past, but since our needs are different, it does not seem to impress upon anyone (I want to send at high speeds, and detect every possible packet dropped by the network. If my local machine drops the packet, my detection of network-dropped packets is bogus...) The reason a local packet drop is different, is because it can be different. Any feedback of this nature that we can give to user-space can be used to make any recovery or throttling decisions better. I accept that I cannot guarantee a UDP packet is received by it's intended target, but I do not accept that the local machine cannot even guarantee that it has sent the packet onto the network. > > When you fail in sendto/sendmsg, errno is set to ENOBUFS as long as you > set IP_RECVERR in the socket options; you can also receive ICMP errors > as described in the manpages (use a msg_control buffer and call recvmsg > with MSG_ERRQUEUE). I will investigate the IP_RECVERR more closely, it may do just what I need. Thanks, Ben > > BTW, a good sample of an app that makes good use of ENOBUFS to do > congestion control, IP_RECVERR and MSG_ERRQUEUE is the ping app in Alexeys > iputils package. Why did i not remember all this before chasing the > phantom with Eric is an indication i need to increase my cafeine > consumption. > > cheers, > jamal > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From greearb@candelatech.com Tue Oct 1 11:56:52 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 11:56:54 -0700 (PDT) Received: from grok.yi.org (IDENT:aK5hxrhE5cl0g90noYplCu4IRrR/frN8@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91IuptG026456 for ; Tue, 1 Oct 2002 11:56:52 -0700 Received: from candelatech.com (IDENT:9grj9H6zoY5/RT6oJ8JeNY3g2iT9Utjb@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g91Isav01204; Tue, 1 Oct 2002 11:54:37 -0700 Message-ID: <3D99EF6C.9030509@candelatech.com> Date: Tue, 01 Oct 2002 11:54:36 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722 X-Accept-Language: en-us, en MIME-Version: 1.0 To: jamal CC: Chris Friesen , kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 463 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev jamal wrote: > > On Tue, 1 Oct 2002, Chris Friesen wrote: > > >>to be silently dropped by the kernel because userspace is sending faster >>than they can get onto the wire during that tight loop. >> > > > So what happens when you find packets being dropped? > AFAIK, a dropped voice packet is as good as dead whether local or remote. If it is dropped locally, you can re-send in way less than 1 milisecond, which is well within the realm of expected jitter. You can also back off for 5 miliseconds to alleviate congestion, which is still within acceptable jitter. If you think you sent it, but didn't actually send it, then it looks like your network is shitting, when in fact your local machine is acting shitty. Ben > > >>Okay, so with IP_RECVERR set the case that Eric saw will not happen? I >>mean that sendto() will return with -1 and errno set to ENOBUFS? > > > yes > > cheers, > jamal > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From cfriesen@nortelnetworks.com Tue Oct 1 12:04:12 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 12:04:14 -0700 (PDT) Received: from zcars04f.ca.nortel.com (zcars04f.nortelnetworks.com [47.129.242.57]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g91J4CtG026925 for ; Tue, 1 Oct 2002 12:04:12 -0700 Received: from zcard309.ca.nortel.com (zcard309.ca.nortel.com [47.129.242.69]) by zcars04f.ca.nortel.com (Switch-2.2.0/Switch-2.2.0) with ESMTP id g91J3Oe08613; Tue, 1 Oct 2002 15:03:24 -0400 (EDT) Received: from zcard0k6.ca.nortel.com ([47.129.242.158]) by zcard309.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLKB9A7R; Tue, 1 Oct 2002 15:03:26 -0400 Received: from pcard0ks.ca.nortel.com ([47.129.117.131]) by zcard0k6.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLK1SQC2; Tue, 1 Oct 2002 15:03:26 -0400 Received: from nortelnetworks.com (localhost.localdomain [127.0.0.1]) by pcard0ks.ca.nortel.com (Postfix) with ESMTP id A20462E134; Tue, 1 Oct 2002 15:03:25 -0400 (EDT) Message-ID: <3D99F17D.10802@nortelnetworks.com> Date: Tue, 01 Oct 2002 15:03:25 -0400 X-Sybari-Space: 00000000 00000000 00000000 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: jamal Cc: Ben Greear , kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 464 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cfriesen@nortelnetworks.com Precedence: bulk X-list: netdev jamal wrote: > > On Tue, 1 Oct 2002, Chris Friesen wrote: > >> to be silently dropped by the kernel because userspace is sending >> faster than they can get onto the wire during that tight loop. > So what happens when you find packets being dropped? AFAIK, a > dropped voice packet is as good as dead whether local or remote. We do have some leeway in terms of latency, and delayed leaving the box is not the same as dropped. We know that call processing messaging can only ever go out one ethernet interface at a time, and we know that the call agent is guaranteed 90% of the userspace cpu time (scheduler changes). We certify the box for a certain engineered throughput, so we know the average packets/sec value. We also have total knowledge/control over the other apps running on the box in question. So really all I'm protecting against is from one single userspace app generating packets faster than the network can keep up. As long as I get EAGAIN/EWOULDBLOCK/ENOBUFS on my non-blocking socket then I'll just try again until it succeeds or I get a more serious error. So far this seems to be working nicely in 2.2, but we're just in the middle of a switch to 2.4 for the new release and I want to make sure I've got a handle on things. Thanks for your help, Chris PS. I realize that this design is simplistic, but we are severely constrained by the legacy app running on the emulator. From pb@bieringer.de Tue Oct 1 23:37:24 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Oct 2002 23:37:29 -0700 (PDT) Received: from titan.bieringer.de (mail.bieringer.de [195.226.187.51]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g926bMtG007278 for ; Tue, 1 Oct 2002 23:37:23 -0700 Received: (qmail 29466 invoked from network); 2 Oct 2002 06:37:15 -0000 Received: from pd950f7bf.dip.t-dialin.net (217.80.247.191) by mail.bieringer.de with SMTP; 2 Oct 2002 06:37:15 -0000 Date: Wed, 02 Oct 2002 08:37:09 +0200 From: Peter Bieringer To: Maillist netdev cc: Maillist USAGI-users , Maillist linux-ipv6 Subject: Description available for all IPv6 related proc settings? Message-ID: <13970000.1033540629@localhost> X-Mailer: Mulberry/3.0.0a4 (Linux/x86) X-URL: http://www.bieringer.de/pb/ X-OS: Linux MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="==========862390887==========" X-archive-position: 465 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pb@bieringer.de Precedence: bulk X-list: netdev --==========862390887========== Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, during extending my HowTo: http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-sys-net-ipv6.html I found not much information about neigh/* route/* Latest ip-sysctl.txt from kernel sources 2.5.39 is dated $Id: ip-sysctl.txt,v 1.20 2001/12/13 09:00:18 davem Exp $ already containing some IPv6 information (credits to Pekka), but not all. Would be very nice if someone is able to contribute more information... BTW: some still not full explained values also are shown here: http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-net.html Perhaps someone can send updates to me for this, too. Thank you very much, Peter --- Dr. Peter Bieringer mailto: pb at bieringer dot de http://www.bieringer.de/pb/ Key 0x958F422D : B501 24F4 9418 23E2 C0F3 F833 7B57 AA7B 958F 422D --==========862390887========== Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) iD8DBQE9mpQWe1eqe5WPQi0RApb8AJ9fFaY7wd7N1IoSxQZF6NvxbafKygCg7wbM eFsph4C+kMdQ2MP7yx4+Xa4= =U+Cb -----END PGP SIGNATURE----- --==========862390887==========-- From ajtuomin@tml.hut.fi Wed Oct 2 02:21:47 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 02:21:53 -0700 (PDT) Received: from tml-gw.tml.hut.fi (tml.hut.fi [130.233.44.1]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g929LjtG014493 for ; Wed, 2 Oct 2002 02:21:46 -0700 Received: (from smap@localhost) by tml-gw.tml.hut.fi (8.8.7/8.8.7) id MAA21681 for ; Wed, 2 Oct 2002 12:21:44 +0300 X-Authentication-Warning: tml-gw.tml.hut.fi: smap set sender to using -f Received: from mail.tml.hut.fi(130.233.45.70) by tml-gw.tml.hut.fi via smap (V2.0) id xma021665; Wed, 2 Oct 02 12:21:27 +0300 Received: from morphine.tml.hut.fi (morphine.tml.hut.fi [130.233.45.7]) by mail.tml.hut.fi (8.12.2+Sun/8.12.2) with ESMTP id g929LQ21004853; Wed, 2 Oct 2002 12:21:26 +0300 (EEST) Received: from tml.hut.fi (localhost [127.0.0.1]) by morphine.tml.hut.fi (8.12.2+Sun/8.12.2) with ESMTP id g929LPF5017153; Wed, 2 Oct 2002 12:21:25 +0300 (EEST) Received: (from ajtuomin@localhost) by tml.hut.fi (8.12.2+Sun/8.12.2/Submit) id g929LBn8017152; Wed, 2 Oct 2002 12:21:11 +0300 (EEST) Date: Wed, 2 Oct 2002 12:21:11 +0300 From: Antti Tuominen To: davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Cc: torvalds@transmeta.com Subject: [PATCH] Mobile IPv6 for 2.5.40 (request for kernel inclusion) Message-ID: <20021002092111.GB17010@morphine.tml.hut.fi> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-archive-position: 466 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ajtuomin@morphine.tml.hut.fi Precedence: bulk X-list: netdev Hello Dave, Alexey, and all, I am part of the MIPL Mobile IPv6 for Linux Team at Helsinki University of Technology, and we have been working on an implementation of Mobility Support in IPv6 specification for the past 3 years. Now the code has matured to the point, that we feel confident enough to ask for kernel inclusion. Our implementation has been to several interop and conformance testing events, and has proven to be very compliant and to interoperate with all major vendors' implementations. Code has been tested on several UP and SMP configurations, and performs quite well. Implementation consists of two kernel modules, changes to IPv6 stack, and userspace configuration tools. First module provides support for 6over6 (IPv6 in IPv6) tunneling. Second module is the Mobile IPv6 module, and adds support for Mobile IPv6 Correspondent Node, Mobile Node, and Home Agent. IPv6 stack has been modified to provide some MIPv6 mandated features as well as hooks to our module. Latest code for 2.5 series can be pulled from our public BitKeeper repository (parent is http://linux.bkbits.net/linux-2.5): bk://bk.mipl.mediapoli.com/linux25-mipl Diff against latest BK bits can be downloaded from: http://www.mipl.mediapoli.com/download/linux-2.5+mipv6.diff Latest userspace tools are found at: bk://bk.mipl.mediapoli.com/mipv6-tools More information of the project can be found at our website: http://www.mipl.mediapoli.com/ The team continues the development work to have fully RFC compliant (when the specification moves to RFC) implementation of Mobile IPv6 in the Linux kernel, as well as work on improving the code. On behalf of the MIPL Team, Antti Tuominen -- Antti J. Tuominen, Gyldenintie 8A 11, 00200 Helsinki, Finland. Research assistant, Institute of Digital Communications at HUT work: ajtuomin@tml.hut.fi; home: tuominen@iki.fi From pekkas@netcore.fi Wed Oct 2 02:26:05 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 02:26:10 -0700 (PDT) Received: from netcore.fi (netcore.fi [193.94.160.1]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g929Q3tG015760 for ; Wed, 2 Oct 2002 02:26:04 -0700 Received: from localhost (pekkas@localhost) by netcore.fi (8.11.6/8.11.6) with ESMTP id g929Pb827895; Wed, 2 Oct 2002 12:25:37 +0300 Date: Wed, 2 Oct 2002 12:25:37 +0300 (EEST) From: Pekka Savola To: Antti Tuominen cc: davem@redhat.com, , , , Subject: Re: [PATCH] Mobile IPv6 for 2.5.40 (request for kernel inclusion) In-Reply-To: <20021002092111.GB17010@morphine.tml.hut.fi> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 467 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pekkas@netcore.fi Precedence: bulk X-list: netdev I believe MIPL implements an old version of MIPv6 (draft -15 or so). Or do you support -18 ? On Wed, 2 Oct 2002, Antti Tuominen wrote: > Hello Dave, Alexey, and all, > > I am part of the MIPL Mobile IPv6 for Linux Team at Helsinki > University of Technology, and we have been working on an > implementation of Mobility Support in IPv6 specification for the past > 3 years. Now the code has matured to the point, that we feel > confident enough to ask for kernel inclusion. > > Our implementation has been to several interop and conformance testing > events, and has proven to be very compliant and to interoperate with > all major vendors' implementations. Code has been tested on several > UP and SMP configurations, and performs quite well. > > Implementation consists of two kernel modules, changes to IPv6 stack, > and userspace configuration tools. First module provides support for > 6over6 (IPv6 in IPv6) tunneling. Second module is the Mobile IPv6 > module, and adds support for Mobile IPv6 Correspondent Node, Mobile > Node, and Home Agent. IPv6 stack has been modified to provide some > MIPv6 mandated features as well as hooks to our module. > > Latest code for 2.5 series can be pulled from our public BitKeeper > repository (parent is http://linux.bkbits.net/linux-2.5): > bk://bk.mipl.mediapoli.com/linux25-mipl > > Diff against latest BK bits can be downloaded from: > http://www.mipl.mediapoli.com/download/linux-2.5+mipv6.diff > > Latest userspace tools are found at: > bk://bk.mipl.mediapoli.com/mipv6-tools > > More information of the project can be found at our website: > http://www.mipl.mediapoli.com/ > > The team continues the development work to have fully RFC compliant > (when the specification moves to RFC) implementation of Mobile IPv6 in > the Linux kernel, as well as work on improving the code. > > On behalf of the MIPL Team, > > Antti Tuominen > > -- Pekka Savola "Tell me of difficulties surmounted, Netcore Oy not those you stumble over and fall" Systems. Networks. Security. -- Robert Jordan: A Crown of Swords From yoshfuji@wide.ad.jp Wed Oct 2 02:31:21 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 02:31:23 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g929VKtG017468 for ; Wed, 2 Oct 2002 02:31:21 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g929VD1o013573; Wed, 2 Oct 2002 18:31:13 +0900 Date: Wed, 02 Oct 2002 18:31:13 +0900 (JST) Message-Id: <20021002.183113.16291158.yoshfuji@wide.ad.jp> To: pekkas@netcore.fi Cc: ajtuomin@morphine.tml.hut.fi, davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org, torvalds@transmeta.com Subject: Re: [PATCH] Mobile IPv6 for 2.5.40 (request for kernel inclusion) From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: References: <20021002092111.GB17010@morphine.tml.hut.fi> X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 468 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@wide.ad.jp Precedence: bulk X-list: netdev In article (at Wed, 2 Oct 2002 12:25:37 +0300 (EEST)), Pekka Savola says: > I believe MIPL implements an old version of MIPv6 (draft -15 or so). > > Or do you support -18 ? We believe we should do -18, not -15 at all. --yoshfuji From pekkas@netcore.fi Wed Oct 2 02:33:42 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 02:33:44 -0700 (PDT) Received: from netcore.fi (netcore.fi [193.94.160.1]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g929XftG017838 for ; Wed, 2 Oct 2002 02:33:42 -0700 Received: from localhost (pekkas@localhost) by netcore.fi (8.11.6/8.11.6) with ESMTP id g929XLL27969; Wed, 2 Oct 2002 12:33:21 +0300 Date: Wed, 2 Oct 2002 12:33:21 +0300 (EEST) From: Pekka Savola To: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= cc: ajtuomin@morphine.tml.hut.fi, , , , , Subject: Re: [PATCH] Mobile IPv6 for 2.5.40 (request for kernel inclusion) In-Reply-To: <20021002.183113.16291158.yoshfuji@wide.ad.jp> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=ISO-8859-1 X-archive-position: 469 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pekkas@netcore.fi Precedence: bulk X-list: netdev On Wed, 2 Oct 2002, YOSHIFUJI Hideaki / [iso-2022-jp] $B5HF#1QL@(B wrote: > In article (at Wed, 2 Oct 2002 12:25:37 +0300 (EEST)), Pekka Savola says: > > > I believe MIPL implements an old version of MIPv6 (draft -15 or so). > > > > Or do you support -18 ? > > We believe we should do -18, not -15 at all. Well, www.mipl.mediapoli.com front page at least refers to -15, but you should know better :-) -- Pekka Savola "Tell me of difficulties surmounted, Netcore Oy not those you stumble over and fall" Systems. Networks. Security. -- Robert Jordan: A Crown of Swords From yoshfuji@wide.ad.jp Wed Oct 2 02:44:23 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 02:44:24 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g929iLtG019461 for ; Wed, 2 Oct 2002 02:44:22 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g929iI1o013674; Wed, 2 Oct 2002 18:44:18 +0900 Date: Wed, 02 Oct 2002 18:44:18 +0900 (JST) Message-Id: <20021002.184418.121132248.yoshfuji@wide.ad.jp> To: pekkas@netcore.fi Cc: ajtuomin@morphine.tml.hut.fi, davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org, torvalds@transmeta.com Subject: Re: [PATCH] Mobile IPv6 for 2.5.40 (request for kernel inclusion) From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: References: <20021002.183113.16291158.yoshfuji@wide.ad.jp> X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 470 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@wide.ad.jp Precedence: bulk X-list: netdev In article (at Wed, 2 Oct 2002 12:33:21 +0300 (EEST)), Pekka Savola says: > On Wed, 2 Oct 2002, YOSHIFUJI Hideaki / [iso-2022-jp] $B5HF#1QL@(B wrote: > > In article (at Wed, 2 Oct 2002 12:25:37 +0300 (EEST)), Pekka Savola says: > > > > > I believe MIPL implements an old version of MIPv6 (draft -15 or so). > > > > > > Or do you support -18 ? > > > > We believe we should do -18, not -15 at all. > > Well, www.mipl.mediapoli.com front page at least refers to -15, but you > should know better :-) I meant, we should go with -18 (or later). (If the MIPL supports only -15,) -15 is too old. --yoshfuji From yoshfuji@wide.ad.jp Wed Oct 2 02:46:07 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 02:46:08 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g929k5tG020362 for ; Wed, 2 Oct 2002 02:46:06 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g929k81o013717; Wed, 2 Oct 2002 18:46:08 +0900 Date: Wed, 02 Oct 2002 18:46:07 +0900 (JST) Message-Id: <20021002.184607.73791540.yoshfuji@wide.ad.jp> To: ajtuomin@morphine.tml.hut.fi Cc: davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org, torvalds@transmeta.com Subject: Re: [PATCH] Mobile IPv6 for 2.5.40 (request for kernel inclusion) From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20021002092111.GB17010@morphine.tml.hut.fi> References: <20021002092111.GB17010@morphine.tml.hut.fi> X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 471 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@wide.ad.jp Precedence: bulk X-list: netdev In article <20021002092111.GB17010@morphine.tml.hut.fi> (at Wed, 2 Oct 2002 12:21:11 +0300), Antti Tuominen says: > Diff against latest BK bits can be downloaded from: > http://www.mipl.mediapoli.com/download/linux-2.5+mipv6.diff % wget http://www.mipl.mediapoli.com/download/linux-2.5+mipv6.diff --18:45:25-- http://www.mipl.mediapoli.com/download/linux-2.5+mipv6.diff => `linux-2.5+mipv6.diff' Resolving www.mipl.mediapoli.com... done. Connecting to www.mipl.mediapoli.com[212.68.2.195]:80... connected. HTTP request sent, awaiting response... 403 Forbidden 18:45:25 ERROR 403: Forbidden. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From ajtuomin@tml.hut.fi Wed Oct 2 04:04:32 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 04:04:38 -0700 (PDT) Received: from tml-gw.tml.hut.fi (tml.hut.fi [130.233.44.1]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92B4UtG022382 for ; Wed, 2 Oct 2002 04:04:31 -0700 Received: (from smap@localhost) by tml-gw.tml.hut.fi (8.8.7/8.8.7) id OAA22663 for ; Wed, 2 Oct 2002 14:04:29 +0300 X-Authentication-Warning: tml-gw.tml.hut.fi: smap set sender to using -f Received: from mail.tml.hut.fi(130.233.45.70) by tml-gw.tml.hut.fi via smap (V2.0) id xma022646; Wed, 2 Oct 02 14:04:24 +0300 Received: from morphine.tml.hut.fi (morphine.tml.hut.fi [130.233.45.7]) by mail.tml.hut.fi (8.12.2+Sun/8.12.2) with ESMTP id g92B4N21005589; Wed, 2 Oct 2002 14:04:23 +0300 (EEST) Received: from tml.hut.fi (localhost [127.0.0.1]) by morphine.tml.hut.fi (8.12.2+Sun/8.12.2) with ESMTP id g92B4IF5017487; Wed, 2 Oct 2002 14:04:23 +0300 (EEST) Received: (from ajtuomin@localhost) by tml.hut.fi (8.12.2+Sun/8.12.2/Submit) id g92B4HFe017486; Wed, 2 Oct 2002 14:04:17 +0300 (EEST) Date: Wed, 2 Oct 2002 14:04:17 +0300 From: Antti Tuominen To: "YOSHIFUJI Hideaki / $B5HF#1QL@(B" Cc: pekkas@netcore.fi, davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org, torvalds@transmeta.com Subject: Re: [PATCH] Mobile IPv6 for 2.5.40 (request for kernel inclusion) Message-ID: <20021002110416.GC17010@morphine.tml.hut.fi> References: <20021002.183113.16291158.yoshfuji@wide.ad.jp> <20021002.184418.121132248.yoshfuji@wide.ad.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20021002.184418.121132248.yoshfuji@wide.ad.jp> User-Agent: Mutt/1.4i Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id g92B4UtG022382 X-archive-position: 472 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ajtuomin@morphine.tml.hut.fi Precedence: bulk X-list: netdev On Wed, Oct 02, 2002 at 06:44:18PM +0900, YOSHIFUJI Hideaki / ?$B5HF#1QL@?(B wrote: > In article (at Wed, 2 Oct 2002 12:33:21 +0300 (EEST)), Pekka Savola says: > > > On Wed, 2 Oct 2002, YOSHIFUJI Hideaki / [iso-2022-jp] $B5HF#1QL@(B wrote: > > > In article (at Wed, 2 Oct 2002 12:25:37 +0300 (EEST)), Pekka Savola says: > > > > > > > I believe MIPL implements an old version of MIPv6 (draft -15 or so). > > > > > > > > Or do you support -18 ? > > > > > > We believe we should do -18, not -15 at all. > > > > Well, www.mipl.mediapoli.com front page at least refers to -15, but you > > should know better :-) > > I meant, we should go with -18 (or later). > (If the MIPL supports only -15,) -15 is too old. We do support Draft 18 in our development code (tested last week at ETSI IPv6 Plugtest and mostly working), but since Draft 15 was the last implementable draft (no _draft_ issues, compared to large number of inconcistencies and contradictions in draft 18) and we've had time to test the code properly, we decided to submit working code over latest code. Draft 15 based code is tested and works. To get Mobile IPv6 in the kernel we felt that it is more important to have solid, tested code rather than our latest devel code for the submission. Of course we are committed to providing the latest draft revision compliant code immediately when it's available. But we don't feel draft 18 is the answer since draft 19 will soon be out and should address rest of the 126 issues raised about drafts 16, 17 and 18. If the kernel maintainers feel differently, we are happy to provide you with our latest code implementing most of draft 18. Regards, Antti -- Antti J. Tuominen, Gyldenintie 8A 11, 00200 Helsinki, Finland. Research assistant, Institute of Digital Communications at HUT work: ajtuomin@tml.hut.fi; home: tuominen@iki.fi From ajtuomin@tml.hut.fi Wed Oct 2 04:08:40 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 04:08:43 -0700 (PDT) Received: from tml-gw.tml.hut.fi (tml.hut.fi [130.233.44.1]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92B8ctG022979 for ; Wed, 2 Oct 2002 04:08:39 -0700 Received: (from smap@localhost) by tml-gw.tml.hut.fi (8.8.7/8.8.7) id OAA22723 for ; Wed, 2 Oct 2002 14:08:38 +0300 X-Authentication-Warning: tml-gw.tml.hut.fi: smap set sender to using -f Received: from mail.tml.hut.fi(130.233.45.70) by tml-gw.tml.hut.fi via smap (V2.0) id xma022711; Wed, 2 Oct 02 14:08:29 +0300 Received: from morphine.tml.hut.fi (morphine.tml.hut.fi [130.233.45.7]) by mail.tml.hut.fi (8.12.2+Sun/8.12.2) with ESMTP id g92B8T21005612; Wed, 2 Oct 2002 14:08:29 +0300 (EEST) Received: from tml.hut.fi (localhost [127.0.0.1]) by morphine.tml.hut.fi (8.12.2+Sun/8.12.2) with ESMTP id g92B8SF5017511; Wed, 2 Oct 2002 14:08:28 +0300 (EEST) Received: (from ajtuomin@localhost) by tml.hut.fi (8.12.2+Sun/8.12.2/Submit) id g92B8S9x017510; Wed, 2 Oct 2002 14:08:28 +0300 (EEST) Date: Wed, 2 Oct 2002 14:08:28 +0300 From: Antti Tuominen To: "YOSHIFUJI Hideaki / $B5HF#1QL@(B" Cc: davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org, torvalds@transmeta.com Subject: Re: [PATCH] Mobile IPv6 for 2.5.40 (request for kernel inclusion) Message-ID: <20021002110828.GD17010@morphine.tml.hut.fi> References: <20021002092111.GB17010@morphine.tml.hut.fi> <20021002.184607.73791540.yoshfuji@wide.ad.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20021002.184607.73791540.yoshfuji@wide.ad.jp> User-Agent: Mutt/1.4i X-archive-position: 473 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ajtuomin@morphine.tml.hut.fi Precedence: bulk X-list: netdev On Wed, Oct 02, 2002 at 06:46:07PM +0900, YOSHIFUJI Hideaki / ?$B5HF#1QL@?(B wrote: > Resolving www.mipl.mediapoli.com... done. > Connecting to www.mipl.mediapoli.com[212.68.2.195]:80... connected. > HTTP request sent, awaiting response... 403 Forbidden > 18:45:25 ERROR 403: Forbidden. Sorry about that. Apache had some strange rule denying download of files with .diff suffix. Now works. Add .gz to the url for gzipped version. Regards, Antti -- Antti J. Tuominen, Gyldenintie 8A 11, 00200 Helsinki, Finland. Research assistant, Institute of Digital Communications at HUT work: ajtuomin@tml.hut.fi; home: tuominen@iki.fi From Eric.Lemoine@ens-lyon.fr Wed Oct 2 06:08:05 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 06:08:07 -0700 (PDT) Received: from mailhost.ens-lyon.fr (pluvier.ens-lyon.fr [140.77.167.5]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92D83tG025714 for ; Wed, 2 Oct 2002 06:08:04 -0700 Received: from [140.77.13.123] (helo=[140.77.13.123]) by mailhost.ens-lyon.fr with esmtp (Exim 3.35 #1 (Debian)) id 17whRW-0008DZ-00; Wed, 02 Oct 2002 13:13:26 +0200 Received: from eric by (null) with local (MasqMail 0.1.16) id 17whRW-0BG-00; Wed, 02 Oct 2002 13:13:26 +0200 Date: Wed, 2 Oct 2002 13:13:26 +0200 From: Eric Lemoine To: kuznet@ms2.inr.ac.ru Cc: Chris Friesen , hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness Message-ID: <20021002111326.GG357@hookipa> References: <3D99B6C7.3010302@nortelnetworks.com> <200210011531.TAA19943@sex.inr.ac.ru> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200210011531.TAA19943@sex.inr.ac.ru> User-Agent: Mutt/1.3.28i X-Warning: return path set from From: address X-archive-position: 474 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Eric.Lemoine@ens-lyon.fr Precedence: bulk X-list: netdev > > I may have to poke around...if nothing else I'll learn more about the > > networking code... > > It is difficult task, if possible at all. > > The main obstacle is that we must not block after select() succeeded, > otherwise applications will lockup. Taking into account nature of datagram > services (and generally of networking services, where routes change et al.) > you do not know at time of select(), where the datagram will go. > So, blocking can be made only based on a criterium not depending on this. > problems with silent losses. People just do not care about this, so > they get the thing which they deserve. Alexey, Would you mind explaining a bit more why apps will lockup if we block after select() succeeded. Or anyone? Thx. Eric. From cfriesen@nortelnetworks.com Wed Oct 2 07:10:41 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 07:10:46 -0700 (PDT) Received: from zcars04f.ca.nortel.com (zcars04f.nortelnetworks.com [47.129.242.57]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92EAftG001462 for ; Wed, 2 Oct 2002 07:10:41 -0700 Received: from zcard307.ca.nortel.com (americasm03.nt.com [47.129.242.67]) by zcars04f.ca.nortel.com (Switch-2.2.0/Switch-2.2.0) with ESMTP id g92E9Ne15656; Wed, 2 Oct 2002 10:09:23 -0400 (EDT) Received: from zcard0k6.ca.nortel.com ([47.129.242.158]) by zcard307.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id T9BXLTQT; Wed, 2 Oct 2002 10:09:25 -0400 Received: from pcard0ks.ca.nortel.com ([47.129.117.131]) by zcard0k6.ca.nortel.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id TLK1SR4G; Wed, 2 Oct 2002 10:09:25 -0400 Received: from nortelnetworks.com (localhost.localdomain [127.0.0.1]) by pcard0ks.ca.nortel.com (Postfix) with ESMTP id 6A4D12E134; Wed, 2 Oct 2002 10:09:24 -0400 (EDT) Message-ID: <3D9AFE14.4030606@nortelnetworks.com> Date: Wed, 02 Oct 2002 10:09:24 -0400 X-Sybari-Space: 00000000 00000000 00000000 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 To: Eric Lemoine Cc: kuznet@ms2.inr.ac.ru, hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: <3D99B6C7.3010302@nortelnetworks.com> <200210011531.TAA19943@sex.inr.ac.ru> <20021002111326.GG357@hookipa> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 475 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cfriesen@nortelnetworks.com Precedence: bulk X-list: netdev Eric Lemoine wrote: > Would you mind explaining a bit more why apps will lockup if we block > after select() succeeded. Or anyone? I suspect he means a temporary lockup. There are many apps that use blocking sockets and rely on select() to tell them when they may write out to the socket without blocking. If the write then blocks, the whole app is blocked. Some of them probably wouldn't like this. Was that it Alexey? Or is there something more that I missed? Chris From greearb@candelatech.com Wed Oct 2 08:29:27 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 08:29:31 -0700 (PDT) Received: from grok.yi.org (IDENT:XvzdN63Fi9D82MGETDFySHeTXsx87E/s@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92FTQtG008373 for ; Wed, 2 Oct 2002 08:29:26 -0700 Received: from candelatech.com (IDENT:GzyoO8qV5hUiED1VCAOVJipCWjwxhl0f@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g92FPbv26485; Wed, 2 Oct 2002 08:25:38 -0700 Message-ID: <3D9B0FF1.1070203@candelatech.com> Date: Wed, 02 Oct 2002 08:25:37 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Eric Lemoine CC: kuznet@ms2.inr.ac.ru, Chris Friesen , hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness References: <3D99B6C7.3010302@nortelnetworks.com> <200210011531.TAA19943@sex.inr.ac.ru> <20021002111326.GG357@hookipa> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 476 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Eric Lemoine wrote: >>>I may have to poke around...if nothing else I'll learn more about the >>>networking code... >> >>It is difficult task, if possible at all. >> >>The main obstacle is that we must not block after select() succeeded, >>otherwise applications will lockup. Taking into account nature of datagram >>services (and generally of networking services, where routes change et al.) >>you do not know at time of select(), where the datagram will go. >>So, blocking can be made only based on a criterium not depending on this. >>problems with silent losses. People just do not care about this, so >>they get the thing which they deserve. > > > Alexey, > > Would you mind explaining a bit more why apps will lockup if we block > after select() succeeded. Or anyone? Actually, I'm more interested to know why we would **need** to block after select has succeeded. It would seem to me that select is busted in this case. For the case of a very large UDP packet and a small send buffer, select gets confused, but at least when the send buffer is > 128k, it should be right... > > Thx. > > Eric. > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From yoshfuji@linux-ipv6.org Wed Oct 2 09:51:07 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 09:51:09 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92Gp6tG013806 for ; Wed, 2 Oct 2002 09:51:06 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g92GpE1o016333; Thu, 3 Oct 2002 01:51:14 +0900 Date: Thu, 03 Oct 2002 01:50:57 +0900 (JST) Message-Id: <20021003.015057.14743018.yoshfuji@linux-ipv6.org> To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com CC: usagi@linux-ipv6.org Subject: [PATCH] IPv6: Default Router Selection Round-robin From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 477 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hello! Linux changes default router even while it is probably reachable. Once it becomes "non-REACHABLE," Linux trys to select one in round-robin fashion, but once it reached end of list, it would be stuck there. Here's the patch against 2.4.19. Thank you in advance. ------------------------------------------------------------------- Patch-Name: Default Router Selection Round-robin Patch-Id: FIX_2_4_19_DEFRTR_SELECT-20020919 Patch-Author: YOSHIFUJI Hideaki / USAGI Project Credit: YOSHIFUJI Hideaki / USAGI Project Reference: RFC2461 ------------------------------------------------------------------- Index: net/ipv6/route.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/route.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.14.1 diff -u -r1.1.1.1 -r1.1.1.1.14.1 --- net/ipv6/route.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/route.c 2002/09/19 16:28:03 1.1.1.1.14.1 @@ -13,6 +13,17 @@ * 2 of the License, or (at your option) any later version. */ +/* Changes: + * + * YOSHIFUJI Hideaki @USAGI + * reworked default router selection. + * - respect outgoing interface + * - select from (probably) reachable routers (i.e. + * routers in REACHABLE, STALE, DELAY or PROBE states). + * - always select the same router if it is (probably) + * reachable. otherwise, round-robin the list. + */ + #include #include #include @@ -168,6 +179,7 @@ static struct rt6_info *rt6_dflt_pointer = NULL; static spinlock_t rt6_dflt_lock = SPIN_LOCK_UNLOCKED; +/* Default Router Selection (RFC 2461 6.3.6) */ static struct rt6_info *rt6_best_dflt(struct rt6_info *rt, int oif) { struct rt6_info *match = NULL; @@ -176,63 +188,117 @@ for (sprt = rt; sprt; sprt = sprt->u.next) { struct neighbour *neigh; + int m = 0; - if ((neigh = sprt->rt6i_nexthop) != NULL) { - int m = -1; + if (!oif || + (sprt->rt6i_dev && + sprt->rt6i_dev->ifindex == oif)) + m += 8; + if (sprt == rt6_dflt_pointer) + m += 4; + + if ((neigh = sprt->rt6i_nexthop) != NULL) { + read_lock_bh(&neigh->lock); switch (neigh->nud_state) { case NUD_REACHABLE: - if (sprt != rt6_dflt_pointer) { - rt = sprt; - goto out; - } - m = 2; + m += 3; break; + case NUD_STALE: case NUD_DELAY: - m = 1; + case NUD_PROBE: + m += 2; break; - case NUD_STALE: - m = 1; + case NUD_NOARP: + case NUD_PERMANENT: + m += 1; break; - }; - if (oif && sprt->rt6i_dev->ifindex == oif) { - m += 2; + case NUD_INCOMPLETE: + default: + read_unlock_bh(&neigh->lock); + continue; } + read_unlock_bh(&neigh->lock); + } else { + continue; + } - if (m >= mpri) { - mpri = m; - match = sprt; + if (m > mpri || m >= 12) { + match = sprt; + mpri = m; + if (m >= 12) { + /* we choose the lastest default router if it + * is in (probably) reachable state. + * If route changed, we should do pmtu + * discovery. --yoshfuji + */ + break; } } } - if (match) { - rt = match; - } else { + spin_lock(&rt6_dflt_lock); + if (!match) { /* * No default routers are known to be reachable. * SHOULD round robin */ - spin_lock(&rt6_dflt_lock); if (rt6_dflt_pointer) { - struct rt6_info *next; - - if ((next = rt6_dflt_pointer->u.next) != NULL && - next->u.dst.obsolete <= 0 && - next->u.dst.error == 0) - rt = next; + for (sprt = rt6_dflt_pointer->u.next; + sprt; sprt = sprt->u.next) { + if (sprt->u.dst.obsolete <= 0 && + sprt->u.dst.error == 0) { + match = sprt; + break; + } + } + for (sprt = rt; + !match && sprt && sprt != rt6_dflt_pointer; + sprt = sprt->u.next) { + if (sprt->u.dst.obsolete <= 0 && + sprt->u.dst.error == 0) { + match = sprt; + break; + } + } } - spin_unlock(&rt6_dflt_lock); } -out: - spin_lock(&rt6_dflt_lock); - rt6_dflt_pointer = rt; + if (match) { + if (rt6_dflt_pointer != match) + RT6_TRACE1(KERN_INFO + "changed default router: %p->%p\n", + rt6_dflt_pointer, match); + rt6_dflt_pointer = match; + } spin_unlock(&rt6_dflt_lock); - return rt; + + if (!match) { + /* + * Last Resort: if no default routers found, + * use addrconf default route. + * We don't record this route. + */ + for (sprt = ip6_routing_table.leaf; + sprt; sprt = sprt->u.next) { + if ((sprt->rt6i_flags & RTF_DEFAULT) && + (!oif || + (sprt->rt6i_dev && + sprt->rt6i_dev->ifindex == oif))) { + match = sprt; + break; + } + } + if (!match) { + /* no default route. give up. */ + match = &ip6_null_entry; + } + } + + return match; } struct rt6_info *rt6_lookup(struct in6_addr *daddr, struct in6_addr *saddr, -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From ratz@drugphish.ch Wed Oct 2 10:37:09 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 10:37:11 -0700 (PDT) Received: from mailphish.drugphish.ch (adsl-196-233.cybernet.ch [212.90.196.233]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92Hb7tG015436 for ; Wed, 2 Oct 2002 10:37:08 -0700 Received: from drugphish.ch (unknown [158.64.76.6]) by mailphish.drugphish.ch (drugphish mail transportation agency) with ESMTP id E2C162EC9; Wed, 2 Oct 2002 17:28:40 +0000 (/etc/localtime) Message-ID: <3D9B2EBC.4010102@drugphish.ch> Date: Wed, 02 Oct 2002 19:37:00 +0200 From: Roberto Nibali User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020826 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Bill Davidsen Cc: linux-kernel@vger.kernel.org, netdev Subject: Re: [ANNOUNCE] NF-HIPAC: High Performance Packet Classification References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 478 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ratz@drugphish.ch Precedence: bulk X-list: netdev Hi, >>I will do a new round of testing this weekend for a speech I'll be >>giving. This time I will include ipchains, iptables (of course I am >>willing to apply every interesting patch regarding hash table >>optimisation and whatnot you want me to test), nf-hipac, the OpenBSD pf >>and of course the work done by Jamal. > > Look forward to any info you can provide. Unfortunately (as always) there were tons of delays that didn't allow me to finish the complete test suite as I hoped I could but I sent some information off this list to Jamal and the nf-hipac guys about previous test result. See below. I hope I can do more tests this weekend ... > I particularly like that nf-hipac can be put in and tried in one-to-one > comparison, that leaves an easy route to testing and getting confidence in > the code. Yes and it was very convincing after the first few tests Some prelimiary test with raw TCP throughput have given me following really cool results: TCP RAW throughput 100Mbit/s max MTU: ------------------------------------- ratz@laphish:~/netperf-2.2pl2 > ./netperf -H 192.168.1.141 -p 6666 -l 60 TCP STREAM TEST to 192.168.1.141 Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/s 87380 16384 16384 60.01 88.03 <------ ratz@laphish:~/netperf-2.2pl2 > TCP RAW throughput 100Mbit/s max MTU with 10000 non-matching rules + 1 last matching rule at the end of the FORWARD chain [iptables]: ---------------------------------------------------------------------- ratz@laphish:~/netperf-2.2pl2 > ./netperf -H 192.168.1.141 -p 6666 -l 60 TCP STREAM TEST to 192.168.1.141 Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 16384 60.12 3.28 <------ ratz@laphish:~/netperf-2.2pl2 > TCP RAW throughput 100Mbit/s max MTU with 10000 non-matching rules + 1 last matching rule at the end of the FORWARD chain [nf-hipac]: ---------------------------------------------------------------------- ratz@laphish:~/netperf-2.2pl2 > ./netperf -H 192.168.1.141 -p 6666 -l 60 TCP STREAM TEST to 192.168.1.141 Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 16384 60.03 85.78 <------ ratz@laphish:~/netperf-2.2pl2 > For nf-hipac I also have some statistics: ----------------------------------------- bloodyhell:/var/FWTEST/nf-hipac # cat /proc/net/nf-hipac nf-hipac statistics ------------------- Maximum available memory: 65308672 bytes Currently used memory: 1764160 bytes INPUT: - INPUT chain is empty FORWARD: - Number of rules: 10002 - Total size: 1033010 bytes - Total size (allocated): 1764160 bytes - Termrule size: 80016 bytes - Termrule size (allocated): 320064 bytes - Number of btrees: 30007 * number of u32 btrees: 10003 + distribution of u32 btrees: [ 2, 4]: 10002 [ 16384, 32768]: 1 * number of u16 btrees: 10002 + distribution of u16 btrees: [ 1, 2]: 10002 * number of u8 btrees: 10002 + distribution of u8 btrees: [ 2, 4]: 18 OUTPUT: - OUTPUT chain is empty bloodyhell:/var/FWTEST/nf-hipac # Roberto Nibali, ratz -- echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc From kuznet@ms2.inr.ac.ru Wed Oct 2 12:24:10 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 12:24:14 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92JO8tG019032 for ; Wed, 2 Oct 2002 12:24:09 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id XAA26368; Wed, 2 Oct 2002 23:22:41 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200210021922.XAA26368@sex.inr.ac.ru> Subject: Re: [PATCH] IPv6: Default Router Selection Round-robin To: yoshfuji@linux-ipv6.ORG (YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?=) Date: Wed, 2 Oct 2002 23:22:41 +0400 (MSD) Cc: netdev@oss.sgi.com, davem@redhat.com (Dave Miller) In-Reply-To: <20021003.015057.14743018.yoshfuji@linux-ipv6.org> from "YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?=" at Oct 2, 2 09:15:04 pm X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 479 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > Linux changes default router even while it is probably reachable. > Once it becomes "non-REACHABLE," Linux trys to select one in round-robin > fashion, but once it reached end of list, it would be stuck there. The patch looks perfect. Alexey From steve@gw.chygwyn.com Wed Oct 2 14:05:09 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 14:05:17 -0700 (PDT) Received: from gw.chygwyn.com (IDENT:root@gw.chygwyn.com [62.172.158.50]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g92L57tG022858 for ; Wed, 2 Oct 2002 14:05:08 -0700 Received: (from steve@localhost) by gw.chygwyn.com (8.9.3/8.9.3) id WAA25884; Wed, 2 Oct 2002 22:08:47 +0100 From: Steven Whitehouse Message-Id: <200210022108.WAA25884@gw.chygwyn.com> Subject: Network stack AIO in 2.5 To: davem@redhat.com, bcrl@redhat.com Date: Wed, 2 Oct 2002 22:08:47 +0100 (BST) Cc: netdev@oss.sgi.com Organization: ChyGywn Limited X-RegisteredOffice: 7, New Yatt Road, Witney, Oxfordshire. OX28 1NU England X-RegisteredNumber: 03887683 Reply-To: Steve Whitehouse X-Mailer: ELM [version 2.5 PL1] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 480 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: steve@gw.chygwyn.com Precedence: bulk X-list: netdev Hi, What is the current status of AIO for the network stack in 2.5 ? Are there patches somewhere (I looked but didn't find any) or is it a matter of porting from the 2.4 AIO or are there still design issues to be resolved ? Steve. From davem@redhat.com Wed Oct 2 17:15:49 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 17:15:51 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g930FntG000749 for ; Wed, 2 Oct 2002 17:15:49 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id RAA26385; Wed, 2 Oct 2002 17:08:32 -0700 Date: Wed, 02 Oct 2002 17:08:31 -0700 (PDT) Message-Id: <20021002.170831.13760613.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Default Router Selection Round-robin From: "David S. Miller" In-Reply-To: <20021003.015057.14743018.yoshfuji@linux-ipv6.org> References: <20021003.015057.14743018.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 481 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Patch applied, thanks. From yoshfuji@linux-ipv6.org Wed Oct 2 20:13:45 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 20:13:52 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g933DitG016055 for ; Wed, 2 Oct 2002 20:13:44 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g933Do1o019704; Thu, 3 Oct 2002 12:13:50 +0900 Date: Thu, 03 Oct 2002 12:13:50 +0900 (JST) Message-Id: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com CC: usagi@linux-ipv6.org Subject: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 482 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hello! Linux IPv6 stack provides the ability for IPv6 applications to interoperate with IPv4 applications. Port space for TCP (or UDP) is shared by IPv6 and IPv4. This conforms to RFC2553. However, some kind of applications may want to restrict their use of an IPv6 socket to IPv6 communication only. IPV6_V6ONLY socket option is defined for such applications in RFC2553bis, which is successor of RFC2553. This patch allows to bind both IPv6 and IPv4 sockets with the single port number at the same time if IPV6_V6ONLY socket options is set to the IPv6 socket. We also prohibit a completely duplicate set of (local-addr, local-port, remote-addr, remote-port) set even if SO_REUSEADDR is set unless the local address is a multicast address; it is ambiguous and it may steal packets from others; i.e. a kind of DoS. Packet delivery strategy is similar to one before, but we prefer IPv4 a bit. Following patch is against linux-2.4.19. Thank you in advance. ------------------------------------------------------------------- Patch-Name: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) Patch-Id: FIX_2_4_19_DOUBLEBIND-20020909 Patch-Author: YOSHIFUJI Hideaki / USAGI Project Credit: YOSHIFUJI Hideaki / USAGI Project Reference: RFC2553bis ------------------------------------------------------------------- Index: include/linux/in6.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/include/linux/in6.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- include/linux/in6.h 2002/08/20 09:46:34 1.1.1.1 +++ include/linux/in6.h 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -156,6 +156,7 @@ #define IPV6_MTU_DISCOVER 23 #define IPV6_MTU 24 #define IPV6_RECVERR 25 +#define IPV6_V6ONLY 26 /* IPV6_MTU_DISCOVER values */ #define IPV6_PMTUDISC_DONT 0 @@ -167,4 +168,19 @@ #define IPV6_FLOWINFO_SEND 33 +#ifdef __KERNEL__ +#ifndef IN6_IS_ADDR_UNSPECIFIED +#define IN6_IS_ADDR_UNSPECIFIED(a) \ + ((((a)->s6_addr32[0]) == 0) && \ + (((a)->s6_addr32[1]) == 0) && \ + (((a)->s6_addr32[2]) == 0) && \ + (((a)->s6_addr32[3]) == 0)) +#endif +#ifndef IN6_IS_ADDR_V4MAPPED +#define IN6_IS_ADDR_V4MAPPED(a) \ + ((((a)->s6_addr32[0]) == 0) && \ + (((a)->s6_addr32[1]) == 0) && \ + (((a)->s6_addr32[2]) == __constant_htonl(0x0000ffff))) +#endif +#endif #endif Index: include/linux/sysctl.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/include/linux/sysctl.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- include/linux/sysctl.h 2002/08/20 09:46:34 1.1.1.1 +++ include/linux/sysctl.h 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -369,7 +369,8 @@ NET_IPV6_DAD_TRANSMITS=7, NET_IPV6_RTR_SOLICITS=8, NET_IPV6_RTR_SOLICIT_INTERVAL=9, - NET_IPV6_RTR_SOLICIT_DELAY=10 + NET_IPV6_RTR_SOLICIT_DELAY=10, + NET_IPV6_BINDV6ONLY=11 }; /* /proc/sys/net//neigh/ */ Index: include/net/if_inet6.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/if_inet6.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- include/net/if_inet6.h 2002/08/20 09:46:45 1.1.1.1 +++ include/net/if_inet6.h 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -86,6 +86,7 @@ int rtr_solicits; int rtr_solicit_interval; int rtr_solicit_delay; + int bindv6only; void *sysctl; }; Index: include/net/sock.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/sock.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- include/net/sock.h 2002/08/20 09:46:45 1.1.1.1 +++ include/net/sock.h 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -171,7 +171,8 @@ __u8 mc_loop:1, recverr:1, sndflow:1, - pmtudisc:2; + pmtudisc:2, + ipv6only:1; struct ipv6_mc_socklist *ipv6_mc_list; struct ipv6_fl_socklist *ipv6_fl_list; Index: net/ipv4/tcp_ipv4.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_ipv4.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- net/ipv4/tcp_ipv4.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_ipv4.c 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -45,6 +45,14 @@ * Vitaly E. Lavrov : Transparent proxy revived after year coma. * Andi Kleen : Fix new listen. * Andi Kleen : Fix accept error reporting. + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior including: + * - Allow ipv6 and ipv4 bind(2) to the + * same port if IPV6_V6ONLY socket option + * is set. + * - Don't allow binding to the same + * address unless it is one of multi- + * cast address even if SO_REUSEADDR + * is set. */ #include @@ -177,23 +185,92 @@ static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb) { struct sock *sk2 = tb->owners; - int sk_reuse = sk->reuse; + int sk_reuse, sk2_reuse; + int addr_type2; + int ret; + + sk_reuse = 0; + if (sk->reuse) + sk_reuse |= 1; for( ; sk2 != NULL; sk2 = sk2->bind_next) { - if (sk != sk2 && - sk2->reuse <= 1 && - sk->bound_dev_if == sk2->bound_dev_if) { - if (!sk_reuse || - !sk2->reuse || - sk2->state == TCP_LISTEN) { - if (!sk2->rcv_saddr || - !sk->rcv_saddr || - (sk2->rcv_saddr == sk->rcv_saddr)) - break; + int both_specified = 0; + + if (sk2 == sk || + (sk2->bound_dev_if && sk->bound_dev_if && + sk2->bound_dev_if != sk->bound_dev_if)) + continue; + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + if (sk2->family == AF_INET6) { + struct in6_addr *sk2_rcv_saddr6 = sk2->state != TCP_TIME_WAIT ? + &sk2->net_pinfo.af_inet6.rcv_saddr : + &((struct tcp_tw_bucket*)sk2)->v6_rcv_saddr; + if (IN6_IS_ADDR_UNSPECIFIED(sk2_rcv_saddr6)) + addr_type2 = IPV6_ADDR_ANY; + else if (IN6_IS_ADDR_V4MAPPED(sk2_rcv_saddr6)) + addr_type2 = IPV6_ADDR_MAPPED; + else + addr_type2 = IPV6_ADDR_UNICAST; /*XXX*/ + } else + addr_type2 = IPV6_ADDR_MAPPED; +#else + addr_type2 = IPV6_ADDR_MAPPED; +#endif + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && + sk->rcv_saddr) { + if (sk2->rcv_saddr != sk->rcv_saddr) + continue; + both_specified = 1; + } + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + if (addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only) { + continue; + } +#endif + + sk2_reuse = 0; + if (sk2->reuse) + sk2_reuse |= 1; + + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ + ret = 1; + if (both_specified) { +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + struct in6_addr *sk2_daddr6 = sk2->state != TCP_TIME_WAIT ? + &sk2->net_pinfo.af_inet6.daddr : + &((struct tcp_tw_bucket*)sk2)->v6_daddr; +#endif + int addr_type2d; +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + if (sk2->family == AF_INET6) { + if (IN6_IS_ADDR_UNSPECIFIED(sk2_daddr6)) + addr_type2d = IPV6_ADDR_ANY; + else if (IN6_IS_ADDR_V4MAPPED(sk2_daddr6)) + addr_type2d = IPV6_ADDR_MAPPED; + else + addr_type2d = IPV6_ADDR_UNICAST; /*XXX*/ + } else + addr_type2d = IPV6_ADDR_MAPPED; +#else + addr_type2d = IPV6_ADDR_MAPPED; +#endif + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) + continue; + } else { + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || + sk->rcv_saddr) + continue; } } + ret = 1; + goto failed; } - return sk2 != NULL; + /* If we found a conflict, fail. */ + ret = sk2 != NULL; +failed: + return ret; } /* Obtain a reference to a local port for the given sock, @@ -247,10 +324,11 @@ break; } if (tb != NULL && tb->owners != NULL) { - if (sk->reuse > 1) + ret = 1; + if (tb->fastreuse > 0 && + sk->reuse != 0 && + sk->state != TCP_LISTEN) { goto success; - if (tb->fastreuse > 0 && sk->reuse != 0 && sk->state != TCP_LISTEN) { - goto success; } else { ret = 1; if (tcp_bind_conflict(sk, tb)) @@ -418,23 +496,31 @@ struct sock *result = NULL; int score, hiscore; - hiscore=0; + hiscore = -1; for(; sk; sk = sk->next) { if(sk->num == hnum) { __u32 rcv_saddr = sk->rcv_saddr; +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + score = 0; + if (sk->family == PF_INET) + score++; + else if (sk->net_pinfo.af_inet6.ipv6only) + continue; +#else score = 1; +#endif if(rcv_saddr) { if (rcv_saddr != daddr) continue; - score++; + score+=2; } if (sk->bound_dev_if) { if (sk->bound_dev_if != dif) continue; - score++; + score+=2; } - if (score == 3) + if (score == 5) return sk; if (score > hiscore) { hiscore = score; @@ -456,6 +542,10 @@ if (sk->num == hnum && sk->next == NULL && (!sk->rcv_saddr || sk->rcv_saddr == daddr) && +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + (sk->family == PF_INET || + (sk->family == PF_INET6 && !sk->net_pinfo.af_inet6.ipv6only)) && +#endif !sk->bound_dev_if) goto sherry_cache; sk = __tcp_v4_lookup_listener(sk, daddr, hnum, dif); Index: net/ipv4/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/udp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- net/ipv4/udp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/udp.c 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -61,6 +61,14 @@ * return ENOTCONN for unconnected sockets (POSIX) * Janos Farkas : don't deliver multi/broadcasts to a different * bound-to-device socket + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: + * - Allow ipv6 and ipv4 bind(2) to the + * same port if IPV6_V6ONLY socket opttion is + * is set. + * - Don't allow binding to the same + * address unless it is one of multi- + * cast address even if SO_REUSEADDR + * is set. * * * This program is free software; you can redistribute it and/or @@ -85,6 +93,7 @@ #include #include #include +#include #include #include #include @@ -153,18 +162,88 @@ udp_port_rover = snum = result; } else { struct sock *sk2; + int sk_reuse, sk2_reuse; + int addr_type2; + sk_reuse = 0; + if (sk->reuse) + sk_reuse |= 1; + if (sk_reuse && + MULTICAST(sk->rcv_saddr)) + sk_reuse |= 4; + for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)]; sk2 != NULL; sk2 = sk2->next) { - if (sk2->num == snum && - sk2 != sk && - sk2->bound_dev_if == sk->bound_dev_if && - (!sk2->rcv_saddr || - !sk->rcv_saddr || - sk2->rcv_saddr == sk->rcv_saddr) && - (!sk2->reuse || !sk->reuse)) - goto fail; + int both_specified = 0; + + if (sk2->num != snum || + sk2 == sk || + (sk2->bound_dev_if && sk->bound_dev_if && + sk2->bound_dev_if != sk->bound_dev_if)) + continue; + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + if (sk2->family == AF_INET6) { + if (IN6_IS_ADDR_UNSPECIFIED(&sk2->net_pinfo.af_inet6.rcv_saddr)) + addr_type2 = IPV6_ADDR_ANY; + else if (IN6_IS_ADDR_V4MAPPED(&sk2->net_pinfo.af_inet6.rcv_saddr)) + addr_type2 = IPV6_ADDR_MAPPED; + else + addr_type2 = IPV6_ADDR_UNICAST; /*XXX*/ + } else + addr_type2 = IPV6_ADDR_MAPPED; +#else + addr_type2 = IPV6_ADDR_MAPPED; +#endif + + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && + sk->rcv_saddr) { + if (sk2->rcv_saddr != sk->rcv_saddr) + continue; + both_specified = 1; + } + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + if (addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only) { + continue; + } +#endif + + sk2_reuse = 0; + if (sk2->reuse) + sk2_reuse |= 1; + if (sk2_reuse && + (addr_type2 != IPV6_ADDR_MAPPED ? (addr_type2 & IPV6_ADDR_MULTICAST) : MULTICAST(sk2->rcv_saddr))) + sk2_reuse |= 4; + + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ + if (sk2_reuse & sk_reuse & 4) + continue; + if (both_specified) { + int addr_type2d; +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + if (sk2->family == AF_INET6) { + if (IN6_IS_ADDR_UNSPECIFIED(&sk2->net_pinfo.af_inet6.daddr)) + addr_type2d = IPV6_ADDR_ANY; + else if (IN6_IS_ADDR_V4MAPPED(&sk2->net_pinfo.af_inet6.daddr)) + addr_type2d = IPV6_ADDR_MAPPED; + else + addr_type2d = IPV6_ADDR_UNICAST; /*XXX*/ + } else + addr_type2d = IPV6_ADDR_MAPPED; +#else + addr_type2d = IPV6_ADDR_MAPPED; +#endif + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) + continue; + } else { + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || + sk->rcv_saddr) + continue; + } + } + goto fail; } } sk->num = snum; @@ -216,28 +295,37 @@ for(sk = udp_hash[hnum & (UDP_HTABLE_SIZE - 1)]; sk != NULL; sk = sk->next) { if(sk->num == hnum) { - int score = 0; + int score; +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + score = 0; + if(sk->family == PF_INET) + score++; + else if (sk->net_pinfo.af_inet6.ipv6only) + continue; +#else + score = 1; +#endif if(sk->rcv_saddr) { if(sk->rcv_saddr != daddr) continue; - score++; + score+=2; } if(sk->daddr) { if(sk->daddr != saddr) continue; - score++; + score+=2; } if(sk->dport) { if(sk->dport != sport) continue; - score++; + score+=2; } if(sk->bound_dev_if) { if(sk->bound_dev_if != dif) continue; - score++; + score+=2; } - if(score == 4) { + if(score == 9) { result = sk; break; } else if(score > badness) { @@ -273,6 +361,9 @@ (s->daddr && s->daddr!=rmt_addr) || (s->dport != rmt_port && s->dport != 0) || (s->rcv_saddr && s->rcv_saddr != loc_addr) || +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + (s->family != PF_INET && s->net_pinfo.af_inet6.ipv6only) || +#endif (s->bound_dev_if && s->bound_dev_if != dif)) continue; break; Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -116,6 +116,7 @@ MAX_RTR_SOLICITATIONS, /* router solicits */ RTR_SOLICITATION_INTERVAL, /* rtr solicit interval */ MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */ + bindv6only: 0, }; static struct ipv6_devconf ipv6_devconf_dflt = @@ -130,6 +131,7 @@ MAX_RTR_SOLICITATIONS, /* router solicits */ RTR_SOLICITATION_INTERVAL, /* rtr solicit interval */ MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */ + bindv6only: 0, }; int ipv6_addr_type(struct in6_addr *addr) @@ -1879,7 +1881,7 @@ static struct addrconf_sysctl_table { struct ctl_table_header *sysctl_header; - ctl_table addrconf_vars[11]; + ctl_table addrconf_vars[12]; ctl_table addrconf_dev[2]; ctl_table addrconf_conf_dir[2]; ctl_table addrconf_proto_dir[2]; @@ -1925,6 +1927,10 @@ {NET_IPV6_RTR_SOLICIT_DELAY, "router_solicitation_delay", &ipv6_devconf.rtr_solicit_delay, sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + + {NET_IPV6_BINDV6ONLY, "bindv6only", + &ipv6_devconf.bindv6only, sizeof(int), 0644, NULL, + &proc_dointvec}, {0}}, Index: net/ipv6/af_inet6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/af_inet6.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- net/ipv6/af_inet6.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/af_inet6.c 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -173,6 +173,8 @@ sk->net_pinfo.af_inet6.mc_loop = 1; sk->net_pinfo.af_inet6.pmtudisc = IPV6_PMTUDISC_WANT; + sk->net_pinfo.af_inet6.ipv6only = ipv6_devconf.bindv6only; + /* Init the ipv4 part of the socket since we can have sockets * using v6 API for ipv4. */ @@ -248,6 +250,8 @@ /* Check if the address belongs to the host. */ if (addr_type == IPV6_ADDR_MAPPED) { + if (sk->net_pinfo.af_inet6.ipv6only) + return -EADDRNOTAVAIL; v4addr = addr->sin6_addr.s6_addr32[3]; if (inet_addr_type(v4addr) != RTN_LOCAL) return -EADDRNOTAVAIL; Index: net/ipv6/ipv6_sockglue.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/ipv6_sockglue.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- net/ipv6/ipv6_sockglue.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/ipv6_sockglue.c 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -380,6 +380,15 @@ retv = ipv6_flowlabel_opt(sk, optval, optlen); break; + case IPV6_V6ONLY: + if (optlen != sizeof(int)) + goto e_inval; + if (sk->userlocks&SOCK_BINDADDR_LOCK) + goto e_inval; + np->ipv6only = valbool; + retv = 0; + break; + #ifdef CONFIG_NETFILTER default: retv = nf_setsockopt(sk, PF_INET6, optname, optval, @@ -520,6 +529,10 @@ case IPV6_FLOWINFO_SEND: val = np->sndflow; + break; + + case IPV6_V6ONLY: + val = np->ipv6only; break; default: Index: net/ipv6/tcp_ipv6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/tcp_ipv6.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- net/ipv6/tcp_ipv6.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/tcp_ipv6.c 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -14,6 +14,14 @@ * * Fixes: * Hideaki YOSHIFUJI : sin6_scope_id support + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: + * - Allow ipv6 and ipv4 bind(2) to the + * same port if IPV6_V6ONLY socket + * option is set. + * - Don't allow binding to the same + * address unless it is one of multi- + * cast address even if SO_REUSEADDR + * is set. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -137,28 +145,70 @@ goto success; } else { struct sock *sk2 = tb->owners; - int sk_reuse = sk->reuse; - int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr); + int sk_reuse, sk2_reuse; + struct in6_addr *sk_rcv_saddr6 = sk->state != TCP_TIME_WAIT ? + &sk->net_pinfo.af_inet6.rcv_saddr: + &((struct tcp_tw_bucket*)sk)->v6_rcv_saddr; + int addr_type = ipv6_addr_type(sk_rcv_saddr6), + addr_type2; + + sk_reuse = 0; + if (sk->reuse) + sk_reuse |= 1; /* We must walk the whole port owner list in this case. -DaveM */ for( ; sk2 != NULL; sk2 = sk2->bind_next) { - if (sk != sk2 && - sk->bound_dev_if == sk2->bound_dev_if) { - if (!sk_reuse || - !sk2->reuse || - sk2->state == TCP_LISTEN) { - /* NOTE: IPv6 tw bucket have different format */ - if (!sk2->rcv_saddr || - addr_type == IPV6_ADDR_ANY || - !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.rcv_saddr, - sk2->state != TCP_TIME_WAIT ? - &sk2->net_pinfo.af_inet6.rcv_saddr : - &((struct tcp_tw_bucket*)sk)->v6_rcv_saddr) || - (addr_type==IPV6_ADDR_MAPPED && sk2->family==AF_INET && - sk->rcv_saddr==sk2->rcv_saddr)) - break; + int both_specified = 0; + struct in6_addr *sk2_rcv_saddr6; + if (sk2 == sk || + (sk2->bound_dev_if && sk->bound_dev_if && + sk2->bound_dev_if != sk->bound_dev_if)) + continue; + sk2_rcv_saddr6 = sk2->state != TCP_TIME_WAIT ? + &sk2->net_pinfo.af_inet6.rcv_saddr : + &((struct tcp_tw_bucket*)sk2)->v6_rcv_saddr; + + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) { + if (addr_type2 == IPV6_ADDR_MAPPED || addr_type == IPV6_ADDR_MAPPED) { + if (addr_type2 != addr_type || + sk2->rcv_saddr != sk->rcv_saddr) + continue; + } else { + if (ipv6_addr_cmp(sk2_rcv_saddr6, sk_rcv_saddr6)) + continue; } + both_specified = 1; } + + if ((addr_type2 == IPV6_ADDR_MAPPED && + addr_type != IPV6_ADDR_MAPPED && sk->net_pinfo.af_inet6.ipv6only) || + (addr_type == IPV6_ADDR_MAPPED && + addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only)) { + continue; + } + + sk2_reuse = 0; + if (sk2->reuse) + sk2_reuse |= 1; + + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ + ret = 1; + if (both_specified) { + struct in6_addr *sk2_daddr6 = sk2->state != TCP_TIME_WAIT ? + &sk2->net_pinfo.af_inet6.daddr : + &((struct tcp_tw_bucket*)sk2)->v6_daddr; + int addr_type2d = sk2->family == AF_INET6 ? ipv6_addr_type(sk2_daddr6) : IPV6_ADDR_MAPPED; + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) + continue; + } else { + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) + continue; + } + } + ret = 1; + goto fail_unlock; } /* If we found a conflict, fail. */ ret = 1; @@ -601,6 +651,9 @@ struct sockaddr_in sin; SOCK_DEBUG(sk, "connect: ipv4 mapped\n"); + + if (sk->net_pinfo.af_inet6.ipv6only) + return -ENETUNREACH; sin.sin_family = AF_INET; sin.sin_port = usin->sin6_port; Index: net/ipv6/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/udp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -u -r1.1.1.1 -r1.1.1.1.8.1 --- net/ipv6/udp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/udp.c 2002/09/11 03:30:27 1.1.1.1.8.1 @@ -11,7 +11,16 @@ * * Fixes: * Hideaki YOSHIFUJI : sin6_scope_id support + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: + * - Allow ipv6 and ipv4 bind(2) to the + * same port if IPV6_V6ONLY socket + * option is set. + * - Don't allow binding to the same + * address unless it is one of multi- + * cast address even if SO_REUSEADDR + * is set. * + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version @@ -98,23 +107,72 @@ udp_port_rover = snum = result; } else { struct sock *sk2; - int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr); + int sk_reuse, sk2_reuse; + int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr), + addr_type2; + + sk_reuse = 0; + if (sk->reuse) + sk_reuse |= 1; + if (sk_reuse && + (addr_type != IPV6_ADDR_MAPPED ? (addr_type & IPV6_ADDR_MULTICAST) : MULTICAST(sk->rcv_saddr))) + sk_reuse |= 4; for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)]; sk2 != NULL; sk2 = sk2->next) { - if (sk2->num == snum && - sk2 != sk && - sk2->bound_dev_if == sk->bound_dev_if && - (!sk2->rcv_saddr || - addr_type == IPV6_ADDR_ANY || - !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.rcv_saddr, - &sk2->net_pinfo.af_inet6.rcv_saddr) || - (addr_type == IPV6_ADDR_MAPPED && - sk2->family == AF_INET && - sk->rcv_saddr == sk2->rcv_saddr)) && - (!sk2->reuse || !sk->reuse)) - goto fail; + int both_specified = 0; + + if (sk2->num != snum || + sk2 == sk || + (sk2->bound_dev_if && sk->bound_dev_if && + sk2->bound_dev_if != sk->bound_dev_if)) + continue; + + addr_type2 = sk2->family == AF_INET6 ? ipv6_addr_type(&sk2->net_pinfo.af_inet6.rcv_saddr) : IPV6_ADDR_MAPPED; + + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) { + if (addr_type2 == IPV6_ADDR_MAPPED || addr_type == IPV6_ADDR_MAPPED) { + if (addr_type2 != addr_type || + sk2->rcv_saddr != sk->rcv_saddr) + continue; + } else { + if (ipv6_addr_cmp(&sk2->net_pinfo.af_inet6.rcv_saddr, + &sk->net_pinfo.af_inet6.rcv_saddr)) + continue; + } + both_specified = 1; + } + + if ((addr_type2 == IPV6_ADDR_MAPPED && + addr_type != IPV6_ADDR_MAPPED && sk->net_pinfo.af_inet6.ipv6only) || + (addr_type == IPV6_ADDR_MAPPED && + addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only)) { + continue; + } + + sk2_reuse = 0; + if (sk2->reuse) + sk2_reuse |= 1; + if (sk2_reuse && + (addr_type2 != IPV6_ADDR_MAPPED ? (addr_type2 & IPV6_ADDR_MULTICAST) : MULTICAST(sk2->rcv_saddr))) + sk2_reuse |= 4; + + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ + if (sk2_reuse & sk_reuse & 4) + continue; + if (both_specified) { + int addr_type2d = sk2->family == AF_INET6 ? ipv6_addr_type(&sk2->net_pinfo.af_inet6.daddr) : IPV6_ADDR_MAPPED; + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) + continue; + } else { + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) + continue; + } + } + goto fail; } } @@ -221,6 +279,8 @@ int err; if (usin->sin6_family == AF_INET) { + if (sk->net_pinfo.af_inet6.ipv6only) + return -EAFNOSUPPORT; err = udp_connect(sk, uaddr, addr_len); goto ipv4_connected; } @@ -256,6 +316,9 @@ if (addr_type == IPV6_ADDR_MAPPED) { struct sockaddr_in sin; + if (sk->net_pinfo.af_inet6.ipv6only) + return -ENETUNREACH; + sin.sin_family = AF_INET; sin.sin_addr.s_addr = daddr->s6_addr32[3]; sin.sin_port = usin->sin6_port; @@ -783,8 +846,11 @@ fl.oif = 0; if (sin6) { - if (sin6->sin6_family == AF_INET) + if (sin6->sin6_family == AF_INET) { + if (sk->net_pinfo.af_inet6.ipv6only) + return -EAFNOSUPPORT; return udp_sendmsg(sk, msg, ulen); + } if (addr_len < SIN6_LEN_RFC2133) return -EINVAL; @@ -830,6 +896,9 @@ if (addr_type == IPV6_ADDR_MAPPED) { struct sockaddr_in sin; + + if (sk->net_pinfo.af_inet6.ipv6only) + return -ENETUNREACH; sin.sin_family = AF_INET; sin.sin_addr.s_addr = daddr->s6_addr32[3]; From jmorris@intercode.com.au Wed Oct 2 20:31:30 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 20:31:36 -0700 (PDT) Received: from blackbird.intercode.com.au (blackbird.intercode.com.au [203.32.101.10]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g933VStG016771 for ; Wed, 2 Oct 2002 20:31:29 -0700 Received: from localhost (jmorris@localhost) by blackbird.intercode.com.au (8.9.3/8.9.3) with ESMTP id NAA13245; Thu, 3 Oct 2002 13:30:44 +1000 Date: Thu, 3 Oct 2002 13:30:44 +1000 (EST) From: James Morris To: Alan Cox cc: Martin Pool , "David S. Miller" , , , , Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case In-Reply-To: <1033388585.16337.9.camel@irongate.swansea.linux.org.uk> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 483 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@intercode.com.au Precedence: bulk X-list: netdev On 30 Sep 2002, Alan Cox wrote: > Well if Dave can't test it and isnt doing any 2.2 who wants to be the > 2.2 networking maintainer ? > I'd be willing to give it a go. - James -- James Morris From httpd@dino.conectiva.com.br Wed Oct 2 20:53:22 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 20:53:24 -0700 (PDT) Received: from dino.conectiva.com.br (dino.conectiva.com.br [200.250.58.152]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g933rLtG017368 for ; Wed, 2 Oct 2002 20:53:22 -0700 Received: (from httpd@localhost) by dino.conectiva.com.br (8.9.3/8.9.3) id AAA16485; Thu, 3 Oct 2002 00:53:15 -0300 To: YOSHIFUJI@conectiva.com.br, UNEXPECTED_DATA_AFTER_ADDRESS@.SYNTAX-ERROR Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) Message-ID: <1033617195.3d9bbf2b900e4@webmail.conectiva.com.br> Date: Thu, 03 Oct 2002 00:53:15 -0300 (BRST) From: acme@conectiva.com.br Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit User-Agent: IMP/PHP IMAP webmail program 2.2.8 X-archive-position: 485 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Quoting YOSHIFUJI Hideaki / $B5HF#1QL@(B : > +#define IN6_IS_ADDR_V4MAPPED(a) \ > + ((((a)->s6_addr32[0]) == 0) && \ > + (((a)->s6_addr32[1]) == 0) && \ > + (((a)->s6_addr32[2]) == __constant_htonl(0x0000ffff))) Please use plain htonl, __constant_htonl is only needed in static initializations, in all other cases with constants as a parameter it generates the same code as htonl, so lets prefer using the shorter, more readable format. - Arnaldo From httpd@dino.conectiva.com.br Wed Oct 2 20:53:13 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 20:53:19 -0700 (PDT) Received: from dino.conectiva.com.br (dino.conectiva.com.br [200.250.58.152]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g933rBtG017328 for ; Wed, 2 Oct 2002 20:53:12 -0700 Received: (from httpd@localhost) by dino.conectiva.com.br (8.9.3/8.9.3) id AAA16474; Thu, 3 Oct 2002 00:53:01 -0300 To: YOSHIFUJI@conectiva.com.br, UNEXPECTED_DATA_AFTER_ADDRESS@.SYNTAX-ERROR Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) Message-ID: <1033617181.3d9bbf1d557a3@webmail.conectiva.com.br> Date: Thu, 03 Oct 2002 00:53:01 -0300 (BRST) From: acme@conectiva.com.br Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org References: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> In-Reply-To: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit User-Agent: IMP/PHP IMAP webmail program 2.2.8 X-archive-position: 484 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Quoting YOSHIFUJI Hideaki / $B5HF#1QL@(B : > +#define IN6_IS_ADDR_V4MAPPED(a) \ > + ((((a)->s6_addr32[0]) == 0) && \ > + (((a)->s6_addr32[1]) == 0) && \ > + (((a)->s6_addr32[2]) == __constant_htonl(0x0000ffff))) Please use plain htonl, __constant_htonl is only needed in static initializations, in all other cases with constants as a parameter it generates the same code as htonl, so lets prefer using the shorter, more readable format. - Arnaldo From acme@conectiva.com.br Wed Oct 2 20:55:28 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 20:55:29 -0700 (PDT) Received: from dino.conectiva.com.br (dino.conectiva.com.br [200.250.58.152]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g933tQtG018118 for ; Wed, 2 Oct 2002 20:55:27 -0700 Received: (from httpd@localhost) by dino.conectiva.com.br (8.9.3/8.9.3) id AAA16496; Thu, 3 Oct 2002 00:55:19 -0300 From: acme@conectiva.com.br X-Authentication-Warning: dino.conectiva.com.br: httpd set sender to acme@conectiva.com.br using -f To: yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) Message-ID: <1033617319.3d9bbfa7cd15e@webmail.conectiva.com.br> Date: Thu, 03 Oct 2002 00:55:19 -0300 (BRST) Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org References: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> In-Reply-To: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit User-Agent: IMP/PHP IMAP webmail program 2.2.8 X-archive-position: 486 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Quoting YOSHIFUJI Hideaki / $B5HF#1QL@(B : > + (((a)->s6_addr32[2]) == __constant_htonl(0x0000ffff))) Please use plain htonl, __constant_htonl is only needed in static initializations, in all other cases with constants as a parameter it generates the same code as htonl, so lets prefer using the shorter, more readable format. - Arnaldo From andi@averellmail.firstfloor.org Wed Oct 2 20:56:07 2002 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Oct 2002 20:56:09 -0700 (PDT) Received: from zero.aec.at (nichts@zero.aec.at [193.170.194.10]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g933u6tG018380 for ; Wed, 2 Oct 2002 20:56:07 -0700 Received: from averell.firstfloor.org (nichts@localhost.localdomain [127.0.0.1]) by zero.aec.at (8.11.6/8.11.2) with ESMTP id g933slF02011; Thu, 3 Oct 2002 05:54:50 +0200 Received: by averell.firstfloor.org (Postfix on SuSE Linux 7.3 (i386), from userid 500) id 92BEA6A984; Thu, 3 Oct 2002 05:54:46 +0200 (CEST) Date: Thu, 3 Oct 2002 05:54:46 +0200 From: Andi Kleen To: James Morris Cc: Alan Cox , Martin Pool , "David S. Miller" , kuznet@ms2.inr.ac.ru, ak@muc.de, netdev@oss.sgi.com, Alan.Cox@linux.org Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case Message-ID: <20021003035446.GA29860@averell> References: <1033388585.16337.9.camel@irongate.swansea.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4i X-archive-position: 487 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@muc.de Precedence: bulk X-list: netdev On Thu, Oct 03, 2002 at 05:30:44AM +0200, James Morris wrote: > On 30 Sep 2002, Alan Cox wrote: > > > Well if Dave can't test it and isnt doing any 2.2 who wants to be the > > 2.2 networking maintainer ? > > > > I'd be willing to give it a go. 2.2 networking unfortunately has some more SMP bugs (DaveM can tell you details) which are hard to fix. So think twice before you volunteer ;) -Andi From pekkas@netcore.fi Thu Oct 3 00:00:20 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 00:00:28 -0700 (PDT) Received: from netcore.fi (netcore.fi [193.94.160.1]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g9370ItG021906 for ; Thu, 3 Oct 2002 00:00:19 -0700 Received: from localhost (pekkas@localhost) by netcore.fi (8.11.6/8.11.6) with ESMTP id g93700S04849; Thu, 3 Oct 2002 10:00:01 +0300 Date: Thu, 3 Oct 2002 10:00:00 +0300 (EEST) From: Pekka Savola To: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= cc: linux-kernel@vger.kernel.org, , Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) In-Reply-To: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=ISO-8859-1 X-archive-position: 488 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pekkas@netcore.fi Precedence: bulk X-list: netdev Please add a short description of 'bindv6only' in Documentation/networking/ip-sysctl.txt. This toggle seems usable only in interface "all" context. Didn't really look at the rest of the patch. On Thu, 3 Oct 2002, YOSHIFUJI Hideaki / [iso-2022-jp] $B5HF#1QL@(B wrote: > Hello! > > Linux IPv6 stack provides the ability for IPv6 applications to > interoperate with IPv4 applications. Port space for TCP (or UDP) is > shared by IPv6 and IPv4. This conforms to RFC2553. > However, some kind of applications may want to restrict their use of > an IPv6 socket to IPv6 communication only. IPV6_V6ONLY socket option is > defined for such applications in RFC2553bis, which is successor of RFC2553. > This patch allows to bind both IPv6 and IPv4 sockets with the single > port number at the same time if IPV6_V6ONLY socket options is set to > the IPv6 socket. > > We also prohibit a completely duplicate set of (local-addr, local-port, > remote-addr, remote-port) set even if SO_REUSEADDR is set unless > the local address is a multicast address; it is ambiguous and it may > steal packets from others; i.e. a kind of DoS. > > Packet delivery strategy is similar to one before, but we prefer > IPv4 a bit. > > Following patch is against linux-2.4.19. > > Thank you in advance. > > ------------------------------------------------------------------- > Patch-Name: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) > Patch-Id: FIX_2_4_19_DOUBLEBIND-20020909 > Patch-Author: YOSHIFUJI Hideaki / USAGI Project > Credit: YOSHIFUJI Hideaki / USAGI Project > Reference: RFC2553bis > ------------------------------------------------------------------- > Index: include/linux/in6.h > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/include/linux/in6.h,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- include/linux/in6.h 2002/08/20 09:46:34 1.1.1.1 > +++ include/linux/in6.h 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -156,6 +156,7 @@ > #define IPV6_MTU_DISCOVER 23 > #define IPV6_MTU 24 > #define IPV6_RECVERR 25 > +#define IPV6_V6ONLY 26 > > /* IPV6_MTU_DISCOVER values */ > #define IPV6_PMTUDISC_DONT 0 > @@ -167,4 +168,19 @@ > #define IPV6_FLOWINFO_SEND 33 > > > +#ifdef __KERNEL__ > +#ifndef IN6_IS_ADDR_UNSPECIFIED > +#define IN6_IS_ADDR_UNSPECIFIED(a) \ > + ((((a)->s6_addr32[0]) == 0) && \ > + (((a)->s6_addr32[1]) == 0) && \ > + (((a)->s6_addr32[2]) == 0) && \ > + (((a)->s6_addr32[3]) == 0)) > +#endif > +#ifndef IN6_IS_ADDR_V4MAPPED > +#define IN6_IS_ADDR_V4MAPPED(a) \ > + ((((a)->s6_addr32[0]) == 0) && \ > + (((a)->s6_addr32[1]) == 0) && \ > + (((a)->s6_addr32[2]) == __constant_htonl(0x0000ffff))) > +#endif > +#endif > #endif > Index: include/linux/sysctl.h > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/include/linux/sysctl.h,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- include/linux/sysctl.h 2002/08/20 09:46:34 1.1.1.1 > +++ include/linux/sysctl.h 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -369,7 +369,8 @@ > NET_IPV6_DAD_TRANSMITS=7, > NET_IPV6_RTR_SOLICITS=8, > NET_IPV6_RTR_SOLICIT_INTERVAL=9, > - NET_IPV6_RTR_SOLICIT_DELAY=10 > + NET_IPV6_RTR_SOLICIT_DELAY=10, > + NET_IPV6_BINDV6ONLY=11 > }; > > /* /proc/sys/net//neigh/ */ > Index: include/net/if_inet6.h > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/if_inet6.h,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- include/net/if_inet6.h 2002/08/20 09:46:45 1.1.1.1 > +++ include/net/if_inet6.h 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -86,6 +86,7 @@ > int rtr_solicits; > int rtr_solicit_interval; > int rtr_solicit_delay; > + int bindv6only; > > void *sysctl; > }; > Index: include/net/sock.h > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/sock.h,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- include/net/sock.h 2002/08/20 09:46:45 1.1.1.1 > +++ include/net/sock.h 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -171,7 +171,8 @@ > __u8 mc_loop:1, > recverr:1, > sndflow:1, > - pmtudisc:2; > + pmtudisc:2, > + ipv6only:1; > > struct ipv6_mc_socklist *ipv6_mc_list; > struct ipv6_fl_socklist *ipv6_fl_list; > Index: net/ipv4/tcp_ipv4.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_ipv4.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv4/tcp_ipv4.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv4/tcp_ipv4.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -45,6 +45,14 @@ > * Vitaly E. Lavrov : Transparent proxy revived after year coma. > * Andi Kleen : Fix new listen. > * Andi Kleen : Fix accept error reporting. > + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior including: > + * - Allow ipv6 and ipv4 bind(2) to the > + * same port if IPV6_V6ONLY socket option > + * is set. > + * - Don't allow binding to the same > + * address unless it is one of multi- > + * cast address even if SO_REUSEADDR > + * is set. > */ > > #include > @@ -177,23 +185,92 @@ > static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb) > { > struct sock *sk2 = tb->owners; > - int sk_reuse = sk->reuse; > + int sk_reuse, sk2_reuse; > + int addr_type2; > + int ret; > + > + sk_reuse = 0; > + if (sk->reuse) > + sk_reuse |= 1; > > for( ; sk2 != NULL; sk2 = sk2->bind_next) { > - if (sk != sk2 && > - sk2->reuse <= 1 && > - sk->bound_dev_if == sk2->bound_dev_if) { > - if (!sk_reuse || > - !sk2->reuse || > - sk2->state == TCP_LISTEN) { > - if (!sk2->rcv_saddr || > - !sk->rcv_saddr || > - (sk2->rcv_saddr == sk->rcv_saddr)) > - break; > + int both_specified = 0; > + > + if (sk2 == sk || > + (sk2->bound_dev_if && sk->bound_dev_if && > + sk2->bound_dev_if != sk->bound_dev_if)) > + continue; > + > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (sk2->family == AF_INET6) { > + struct in6_addr *sk2_rcv_saddr6 = sk2->state != TCP_TIME_WAIT ? > + &sk2->net_pinfo.af_inet6.rcv_saddr : > + &((struct tcp_tw_bucket*)sk2)->v6_rcv_saddr; > + if (IN6_IS_ADDR_UNSPECIFIED(sk2_rcv_saddr6)) > + addr_type2 = IPV6_ADDR_ANY; > + else if (IN6_IS_ADDR_V4MAPPED(sk2_rcv_saddr6)) > + addr_type2 = IPV6_ADDR_MAPPED; > + else > + addr_type2 = IPV6_ADDR_UNICAST; /*XXX*/ > + } else > + addr_type2 = IPV6_ADDR_MAPPED; > +#else > + addr_type2 = IPV6_ADDR_MAPPED; > +#endif > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && > + sk->rcv_saddr) { > + if (sk2->rcv_saddr != sk->rcv_saddr) > + continue; > + both_specified = 1; > + } > + > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only) { > + continue; > + } > +#endif > + > + sk2_reuse = 0; > + if (sk2->reuse) > + sk2_reuse |= 1; > + > + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ > + ret = 1; > + if (both_specified) { > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + struct in6_addr *sk2_daddr6 = sk2->state != TCP_TIME_WAIT ? > + &sk2->net_pinfo.af_inet6.daddr : > + &((struct tcp_tw_bucket*)sk2)->v6_daddr; > +#endif > + int addr_type2d; > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (sk2->family == AF_INET6) { > + if (IN6_IS_ADDR_UNSPECIFIED(sk2_daddr6)) > + addr_type2d = IPV6_ADDR_ANY; > + else if (IN6_IS_ADDR_V4MAPPED(sk2_daddr6)) > + addr_type2d = IPV6_ADDR_MAPPED; > + else > + addr_type2d = IPV6_ADDR_UNICAST; /*XXX*/ > + } else > + addr_type2d = IPV6_ADDR_MAPPED; > +#else > + addr_type2d = IPV6_ADDR_MAPPED; > +#endif > + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) > + continue; > + } else { > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || > + sk->rcv_saddr) > + continue; > } > } > + ret = 1; > + goto failed; > } > - return sk2 != NULL; > + /* If we found a conflict, fail. */ > + ret = sk2 != NULL; > +failed: > + return ret; > } > > /* Obtain a reference to a local port for the given sock, > @@ -247,10 +324,11 @@ > break; > } > if (tb != NULL && tb->owners != NULL) { > - if (sk->reuse > 1) > + ret = 1; > + if (tb->fastreuse > 0 && > + sk->reuse != 0 && > + sk->state != TCP_LISTEN) { > goto success; > - if (tb->fastreuse > 0 && sk->reuse != 0 && sk->state != TCP_LISTEN) { > - goto success; > } else { > ret = 1; > if (tcp_bind_conflict(sk, tb)) > @@ -418,23 +496,31 @@ > struct sock *result = NULL; > int score, hiscore; > > - hiscore=0; > + hiscore = -1; > for(; sk; sk = sk->next) { > if(sk->num == hnum) { > __u32 rcv_saddr = sk->rcv_saddr; > > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + score = 0; > + if (sk->family == PF_INET) > + score++; > + else if (sk->net_pinfo.af_inet6.ipv6only) > + continue; > +#else > score = 1; > +#endif > if(rcv_saddr) { > if (rcv_saddr != daddr) > continue; > - score++; > + score+=2; > } > if (sk->bound_dev_if) { > if (sk->bound_dev_if != dif) > continue; > - score++; > + score+=2; > } > - if (score == 3) > + if (score == 5) > return sk; > if (score > hiscore) { > hiscore = score; > @@ -456,6 +542,10 @@ > if (sk->num == hnum && > sk->next == NULL && > (!sk->rcv_saddr || sk->rcv_saddr == daddr) && > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + (sk->family == PF_INET || > + (sk->family == PF_INET6 && !sk->net_pinfo.af_inet6.ipv6only)) && > +#endif > !sk->bound_dev_if) > goto sherry_cache; > sk = __tcp_v4_lookup_listener(sk, daddr, hnum, dif); > Index: net/ipv4/udp.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/udp.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv4/udp.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv4/udp.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -61,6 +61,14 @@ > * return ENOTCONN for unconnected sockets (POSIX) > * Janos Farkas : don't deliver multi/broadcasts to a different > * bound-to-device socket > + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: > + * - Allow ipv6 and ipv4 bind(2) to the > + * same port if IPV6_V6ONLY socket opttion is > + * is set. > + * - Don't allow binding to the same > + * address unless it is one of multi- > + * cast address even if SO_REUSEADDR > + * is set. > * > * > * This program is free software; you can redistribute it and/or > @@ -85,6 +93,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -153,18 +162,88 @@ > udp_port_rover = snum = result; > } else { > struct sock *sk2; > + int sk_reuse, sk2_reuse; > + int addr_type2; > > + sk_reuse = 0; > + if (sk->reuse) > + sk_reuse |= 1; > + if (sk_reuse && > + MULTICAST(sk->rcv_saddr)) > + sk_reuse |= 4; > + > for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)]; > sk2 != NULL; > sk2 = sk2->next) { > - if (sk2->num == snum && > - sk2 != sk && > - sk2->bound_dev_if == sk->bound_dev_if && > - (!sk2->rcv_saddr || > - !sk->rcv_saddr || > - sk2->rcv_saddr == sk->rcv_saddr) && > - (!sk2->reuse || !sk->reuse)) > - goto fail; > + int both_specified = 0; > + > + if (sk2->num != snum || > + sk2 == sk || > + (sk2->bound_dev_if && sk->bound_dev_if && > + sk2->bound_dev_if != sk->bound_dev_if)) > + continue; > + > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (sk2->family == AF_INET6) { > + if (IN6_IS_ADDR_UNSPECIFIED(&sk2->net_pinfo.af_inet6.rcv_saddr)) > + addr_type2 = IPV6_ADDR_ANY; > + else if (IN6_IS_ADDR_V4MAPPED(&sk2->net_pinfo.af_inet6.rcv_saddr)) > + addr_type2 = IPV6_ADDR_MAPPED; > + else > + addr_type2 = IPV6_ADDR_UNICAST; /*XXX*/ > + } else > + addr_type2 = IPV6_ADDR_MAPPED; > +#else > + addr_type2 = IPV6_ADDR_MAPPED; > +#endif > + > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && > + sk->rcv_saddr) { > + if (sk2->rcv_saddr != sk->rcv_saddr) > + continue; > + both_specified = 1; > + } > + > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only) { > + continue; > + } > +#endif > + > + sk2_reuse = 0; > + if (sk2->reuse) > + sk2_reuse |= 1; > + if (sk2_reuse && > + (addr_type2 != IPV6_ADDR_MAPPED ? (addr_type2 & IPV6_ADDR_MULTICAST) : MULTICAST(sk2->rcv_saddr))) > + sk2_reuse |= 4; > + > + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ > + if (sk2_reuse & sk_reuse & 4) > + continue; > + if (both_specified) { > + int addr_type2d; > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (sk2->family == AF_INET6) { > + if (IN6_IS_ADDR_UNSPECIFIED(&sk2->net_pinfo.af_inet6.daddr)) > + addr_type2d = IPV6_ADDR_ANY; > + else if (IN6_IS_ADDR_V4MAPPED(&sk2->net_pinfo.af_inet6.daddr)) > + addr_type2d = IPV6_ADDR_MAPPED; > + else > + addr_type2d = IPV6_ADDR_UNICAST; /*XXX*/ > + } else > + addr_type2d = IPV6_ADDR_MAPPED; > +#else > + addr_type2d = IPV6_ADDR_MAPPED; > +#endif > + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) > + continue; > + } else { > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || > + sk->rcv_saddr) > + continue; > + } > + } > + goto fail; > } > } > sk->num = snum; > @@ -216,28 +295,37 @@ > > for(sk = udp_hash[hnum & (UDP_HTABLE_SIZE - 1)]; sk != NULL; sk = sk->next) { > if(sk->num == hnum) { > - int score = 0; > + int score; > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + score = 0; > + if(sk->family == PF_INET) > + score++; > + else if (sk->net_pinfo.af_inet6.ipv6only) > + continue; > +#else > + score = 1; > +#endif > if(sk->rcv_saddr) { > if(sk->rcv_saddr != daddr) > continue; > - score++; > + score+=2; > } > if(sk->daddr) { > if(sk->daddr != saddr) > continue; > - score++; > + score+=2; > } > if(sk->dport) { > if(sk->dport != sport) > continue; > - score++; > + score+=2; > } > if(sk->bound_dev_if) { > if(sk->bound_dev_if != dif) > continue; > - score++; > + score+=2; > } > - if(score == 4) { > + if(score == 9) { > result = sk; > break; > } else if(score > badness) { > @@ -273,6 +361,9 @@ > (s->daddr && s->daddr!=rmt_addr) || > (s->dport != rmt_port && s->dport != 0) || > (s->rcv_saddr && s->rcv_saddr != loc_addr) || > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + (s->family != PF_INET && s->net_pinfo.af_inet6.ipv6only) || > +#endif > (s->bound_dev_if && s->bound_dev_if != dif)) > continue; > break; > Index: net/ipv6/addrconf.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/addrconf.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -116,6 +116,7 @@ > MAX_RTR_SOLICITATIONS, /* router solicits */ > RTR_SOLICITATION_INTERVAL, /* rtr solicit interval */ > MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */ > + bindv6only: 0, > }; > > static struct ipv6_devconf ipv6_devconf_dflt = > @@ -130,6 +131,7 @@ > MAX_RTR_SOLICITATIONS, /* router solicits */ > RTR_SOLICITATION_INTERVAL, /* rtr solicit interval */ > MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */ > + bindv6only: 0, > }; > > int ipv6_addr_type(struct in6_addr *addr) > @@ -1879,7 +1881,7 @@ > static struct addrconf_sysctl_table > { > struct ctl_table_header *sysctl_header; > - ctl_table addrconf_vars[11]; > + ctl_table addrconf_vars[12]; > ctl_table addrconf_dev[2]; > ctl_table addrconf_conf_dir[2]; > ctl_table addrconf_proto_dir[2]; > @@ -1925,6 +1927,10 @@ > {NET_IPV6_RTR_SOLICIT_DELAY, "router_solicitation_delay", > &ipv6_devconf.rtr_solicit_delay, sizeof(int), 0644, NULL, > &proc_dointvec_jiffies}, > + > + {NET_IPV6_BINDV6ONLY, "bindv6only", > + &ipv6_devconf.bindv6only, sizeof(int), 0644, NULL, > + &proc_dointvec}, > > {0}}, > > Index: net/ipv6/af_inet6.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/af_inet6.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/af_inet6.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/af_inet6.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -173,6 +173,8 @@ > sk->net_pinfo.af_inet6.mc_loop = 1; > sk->net_pinfo.af_inet6.pmtudisc = IPV6_PMTUDISC_WANT; > > + sk->net_pinfo.af_inet6.ipv6only = ipv6_devconf.bindv6only; > + > /* Init the ipv4 part of the socket since we can have sockets > * using v6 API for ipv4. > */ > @@ -248,6 +250,8 @@ > > /* Check if the address belongs to the host. */ > if (addr_type == IPV6_ADDR_MAPPED) { > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -EADDRNOTAVAIL; > v4addr = addr->sin6_addr.s6_addr32[3]; > if (inet_addr_type(v4addr) != RTN_LOCAL) > return -EADDRNOTAVAIL; > Index: net/ipv6/ipv6_sockglue.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/ipv6_sockglue.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/ipv6_sockglue.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/ipv6_sockglue.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -380,6 +380,15 @@ > retv = ipv6_flowlabel_opt(sk, optval, optlen); > break; > > + case IPV6_V6ONLY: > + if (optlen != sizeof(int)) > + goto e_inval; > + if (sk->userlocks&SOCK_BINDADDR_LOCK) > + goto e_inval; > + np->ipv6only = valbool; > + retv = 0; > + break; > + > #ifdef CONFIG_NETFILTER > default: > retv = nf_setsockopt(sk, PF_INET6, optname, optval, > @@ -520,6 +529,10 @@ > > case IPV6_FLOWINFO_SEND: > val = np->sndflow; > + break; > + > + case IPV6_V6ONLY: > + val = np->ipv6only; > break; > > default: > Index: net/ipv6/tcp_ipv6.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/tcp_ipv6.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/tcp_ipv6.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/tcp_ipv6.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -14,6 +14,14 @@ > * > * Fixes: > * Hideaki YOSHIFUJI : sin6_scope_id support > + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: > + * - Allow ipv6 and ipv4 bind(2) to the > + * same port if IPV6_V6ONLY socket > + * option is set. > + * - Don't allow binding to the same > + * address unless it is one of multi- > + * cast address even if SO_REUSEADDR > + * is set. > * > * This program is free software; you can redistribute it and/or > * modify it under the terms of the GNU General Public License > @@ -137,28 +145,70 @@ > goto success; > } else { > struct sock *sk2 = tb->owners; > - int sk_reuse = sk->reuse; > - int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr); > + int sk_reuse, sk2_reuse; > + struct in6_addr *sk_rcv_saddr6 = sk->state != TCP_TIME_WAIT ? > + &sk->net_pinfo.af_inet6.rcv_saddr: > + &((struct tcp_tw_bucket*)sk)->v6_rcv_saddr; > + int addr_type = ipv6_addr_type(sk_rcv_saddr6), > + addr_type2; > + > + sk_reuse = 0; > + if (sk->reuse) > + sk_reuse |= 1; > > /* We must walk the whole port owner list in this case. -DaveM */ > for( ; sk2 != NULL; sk2 = sk2->bind_next) { > - if (sk != sk2 && > - sk->bound_dev_if == sk2->bound_dev_if) { > - if (!sk_reuse || > - !sk2->reuse || > - sk2->state == TCP_LISTEN) { > - /* NOTE: IPv6 tw bucket have different format */ > - if (!sk2->rcv_saddr || > - addr_type == IPV6_ADDR_ANY || > - !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.rcv_saddr, > - sk2->state != TCP_TIME_WAIT ? > - &sk2->net_pinfo.af_inet6.rcv_saddr : > - &((struct tcp_tw_bucket*)sk)->v6_rcv_saddr) || > - (addr_type==IPV6_ADDR_MAPPED && sk2->family==AF_INET && > - sk->rcv_saddr==sk2->rcv_saddr)) > - break; > + int both_specified = 0; > + struct in6_addr *sk2_rcv_saddr6; > + if (sk2 == sk || > + (sk2->bound_dev_if && sk->bound_dev_if && > + sk2->bound_dev_if != sk->bound_dev_if)) > + continue; > + sk2_rcv_saddr6 = sk2->state != TCP_TIME_WAIT ? > + &sk2->net_pinfo.af_inet6.rcv_saddr : > + &((struct tcp_tw_bucket*)sk2)->v6_rcv_saddr; > + > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && > + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) { > + if (addr_type2 == IPV6_ADDR_MAPPED || addr_type == IPV6_ADDR_MAPPED) { > + if (addr_type2 != addr_type || > + sk2->rcv_saddr != sk->rcv_saddr) > + continue; > + } else { > + if (ipv6_addr_cmp(sk2_rcv_saddr6, sk_rcv_saddr6)) > + continue; > } > + both_specified = 1; > } > + > + if ((addr_type2 == IPV6_ADDR_MAPPED && > + addr_type != IPV6_ADDR_MAPPED && sk->net_pinfo.af_inet6.ipv6only) || > + (addr_type == IPV6_ADDR_MAPPED && > + addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only)) { > + continue; > + } > + > + sk2_reuse = 0; > + if (sk2->reuse) > + sk2_reuse |= 1; > + > + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ > + ret = 1; > + if (both_specified) { > + struct in6_addr *sk2_daddr6 = sk2->state != TCP_TIME_WAIT ? > + &sk2->net_pinfo.af_inet6.daddr : > + &((struct tcp_tw_bucket*)sk2)->v6_daddr; > + int addr_type2d = sk2->family == AF_INET6 ? ipv6_addr_type(sk2_daddr6) : IPV6_ADDR_MAPPED; > + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) > + continue; > + } else { > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || > + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) > + continue; > + } > + } > + ret = 1; > + goto fail_unlock; > } > /* If we found a conflict, fail. */ > ret = 1; > @@ -601,6 +651,9 @@ > struct sockaddr_in sin; > > SOCK_DEBUG(sk, "connect: ipv4 mapped\n"); > + > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -ENETUNREACH; > > sin.sin_family = AF_INET; > sin.sin_port = usin->sin6_port; > Index: net/ipv6/udp.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/udp.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/udp.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/udp.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -11,7 +11,16 @@ > * > * Fixes: > * Hideaki YOSHIFUJI : sin6_scope_id support > + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: > + * - Allow ipv6 and ipv4 bind(2) to the > + * same port if IPV6_V6ONLY socket > + * option is set. > + * - Don't allow binding to the same > + * address unless it is one of multi- > + * cast address even if SO_REUSEADDR > + * is set. > * > + * > * This program is free software; you can redistribute it and/or > * modify it under the terms of the GNU General Public License > * as published by the Free Software Foundation; either version > @@ -98,23 +107,72 @@ > udp_port_rover = snum = result; > } else { > struct sock *sk2; > - int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr); > + int sk_reuse, sk2_reuse; > + int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr), > + addr_type2; > + > + sk_reuse = 0; > + if (sk->reuse) > + sk_reuse |= 1; > + if (sk_reuse && > + (addr_type != IPV6_ADDR_MAPPED ? (addr_type & IPV6_ADDR_MULTICAST) : MULTICAST(sk->rcv_saddr))) > + sk_reuse |= 4; > > for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)]; > sk2 != NULL; > sk2 = sk2->next) { > - if (sk2->num == snum && > - sk2 != sk && > - sk2->bound_dev_if == sk->bound_dev_if && > - (!sk2->rcv_saddr || > - addr_type == IPV6_ADDR_ANY || > - !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.rcv_saddr, > - &sk2->net_pinfo.af_inet6.rcv_saddr) || > - (addr_type == IPV6_ADDR_MAPPED && > - sk2->family == AF_INET && > - sk->rcv_saddr == sk2->rcv_saddr)) && > - (!sk2->reuse || !sk->reuse)) > - goto fail; > + int both_specified = 0; > + > + if (sk2->num != snum || > + sk2 == sk || > + (sk2->bound_dev_if && sk->bound_dev_if && > + sk2->bound_dev_if != sk->bound_dev_if)) > + continue; > + > + addr_type2 = sk2->family == AF_INET6 ? ipv6_addr_type(&sk2->net_pinfo.af_inet6.rcv_saddr) : IPV6_ADDR_MAPPED; > + > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && > + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) { > + if (addr_type2 == IPV6_ADDR_MAPPED || addr_type == IPV6_ADDR_MAPPED) { > + if (addr_type2 != addr_type || > + sk2->rcv_saddr != sk->rcv_saddr) > + continue; > + } else { > + if (ipv6_addr_cmp(&sk2->net_pinfo.af_inet6.rcv_saddr, > + &sk->net_pinfo.af_inet6.rcv_saddr)) > + continue; > + } > + both_specified = 1; > + } > + > + if ((addr_type2 == IPV6_ADDR_MAPPED && > + addr_type != IPV6_ADDR_MAPPED && sk->net_pinfo.af_inet6.ipv6only) || > + (addr_type == IPV6_ADDR_MAPPED && > + addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only)) { > + continue; > + } > + > + sk2_reuse = 0; > + if (sk2->reuse) > + sk2_reuse |= 1; > + if (sk2_reuse && > + (addr_type2 != IPV6_ADDR_MAPPED ? (addr_type2 & IPV6_ADDR_MULTICAST) : MULTICAST(sk2->rcv_saddr))) > + sk2_reuse |= 4; > + > + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ > + if (sk2_reuse & sk_reuse & 4) > + continue; > + if (both_specified) { > + int addr_type2d = sk2->family == AF_INET6 ? ipv6_addr_type(&sk2->net_pinfo.af_inet6.daddr) : IPV6_ADDR_MAPPED; > + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) > + continue; > + } else { > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || > + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) > + continue; > + } > + } > + goto fail; > } > } > > @@ -221,6 +279,8 @@ > int err; > > if (usin->sin6_family == AF_INET) { > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -EAFNOSUPPORT; > err = udp_connect(sk, uaddr, addr_len); > goto ipv4_connected; > } > @@ -256,6 +316,9 @@ > if (addr_type == IPV6_ADDR_MAPPED) { > struct sockaddr_in sin; > > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -ENETUNREACH; > + > sin.sin_family = AF_INET; > sin.sin_addr.s_addr = daddr->s6_addr32[3]; > sin.sin_port = usin->sin6_port; > @@ -783,8 +846,11 @@ > fl.oif = 0; > > if (sin6) { > - if (sin6->sin6_family == AF_INET) > + if (sin6->sin6_family == AF_INET) { > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -EAFNOSUPPORT; > return udp_sendmsg(sk, msg, ulen); > + } > > if (addr_len < SIN6_LEN_RFC2133) > return -EINVAL; > @@ -830,6 +896,9 @@ > > if (addr_type == IPV6_ADDR_MAPPED) { > struct sockaddr_in sin; > + > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -ENETUNREACH; > > sin.sin_family = AF_INET; > sin.sin_addr.s_addr = daddr->s6_addr32[3]; > > -- Pekka Savola "Tell me of difficulties surmounted, Netcore Oy not those you stumble over and fall" Systems. Networks. Security. -- Robert Jordan: A Crown of Swords From davem@redhat.com Thu Oct 3 01:05:01 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 01:05:08 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93850tG005128 for ; Thu, 3 Oct 2002 01:05:01 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id AAA28473; Thu, 3 Oct 2002 00:56:56 -0700 Date: Thu, 03 Oct 2002 00:56:56 -0700 (PDT) Message-Id: <20021003.005656.102625653.davem@redhat.com> To: jmorris@intercode.com.au Cc: alan@lxorguk.ukuu.org.uk, mbp@samba.org, kuznet@ms2.inr.ac.ru, ak@muc.de, netdev@oss.sgi.com, Alan.Cox@linux.org Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case From: "David S. Miller" In-Reply-To: References: <1033388585.16337.9.camel@irongate.swansea.linux.org.uk> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 489 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: James Morris Date: Thu, 3 Oct 2002 13:30:44 +1000 (EST) On 30 Sep 2002, Alan Cox wrote: > Well if Dave can't test it and isnt doing any 2.2 who wants to be the > 2.2 networking maintainer ? I'd be willing to give it a go. So be it. From davem@redhat.com Thu Oct 3 01:07:04 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 01:07:08 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93874tG005445 for ; Thu, 3 Oct 2002 01:07:04 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id AAA28486; Thu, 3 Oct 2002 00:59:08 -0700 Date: Thu, 03 Oct 2002 00:59:07 -0700 (PDT) Message-Id: <20021003.005907.62651859.davem@redhat.com> To: ak@muc.de Cc: jmorris@intercode.com.au, alan@lxorguk.ukuu.org.uk, mbp@samba.org, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, Alan.Cox@linux.org Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case From: "David S. Miller" In-Reply-To: <20021003035446.GA29860@averell> References: <1033388585.16337.9.camel@irongate.swansea.linux.org.uk> <20021003035446.GA29860@averell> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 490 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Andi Kleen Date: Thu, 3 Oct 2002 05:54:46 +0200 On Thu, Oct 03, 2002 at 05:30:44AM +0200, James Morris wrote: > On 30 Sep 2002, Alan Cox wrote: > > > Well if Dave can't test it and isnt doing any 2.2 who wants to be the > > 2.2 networking maintainer ? > > > > I'd be willing to give it a go. 2.2 networking unfortunately has some more SMP bugs (DaveM can tell you details) which are hard to fix. So think twice before you volunteer ;) These don't matter as much as you may think. The real show stoppers are the ones like this FIN_WAIT1 cork bug. These are the only ones we can come up with safe fixes (in terms of what this means for 2.2.x) for anyways. Franks a lot, David S. Miller davem@redhat.com From davem@redhat.com Thu Oct 3 01:36:20 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 01:36:24 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g938aKtG006014 for ; Thu, 3 Oct 2002 01:36:20 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id BAA28665; Thu, 3 Oct 2002 01:29:05 -0700 Date: Thu, 03 Oct 2002 01:29:04 -0700 (PDT) Message-Id: <20021003.012904.75241727.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) From: "David S. Miller" In-Reply-To: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> References: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 491 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Thu, 03 Oct 2002 12:13:50 +0900 (JST) Linux IPv6 stack provides the ability for IPv6 applications to interoperate with IPv4 applications. Port space for TCP (or UDP) is shared by IPv6 and IPv4. This conforms to RFC2553. However, some kind of applications may want to restrict their use of an IPv6 socket to IPv6 communication only. IPV6_V6ONLY socket option is defined for such applications in RFC2553bis, which is successor of RFC2553. I really wish BSD socket features did not get standardized in RFC's, we must live with their mistakes. For example, this IPV6_V6ONLY socket option is flawed. What we really need is a generic socket option which says "my family only" There is nothing ipv6 specific about such a socket attribute. So please, create instead "SO_ONEFAMILY" or similar generic socket option. I still need to review the rest of the patch for functional correctness. This is probably the most complex area of the socket identity code in TCP/UDP :-) From bhards@bigpond.net.au Thu Oct 3 02:02:29 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 02:02:31 -0700 (PDT) Received: from mta06bw.bigpond.com (mta06bw.bigpond.com [139.134.6.96]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g9392StG006522 for ; Thu, 3 Oct 2002 02:02:28 -0700 Received: from 192.168.1.246 ([144.135.24.81]) by mta06bw.bigpond.com (Netscape Messaging Server 4.15 mta06bw Jul 16 2002 22:47:55) with SMTP id H3EEFW00.CZD; Thu, 3 Oct 2002 19:02:20 +1000 Received: from CPE-203-51-35-141.nsw.bigpond.net.au ([203.51.35.141]) by bwmam05.mailsvc.email.bigpond.com(MailRouter V3.0n 44/2343467); 03 Oct 2002 19:02:20 From: Brad Hards To: "David S. Miller" , yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) Date: Thu, 3 Oct 2002 18:55:11 +1000 User-Agent: KMail/1.4.5 Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org References: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> <20021003.012904.75241727.davem@redhat.com> In-Reply-To: <20021003.012904.75241727.davem@redhat.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-2022-jp" Content-Transfer-Encoding: 8bit Content-Description: clearsigned data Content-Disposition: inline Message-Id: <200210031855.12148.bhards@bigpond.net.au> X-archive-position: 492 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bhards@bigpond.net.au Precedence: bulk X-list: netdev -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Thu, 3 Oct 2002 18:29, David S. Miller wrote: > For example, this IPV6_V6ONLY socket option is flawed. What we > really need is a generic socket option which says "my family only" > > There is nothing ipv6 specific about such a socket attribute. > > So please, create instead "SO_ONEFAMILY" or similar generic > socket option. > > I still need to review the rest of the patch for functional > correctness. This is probably the most complex area of the > socket identity code in TCP/UDP :-) While you are grotting aroung in this area - a thought / request. When we get IPv4 link-local autoconf addressing in widespread use, there is a problem on multi-homed machines. Assume B has two network interfaces (B1 and B2) on seperate IPv4 links (net1 and net2). Host A is on net1 and Host C is on net2. Assume that both Host A and Host C have the same autoconf address. So IP address is not enough information for Host B to use to determine which interface to use in order to contact Host A (instead of Host C). If host B has socket binding on IP+port+local interface, it all works out. Is this going to work? Brad - -- http://conf.linux.org.au. 22-25Jan2003. Perth, Aust. Tickets booked. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9nAXwW6pHgIdAuOMRAscOAKC/TyYdV1IOjDMlYZghhLf1mYtrKgCfbDEh VJAdPL1Rc1Z2uM6RCIgSYOE= =JZGw -----END PGP SIGNATURE----- From davem@redhat.com Thu Oct 3 02:06:33 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 02:06:34 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g9396XtG006937 for ; Thu, 3 Oct 2002 02:06:33 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id BAA28848; Thu, 3 Oct 2002 01:58:42 -0700 Date: Thu, 03 Oct 2002 01:58:42 -0700 (PDT) Message-Id: <20021003.015842.56966498.davem@redhat.com> To: bhards@bigpond.net.au Cc: yoshfuji@linux-ipv6.org, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port Number (IPV6_V6ONLY Support) From: "David S. Miller" In-Reply-To: <200210031855.12148.bhards@bigpond.net.au> References: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> <20021003.012904.75241727.davem@redhat.com> <200210031855.12148.bhards@bigpond.net.au> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 493 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Brad Hards Date: Thu, 3 Oct 2002 18:55:11 +1000 Assume B has two network interfaces (B1 and B2) on seperate IPv4 links (net1 and net2). Host A is on net1 and Host C is on net2. Assume that both Host A and Host C have the same autoconf address. So IP address is not enough information for Host B to use to determine which interface to use in order to contact Host A (instead of Host C). If host B has socket binding on IP+port+local interface, it all works out. You want SO_BINDTODEVICE, which we have. From steve@gw.chygwyn.com Thu Oct 3 03:27:22 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 03:27:28 -0700 (PDT) Received: from gw.chygwyn.com (IDENT:root@gw.chygwyn.com [62.172.158.50]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93ARKtG016467 for ; Thu, 3 Oct 2002 03:27:21 -0700 Received: (from steve@localhost) by gw.chygwyn.com (8.9.3/8.9.3) id LAA29397; Thu, 3 Oct 2002 11:31:01 +0100 From: Steven Whitehouse Message-Id: <200210031031.LAA29397@gw.chygwyn.com> Subject: DECnet patch for 2.5 To: davej@suse.de, davem@redhat.com Date: Thu, 3 Oct 2002 11:31:01 +0100 (BST) Cc: netdev@oss.sgi.com Organization: ChyGywn Limited X-RegisteredOffice: 7, New Yatt Road, Witney, Oxfordshire. OX28 1NU England X-RegisteredNumber: 03887683 Reply-To: Steve Whitehouse X-Mailer: ELM [version 2.5 PL1] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 494 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: steve@gw.chygwyn.com Precedence: bulk X-list: netdev Hi, Here is the URL for my latest DECnet patch (for 2.5 kernels only): http://www.chygwyn.com/~steve/kpatch/decnet/decnet-2.5.40-autoconfig.diff It changes the way that DECnet gets autoconfigured in order to make the simple case of setting up an endnode easier. It also fixes several bugs which I found along the way and does a bit of C99 cleanup in the sysctl code. I'm not ready for this to go to Linus yet, but I'd like the maximum number of people possible to try it and send me feedback on any problems that are seen. I've updated the docs to explain the new configuration procedure. Other features are: o Outgoing packets set with correct source address when device MAC address isn't the same as the DECnet address o Updated TODO list o Updated socket allocation in the light of the socket layer changes in 2.5 o Fixed a race in bind() system call o Fixed a bug in autobind where we were not checking a return value o Fixed locking on the default_device o Routing changes for loopback routes in order to allow the new autoconfiguration changes to work as intended. o "hello" messages now sent for each address on an interface o Using multicast address filters to listen to extra unicast MAC addresses when they are not equal to the MAC address of the device (allows DECnet without setting MAC address to a DECnet compatible address and multiple DECnet addresses per interface) o Unregisters the "all endnodes" or "all routers" multicast addresses when the device goes down (previously we forgot, causing an address leak). o Updated version string I'll back port the bug fix parts to 2.4 in chunks once this has had a bit of testing, Steve. From webmaster@coeursolitaire.com Thu Oct 3 05:02:55 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 05:03:02 -0700 (PDT) Received: from mail.libertysurf.net (mail.libertysurf.net [213.36.80.91]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93C2stG019402 for ; Thu, 3 Oct 2002 05:02:55 -0700 Received: from Poste07 (213.19.0.21) by mail.libertysurf.net (6.5.026) id 3D902B020011E682; Thu, 3 Oct 2002 13:49:38 +0200 Message-ID: <41199-220021043114942722@Poste07> To: "jen08" From: "webmaster" Subject: Le 1er site de rencontres Date: Thu, 3 Oct 2002 13:49:42 +0200 MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Content-length: 841 X-archive-position: 495 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: webmaster@coeursolitaire.com Precedence: bulk X-list: netdev =20=20=20=20=20=20=20=20=20 =20=20=20 =20=20=20=20 http://www.hollygood.net=20 =20=20=20 =20=20=20=20=20 =20=20=20 =20=20 Faites des rencontres sans tabous =20=20=20=20=20 Vous cherchez l'=E2me soeur ? une seule solution pour cela ... http://www.= hollygood.net=20=20=20=20 =20=20 Sur Hollygood.net pas de tabous, c'est vous qui d=E9cidez qui vous voulez r= encontrer, 35 000 Membres actifs Recherchent activement l'amour et les renc= ontres :=20 HOMMES / FEMMES ET COUPLES Lachez vous ...=20 Ce mail vous est envoy=E9 car vous =EAtes inscrit ou une personne vous =E0 = inscrit =E0 notre base de donn=E9es, si vous ne souhaitez plus recevoir ce = genre d'informations envoyez un mail vide =E0 :webmaster@coeursolitaire.com= et vous serez automatiquement supprim=E9=20 =20=20=20 =20=20=20 [[HTML alternate version deleted]] From jaganbabu_ipv6@yahoo.co.in Thu Oct 3 05:24:50 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 05:24:54 -0700 (PDT) Received: from web40603.mail.yahoo.com (web40603.mail.yahoo.com [66.218.78.140]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93COotG019871 for ; Thu, 3 Oct 2002 05:24:50 -0700 Message-ID: <20021003122445.37447.qmail@web40603.mail.yahoo.com> Received: from [12.27.183.253] by web40603.mail.yahoo.com via HTTP; Thu, 03 Oct 2002 13:24:45 BST Date: Thu, 3 Oct 2002 13:24:45 +0100 (BST) From: =?iso-8859-1?q?jaganbabu=20rajamanickam?= Subject: problem in binding with ipv6 socket.. please help me To: netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-archive-position: 496 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jaganbabu_ipv6@yahoo.co.in Precedence: bulk X-list: netdev hi, Iam working on "Red Hat Linux release 7.2", I have an interface configured with ipv6 address "fe80::203:baff:fe14:4747/10". Iam trying to open a TCP socket on that interface and bind with it, but bind() call is failing, if iam using getsockopt( SO_ERROR), iam getting error as "0". What could be the problem, Is there any configuration need to be done. Note: by the way, same programm is running fine for loopback address (::1) and in_addr_any (::). can any one please help me in sorting out this problem. Iam pasting my test code below.. Thanx, Jags int ipv6_sock_test(void) { struct sockaddr_in6 laddr, faddr; int sock, new_sock, sock_opt; int faddrlen; char addrbuf[INET6_ADDRSTRLEN]; int port = 3000; /* * Set up a socket to listen on for connections. * Make sure all sockaddr_in6 fields are zero. */ bzero(&laddr, sizeof (laddr)); laddr.sin6_family = AF_INET6; laddr.sin6_port = htons(port); /*laddr.sin6_addr = in6addr_any; structure assignment */ laddr.sin6_addr.s6_addr[0] = 0xfe; laddr.sin6_addr.s6_addr[1] = 0x80; laddr.sin6_addr.s6_addr[2] = 0x0; laddr.sin6_addr.s6_addr[3] = 0x0; laddr.sin6_addr.s6_addr[4] = 0x0; laddr.sin6_addr.s6_addr[5] = 0x0; laddr.sin6_addr.s6_addr[6] = 0x0; laddr.sin6_addr.s6_addr[7] = 0x0; laddr.sin6_addr.s6_addr[8] = 0x2; laddr.sin6_addr.s6_addr[9] = 0x3; laddr.sin6_addr.s6_addr[10] = 0xba; laddr.sin6_addr.s6_addr[11] = 0xff; laddr.sin6_addr.s6_addr[12] = 0xfe; laddr.sin6_addr.s6_addr[13] = 0x14; laddr.sin6_addr.s6_addr[14] = 0x47; laddr.sin6_addr.s6_addr[15] = 0x47; sock = socket(AF_INET6, SOCK_STREAM, 0); if (sock == -1) { perror("socket"); return (-1); } /* Tell the system to allow local addresses to be reused. */ sock_opt = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&sock_opt, sizeof (sock_opt)) == -1) { perror("setsockopt(SO_REUSEADDR)"); (void) close(sock); return (-1); } if (bind(sock, (struct sockaddr *)&laddr, sizeof (laddr)) == -1) { perror("bind"); (void) close(sock); return (-1); } return 0; } ________________________________________________________________________ Missed your favourite TV serial last night? Try the new, Yahoo! TV. visit http://in.tv.yahoo.com From kuznet@ms2.inr.ac.ru Thu Oct 3 06:08:18 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 06:08:23 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93D8HtG025256 for ; Thu, 3 Oct 2002 06:08:18 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id RAA29293; Thu, 3 Oct 2002 17:06:48 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200210031306.RAA29293@sex.inr.ac.ru> Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same To: davem@redhat.COM (David S. Miller) Date: Thu, 3 Oct 2002 17:06:48 +0400 (MSD) Cc: netdev@oss.sgi.com In-Reply-To: <20021003.012904.75241727.davem@redhat.com> from "David S. Miller" at Oct 3, 2 12:45:01 pm X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 497 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > For example, this IPV6_V6ONLY socket option is flawed. What we > really need is a generic socket option which says "my family only" > > There is nothing ipv6 specific about such a socket attribute. > > So please, create instead "SO_ONEFAMILY" or similar generic > socket option. No, really! __Sharing__ of port space between IPv4 and IPv6 was mad idea. It cannot generalized to other protocol families. So, IPV6_V6ONLY is really unique for IPv6. Well, actually, it could be negated: be default and the option would be called IPV6_SHARE_THIS_PORT_TO_IPV4. Alexey From davem@redhat.com Thu Oct 3 06:10:40 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 06:10:41 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93DAdtG025735 for ; Thu, 3 Oct 2002 06:10:39 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id GAA31391; Thu, 3 Oct 2002 06:02:55 -0700 Date: Thu, 03 Oct 2002 06:02:54 -0700 (PDT) Message-Id: <20021003.060254.26942488.davem@redhat.com> To: kuznet@ms2.inr.ac.ru Cc: netdev@oss.sgi.com Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same From: "David S. Miller" In-Reply-To: <200210031306.RAA29293@sex.inr.ac.ru> References: <20021003.012904.75241727.davem@redhat.com> <200210031306.RAA29293@sex.inr.ac.ru> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 498 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: kuznet@ms2.inr.ac.ru Date: Thu, 3 Oct 2002 17:06:48 +0400 (MSD) No, really! __Sharing__ of port space between IPv4 and IPv6 was mad idea. It cannot generalized to other protocol families. So, IPV6_V6ONLY is really unique for IPv6. Well, actually, it could be negated: be default and the option would be called IPV6_SHARE_THIS_PORT_TO_IPV4. I think what I want to really say is that I want to provide way for ipv4 application to say "no ipv6 connections on this listening socket please". So does it make no sense at all to have IP_V4ONLY? From pekkas@netcore.fi Thu Oct 3 06:19:10 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 06:19:11 -0700 (PDT) Received: from netcore.fi (netcore.fi [193.94.160.1]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93DJ8tG026473 for ; Thu, 3 Oct 2002 06:19:09 -0700 Received: from localhost (pekkas@localhost) by netcore.fi (8.11.6/8.11.6) with ESMTP id g93DIsf08541; Thu, 3 Oct 2002 16:18:54 +0300 Date: Thu, 3 Oct 2002 16:18:53 +0300 (EEST) From: Pekka Savola To: "David S. Miller" cc: kuznet@ms2.inr.ac.ru, Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same In-Reply-To: <20021003.060254.26942488.davem@redhat.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 499 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pekkas@netcore.fi Precedence: bulk X-list: netdev On Thu, 3 Oct 2002, David S. Miller wrote: > From: kuznet@ms2.inr.ac.ru > Date: Thu, 3 Oct 2002 17:06:48 +0400 (MSD) > > No, really! __Sharing__ of port space between IPv4 and IPv6 was mad > idea. It cannot generalized to other protocol families. > > So, IPV6_V6ONLY is really unique for IPv6. Well, actually, it could > be negated: be default and the option would be called > IPV6_SHARE_THIS_PORT_TO_IPV4. > > I think what I want to really say is that I want to provide > way for ipv4 application to say "no ipv6 connections on this > listening socket please". > > So does it make no sense at all to have IP_V4ONLY? Umm, I think an app guy can do that with creating an AF_INET socket; there will not be IPv6 there. Folks Who Think They Know Best decided that dual use for AF_INET6 would be best, and IPV6_V6ONLY was invented (note: it'd already implemented by some others) to repair that. -- Pekka Savola "Tell me of difficulties surmounted, Netcore Oy not those you stumble over and fall" Systems. Networks. Security. -- Robert Jordan: A Crown of Swords From davem@redhat.com Thu Oct 3 06:21:28 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 06:21:30 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93DLStG028294 for ; Thu, 3 Oct 2002 06:21:28 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id GAA31636; Thu, 3 Oct 2002 06:13:41 -0700 Date: Thu, 03 Oct 2002 06:13:40 -0700 (PDT) Message-Id: <20021003.061340.91772406.davem@redhat.com> To: pekkas@netcore.fi Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same From: "David S. Miller" In-Reply-To: References: <20021003.060254.26942488.davem@redhat.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 500 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Pekka Savola Date: Thu, 3 Oct 2002 16:18:53 +0300 (EEST) On Thu, 3 Oct 2002, David S. Miller wrote: > So does it make no sense at all to have IP_V4ONLY? Umm, I think an app guy can do that with creating an AF_INET socket; there will not be IPv6 there. Folks Who Think They Know Best decided that dual use for AF_INET6 would be best, and IPV6_V6ONLY was invented (note: it'd already implemented by some others) to repair that. Ok, ignore my silly idea then. Let us continue with verifying correctness of the USAGI patch. From kuznet@ms2.inr.ac.ru Thu Oct 3 06:21:55 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 06:21:58 -0700 (PDT) Received: from netserv1.free.net (netserv1.free.net [147.45.15.34]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93DLqtG029833 for ; Thu, 3 Oct 2002 06:21:53 -0700 Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by netserv1.free.net (8.9.3/EM.SRV.11.2) with SMTP id RAA31420 for ; Thu, 3 Oct 2002 17:20:46 +0400 From: kuznet@ms2.inr.ac.ru Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id RAA29267; Thu, 3 Oct 2002 17:01:11 +0400 Message-Id: <200210031301.RAA29267@sex.inr.ac.ru> Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port To: yoshfuji@linux-ipv6.ORG (YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?=) Date: Thu, 3 Oct 2002 17:01:11 +0400 (MSD) Cc: netdev@oss.sgi.com, davem@redhat.com (Dave Miller) In-Reply-To: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> from "YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?=" at Oct 3, 2 07:45:01 am X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 501 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > We also prohibit a completely duplicate set of (local-addr, local-port, > remote-addr, remote-port) set even if SO_REUSEADDR is set unless > the local address is a multicast address; it is ambiguous and it may > steal packets from others; i.e. a kind of DoS. This part of the patch is noop. While doing *_get_port() daddr/dport are _unknown_ and always zero, so it never works. Please, remove these bits, the patch will become simpler. What's about the problem, it cannot be a problem for TCP, connection uniqueness is verified by tcp_*_check_established() not depending on value of SO_REUSEADDR. What's about UDP, the problem really might be a real problem, let's defer the issue, it looks absoluteky unrelated. BTW the question: why is bindv6only in device configuration directory? Alexey > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/if_inet6.h,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- include/net/if_inet6.h 2002/08/20 09:46:45 1.1.1.1 > +++ include/net/if_inet6.h 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -86,6 +86,7 @@ > int rtr_solicits; > int rtr_solicit_interval; > int rtr_solicit_delay; > + int bindv6only; > > void *sysctl; > }; > Index: include/net/sock.h > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/sock.h,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- include/net/sock.h 2002/08/20 09:46:45 1.1.1.1 > +++ include/net/sock.h 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -171,7 +171,8 @@ > __u8 mc_loop:1, > recverr:1, > sndflow:1, > - pmtudisc:2; > + pmtudisc:2, > + ipv6only:1; > > struct ipv6_mc_socklist *ipv6_mc_list; > struct ipv6_fl_socklist *ipv6_fl_list; > Index: net/ipv4/tcp_ipv4.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_ipv4.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv4/tcp_ipv4.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv4/tcp_ipv4.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -45,6 +45,14 @@ > * Vitaly E. Lavrov : Transparent proxy revived after year coma. > * Andi Kleen : Fix new listen. > * Andi Kleen : Fix accept error reporting. > + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior including: > + * - Allow ipv6 and ipv4 bind(2) to the > + * same port if IPV6_V6ONLY socket option > + * is set. > + * - Don't allow binding to the same > + * address unless it is one of multi- > + * cast address even if SO_REUSEADDR > + * is set. > */ > > #include > @@ -177,23 +185,92 @@ > static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb) > { > struct sock *sk2 = tb->owners; > - int sk_reuse = sk->reuse; > + int sk_reuse, sk2_reuse; > + int addr_type2; > + int ret; > + > + sk_reuse = 0; > + if (sk->reuse) > + sk_reuse |= 1; > > for( ; sk2 != NULL; sk2 = sk2->bind_next) { > - if (sk != sk2 && > - sk2->reuse <= 1 && > - sk->bound_dev_if == sk2->bound_dev_if) { > - if (!sk_reuse || > - !sk2->reuse || > - sk2->state == TCP_LISTEN) { > - if (!sk2->rcv_saddr || > - !sk->rcv_saddr || > - (sk2->rcv_saddr == sk->rcv_saddr)) > - break; > + int both_specified = 0; > + > + if (sk2 == sk || > + (sk2->bound_dev_if && sk->bound_dev_if && > + sk2->bound_dev_if != sk->bound_dev_if)) > + continue; > + > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (sk2->family == AF_INET6) { > + struct in6_addr *sk2_rcv_saddr6 = sk2->state != TCP_TIME_WAIT ? > + &sk2->net_pinfo.af_inet6.rcv_saddr : > + &((struct tcp_tw_bucket*)sk2)->v6_rcv_saddr; > + if (IN6_IS_ADDR_UNSPECIFIED(sk2_rcv_saddr6)) > + addr_type2 = IPV6_ADDR_ANY; > + else if (IN6_IS_ADDR_V4MAPPED(sk2_rcv_saddr6)) > + addr_type2 = IPV6_ADDR_MAPPED; > + else > + addr_type2 = IPV6_ADDR_UNICAST; /*XXX*/ > + } else > + addr_type2 = IPV6_ADDR_MAPPED; > +#else > + addr_type2 = IPV6_ADDR_MAPPED; > +#endif > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && > + sk->rcv_saddr) { > + if (sk2->rcv_saddr != sk->rcv_saddr) > + continue; > + both_specified = 1; > + } > + > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only) { > + continue; > + } > +#endif > + > + sk2_reuse = 0; > + if (sk2->reuse) > + sk2_reuse |= 1; > + > + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ > + ret = 1; > + if (both_specified) { > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + struct in6_addr *sk2_daddr6 = sk2->state != TCP_TIME_WAIT ? > + &sk2->net_pinfo.af_inet6.daddr : > + &((struct tcp_tw_bucket*)sk2)->v6_daddr; > +#endif > + int addr_type2d; > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (sk2->family == AF_INET6) { > + if (IN6_IS_ADDR_UNSPECIFIED(sk2_daddr6)) > + addr_type2d = IPV6_ADDR_ANY; > + else if (IN6_IS_ADDR_V4MAPPED(sk2_daddr6)) > + addr_type2d = IPV6_ADDR_MAPPED; > + else > + addr_type2d = IPV6_ADDR_UNICAST; /*XXX*/ > + } else > + addr_type2d = IPV6_ADDR_MAPPED; > +#else > + addr_type2d = IPV6_ADDR_MAPPED; > +#endif > + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) > + continue; > + } else { > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || > + sk->rcv_saddr) > + continue; > } > } > + ret = 1; > + goto failed; > } > - return sk2 != NULL; > + /* If we found a conflict, fail. */ > + ret = sk2 != NULL; > +failed: > + return ret; > } > > /* Obtain a reference to a local port for the given sock, > @@ -247,10 +324,11 @@ > break; > } > if (tb != NULL && tb->owners != NULL) { > - if (sk->reuse > 1) > + ret = 1; > + if (tb->fastreuse > 0 && > + sk->reuse != 0 && > + sk->state != TCP_LISTEN) { > goto success; > - if (tb->fastreuse > 0 && sk->reuse != 0 && sk->state != TCP_LISTEN) { > - goto success; > } else { > ret = 1; > if (tcp_bind_conflict(sk, tb)) > @@ -418,23 +496,31 @@ > struct sock *result = NULL; > int score, hiscore; > > - hiscore=0; > + hiscore = -1; > for(; sk; sk = sk->next) { > if(sk->num == hnum) { > __u32 rcv_saddr = sk->rcv_saddr; > > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + score = 0; > + if (sk->family == PF_INET) > + score++; > + else if (sk->net_pinfo.af_inet6.ipv6only) > + continue; > +#else > score = 1; > +#endif > if(rcv_saddr) { > if (rcv_saddr != daddr) > continue; > - score++; > + score+=2; > } > if (sk->bound_dev_if) { > if (sk->bound_dev_if != dif) > continue; > - score++; > + score+=2; > } > - if (score == 3) > + if (score == 5) > return sk; > if (score > hiscore) { > hiscore = score; > @@ -456,6 +542,10 @@ > if (sk->num == hnum && > sk->next == NULL && > (!sk->rcv_saddr || sk->rcv_saddr == daddr) && > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + (sk->family == PF_INET || > + (sk->family == PF_INET6 && !sk->net_pinfo.af_inet6.ipv6only)) && > +#endif > !sk->bound_dev_if) > goto sherry_cache; > sk = __tcp_v4_lookup_listener(sk, daddr, hnum, dif); > Index: net/ipv4/udp.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/udp.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv4/udp.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv4/udp.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -61,6 +61,14 @@ > * return ENOTCONN for unconnected sockets (POSIX) > * Janos Farkas : don't deliver multi/broadcasts to a different > * bound-to-device socket > + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: > + * - Allow ipv6 and ipv4 bind(2) to the > + * same port if IPV6_V6ONLY socket opttion is > + * is set. > + * - Don't allow binding to the same > + * address unless it is one of multi- > + * cast address even if SO_REUSEADDR > + * is set. > * > * > * This program is free software; you can redistribute it and/or > @@ -85,6 +93,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -153,18 +162,88 @@ > udp_port_rover = snum = result; > } else { > struct sock *sk2; > + int sk_reuse, sk2_reuse; > + int addr_type2; > > + sk_reuse = 0; > + if (sk->reuse) > + sk_reuse |= 1; > + if (sk_reuse && > + MULTICAST(sk->rcv_saddr)) > + sk_reuse |= 4; > + > for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)]; > sk2 != NULL; > sk2 = sk2->next) { > - if (sk2->num == snum && > - sk2 != sk && > - sk2->bound_dev_if == sk->bound_dev_if && > - (!sk2->rcv_saddr || > - !sk->rcv_saddr || > - sk2->rcv_saddr == sk->rcv_saddr) && > - (!sk2->reuse || !sk->reuse)) > - goto fail; > + int both_specified = 0; > + > + if (sk2->num != snum || > + sk2 == sk || > + (sk2->bound_dev_if && sk->bound_dev_if && > + sk2->bound_dev_if != sk->bound_dev_if)) > + continue; > + > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (sk2->family == AF_INET6) { > + if (IN6_IS_ADDR_UNSPECIFIED(&sk2->net_pinfo.af_inet6.rcv_saddr)) > + addr_type2 = IPV6_ADDR_ANY; > + else if (IN6_IS_ADDR_V4MAPPED(&sk2->net_pinfo.af_inet6.rcv_saddr)) > + addr_type2 = IPV6_ADDR_MAPPED; > + else > + addr_type2 = IPV6_ADDR_UNICAST; /*XXX*/ > + } else > + addr_type2 = IPV6_ADDR_MAPPED; > +#else > + addr_type2 = IPV6_ADDR_MAPPED; > +#endif > + > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && > + sk->rcv_saddr) { > + if (sk2->rcv_saddr != sk->rcv_saddr) > + continue; > + both_specified = 1; > + } > + > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only) { > + continue; > + } > +#endif > + > + sk2_reuse = 0; > + if (sk2->reuse) > + sk2_reuse |= 1; > + if (sk2_reuse && > + (addr_type2 != IPV6_ADDR_MAPPED ? (addr_type2 & IPV6_ADDR_MULTICAST) : MULTICAST(sk2->rcv_saddr))) > + sk2_reuse |= 4; > + > + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ > + if (sk2_reuse & sk_reuse & 4) > + continue; > + if (both_specified) { > + int addr_type2d; > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + if (sk2->family == AF_INET6) { > + if (IN6_IS_ADDR_UNSPECIFIED(&sk2->net_pinfo.af_inet6.daddr)) > + addr_type2d = IPV6_ADDR_ANY; > + else if (IN6_IS_ADDR_V4MAPPED(&sk2->net_pinfo.af_inet6.daddr)) > + addr_type2d = IPV6_ADDR_MAPPED; > + else > + addr_type2d = IPV6_ADDR_UNICAST; /*XXX*/ > + } else > + addr_type2d = IPV6_ADDR_MAPPED; > +#else > + addr_type2d = IPV6_ADDR_MAPPED; > +#endif > + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) > + continue; > + } else { > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || > + sk->rcv_saddr) > + continue; > + } > + } > + goto fail; > } > } > sk->num = snum; > @@ -216,28 +295,37 @@ > > for(sk = udp_hash[hnum & (UDP_HTABLE_SIZE - 1)]; sk != NULL; sk = sk->next) { > if(sk->num == hnum) { > - int score = 0; > + int score; > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + score = 0; > + if(sk->family == PF_INET) > + score++; > + else if (sk->net_pinfo.af_inet6.ipv6only) > + continue; > +#else > + score = 1; > +#endif > if(sk->rcv_saddr) { > if(sk->rcv_saddr != daddr) > continue; > - score++; > + score+=2; > } > if(sk->daddr) { > if(sk->daddr != saddr) > continue; > - score++; > + score+=2; > } > if(sk->dport) { > if(sk->dport != sport) > continue; > - score++; > + score+=2; > } > if(sk->bound_dev_if) { > if(sk->bound_dev_if != dif) > continue; > - score++; > + score+=2; > } > - if(score == 4) { > + if(score == 9) { > result = sk; > break; > } else if(score > badness) { > @@ -273,6 +361,9 @@ > (s->daddr && s->daddr!=rmt_addr) || > (s->dport != rmt_port && s->dport != 0) || > (s->rcv_saddr && s->rcv_saddr != loc_addr) || > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + (s->family != PF_INET && s->net_pinfo.af_inet6.ipv6only) || > +#endif > (s->bound_dev_if && s->bound_dev_if != dif)) > continue; > break; > Index: net/ipv6/addrconf.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/addrconf.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -116,6 +116,7 @@ > MAX_RTR_SOLICITATIONS, /* router solicits */ > RTR_SOLICITATION_INTERVAL, /* rtr solicit interval */ > MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */ > + bindv6only: 0, > }; > > static struct ipv6_devconf ipv6_devconf_dflt = > @@ -130,6 +131,7 @@ > MAX_RTR_SOLICITATIONS, /* router solicits */ > RTR_SOLICITATION_INTERVAL, /* rtr solicit interval */ > MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */ > + bindv6only: 0, > }; > > int ipv6_addr_type(struct in6_addr *addr) > @@ -1879,7 +1881,7 @@ > static struct addrconf_sysctl_table > { > struct ctl_table_header *sysctl_header; > - ctl_table addrconf_vars[11]; > + ctl_table addrconf_vars[12]; > ctl_table addrconf_dev[2]; > ctl_table addrconf_conf_dir[2]; > ctl_table addrconf_proto_dir[2]; > @@ -1925,6 +1927,10 @@ > {NET_IPV6_RTR_SOLICIT_DELAY, "router_solicitation_delay", > &ipv6_devconf.rtr_solicit_delay, sizeof(int), 0644, NULL, > &proc_dointvec_jiffies}, > + > + {NET_IPV6_BINDV6ONLY, "bindv6only", > + &ipv6_devconf.bindv6only, sizeof(int), 0644, NULL, > + &proc_dointvec}, > > {0}}, > > Index: net/ipv6/af_inet6.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/af_inet6.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/af_inet6.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/af_inet6.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -173,6 +173,8 @@ > sk->net_pinfo.af_inet6.mc_loop = 1; > sk->net_pinfo.af_inet6.pmtudisc = IPV6_PMTUDISC_WANT; > > + sk->net_pinfo.af_inet6.ipv6only = ipv6_devconf.bindv6only; > + > /* Init the ipv4 part of the socket since we can have sockets > * using v6 API for ipv4. > */ > @@ -248,6 +250,8 @@ > > /* Check if the address belongs to the host. */ > if (addr_type == IPV6_ADDR_MAPPED) { > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -EADDRNOTAVAIL; > v4addr = addr->sin6_addr.s6_addr32[3]; > if (inet_addr_type(v4addr) != RTN_LOCAL) > return -EADDRNOTAVAIL; > Index: net/ipv6/ipv6_sockglue.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/ipv6_sockglue.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/ipv6_sockglue.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/ipv6_sockglue.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -380,6 +380,15 @@ > retv = ipv6_flowlabel_opt(sk, optval, optlen); > break; > > + case IPV6_V6ONLY: > + if (optlen != sizeof(int)) > + goto e_inval; > + if (sk->userlocks&SOCK_BINDADDR_LOCK) > + goto e_inval; > + np->ipv6only = valbool; > + retv = 0; > + break; > + > #ifdef CONFIG_NETFILTER > default: > retv = nf_setsockopt(sk, PF_INET6, optname, optval, > @@ -520,6 +529,10 @@ > > case IPV6_FLOWINFO_SEND: > val = np->sndflow; > + break; > + > + case IPV6_V6ONLY: > + val = np->ipv6only; > break; > > default: > Index: net/ipv6/tcp_ipv6.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/tcp_ipv6.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/tcp_ipv6.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/tcp_ipv6.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -14,6 +14,14 @@ > * > * Fixes: > * Hideaki YOSHIFUJI : sin6_scope_id support > + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: > + * - Allow ipv6 and ipv4 bind(2) to the > + * same port if IPV6_V6ONLY socket > + * option is set. > + * - Don't allow binding to the same > + * address unless it is one of multi- > + * cast address even if SO_REUSEADDR > + * is set. > * > * This program is free software; you can redistribute it and/or > * modify it under the terms of the GNU General Public License > @@ -137,28 +145,70 @@ > goto success; > } else { > struct sock *sk2 = tb->owners; > - int sk_reuse = sk->reuse; > - int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr); > + int sk_reuse, sk2_reuse; > + struct in6_addr *sk_rcv_saddr6 = sk->state != TCP_TIME_WAIT ? > + &sk->net_pinfo.af_inet6.rcv_saddr: > + &((struct tcp_tw_bucket*)sk)->v6_rcv_saddr; > + int addr_type = ipv6_addr_type(sk_rcv_saddr6), > + addr_type2; > + > + sk_reuse = 0; > + if (sk->reuse) > + sk_reuse |= 1; > > /* We must walk the whole port owner list in this case. -DaveM */ > for( ; sk2 != NULL; sk2 = sk2->bind_next) { > - if (sk != sk2 && > - sk->bound_dev_if == sk2->bound_dev_if) { > - if (!sk_reuse || > - !sk2->reuse || > - sk2->state == TCP_LISTEN) { > - /* NOTE: IPv6 tw bucket have different format */ > - if (!sk2->rcv_saddr || > - addr_type == IPV6_ADDR_ANY || > - !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.rcv_saddr, > - sk2->state != TCP_TIME_WAIT ? > - &sk2->net_pinfo.af_inet6.rcv_saddr : > - &((struct tcp_tw_bucket*)sk)->v6_rcv_saddr) || > - (addr_type==IPV6_ADDR_MAPPED && sk2->family==AF_INET && > - sk->rcv_saddr==sk2->rcv_saddr)) > - break; > + int both_specified = 0; > + struct in6_addr *sk2_rcv_saddr6; > + if (sk2 == sk || > + (sk2->bound_dev_if && sk->bound_dev_if && > + sk2->bound_dev_if != sk->bound_dev_if)) > + continue; > + sk2_rcv_saddr6 = sk2->state != TCP_TIME_WAIT ? > + &sk2->net_pinfo.af_inet6.rcv_saddr : > + &((struct tcp_tw_bucket*)sk2)->v6_rcv_saddr; > + > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && > + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) { > + if (addr_type2 == IPV6_ADDR_MAPPED || addr_type == IPV6_ADDR_MAPPED) { > + if (addr_type2 != addr_type || > + sk2->rcv_saddr != sk->rcv_saddr) > + continue; > + } else { > + if (ipv6_addr_cmp(sk2_rcv_saddr6, sk_rcv_saddr6)) > + continue; > } > + both_specified = 1; > } > + > + if ((addr_type2 == IPV6_ADDR_MAPPED && > + addr_type != IPV6_ADDR_MAPPED && sk->net_pinfo.af_inet6.ipv6only) || > + (addr_type == IPV6_ADDR_MAPPED && > + addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only)) { > + continue; > + } > + > + sk2_reuse = 0; > + if (sk2->reuse) > + sk2_reuse |= 1; > + > + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ > + ret = 1; > + if (both_specified) { > + struct in6_addr *sk2_daddr6 = sk2->state != TCP_TIME_WAIT ? > + &sk2->net_pinfo.af_inet6.daddr : > + &((struct tcp_tw_bucket*)sk2)->v6_daddr; > + int addr_type2d = sk2->family == AF_INET6 ? ipv6_addr_type(sk2_daddr6) : IPV6_ADDR_MAPPED; > + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) > + continue; > + } else { > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || > + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) > + continue; > + } > + } > + ret = 1; > + goto fail_unlock; > } > /* If we found a conflict, fail. */ > ret = 1; > @@ -601,6 +651,9 @@ > struct sockaddr_in sin; > > SOCK_DEBUG(sk, "connect: ipv4 mapped\n"); > + > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -ENETUNREACH; > > sin.sin_family = AF_INET; > sin.sin_port = usin->sin6_port; > Index: net/ipv6/udp.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/udp.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.8.1 > diff -u -r1.1.1.1 -r1.1.1.1.8.1 > --- net/ipv6/udp.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/udp.c 2002/09/11 03:30:27 1.1.1.1.8.1 > @@ -11,7 +11,16 @@ > * > * Fixes: > * Hideaki YOSHIFUJI : sin6_scope_id support > + * YOSHIFUJI Hideaki @USAGI: Reworked bind(2) behavior, including: > + * - Allow ipv6 and ipv4 bind(2) to the > + * same port if IPV6_V6ONLY socket > + * option is set. > + * - Don't allow binding to the same > + * address unless it is one of multi- > + * cast address even if SO_REUSEADDR > + * is set. > * > + * > * This program is free software; you can redistribute it and/or > * modify it under the terms of the GNU General Public License > * as published by the Free Software Foundation; either version > @@ -98,23 +107,72 @@ > udp_port_rover = snum = result; > } else { > struct sock *sk2; > - int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr); > + int sk_reuse, sk2_reuse; > + int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr), > + addr_type2; > + > + sk_reuse = 0; > + if (sk->reuse) > + sk_reuse |= 1; > + if (sk_reuse && > + (addr_type != IPV6_ADDR_MAPPED ? (addr_type & IPV6_ADDR_MULTICAST) : MULTICAST(sk->rcv_saddr))) > + sk_reuse |= 4; > > for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)]; > sk2 != NULL; > sk2 = sk2->next) { > - if (sk2->num == snum && > - sk2 != sk && > - sk2->bound_dev_if == sk->bound_dev_if && > - (!sk2->rcv_saddr || > - addr_type == IPV6_ADDR_ANY || > - !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.rcv_saddr, > - &sk2->net_pinfo.af_inet6.rcv_saddr) || > - (addr_type == IPV6_ADDR_MAPPED && > - sk2->family == AF_INET && > - sk->rcv_saddr == sk2->rcv_saddr)) && > - (!sk2->reuse || !sk->reuse)) > - goto fail; > + int both_specified = 0; > + > + if (sk2->num != snum || > + sk2 == sk || > + (sk2->bound_dev_if && sk->bound_dev_if && > + sk2->bound_dev_if != sk->bound_dev_if)) > + continue; > + > + addr_type2 = sk2->family == AF_INET6 ? ipv6_addr_type(&sk2->net_pinfo.af_inet6.rcv_saddr) : IPV6_ADDR_MAPPED; > + > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) && > + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) { > + if (addr_type2 == IPV6_ADDR_MAPPED || addr_type == IPV6_ADDR_MAPPED) { > + if (addr_type2 != addr_type || > + sk2->rcv_saddr != sk->rcv_saddr) > + continue; > + } else { > + if (ipv6_addr_cmp(&sk2->net_pinfo.af_inet6.rcv_saddr, > + &sk->net_pinfo.af_inet6.rcv_saddr)) > + continue; > + } > + both_specified = 1; > + } > + > + if ((addr_type2 == IPV6_ADDR_MAPPED && > + addr_type != IPV6_ADDR_MAPPED && sk->net_pinfo.af_inet6.ipv6only) || > + (addr_type == IPV6_ADDR_MAPPED && > + addr_type2 != IPV6_ADDR_MAPPED && sk2->net_pinfo.af_inet6.ipv6only)) { > + continue; > + } > + > + sk2_reuse = 0; > + if (sk2->reuse) > + sk2_reuse |= 1; > + if (sk2_reuse && > + (addr_type2 != IPV6_ADDR_MAPPED ? (addr_type2 & IPV6_ADDR_MULTICAST) : MULTICAST(sk2->rcv_saddr))) > + sk2_reuse |= 4; > + > + if (sk2_reuse & sk_reuse & 3) { /* NOT && */ > + if (sk2_reuse & sk_reuse & 4) > + continue; > + if (both_specified) { > + int addr_type2d = sk2->family == AF_INET6 ? ipv6_addr_type(&sk2->net_pinfo.af_inet6.daddr) : IPV6_ADDR_MAPPED; > + if (addr_type2d != IPV6_ADDR_MAPPED ? addr_type2d != IPV6_ADDR_ANY : sk2->daddr) > + continue; > + } else { > + if ((addr_type2 != IPV6_ADDR_MAPPED ? addr_type2 != IPV6_ADDR_ANY : sk2->rcv_saddr) || > + (addr_type != IPV6_ADDR_MAPPED ? addr_type != IPV6_ADDR_ANY : sk->rcv_saddr)) > + continue; > + } > + } > + goto fail; > } > } > > @@ -221,6 +279,8 @@ > int err; > > if (usin->sin6_family == AF_INET) { > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -EAFNOSUPPORT; > err = udp_connect(sk, uaddr, addr_len); > goto ipv4_connected; > } > @@ -256,6 +316,9 @@ > if (addr_type == IPV6_ADDR_MAPPED) { > struct sockaddr_in sin; > > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -ENETUNREACH; > + > sin.sin_family = AF_INET; > sin.sin_addr.s_addr = daddr->s6_addr32[3]; > sin.sin_port = usin->sin6_port; > @@ -783,8 +846,11 @@ > fl.oif = 0; > > if (sin6) { > - if (sin6->sin6_family == AF_INET) > + if (sin6->sin6_family == AF_INET) { > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -EAFNOSUPPORT; > return udp_sendmsg(sk, msg, ulen); > + } > > if (addr_len < SIN6_LEN_RFC2133) > return -EINVAL; > @@ -830,6 +896,9 @@ > > if (addr_type == IPV6_ADDR_MAPPED) { > struct sockaddr_in sin; > + > + if (sk->net_pinfo.af_inet6.ipv6only) > + return -ENETUNREACH; > > sin.sin_family = AF_INET; > sin.sin_addr.s_addr = daddr->s6_addr32[3]; > > > From yoshfuji@linux-ipv6.org Thu Oct 3 07:15:30 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 07:15:37 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93EFTtG000322 for ; Thu, 3 Oct 2002 07:15:30 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93EFY1o023765; Thu, 3 Oct 2002 23:15:34 +0900 Date: Thu, 03 Oct 2002 23:15:34 +0900 (JST) Message-Id: <20021003.231534.83777766.yoshfuji@linux-ipv6.org> To: kuznet@ms2.inr.ac.ru Cc: netdev@oss.sgi.com, davem@redhat.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <200210031301.RAA29267@sex.inr.ac.ru> References: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> <200210031301.RAA29267@sex.inr.ac.ru> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 502 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <200210031301.RAA29267@sex.inr.ac.ru> (at Thu, 3 Oct 2002 17:01:11 +0400 (MSD)), kuznet@ms2.inr.ac.ru says: > While doing *_get_port() daddr/dport are _unknown_ and always zero, > so it never works. > > Please, remove these bits, the patch will become simpler. Ok, I'll do that. > What's about the problem, it cannot be a problem for TCP, connection > uniqueness is verified by tcp_*_check_established() not depending > on value of SO_REUSEADDR. What's about UDP, the problem really might > be a real problem, let's defer the issue, it looks absoluteky unrelated. Hmm, but I'm afraid that different behavior between TCP and UDP would confuse users. > BTW the question: why is bindv6only in device configuration directory? Because I thought that net.ipv6.conf is the place for all configuration... Do you propose to move it to parent directory (net.ipv6.bindv6only), and put other general settings there? --yoshfuji From davem@redhat.com Thu Oct 3 07:18:50 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 07:18:53 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93EIntG000692 for ; Thu, 3 Oct 2002 07:18:49 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id HAA32140; Thu, 3 Oct 2002 07:10:59 -0700 Date: Thu, 03 Oct 2002 07:10:58 -0700 (PDT) Message-Id: <20021003.071058.89246593.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port From: "David S. Miller" In-Reply-To: <20021003.231534.83777766.yoshfuji@linux-ipv6.org> References: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> <200210031301.RAA29267@sex.inr.ac.ru> <20021003.231534.83777766.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 503 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Thu, 03 Oct 2002 23:15:34 +0900 (JST) In article <200210031301.RAA29267@sex.inr.ac.ru> (at Thu, 3 Oct 2002 17:01:11 +0400 (MSD)), kuznet@ms2.inr.ac.ru says: > What's about the problem, it cannot be a problem for TCP, connection > uniqueness is verified by tcp_*_check_established() not depending > on value of SO_REUSEADDR. What's about UDP, the problem really might > be a real problem, let's defer the issue, it looks absoluteky unrelated. Hmm, but I'm afraid that different behavior between TCP and UDP would confuse users. He is saying we should do the TCP part first to make the patch simpler and easier to verify. Then we can investigate the UDP side seperately. > BTW the question: why is bindv6only in device configuration directory? Because I thought that net.ipv6.conf is the place for all configuration... It is for interface level configuration. Do you propose to move it to parent directory (net.ipv6.bindv6only), and put other general settings there? Yes. From yoshfuji@linux-ipv6.org Thu Oct 3 08:06:26 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 08:06:28 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93F6PtG001966 for ; Thu, 3 Oct 2002 08:06:26 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93F6V1o024082; Fri, 4 Oct 2002 00:06:31 +0900 Date: Fri, 04 Oct 2002 00:06:31 +0900 (JST) Message-Id: <20021004.000631.28088811.yoshfuji@linux-ipv6.org> To: kuznet@ms2.inr.ac.ru Cc: netdev@oss.sgi.com, davem@redhat.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20021003.231534.83777766.yoshfuji@linux-ipv6.org> References: <20021003.121350.119660876.yoshfuji@linux-ipv6.org> <200210031301.RAA29267@sex.inr.ac.ru> <20021003.231534.83777766.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 504 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20021003.231534.83777766.yoshfuji@linux-ipv6.org> (at Thu, 03 Oct 2002 23:15:34 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > In article <200210031301.RAA29267@sex.inr.ac.ru> (at Thu, 3 Oct 2002 17:01:11 +0400 (MSD)), kuznet@ms2.inr.ac.ru says: > > > While doing *_get_port() daddr/dport are _unknown_ and always zero, > > so it never works. > > > > Please, remove these bits, the patch will become simpler. > > Ok, I'll do that. I remember that test for daddr is for existing sockets, not for socket doing XXX_get_port(). So, I think I don't need to remove that. --yoshfuji From davem@redhat.com Thu Oct 3 08:11:56 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 08:11:58 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93FButG002427 for ; Thu, 3 Oct 2002 08:11:56 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id IAA32662; Thu, 3 Oct 2002 08:04:09 -0700 Date: Thu, 03 Oct 2002 08:04:08 -0700 (PDT) Message-Id: <20021003.080408.78030688.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port From: "David S. Miller" In-Reply-To: <20021004.000631.28088811.yoshfuji@linux-ipv6.org> References: <200210031301.RAA29267@sex.inr.ac.ru> <20021003.231534.83777766.yoshfuji@linux-ipv6.org> <20021004.000631.28088811.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 505 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Fri, 04 Oct 2002 00:06:31 +0900 (JST) In article <20021003.231534.83777766.yoshfuji@linux-ipv6.org> (at Thu, 03 Oct 2002 23:15:34 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > In article <200210031301.RAA29267@sex.inr.ac.ru> (at Thu, 3 Oct 2002 17:01:11 +0400 (MSD)), kuznet@ms2.inr.ac.ru says: > > > While doing *_get_port() daddr/dport are _unknown_ and always zero, > > so it never works. > > > > Please, remove these bits, the patch will become simpler. > > Ok, I'll do that. I remember that test for daddr is for existing sockets, not for socket doing XXX_get_port(). So, I think I don't need to remove that. Where can daddr/dport be non-zero during get_port()? From yoshfuji@linux-ipv6.org Thu Oct 3 08:19:26 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 08:19:30 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93FJOtG002853 for ; Thu, 3 Oct 2002 08:19:25 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93FJT1o024223; Fri, 4 Oct 2002 00:19:30 +0900 Date: Fri, 04 Oct 2002 00:19:29 +0900 (JST) Message-Id: <20021004.001929.03389091.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20021003.080408.78030688.davem@redhat.com> References: <20021003.231534.83777766.yoshfuji@linux-ipv6.org> <20021004.000631.28088811.yoshfuji@linux-ipv6.org> <20021003.080408.78030688.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 506 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20021003.080408.78030688.davem@redhat.com> (at Thu, 03 Oct 2002 08:04:08 -0700 (PDT)), "David S. Miller" says: > I remember that test for daddr is for existing sockets, > not for socket doing XXX_get_port(). > So, I think I don't need to remove that. > > Where can daddr/dport be non-zero during get_port()? test for daddr if for sk2. sk2 is iterator for existing sockets, which can be "connected." daddr can be non-zero, can't it? Am I wrong??? --yoshfuji From kuznet@ms2.inr.ac.ru Thu Oct 3 08:54:17 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 08:54:22 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93FsGtG009489 for ; Thu, 3 Oct 2002 08:54:17 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id TAA29921; Thu, 3 Oct 2002 19:52:40 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200210031552.TAA29921@sex.inr.ac.ru> Subject: Re: [PATCH] IPv6: Allow Both IPv6 and IPv4 Sockets on the Same Port To: yoshfuji@linux-ipv6.org (YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?=) Date: Thu, 3 Oct 2002 19:52:40 +0400 (MSD) Cc: davem@redhat.com, netdev@oss.sgi.com, usagi@linux-ipv6.org In-Reply-To: <20021004.001929.03389091.yoshfuji@linux-ipv6.org> from "YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?=" at Oct 4, 2 00:19:29 am X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 507 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > test for daddr if for sk2. > sk2 is iterator for existing sockets, which can be "connected." > daddr can be non-zero, can't it? > Am I wrong??? You are absolutely right. But then I am put to coma. Now I do not understand the goal of the check. Can you give a simple example showing what illegal case this check is supposed to eliminate? Actually, it would be great if you said what is wrong in that my patch? It looks so simple that I am not ready to agree that real one should be so complicated. :-) Alexey From Eric.Lemoine@sun.com Thu Oct 3 08:59:38 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 08:59:40 -0700 (PDT) Received: from s1.smtp.oleane.net (s1.smtp.oleane.net [195.25.12.3]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93FxbtG009860 for ; Thu, 3 Oct 2002 08:59:38 -0700 Received: from gbl-dhcp-198-204.europe.research.sun.com ([194.2.198.204]) by s1.smtp.oleane.net with ESMTP id g93FwgoR014297; Thu, 3 Oct 2002 17:58:46 +0200 Received: from eric by (null) with local (MasqMail 0.1.16) id 17x8N7-0ID-00; Thu, 03 Oct 2002 17:58:41 +0200 Date: Thu, 3 Oct 2002 17:58:41 +0200 From: Eric Lemoine To: Ben Greear Cc: Eric Lemoine , kuznet@ms2.inr.ac.ru, Chris Friesen , hadi@cyberus.CA, netdev@oss.sgi.com Subject: Re: PATCH Re: udp weirdness Message-ID: <20021003155841.GF601@hookipa> References: <3D99B6C7.3010302@nortelnetworks.com> <200210011531.TAA19943@sex.inr.ac.ru> <20021002111326.GG357@hookipa> <3D9B0FF1.1070203@candelatech.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3D9B0FF1.1070203@candelatech.com> User-Agent: Mutt/1.3.28i X-Warning: return path set from From: address X-archive-position: 508 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Eric.Lemoine@ens-lyon.fr Precedence: bulk X-list: netdev > > >It is difficult task, if possible at all. > > > > > >The main obstacle is that we must not block after select() succeeded, > > >otherwise applications will lockup. Taking into account nature of datagram > > >services (and generally of networking services, where routes change et > > >al.) > > >you do not know at time of select(), where the datagram will go. > > >So, blocking can be made only based on a criterium not depending on this. > > >problems with silent losses. People just do not care about this, so > > >they get the thing which they deserve. > > > >Alexey, > > > >Would you mind explaining a bit more why apps will lockup if we block > >after select() succeeded. Or anyone? > > Actually, I'm more interested to know why we would **need** to block after > select has succeeded. It would seem to me that select is busted in this > case. For the case of a very large UDP packet and a small send buffer, > select gets confused, but at least when the send buffer is > 128k, it should > be right... With the current impl. process calling sendto() doesn't go to sleep after select() has succeeded. My question applied in the context where process goes to sleep when the qdisc queue is overflowed. -- Eric From yoshfuji@linux-ipv6.org Thu Oct 3 09:13:23 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 09:13:26 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93GDItG010360 for ; Thu, 3 Oct 2002 09:13:21 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93GDF1o028041; Fri, 4 Oct 2002 01:13:15 +0900 Date: Fri, 04 Oct 2002 01:13:15 +0900 (JST) Message-Id: <20021004.011315.05129566.yoshfuji@linux-ipv6.org> To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org CC: usagi@linux-ipv6.org Subject: [PATCH] IPv6: Miscellaneous clean-ups From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 509 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hi, 1. use s6_addrXX instead of in6_u.s6_addrXX. 2. avoid using magic number. 3. use 32bit constants. Following patch in against linux-2.4.19. Thanks in advance. ------------------------------------------------------------------- Patch-Name: Miscellaneous clean-ups Patch-Id: FIX_2_4_19_ADDRCONF_TIMER-20020905 Patch-Author: YOSHIFUJI Hideaki / USAGI Project Credit: YOSHIFUJI Hideaki / USAGI Project Reference: RFC2553 ------------------------------------------------------------------- Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/09/12 09:41:58 1.1.1.1.12.1 @@ -172,7 +172,7 @@ if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { if (addr->s6_addr32[2] == 0) { - if (addr->in6_u.u6_addr32[3] == 0) + if (addr->s6_addr32[3] == 0) return IPV6_ADDR_ANY; if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) @@ -1187,7 +1187,7 @@ ASSERT_RTNL(); memset(&addr, 0, sizeof(struct in6_addr)); - addr.s6_addr[15] = 1; + addr.s6_addr32[3] = __constant_htonl(0x00000001); if ((idev = ipv6_find_idev(dev)) == NULL) { printk(KERN_DEBUG "init loopback: add_dev failed\n"); @@ -1234,9 +1234,7 @@ return; memset(&addr, 0, sizeof(struct in6_addr)); - - addr.s6_addr[0] = 0xFE; - addr.s6_addr[1] = 0x80; + addr.s6_addr32[0] = __contant_htonl(0xFE800000); if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) addrconf_add_linklocal(idev, &addr); Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/icmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/icmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/icmp.c 2002/09/12 09:41:58 1.1.1.1.12.1 @@ -198,7 +198,7 @@ u8 type; if (skb_copy_bits(skb, ptr+offsetof(struct icmp6hdr, icmp6_type), &type, 1) - || !(type & 0x80)) + || !(type & ICMPV6_INFOMSG_MASK)) return 1; } return 0; @@ -216,7 +216,7 @@ int res = 0; /* Informational messages are not limited. */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) return 1; /* Do not limit pmtu discovery, it would break it. */ @@ -519,22 +519,22 @@ skb_checksum(skb, 0, skb->len, 0))) { if (net_ratelimit()) printk(KERN_DEBUG "ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n", - ntohs(saddr->in6_u.u6_addr16[0]), - ntohs(saddr->in6_u.u6_addr16[1]), - ntohs(saddr->in6_u.u6_addr16[2]), - ntohs(saddr->in6_u.u6_addr16[3]), - ntohs(saddr->in6_u.u6_addr16[4]), - ntohs(saddr->in6_u.u6_addr16[5]), - ntohs(saddr->in6_u.u6_addr16[6]), - ntohs(saddr->in6_u.u6_addr16[7]), - ntohs(daddr->in6_u.u6_addr16[0]), - ntohs(daddr->in6_u.u6_addr16[1]), - ntohs(daddr->in6_u.u6_addr16[2]), - ntohs(daddr->in6_u.u6_addr16[3]), - ntohs(daddr->in6_u.u6_addr16[4]), - ntohs(daddr->in6_u.u6_addr16[5]), - ntohs(daddr->in6_u.u6_addr16[6]), - ntohs(daddr->in6_u.u6_addr16[7])); + ntohs(saddr->s6_addr16[0]), + ntohs(saddr->s6_addr16[1]), + ntohs(saddr->s6_addr16[2]), + ntohs(saddr->s6_addr16[3]), + ntohs(saddr->s6_addr16[4]), + ntohs(saddr->s6_addr16[5]), + ntohs(saddr->s6_addr16[6]), + ntohs(saddr->s6_addr16[7]), + ntohs(daddr->s6_addr16[0]), + ntohs(daddr->s6_addr16[1]), + ntohs(daddr->s6_addr16[2]), + ntohs(daddr->s6_addr16[3]), + ntohs(daddr->s6_addr16[4]), + ntohs(daddr->s6_addr16[5]), + ntohs(daddr->s6_addr16[6]), + ntohs(daddr->s6_addr16[7])); goto discard_it; } } @@ -613,7 +613,7 @@ printk(KERN_DEBUG "icmpv6: msg of unkown type\n"); /* informational */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) break; /* Index: net/ipv6/netfilter/ip6_queue.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6_queue.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.2 diff -u -r1.1.1.1 -r1.1.1.1.12.2 --- net/ipv6/netfilter/ip6_queue.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6_queue.c 2002/09/19 03:57:51 1.1.1.1.12.2 @@ -306,14 +306,8 @@ */ if (e->info->hook == NF_IP_LOCAL_OUT) { struct ipv6hdr *iph = e->skb->nh.ipv6h; - if (!( iph->daddr.in6_u.u6_addr32[0] == e->rt_info.daddr.in6_u.u6_addr32[0] - && iph->daddr.in6_u.u6_addr32[1] == e->rt_info.daddr.in6_u.u6_addr32[1] - && iph->daddr.in6_u.u6_addr32[2] == e->rt_info.daddr.in6_u.u6_addr32[2] - && iph->daddr.in6_u.u6_addr32[3] == e->rt_info.daddr.in6_u.u6_addr32[3] - && iph->saddr.in6_u.u6_addr32[0] == e->rt_info.saddr.in6_u.u6_addr32[0] - && iph->saddr.in6_u.u6_addr32[1] == e->rt_info.saddr.in6_u.u6_addr32[1] - && iph->saddr.in6_u.u6_addr32[2] == e->rt_info.saddr.in6_u.u6_addr32[2] - && iph->saddr.in6_u.u6_addr32[3] == e->rt_info.saddr.in6_u.u6_addr32[3])) + if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.daddr) || + ipv6_addr_cmp(&iph->saddr, &e->rt_info.saddr)) return route6_me_harder(e->skb); } return 0; From kuznet@ms2.inr.ac.ru Thu Oct 3 09:31:57 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 09:32:02 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93GVutG010843 for ; Thu, 3 Oct 2002 09:31:56 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id UAA30047; Thu, 3 Oct 2002 20:29:59 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200210031629.UAA30047@sex.inr.ac.ru> Subject: Re: PATCH Re: udp weirdness To: Eric.Lemoine@ens-lyon.fr (Eric Lemoine) Date: Thu, 3 Oct 2002 20:29:59 +0400 (MSD) Cc: greearb@candelatech.com, Eric.Lemoine@ens-lyon.fr, cfriesen@nortelnetworks.com, hadi@cyberus.CA, netdev@oss.sgi.com In-Reply-To: <20021003155841.GF601@hookipa> from "Eric Lemoine" at Oct 3, 2 05:58:41 pm X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-archive-position: 510 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > > >Would you mind explaining a bit more why apps will lockup if we block > > >after select() succeeded. Or anyone? Because queue overflow is persistant condition. Do you want your routing daemon went to coma when sending an update to dead ppp link? But, actually, it is simply required by standards. No blocking after select success is definition of select, in fact. Alexey From yoshfuji@linux-ipv6.org Thu Oct 3 09:50:37 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 09:50:39 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93GoZtG011878 for ; Thu, 3 Oct 2002 09:50:36 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93Goj1o028339; Fri, 4 Oct 2002 01:50:45 +0900 Date: Fri, 04 Oct 2002 01:50:45 +0900 (JST) Message-Id: <20021004.015045.96199793.yoshfuji@linux-ipv6.org> To: netdev@oss.sgi.com Cc: usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Improvement of Source Address Selection From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20020928.001742.125874265.yoshfuji@linux-ipv6.org> References: <20020928.001742.125874265.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 511 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20020928.001742.125874265.yoshfuji@linux-ipv6.org> (at Sat, 28 Sep 2002 00:17:42 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > This patch supports standard default source address selection > algorithm. It takes status, address/prefix itself (prefer same address, > prefer longest matching prefix) into consideration. > Note: Even though matching label is not implemented yet, > this is better than current one. > > Following patch is against linux-2.4.19. This patch is revised version. I think we have more things to be done, but anyways, - save memory (comment from devem) - introduced (static) policy label (comment from pekkas) Thanks in advance. ------ Index: include/net/addrconf.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/addrconf.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.6.1 diff -u -r1.1.1.1 -r1.1.1.1.6.1 --- include/net/addrconf.h 2002/08/20 09:46:45 1.1.1.1 +++ include/net/addrconf.h 2002/09/26 19:15:15 1.1.1.1.6.1 @@ -55,6 +55,9 @@ struct net_device *dev); extern struct inet6_ifaddr * ipv6_get_ifaddr(struct in6_addr *addr, struct net_device *dev); +extern int ipv6_dev_get_saddr(struct net_device *ddev, + struct in6_addr *daddr, + struct in6_addr *saddr); extern int ipv6_get_saddr(struct dst_entry *dst, struct in6_addr *daddr, struct in6_addr *saddr); Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.6.6 diff -u -r1.1.1.1 -r1.1.1.1.6.6 --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/10/03 03:28:33 1.1.1.1.6.6 @@ -26,6 +26,10 @@ * packets. * yoshfuji@USAGI : Fixed interval between DAD * packets. + * YOSHIFUJI Hideaki @USAGI : improved source address + * selection; consider scope, + * status etc. + * */ #include @@ -104,6 +108,8 @@ static struct notifier_block *inet6addr_chain; +static u32 ipv6_addrselect_label_lookup(const struct in6_addr *addr, int ifindex); + struct ipv6_devconf ipv6_devconf = { 0, /* forwarding */ @@ -188,6 +194,99 @@ return IPV6_ADDR_RESERVED; } +#ifndef IPV6_ADDR_MC_SCOPE +#define IPV6_ADDR_MC_SCOPE(a) \ + ((a)->s6_addr[1] & 0x0f) /* XXX nonstandard */ +#define __IPV6_ADDR_SCOPE_RESERVED -2 +#define __IPV6_ADDR_SCOPE_ANY -1 +#define IPV6_ADDR_SCOPE_NODELOCAL 0x01 +#define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 +#define IPV6_ADDR_SCOPE_SITELOCAL 0x05 +#define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 +#define IPV6_ADDR_SCOPE_GLOBAL 0x0e +#endif + +int ipv6_addrselect_scope(const struct in6_addr *addr) +{ + u32 st; + + st = addr->s6_addr32[0]; + + if ((st & __constant_htonl(0xE0000000)) != __constant_htonl(0x00000000) && + (st & __constant_htonl(0xE0000000)) != __constant_htonl(0xE0000000)) + return IPV6_ADDR_SCOPE_GLOBAL; + + if ((st & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000)) + return IPV6_ADDR_MC_SCOPE(addr); + + if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFE800000)) + return IPV6_ADDR_SCOPE_LINKLOCAL; + + if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFEC00000)) + return IPV6_ADDR_SCOPE_SITELOCAL; + + if ((st | addr->s6_addr32[1]) == 0) { + if (addr->s6_addr32[2] == 0) { + if (addr->s6_addr32[3] == 0) + return __IPV6_ADDR_SCOPE_ANY; + + if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.4 */ + + return IPV6_ADDR_SCOPE_GLOBAL; /* section 2.3 */ + } + + if (addr->s6_addr32[2] == __constant_htonl(0x0000FFFF)) { + if (addr->s6_addr32[3] == __constant_htonl(0xA9FF0000)) + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.2 */ + if (addr->s6_addr32[3] == __constant_htonl(0xAC000000)) { + if (addr->s6_addr32[3] == __constant_htonl(0xAC100000)) + return IPV6_ADDR_SCOPE_SITELOCAL; /* section 2.2 */ + + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.2 */ + } + if (addr->s6_addr32[3] == __constant_htonl(0x0A000000)) + return IPV6_ADDR_SCOPE_SITELOCAL; /* section 2.2 */ + if (addr->s6_addr32[3] == __constant_htonl(0xC0A80000)) + return IPV6_ADDR_SCOPE_SITELOCAL; /* section 2.2 */ + + return IPV6_ADDR_SCOPE_GLOBAL; /* section 2.2 */ + } + } + + return __IPV6_ADDR_SCOPE_RESERVED; +} + +/* find 1st bit in difference between the 2 addrs */ +static inline int addr_diff(const void *__a1, const void *__a2, int addrlen) +{ + /* find 1st bit in difference between the 2 addrs. + * bit may be an invalid value, + * but if it is >= plen, the value is ignored in any case. + */ + const u32 *a1 = __a1; + const u32 *a2 = __a2; + int i; + + addrlen >>= 2; + for (i = 0; i < addrlen; i++) { + u32 xb = a1[i] ^ a2[i]; + if (xb) { + int j = 31; + xb = ntohl(xb); + while ((xb & (1 << j)) == 0) + j--; + return (i * 32 + 31 - j); + } + } + return addrlen<<5; +} + +static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2) +{ + return addr_diff(a1->s6_addr, a2->s6_addr, sizeof(struct in6_addr)); +} + static void addrconf_del_timer(struct inet6_ifaddr *ifp) { if (del_timer(&ifp->timer)) @@ -449,122 +548,160 @@ /* * Choose an apropriate source address - * should do: - * i) get an address with an apropriate scope - * ii) see if there is a specific route for the destination and use - * an address of the attached interface - * iii) don't use deprecated addresses + * draft-ietf-ipngwg-default-addr-select-09.txt */ -int ipv6_get_saddr(struct dst_entry *dst, - struct in6_addr *daddr, struct in6_addr *saddr) +#define IPV6_SADDRSELECT_SELF 0x01 +#define IPV6_SADDRSELECT_PREFERRED 0x02 +#define IPV6_SADDRSELECT_HOME 0x04 +#define IPV6_SADDRSELECT_PUBLIC 0x08 +#define IPV6_SADDRSELECT_INTERFACE 0x10 +#define IPV6_SADDRSELECT_LABEL 0x20 + +struct addrselect_attrs { + struct inet6_ifaddr *ifp; + u16 flags; + s16 matchlen; + u8 scope; +}; + +int ipv6_dev_get_saddr(struct net_device *daddr_dev, + struct in6_addr *daddr, struct in6_addr *saddr) { - int scope; - struct inet6_ifaddr *ifp = NULL; - struct inet6_ifaddr *match = NULL; - struct net_device *dev = NULL; + int daddr_scope; + u32 daddr_label; + struct inet6_ifaddr *ifp0, *ifp = NULL; + struct net_device *dev; struct inet6_dev *idev; - struct rt6_info *rt; - int err; - rt = (struct rt6_info *) dst; - if (rt) - dev = rt->rt6i_dev; - - scope = ipv6_addr_scope(daddr); - if (rt && (rt->rt6i_flags & RTF_ALLONLINK)) { - /* - * route for the "all destinations on link" rule - * when no routers are present - */ - scope = IFA_LINK; - } - - /* - * known dev - * search dev and walk through dev addresses - */ + int err; + int update; + struct addrselect_attrs candidate = {NULL,0,0}; - if (dev) { - if (dev->flags & IFF_LOOPBACK) - scope = IFA_HOST; + daddr_scope = ipv6_addrselect_scope(daddr); + daddr_label = ipv6_addrselect_label_lookup(daddr, + daddr_dev?daddr_dev->ifindex:0); - read_lock(&addrconf_lock); + read_lock(&dev_base_lock); + read_lock(&addrconf_lock); + for (dev = dev_base; dev; dev=dev->next) { idev = __in6_dev_get(dev); - if (idev) { - read_lock_bh(&idev->lock); - for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) { - if (ifp->scope == scope) { - if (!(ifp->flags & (IFA_F_DEPRECATED|IFA_F_TENTATIVE))) { - in6_ifa_hold(ifp); - read_unlock_bh(&idev->lock); - read_unlock(&addrconf_lock); - goto out; - } - - if (!match && !(ifp->flags & IFA_F_TENTATIVE)) { - match = ifp; - in6_ifa_hold(ifp); - } + + if (!idev) + continue; + + read_lock_bh(&idev->lock); + ifp0 = idev->addr_list; + for (ifp=ifp0; ifp; ifp=ifp->if_next) { + struct addrselect_attrs temp = {NULL,0,0}; + update = 0; + + /* Rule 1: Prefer same address */ + if (ipv6_addr_cmp(&ifp->addr, daddr) == 0) + temp.flags |= IPV6_SADDRSELECT_SELF; + else + temp.flags &= ~IPV6_SADDRSELECT_SELF; + update = (temp.flags&IPV6_SADDRSELECT_SELF) - + (candidate.flags&IPV6_SADDRSELECT_SELF); + if (update < 0) { + continue; + } + + /* Rule 2: Prefer appropriate scope */ + temp.scope = ipv6_addrselect_scope(&ifp->addr); + if (!update) { + update = temp.scope - candidate.scope; + if (update > 0) { + update = candidate.scope < daddr_scope ? 1 : -1; + } else if (update < 0) { + update = temp.scope < daddr_scope ? -1 : 1; } } - read_unlock_bh(&idev->lock); - } - read_unlock(&addrconf_lock); - } + if (update < 0) { + continue; + } - if (scope == IFA_LINK) - goto out; + /* Rule 3: Avoid deprecated address */ + if (!(ifp->flags & IFA_F_DEPRECATED)) + temp.flags |= IPV6_SADDRSELECT_PREFERRED; + else + temp.flags &= ~IPV6_SADDRSELECT_PREFERRED; + if (!update) + update = (temp.flags&IPV6_SADDRSELECT_PREFERRED) - + (candidate.flags&IPV6_SADDRSELECT_PREFERRED); + if (update < 0) { + continue; + } - /* - * dev == NULL or search failed for specified dev - */ + /* XXX: Rule 4: Prefer home address */ - read_lock(&dev_base_lock); - read_lock(&addrconf_lock); - for (dev = dev_base; dev; dev=dev->next) { - idev = __in6_dev_get(dev); - if (idev) { - read_lock_bh(&idev->lock); - for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) { - if (ifp->scope == scope) { - if (!(ifp->flags&(IFA_F_DEPRECATED|IFA_F_TENTATIVE))) { - in6_ifa_hold(ifp); - read_unlock_bh(&idev->lock); - goto out_unlock_base; - } - - if (!match && !(ifp->flags&IFA_F_TENTATIVE)) { - match = ifp; - in6_ifa_hold(ifp); - } - } + /* Rule 5: Prefer outgoing interface */ + if (daddr_dev == NULL || ifp->idev == NULL || + daddr_dev == ifp->idev->dev) + temp.flags |= IPV6_SADDRSELECT_INTERFACE; + else + temp.flags &= ~IPV6_SADDRSELECT_INTERFACE; + if (!update) + update = (temp.flags&IPV6_SADDRSELECT_INTERFACE) - + (candidate.flags&IPV6_SADDRSELECT_INTERFACE); + if (update < 0) { + continue; } - read_unlock_bh(&idev->lock); + + /* XXX: Rule 6: Prefer matching label */ + if (ipv6_addrselect_label_lookup(&ifp->addr, dev->ifindex) == daddr_label) + temp.flags |= IPV6_SADDRSELECT_LABEL; + else + temp.flags &= ~IPV6_SADDRSELECT_LABEL; + if (!update) + update = (temp.flags&IPV6_SADDRSELECT_LABEL) - + (candidate.flags&IPV6_SADDRSELECT_LABEL); + if (update < 0) { + continue; + } + + /* XXX: Rule 7: Prefer public address */ + + /* Rule 8: Use longest matching prefix */ + temp.matchlen = ipv6_addr_diff(&ifp->addr, daddr); + if (!update) + update = temp.matchlen - candidate.matchlen; + if (update < 0) { + continue; + } + + /* Final Rule */ + if (update <= 0) + continue; + + /* update candidate */ + temp.ifp = ifp; + in6_ifa_hold(ifp); + if (candidate.ifp) + in6_ifa_put(candidate.ifp); + candidate = temp; } + read_unlock_bh(&idev->lock); } - -out_unlock_base: read_unlock(&addrconf_lock); read_unlock(&dev_base_lock); - -out: - if (ifp == NULL) { - ifp = match; - match = NULL; - } - err = -EADDRNOTAVAIL; - if (ifp) { - ipv6_addr_copy(saddr, &ifp->addr); + if (candidate.ifp) { + ipv6_addr_copy(saddr, &candidate.ifp->addr); + in6_ifa_put(candidate.ifp); err = 0; - in6_ifa_put(ifp); + } else { + err = -EADDRNOTAVAIL; } - if (match) - in6_ifa_put(match); - return err; } +int ipv6_get_saddr(struct dst_entry *dst, + struct in6_addr *daddr, struct in6_addr *saddr) +{ + return ipv6_dev_get_saddr(dst ? ((struct rt6_info *)dst)->rt6i_dev : NULL, + daddr, saddr); +} + int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr) { struct inet6_dev *idev; @@ -636,6 +773,69 @@ read_unlock_bh(&addrconf_hash_lock); return ifp; +} + +/* address selection: default policy label */ +/* XXX: user level configuration */ +static struct ipv6_addrselect_label { + struct in6_addr addr; + u16 plen; + u32 ifindex; + u32 label; +} ipv6_addrselect_label_table[] = { + /* ::1/128, label = 0 */ + { + .addr = {{{ [15] = 1 }}}, + .plen = 128, + .label = 0, + }, + /* ::/0, label = 1 */ + { + .plen = 0, + .label = 1, + }, + /* 2002::/16, label = 2 */ + { + .addr = {{{ 0x20, 0x02 }}}, + .plen = 16, + .label = 2, + }, + /* ::/96, label = 3 */ + { + .plen = 96, + .label = 3, + }, + /* ::ffff:0:0/96, label = 4 */ + { + .addr = {{{ [10] = 0xff, [11] = 0xff }}}, + .plen = 96, + .label = 4, + }, + /* sentinel */ + { + .label = 0xffffffff, + } +}; + +static u32 ipv6_addrselect_label_lookup(const struct in6_addr *addr, + int ifindex) +{ + struct ipv6_addrselect_label *p; + int plen, matchlen = -1; + u32 label = 0xffffffff; + + for (p = ipv6_addrselect_label_table; + p->label != 0xffffffff; + p++) { + if (ifindex && p->ifindex && ifindex != p->ifindex) + continue; + plen = ipv6_addr_diff(addr, &p->addr); + if (plen < p->plen || plen < matchlen) + continue; + matchlen = plen; + label = p->label; + } + return label; } /* Gets referenced address, destroys ifaddr */ From davem@redhat.com Thu Oct 3 10:43:35 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 10:43:37 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93HhZtG016213 for ; Thu, 3 Oct 2002 10:43:35 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id KAA01693; Thu, 3 Oct 2002 10:36:17 -0700 Date: Thu, 03 Oct 2002 10:36:17 -0700 (PDT) Message-Id: <20021003.103617.04446177.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Miscellaneous clean-ups From: "David S. Miller" In-Reply-To: <20021004.011315.05129566.yoshfuji@linux-ipv6.org> References: <20021004.011315.05129566.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 512 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Fri, 04 Oct 2002 01:13:15 +0900 (JST) @@ -1187,7 +1187,7 @@ ASSERT_RTNL(); memset(&addr, 0, sizeof(struct in6_addr)); - addr.s6_addr[15] = 1; + addr.s6_addr32[3] = __constant_htonl(0x00000001); Do not use __constant_htonl() in runtime code, use htonl(). Arnaldo de Melo told you this the other day for another one of your patches, so you must fix this kind of stuff up before I'll apply any of your patches which have this problem. Only use __constant_htonl() for compile time initialization of data built into the kernel. Otherwise I like you patch, please fix it up so I may apply it. From yoshfuji@linux-ipv6.org Thu Oct 3 15:39:20 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 15:39:27 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93MdJtG025889 for ; Thu, 3 Oct 2002 15:39:20 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93MdQ1o030139; Fri, 4 Oct 2002 07:39:26 +0900 Date: Fri, 04 Oct 2002 07:39:25 +0900 (JST) Message-Id: <20021004.073925.101556969.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Miscellaneous clean-ups From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20021004.073642.125593159.yoshfuji@linux-ipv6.org> References: <20021004.011315.05129566.yoshfuji@linux-ipv6.org> <20021003.103617.04446177.davem@redhat.com> <20021004.073642.125593159.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 513 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20021004.073642.125593159.yoshfuji@linux-ipv6.org> (at Fri, 04 Oct 2002 07:36:42 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > I saw many __constant_{hton,ntoh}{s,l}()s, so fixed. > > 1. use s6_addrXX instead of in6_u.s6_addrXX. > 2. avoid using magic number. > 3. use 32bit constants. > --> 4. avoid __constant_{hton,ntoh}{l,s}() in runtime code. oops, sorry, not fixed in my fix... :-p just a moment, please... --yoshfuji From yoshfuji@linux-ipv6.org Thu Oct 3 16:32:17 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 16:32:23 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93NW4tK028181 for ; Thu, 3 Oct 2002 16:32:10 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93MsG1o030234; Fri, 4 Oct 2002 07:54:16 +0900 Date: Fri, 04 Oct 2002 07:54:16 +0900 (JST) Message-Id: <20021004.075416.20775355.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Miscellaneous clean-ups From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20021004.073925.101556969.yoshfuji@linux-ipv6.org> References: <20021003.103617.04446177.davem@redhat.com> <20021004.073642.125593159.yoshfuji@linux-ipv6.org> <20021004.073925.101556969.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 515 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20021004.073925.101556969.yoshfuji@linux-ipv6.org> (at Fri, 04 Oct 2002 07:39:25 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > In article <20021004.073642.125593159.yoshfuji@linux-ipv6.org> (at Fri, 04 Oct 2002 07:36:42 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > > > I saw many __constant_{hton,ntoh}{s,l}()s, so fixed. > > > > 1. use s6_addrXX instead of in6_u.s6_addrXX. > > 2. avoid using magic number. > > 3. use 32bit constants. > > --> 4. avoid __constant_{hton,ntoh}{l,s}() in runtime code. > > oops, sorry, not fixed in my fix... :-p I forgot to commit __constant_XXX() under net/ipv6 in my tree... anyway, resend with the fix for ipv6. Index: net/ipv4/arp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/arp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/arp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/arp.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -513,7 +513,7 @@ skb->nh.raw = skb->data; arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr) + 2*(dev->addr_len+4)); skb->dev = dev; - skb->protocol = __constant_htons (ETH_P_ARP); + skb->protocol = htons (ETH_P_ARP); if (src_hw == NULL) src_hw = dev->dev_addr; if (dest_hw == NULL) @@ -539,33 +539,33 @@ switch (dev->type) { default: arp->ar_hrd = htons(dev->type); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_pro = htons(ETH_P_IP); break; #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: - arp->ar_hrd = __constant_htons(ARPHRD_AX25); - arp->ar_pro = __constant_htons(AX25_P_IP); + arp->ar_hrd = htons(ARPHRD_AX25); + arp->ar_pro = htons(AX25_P_IP); break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: - arp->ar_hrd = __constant_htons(ARPHRD_NETROM); - arp->ar_pro = __constant_htons(AX25_P_IP); + arp->ar_hrd = htons(ARPHRD_NETROM); + arp->ar_pro = htons(AX25_P_IP); break; #endif #endif #ifdef CONFIG_FDDI case ARPHRD_FDDI: - arp->ar_hrd = __constant_htons(ARPHRD_ETHER); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_hrd = htons(ARPHRD_ETHER); + arp->ar_pro = htons(ETH_P_IP); break; #endif #ifdef CONFIG_TR case ARPHRD_IEEE802_TR: - arp->ar_hrd = __constant_htons(ARPHRD_IEEE802); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_hrd = htons(ARPHRD_IEEE802); + arp->ar_pro = htons(ETH_P_IP); break; #endif } @@ -629,7 +629,7 @@ switch (dev_type) { default: - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; if (htons(dev_type) != arp->ar_hrd) goto out; @@ -640,10 +640,10 @@ * ETHERNET devices will accept ARP hardware types of either * 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -653,10 +653,10 @@ * Token ring devices will accept ARP hardware types of either * 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -667,10 +667,10 @@ * of 1 (Ethernet). However, to be more robust, we'll accept hardware * types of either 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -681,25 +681,25 @@ * 802 devices) should accept ARP hardware types of 6 (IEEE 802) * and 1 (Ethernet). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: - if (arp->ar_pro != __constant_htons(AX25_P_IP)) + if (arp->ar_pro != htons(AX25_P_IP)) goto out; - if (arp->ar_hrd != __constant_htons(ARPHRD_AX25)) + if (arp->ar_hrd != htons(ARPHRD_AX25)) goto out; break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: - if (arp->ar_pro != __constant_htons(AX25_P_IP)) + if (arp->ar_pro != htons(AX25_P_IP)) goto out; - if (arp->ar_hrd != __constant_htons(ARPHRD_NETROM)) + if (arp->ar_hrd != htons(ARPHRD_NETROM)) goto out; break; #endif @@ -708,8 +708,8 @@ /* Understand only these message types */ - if (arp->ar_op != __constant_htons(ARPOP_REPLY) && - arp->ar_op != __constant_htons(ARPOP_REQUEST)) + if (arp->ar_op != htons(ARPOP_REPLY) && + arp->ar_op != htons(ARPOP_REQUEST)) goto out; /* @@ -754,13 +754,13 @@ /* Special case: IPv4 duplicate address detection packet (RFC2131) */ if (sip == 0) { - if (arp->ar_op == __constant_htons(ARPOP_REQUEST) && + if (arp->ar_op == htons(ARPOP_REQUEST) && inet_addr_type(tip) == RTN_LOCAL) arp_send(ARPOP_REPLY,ETH_P_ARP,tip,dev,tip,sha,dev->dev_addr,dev->dev_addr); goto out; } - if (arp->ar_op == __constant_htons(ARPOP_REQUEST) && + if (arp->ar_op == htons(ARPOP_REQUEST) && ip_route_input(skb, tip, sip, 0, dev) == 0) { rt = (struct rtable*)skb->dst; @@ -810,7 +810,7 @@ devices (strip is candidate) */ if (n == NULL && - arp->ar_op == __constant_htons(ARPOP_REPLY) && + arp->ar_op == htons(ARPOP_REPLY) && inet_addr_type(sip) == RTN_UNICAST) n = __neigh_lookup(&arp_tbl, &sip, dev, -1); #endif @@ -830,7 +830,7 @@ /* Broadcast replies and request packets do not assert neighbour reachability. */ - if (arp->ar_op != __constant_htons(ARPOP_REPLY) || + if (arp->ar_op != htons(ARPOP_REPLY) || skb->pkt_type != PACKET_HOST) state = NUD_STALE; neigh_update(n, sha, state, override, 1); @@ -1050,7 +1050,7 @@ (r.arp_flags & (ATF_NETMASK|ATF_DONTPUB))) return -EINVAL; if (!(r.arp_flags & ATF_NETMASK)) - ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=__constant_htonl(0xFFFFFFFFUL); + ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=htonl(0xFFFFFFFFUL); rtnl_lock(); if (r.arp_dev[0]) { Index: net/ipv4/igmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/igmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/igmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/igmp.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -229,7 +229,7 @@ iph->version = 4; iph->ihl = (sizeof(struct iphdr)+4)>>2; iph->tos = 0; - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); iph->ttl = 1; iph->daddr = dst; iph->saddr = rt->rt_src; Index: net/ipv4/ip_gre.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ip_gre.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ip_gre.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ip_gre.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -412,7 +412,7 @@ struct sk_buff *skb2; struct rtable *rt; - if (p[1] != __constant_htons(ETH_P_IP)) + if (p[1] != htons(ETH_P_IP)) return; flags = p[0]; @@ -535,10 +535,10 @@ static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) { if (INET_ECN_is_ce(iph->tos)) { - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { if (INET_ECN_is_not_ce(skb->nh.iph->tos)) IP_ECN_set_ce(skb->nh.iph); - } else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + } else if (skb->protocol == htons(ETH_P_IPV6)) { if (INET_ECN_is_not_ce(ip6_get_dsfield(skb->nh.ipv6h))) IP6_ECN_set_ce(skb->nh.ipv6h); } @@ -549,9 +549,9 @@ ipgre_ecn_encapsulate(u8 tos, struct iphdr *old_iph, struct sk_buff *skb) { u8 inner = 0; - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) inner = old_iph->tos; - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) + else if (skb->protocol == htons(ETH_P_IPV6)) inner = ip6_get_dsfield((struct ipv6hdr*)old_iph); return INET_ECN_encapsulate(tos, inner); } @@ -708,13 +708,13 @@ goto tx_error; } - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { rt = (struct rtable*)skb->dst; if ((dst = rt->rt_gateway) == 0) goto tx_error_icmp; } #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + else if (skb->protocol == htons(ETH_P_IPV6)) { struct in6_addr *addr6; int addr_type; struct neighbour *neigh = skb->dst->neighbour; @@ -742,7 +742,7 @@ tos = tiph->tos; if (tos&1) { - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) tos = old_iph->tos; tos &= ~1; } @@ -765,13 +765,13 @@ else mtu = skb->dst ? skb->dst->pmtu : dev->mtu; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { if (skb->dst && mtu < skb->dst->pmtu && mtu >= 68) skb->dst->pmtu = mtu; - df |= (old_iph->frag_off&__constant_htons(IP_DF)); + df |= (old_iph->frag_off&htons(IP_DF)); - if ((old_iph->frag_off&__constant_htons(IP_DF)) && + if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); ip_rt_put(rt); @@ -779,7 +779,7 @@ } } #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + else if (skb->protocol == htons(ETH_P_IPV6)) { struct rt6_info *rt6 = (struct rt6_info*)skb->dst; if (rt6 && mtu < rt6->u.dst.pmtu && mtu >= IPV6_MIN_MTU) { @@ -845,10 +845,10 @@ iph->saddr = rt->rt_src; if ((iph->ttl = tiph->ttl) == 0) { - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) iph->ttl = old_iph->ttl; #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) + else if (skb->protocol == htons(ETH_P_IPV6)) iph->ttl = ((struct ipv6hdr*)old_iph)->hop_limit; #endif else @@ -936,11 +936,11 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF)) || + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)) || ((p.i_flags|p.o_flags)&(GRE_VERSION|GRE_ROUTING))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); if (!(p.i_flags&GRE_KEY)) p.i_key = 0; Index: net/ipv4/ip_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ip_output.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ip_output.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ip_output.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -186,7 +186,7 @@ struct net_device *dev = skb->dst->dev; skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev, ip_finish_output2); @@ -208,7 +208,7 @@ #endif skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); /* * Multicasts are looped back for other local users @@ -382,7 +382,7 @@ *((__u16 *)iph) = htons((4 << 12) | (5 << 8) | (sk->protinfo.af_inet.tos & 0xff)); iph->tot_len = htons(skb->len); if (ip_dont_fragment(sk, &rt->u.dst)) - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); else iph->frag_off = 0; iph->ttl = sk->protinfo.af_inet.ttl; Index: net/ipv4/ipconfig.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipconfig.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipconfig.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipconfig.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -356,11 +356,11 @@ if (ic_netmask == INADDR_NONE) { if (IN_CLASSA(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSA_NET); + ic_netmask = htonl(IN_CLASSA_NET); else if (IN_CLASSB(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSB_NET); + ic_netmask = htonl(IN_CLASSB_NET); else if (IN_CLASSC(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSC_NET); + ic_netmask = htonl(IN_CLASSC_NET); else { printk(KERN_ERR "IP-Config: Unable to guess netmask for address %u.%u.%u.%u\n", NIPQUAD(ic_myaddr)); @@ -426,11 +426,11 @@ goto drop; /* If it's not a RARP reply, delete it. */ - if (rarp->ar_op != __constant_htons(ARPOP_RREPLY)) + if (rarp->ar_op != htons(ARPOP_RREPLY)) goto drop; /* If it's not Ethernet, delete it. */ - if (rarp->ar_pro != __constant_htons(ETH_P_IP)) + if (rarp->ar_pro != htons(ETH_P_IP)) goto drop; /* Extract variable-width fields */ @@ -661,15 +661,15 @@ h->version = 4; h->ihl = 5; h->tot_len = htons(sizeof(struct bootp_pkt)); - h->frag_off = __constant_htons(IP_DF); + h->frag_off = htons(IP_DF); h->ttl = 64; h->protocol = IPPROTO_UDP; h->daddr = INADDR_BROADCAST; h->check = ip_fast_csum((unsigned char *) h, h->ihl); /* Construct UDP header */ - b->udph.source = __constant_htons(68); - b->udph.dest = __constant_htons(67); + b->udph.source = htons(68); + b->udph.dest = htons(67); b->udph.len = htons(sizeof(struct bootp_pkt) - sizeof(struct iphdr)); /* UDP checksum not calculated -- explicitly allowed in BOOTP RFC */ @@ -700,7 +700,7 @@ /* Chain packet down the line... */ skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); if ((dev->hard_header && dev->hard_header(skb, dev, ntohs(skb->protocol), dev->broadcast, dev->dev_addr, skb->len) < 0) || dev_queue_xmit(skb) < 0) @@ -800,13 +800,13 @@ ip_fast_csum((char *) h, h->ihl) != 0 || skb->len < ntohs(h->tot_len) || h->protocol != IPPROTO_UDP || - b->udph.source != __constant_htons(67) || - b->udph.dest != __constant_htons(68) || + b->udph.source != htons(67) || + b->udph.dest != htons(68) || ntohs(h->tot_len) < ntohs(b->udph.len) + sizeof(struct iphdr)) goto drop; /* Fragments are not supported */ - if (h->frag_off & __constant_htons(IP_OFFSET | IP_MF)) { + if (h->frag_off & htons(IP_OFFSET | IP_MF)) { printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented reply.\n"); goto drop; } Index: net/ipv4/ipip.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipip.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipip.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipip.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -483,7 +483,7 @@ skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->pkt_type = PACKET_HOST; read_lock(&ipip_lock); @@ -544,7 +544,7 @@ goto tx_error; } - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != htons(ETH_P_IP)) goto tx_error; if (tos&1) @@ -585,9 +585,9 @@ if (skb->dst && mtu < skb->dst->pmtu) skb->dst->pmtu = mtu; - df |= (old_iph->frag_off&__constant_htons(IP_DF)); + df |= (old_iph->frag_off&htons(IP_DF)); - if ((old_iph->frag_off&__constant_htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { + if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); ip_rt_put(rt); goto tx_error; @@ -703,10 +703,10 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF))) + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); t = ipip_tunnel_locate(&p, cmd == SIOCADDTUNNEL); Index: net/ipv4/ipmr.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipmr.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipmr.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipmr.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1434,7 +1434,7 @@ skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; dst_release(skb->dst); @@ -1501,7 +1501,7 @@ skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; dst_release(skb->dst); Index: net/ipv4/route.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/route.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/route.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/route.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1246,7 +1246,7 @@ return -EINVAL; if (MULTICAST(saddr) || BADCLASS(saddr) || LOOPBACK(saddr) || - skb->protocol != __constant_htons(ETH_P_IP)) + skb->protocol != htons(ETH_P_IP)) goto e_inval; if (ZERONET(saddr)) { @@ -1457,7 +1457,7 @@ inet_addr_onlink(out_dev, saddr, FIB_RES_GW(res)))) flags |= RTCF_DOREDIRECT; - if (skb->protocol != __constant_htons(ETH_P_IP)) { + if (skb->protocol != htons(ETH_P_IP)) { /* Not IP (i.e. ARP). Do not create route, if it is * invalid for proxy arp. DNAT routes are always valid. */ @@ -1522,7 +1522,7 @@ out: return err; brd_input: - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != htons(ETH_P_IP)) goto e_inval; if (ZERONET(saddr)) @@ -2156,7 +2156,7 @@ err = -ENODEV; if (!dev) goto out; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->dev = dev; local_bh_disable(); err = ip_route_input(skb, dst, src, rtm->rtm_tos, dev); Index: net/ipv4/tcp_diag.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_diag.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_diag.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_diag.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -346,7 +346,7 @@ break; if (sk->family == AF_INET6 && cond->family == AF_INET) { if (addr[0] == 0 && addr[1] == 0 && - addr[2] == __constant_htonl(0xffff) && + addr[2] == htonl(0xffff) && bitstring_match(addr+3, cond->addr, cond->prefix_len)) break; } Index: net/ipv4/tcp_input.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_input.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_input.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_input.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -2083,8 +2083,8 @@ } else if (tp->tstamp_ok && th->doff == (sizeof(struct tcphdr)>>2)+(TCPOLEN_TSTAMP_ALIGNED>>2)) { __u32 *ptr = (__u32 *)(th + 1); - if (*ptr == __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { + if (*ptr == ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { tp->saw_tstamp = 1; ++ptr; tp->rcv_tsval = ntohl(*ptr); @@ -3252,8 +3252,8 @@ __u32 *ptr = (__u32 *)(th + 1); /* No? Slow path! */ - if (*ptr != __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) + if (*ptr != ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) goto slow_path; tp->saw_tstamp = 1; Index: net/ipv4/tcp_ipv4.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_ipv4.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_ipv4.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_ipv4.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1210,10 +1210,10 @@ arg.iov[0].iov_len = sizeof(rep.th); arg.n_iov = 1; if (ts) { - rep.tsopt[0] = __constant_htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + rep.tsopt[0] = htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); rep.tsopt[1] = htonl(tcp_time_stamp); rep.tsopt[2] = htonl(ts); arg.iov[0].iov_len = sizeof(rep); Index: net/ipv4/netfilter/ip_nat_core.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_core.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_core.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_core.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -775,7 +775,7 @@ if (helper) { /* Always defragged for helpers */ IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off - & __constant_htons(IP_MF|IP_OFFSET))); + & htons(IP_MF|IP_OFFSET))); return helper->help(ct, info, ctinfo, hooknum, pskb); } else return NF_ACCEPT; } Index: net/ipv4/netfilter/ip_nat_snmp_basic.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_snmp_basic.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_snmp_basic.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_snmp_basic.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -1259,9 +1259,9 @@ * on post routing (SNAT). */ if (!((dir == IP_CT_DIR_REPLY && hooknum == NF_IP_PRE_ROUTING && - udph->source == __constant_ntohs(SNMP_PORT)) || + udph->source == ntohs(SNMP_PORT)) || (dir == IP_CT_DIR_ORIGINAL && hooknum == NF_IP_POST_ROUTING && - udph->dest == __constant_ntohs(SNMP_TRAP_PORT)))) { + udph->dest == ntohs(SNMP_TRAP_PORT)))) { spin_unlock_bh(&snmp_lock); return NF_ACCEPT; } Index: net/ipv4/netfilter/ip_nat_standalone.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_standalone.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_standalone.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_standalone.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -60,7 +60,7 @@ /* We never see fragments: conntrack defrags on pre-routing and local-out, and ip_nat_out protects post-routing. */ IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off - & __constant_htons(IP_MF|IP_OFFSET))); + & htons(IP_MF|IP_OFFSET))); (*pskb)->nfcache |= NFC_UNKNOWN; @@ -163,7 +163,7 @@ I'm starting to have nightmares about fragments. */ - if ((*pskb)->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { + if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { *pskb = ip_ct_gather_frags(*pskb); if (!*pskb) Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.2 diff -u -r1.1.1.1 -r1.1.1.1.12.2 --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/10/03 22:41:07 1.1.1.1.12.2 @@ -141,14 +141,14 @@ /* Consider all addresses with the first three bits different of 000 and 111 as unicasts. */ - if ((st & __constant_htonl(0xE0000000)) != __constant_htonl(0x00000000) && - (st & __constant_htonl(0xE0000000)) != __constant_htonl(0xE0000000)) + if ((st & htonl(0xE0000000)) != htonl(0x00000000) && + (st & htonl(0xE0000000)) != htonl(0xE0000000)) return IPV6_ADDR_UNICAST; - if ((st & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000)) { + if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) { int type = IPV6_ADDR_MULTICAST; - switch((st & __constant_htonl(0x00FF0000))) { + switch((st & htonl(0x00FF0000))) { case __constant_htonl(0x00010000): type |= IPV6_ADDR_LOOPBACK; break; @@ -164,24 +164,24 @@ return type; } - if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFE800000)) + if ((st & htonl(0xFFC00000)) == htonl(0xFE800000)) return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST); - if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFEC00000)) + if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000)) return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST); if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { if (addr->s6_addr32[2] == 0) { - if (addr->in6_u.u6_addr32[3] == 0) + if (addr->s6_addr32[3] == 0) return IPV6_ADDR_ANY; - if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) + if (addr->s6_addr32[3] == htonl(0x00000001)) return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST); return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST); } - if (addr->s6_addr32[2] == __constant_htonl(0x0000ffff)) + if (addr->s6_addr32[2] == htonl(0x0000ffff)) return IPV6_ADDR_MAPPED; } @@ -752,7 +752,7 @@ memset(&rtmsg, 0, sizeof(rtmsg)); ipv6_addr_set(&rtmsg.rtmsg_dst, - __constant_htonl(0xFF000000), 0, 0, 0); + htonl(0xFF000000), 0, 0, 0); rtmsg.rtmsg_dst_len = 8; rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF; rtmsg.rtmsg_ifindex = dev->ifindex; @@ -782,7 +782,7 @@ { struct in6_addr addr; - ipv6_addr_set(&addr, __constant_htonl(0xFE800000), 0, 0, 0); + ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); addrconf_prefix_route(&addr, 10, dev, 0, RTF_ADDRCONF); } @@ -1120,7 +1120,7 @@ memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); if (idev->dev->flags&IFF_POINTOPOINT) { - addr.s6_addr32[0] = __constant_htonl(0xfe800000); + addr.s6_addr32[0] = htonl(0xfe800000); scope = IFA_LINK; } else { scope = IPV6_ADDR_COMPATv4; @@ -1187,7 +1187,7 @@ ASSERT_RTNL(); memset(&addr, 0, sizeof(struct in6_addr)); - addr.s6_addr[15] = 1; + addr.s6_addr32[3] = htonl(0x00000001); if ((idev = ipv6_find_idev(dev)) == NULL) { printk(KERN_DEBUG "init loopback: add_dev failed\n"); @@ -1234,9 +1234,7 @@ return; memset(&addr, 0, sizeof(struct in6_addr)); - - addr.s6_addr[0] = 0xFE; - addr.s6_addr[1] = 0x80; + addr.s6_addr32[0] = __contant_htonl(0xFE800000); if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) addrconf_add_linklocal(idev, &addr); Index: net/ipv6/datagram.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/datagram.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/datagram.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/datagram.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -147,7 +147,7 @@ } } else { ipv6_addr_set(&sin->sin6_addr, 0, 0, - __constant_htonl(0xffff), + htonl(0xffff), *(u32*)(skb->nh.raw + serr->addr_offset)); } } @@ -168,7 +168,7 @@ } } else { ipv6_addr_set(&sin->sin6_addr, 0, 0, - __constant_htonl(0xffff), + htonl(0xffff), skb->nh.iph->saddr); if (sk->protinfo.af_inet.cmsg_flags) ip_cmsg_recv(msg, skb); Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/icmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/icmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/icmp.c 2002/09/12 09:41:58 1.1.1.1.12.1 @@ -198,7 +198,7 @@ u8 type; if (skb_copy_bits(skb, ptr+offsetof(struct icmp6hdr, icmp6_type), &type, 1) - || !(type & 0x80)) + || !(type & ICMPV6_INFOMSG_MASK)) return 1; } return 0; @@ -216,7 +216,7 @@ int res = 0; /* Informational messages are not limited. */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) return 1; /* Do not limit pmtu discovery, it would break it. */ @@ -519,22 +519,22 @@ skb_checksum(skb, 0, skb->len, 0))) { if (net_ratelimit()) printk(KERN_DEBUG "ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n", - ntohs(saddr->in6_u.u6_addr16[0]), - ntohs(saddr->in6_u.u6_addr16[1]), - ntohs(saddr->in6_u.u6_addr16[2]), - ntohs(saddr->in6_u.u6_addr16[3]), - ntohs(saddr->in6_u.u6_addr16[4]), - ntohs(saddr->in6_u.u6_addr16[5]), - ntohs(saddr->in6_u.u6_addr16[6]), - ntohs(saddr->in6_u.u6_addr16[7]), - ntohs(daddr->in6_u.u6_addr16[0]), - ntohs(daddr->in6_u.u6_addr16[1]), - ntohs(daddr->in6_u.u6_addr16[2]), - ntohs(daddr->in6_u.u6_addr16[3]), - ntohs(daddr->in6_u.u6_addr16[4]), - ntohs(daddr->in6_u.u6_addr16[5]), - ntohs(daddr->in6_u.u6_addr16[6]), - ntohs(daddr->in6_u.u6_addr16[7])); + ntohs(saddr->s6_addr16[0]), + ntohs(saddr->s6_addr16[1]), + ntohs(saddr->s6_addr16[2]), + ntohs(saddr->s6_addr16[3]), + ntohs(saddr->s6_addr16[4]), + ntohs(saddr->s6_addr16[5]), + ntohs(saddr->s6_addr16[6]), + ntohs(saddr->s6_addr16[7]), + ntohs(daddr->s6_addr16[0]), + ntohs(daddr->s6_addr16[1]), + ntohs(daddr->s6_addr16[2]), + ntohs(daddr->s6_addr16[3]), + ntohs(daddr->s6_addr16[4]), + ntohs(daddr->s6_addr16[5]), + ntohs(daddr->s6_addr16[6]), + ntohs(daddr->s6_addr16[7])); goto discard_it; } } @@ -613,7 +613,7 @@ printk(KERN_DEBUG "icmpv6: msg of unkown type\n"); /* informational */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) break; /* Index: net/ipv6/ip6_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/ip6_output.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/ip6_output.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/ip6_output.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -101,7 +101,7 @@ struct dst_entry *dst = skb->dst; struct net_device *dev = dst->dev; - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->dev = dev; if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr)) { @@ -221,7 +221,7 @@ * Fill in the IPv6 header */ - *(u32*)hdr = __constant_htonl(0x60000000) | fl->fl6_flowlabel; + *(u32*)hdr = htonl(0x60000000) | fl->fl6_flowlabel; hlimit = -1; if (np) hlimit = np->hop_limit; @@ -262,7 +262,7 @@ struct ipv6hdr *hdr; int totlen; - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->dev = dev; totlen = len + sizeof(struct ipv6hdr); Index: net/ipv6/reassembly.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/reassembly.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/reassembly.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/reassembly.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -372,7 +372,7 @@ csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0)); /* Is this the final fragment? */ - if (!(fhdr->frag_off & __constant_htons(0x0001))) { + if (!(fhdr->frag_off & htons(0x0001))) { /* If we already have some bits beyond end * or have different end, the segment is corrupted. */ @@ -648,7 +648,7 @@ hdr = skb->nh.ipv6h; fhdr = (struct frag_hdr *)skb->h.raw; - if (!(fhdr->frag_off & __constant_htons(0xFFF9))) { + if (!(fhdr->frag_off & htons(0xFFF9))) { /* It is not a fragmented frame */ skb->h.raw += sizeof(struct frag_hdr); IP6_INC_STATS_BH(Ip6ReasmOKs); Index: net/ipv6/sit.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/sit.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/sit.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/sit.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -396,7 +396,7 @@ skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->pkt_type = PACKET_HOST; tunnel->stat.rx_packets++; tunnel->stat.rx_bytes += skb->len; @@ -470,7 +470,7 @@ goto tx_error; } - if (skb->protocol != __constant_htons(ETH_P_IPV6)) + if (skb->protocol != htons(ETH_P_IPV6)) goto tx_error; if (!dst) @@ -588,7 +588,7 @@ iph->version = 4; iph->ihl = sizeof(struct iphdr)>>2; if (mtu > IPV6_MIN_MTU) - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); else iph->frag_off = 0; @@ -659,10 +659,10 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPV6 || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF))) + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); t = ipip6_tunnel_locate(&p, cmd == SIOCADDTUNNEL); Index: net/ipv6/tcp_ipv6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/tcp_ipv6.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/tcp_ipv6.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/tcp_ipv6.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -402,7 +402,7 @@ static __u32 tcp_v6_init_sequence(struct sock *sk, struct sk_buff *skb) { - if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + if (skb->protocol == htons(ETH_P_IPV6)) { return secure_tcpv6_sequence_number(skb->nh.ipv6h->daddr.s6_addr32, skb->nh.ipv6h->saddr.s6_addr32, skb->h.th->dest, @@ -617,9 +617,9 @@ sk->backlog_rcv = tcp_v6_do_rcv; goto failure; } else { - ipv6_addr_set(&np->saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF), sk->saddr); - ipv6_addr_set(&np->rcv_saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF), sk->rcv_saddr); } @@ -1031,10 +1031,10 @@ if (ts) { u32 *ptr = (u32*)(t1 + 1); - *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + *ptr++ = htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); *ptr++ = htonl(tcp_time_stamp); *ptr = htonl(ts); } @@ -1145,7 +1145,7 @@ struct open_request *req = NULL; __u32 isn = TCP_SKB_CB(skb)->when; - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_conn_request(sk, skb); /* FIXME: do the same check for anycast */ @@ -1224,7 +1224,7 @@ struct sock *newsk; struct ipv6_txoptions *opt; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { /* * v6 mapped */ @@ -1236,10 +1236,10 @@ np = &newsk->net_pinfo.af_inet6; - ipv6_addr_set(&np->daddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000FFFF), newsk->daddr); - ipv6_addr_set(&np->saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF), newsk->saddr); ipv6_addr_copy(&np->rcv_saddr, &np->saddr); @@ -1425,7 +1425,7 @@ tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK */ - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_do_rcv(sk, skb); #ifdef CONFIG_FILTER Index: net/ipv6/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/udp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/udp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/udp.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -267,18 +267,18 @@ return err; ipv6_addr_set(&np->daddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->daddr); if(ipv6_addr_any(&np->saddr)) { ipv6_addr_set(&np->saddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->saddr); } if(ipv6_addr_any(&np->rcv_saddr)) { ipv6_addr_set(&np->rcv_saddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->rcv_saddr); } return 0; @@ -420,9 +420,9 @@ sin6->sin6_flowinfo = 0; sin6->sin6_scope_id = 0; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { ipv6_addr_set(&sin6->sin6_addr, 0, 0, - __constant_htonl(0xffff), skb->nh.iph->saddr); + htonl(0xffff), skb->nh.iph->saddr); if (sk->protinfo.af_inet.cmsg_flags) ip_cmsg_recv(msg, skb); } else { Index: net/ipv6/netfilter/ip6_queue.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6_queue.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.2 diff -u -r1.1.1.1 -r1.1.1.1.12.2 --- net/ipv6/netfilter/ip6_queue.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6_queue.c 2002/09/19 03:57:51 1.1.1.1.12.2 @@ -306,14 +306,8 @@ */ if (e->info->hook == NF_IP_LOCAL_OUT) { struct ipv6hdr *iph = e->skb->nh.ipv6h; - if (!( iph->daddr.in6_u.u6_addr32[0] == e->rt_info.daddr.in6_u.u6_addr32[0] - && iph->daddr.in6_u.u6_addr32[1] == e->rt_info.daddr.in6_u.u6_addr32[1] - && iph->daddr.in6_u.u6_addr32[2] == e->rt_info.daddr.in6_u.u6_addr32[2] - && iph->daddr.in6_u.u6_addr32[3] == e->rt_info.daddr.in6_u.u6_addr32[3] - && iph->saddr.in6_u.u6_addr32[0] == e->rt_info.saddr.in6_u.u6_addr32[0] - && iph->saddr.in6_u.u6_addr32[1] == e->rt_info.saddr.in6_u.u6_addr32[1] - && iph->saddr.in6_u.u6_addr32[2] == e->rt_info.saddr.in6_u.u6_addr32[2] - && iph->saddr.in6_u.u6_addr32[3] == e->rt_info.saddr.in6_u.u6_addr32[3])) + if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.daddr) || + ipv6_addr_cmp(&iph->saddr, &e->rt_info.saddr)) return route6_me_harder(e->skb); } return 0; Index: net/ipv6/netfilter/ip6t_LOG.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6t_LOG.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/netfilter/ip6t_LOG.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6t_LOG.c 2002/10/03 22:07:26 1.1.1.1.12.1 @@ -112,7 +112,7 @@ printk("FRAG:%u ", ntohs(fhdr->frag_off) & 0xFFF8); /* Max length: 11 "INCOMPLETE " */ - if (fhdr->frag_off & __constant_htons(0x0001)) + if (fhdr->frag_off & htons(0x0001)) printk("INCOMPLETE "); printk("ID:%08x ", fhdr->identification); Index: net/ipv4/arp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/arp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/arp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/arp.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -513,7 +513,7 @@ skb->nh.raw = skb->data; arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr) + 2*(dev->addr_len+4)); skb->dev = dev; - skb->protocol = __constant_htons (ETH_P_ARP); + skb->protocol = htons (ETH_P_ARP); if (src_hw == NULL) src_hw = dev->dev_addr; if (dest_hw == NULL) @@ -539,33 +539,33 @@ switch (dev->type) { default: arp->ar_hrd = htons(dev->type); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_pro = htons(ETH_P_IP); break; #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: - arp->ar_hrd = __constant_htons(ARPHRD_AX25); - arp->ar_pro = __constant_htons(AX25_P_IP); + arp->ar_hrd = htons(ARPHRD_AX25); + arp->ar_pro = htons(AX25_P_IP); break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: - arp->ar_hrd = __constant_htons(ARPHRD_NETROM); - arp->ar_pro = __constant_htons(AX25_P_IP); + arp->ar_hrd = htons(ARPHRD_NETROM); + arp->ar_pro = htons(AX25_P_IP); break; #endif #endif #ifdef CONFIG_FDDI case ARPHRD_FDDI: - arp->ar_hrd = __constant_htons(ARPHRD_ETHER); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_hrd = htons(ARPHRD_ETHER); + arp->ar_pro = htons(ETH_P_IP); break; #endif #ifdef CONFIG_TR case ARPHRD_IEEE802_TR: - arp->ar_hrd = __constant_htons(ARPHRD_IEEE802); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_hrd = htons(ARPHRD_IEEE802); + arp->ar_pro = htons(ETH_P_IP); break; #endif } @@ -629,7 +629,7 @@ switch (dev_type) { default: - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; if (htons(dev_type) != arp->ar_hrd) goto out; @@ -640,10 +640,10 @@ * ETHERNET devices will accept ARP hardware types of either * 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -653,10 +653,10 @@ * Token ring devices will accept ARP hardware types of either * 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -667,10 +667,10 @@ * of 1 (Ethernet). However, to be more robust, we'll accept hardware * types of either 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -681,25 +681,25 @@ * 802 devices) should accept ARP hardware types of 6 (IEEE 802) * and 1 (Ethernet). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: - if (arp->ar_pro != __constant_htons(AX25_P_IP)) + if (arp->ar_pro != htons(AX25_P_IP)) goto out; - if (arp->ar_hrd != __constant_htons(ARPHRD_AX25)) + if (arp->ar_hrd != htons(ARPHRD_AX25)) goto out; break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: - if (arp->ar_pro != __constant_htons(AX25_P_IP)) + if (arp->ar_pro != htons(AX25_P_IP)) goto out; - if (arp->ar_hrd != __constant_htons(ARPHRD_NETROM)) + if (arp->ar_hrd != htons(ARPHRD_NETROM)) goto out; break; #endif @@ -708,8 +708,8 @@ /* Understand only these message types */ - if (arp->ar_op != __constant_htons(ARPOP_REPLY) && - arp->ar_op != __constant_htons(ARPOP_REQUEST)) + if (arp->ar_op != htons(ARPOP_REPLY) && + arp->ar_op != htons(ARPOP_REQUEST)) goto out; /* @@ -754,13 +754,13 @@ /* Special case: IPv4 duplicate address detection packet (RFC2131) */ if (sip == 0) { - if (arp->ar_op == __constant_htons(ARPOP_REQUEST) && + if (arp->ar_op == htons(ARPOP_REQUEST) && inet_addr_type(tip) == RTN_LOCAL) arp_send(ARPOP_REPLY,ETH_P_ARP,tip,dev,tip,sha,dev->dev_addr,dev->dev_addr); goto out; } - if (arp->ar_op == __constant_htons(ARPOP_REQUEST) && + if (arp->ar_op == htons(ARPOP_REQUEST) && ip_route_input(skb, tip, sip, 0, dev) == 0) { rt = (struct rtable*)skb->dst; @@ -810,7 +810,7 @@ devices (strip is candidate) */ if (n == NULL && - arp->ar_op == __constant_htons(ARPOP_REPLY) && + arp->ar_op == htons(ARPOP_REPLY) && inet_addr_type(sip) == RTN_UNICAST) n = __neigh_lookup(&arp_tbl, &sip, dev, -1); #endif @@ -830,7 +830,7 @@ /* Broadcast replies and request packets do not assert neighbour reachability. */ - if (arp->ar_op != __constant_htons(ARPOP_REPLY) || + if (arp->ar_op != htons(ARPOP_REPLY) || skb->pkt_type != PACKET_HOST) state = NUD_STALE; neigh_update(n, sha, state, override, 1); @@ -1050,7 +1050,7 @@ (r.arp_flags & (ATF_NETMASK|ATF_DONTPUB))) return -EINVAL; if (!(r.arp_flags & ATF_NETMASK)) - ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=__constant_htonl(0xFFFFFFFFUL); + ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=htonl(0xFFFFFFFFUL); rtnl_lock(); if (r.arp_dev[0]) { Index: net/ipv4/igmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/igmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/igmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/igmp.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -229,7 +229,7 @@ iph->version = 4; iph->ihl = (sizeof(struct iphdr)+4)>>2; iph->tos = 0; - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); iph->ttl = 1; iph->daddr = dst; iph->saddr = rt->rt_src; Index: net/ipv4/ip_gre.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ip_gre.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ip_gre.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ip_gre.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -412,7 +412,7 @@ struct sk_buff *skb2; struct rtable *rt; - if (p[1] != __constant_htons(ETH_P_IP)) + if (p[1] != htons(ETH_P_IP)) return; flags = p[0]; @@ -535,10 +535,10 @@ static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) { if (INET_ECN_is_ce(iph->tos)) { - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { if (INET_ECN_is_not_ce(skb->nh.iph->tos)) IP_ECN_set_ce(skb->nh.iph); - } else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + } else if (skb->protocol == htons(ETH_P_IPV6)) { if (INET_ECN_is_not_ce(ip6_get_dsfield(skb->nh.ipv6h))) IP6_ECN_set_ce(skb->nh.ipv6h); } @@ -549,9 +549,9 @@ ipgre_ecn_encapsulate(u8 tos, struct iphdr *old_iph, struct sk_buff *skb) { u8 inner = 0; - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) inner = old_iph->tos; - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) + else if (skb->protocol == htons(ETH_P_IPV6)) inner = ip6_get_dsfield((struct ipv6hdr*)old_iph); return INET_ECN_encapsulate(tos, inner); } @@ -708,13 +708,13 @@ goto tx_error; } - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { rt = (struct rtable*)skb->dst; if ((dst = rt->rt_gateway) == 0) goto tx_error_icmp; } #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + else if (skb->protocol == htons(ETH_P_IPV6)) { struct in6_addr *addr6; int addr_type; struct neighbour *neigh = skb->dst->neighbour; @@ -742,7 +742,7 @@ tos = tiph->tos; if (tos&1) { - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) tos = old_iph->tos; tos &= ~1; } @@ -765,13 +765,13 @@ else mtu = skb->dst ? skb->dst->pmtu : dev->mtu; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { if (skb->dst && mtu < skb->dst->pmtu && mtu >= 68) skb->dst->pmtu = mtu; - df |= (old_iph->frag_off&__constant_htons(IP_DF)); + df |= (old_iph->frag_off&htons(IP_DF)); - if ((old_iph->frag_off&__constant_htons(IP_DF)) && + if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); ip_rt_put(rt); @@ -779,7 +779,7 @@ } } #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + else if (skb->protocol == htons(ETH_P_IPV6)) { struct rt6_info *rt6 = (struct rt6_info*)skb->dst; if (rt6 && mtu < rt6->u.dst.pmtu && mtu >= IPV6_MIN_MTU) { @@ -845,10 +845,10 @@ iph->saddr = rt->rt_src; if ((iph->ttl = tiph->ttl) == 0) { - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) iph->ttl = old_iph->ttl; #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) + else if (skb->protocol == htons(ETH_P_IPV6)) iph->ttl = ((struct ipv6hdr*)old_iph)->hop_limit; #endif else @@ -936,11 +936,11 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF)) || + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)) || ((p.i_flags|p.o_flags)&(GRE_VERSION|GRE_ROUTING))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); if (!(p.i_flags&GRE_KEY)) p.i_key = 0; Index: net/ipv4/ip_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ip_output.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ip_output.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ip_output.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -186,7 +186,7 @@ struct net_device *dev = skb->dst->dev; skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev, ip_finish_output2); @@ -208,7 +208,7 @@ #endif skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); /* * Multicasts are looped back for other local users @@ -382,7 +382,7 @@ *((__u16 *)iph) = htons((4 << 12) | (5 << 8) | (sk->protinfo.af_inet.tos & 0xff)); iph->tot_len = htons(skb->len); if (ip_dont_fragment(sk, &rt->u.dst)) - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); else iph->frag_off = 0; iph->ttl = sk->protinfo.af_inet.ttl; Index: net/ipv4/ipconfig.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipconfig.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipconfig.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipconfig.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -356,11 +356,11 @@ if (ic_netmask == INADDR_NONE) { if (IN_CLASSA(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSA_NET); + ic_netmask = htonl(IN_CLASSA_NET); else if (IN_CLASSB(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSB_NET); + ic_netmask = htonl(IN_CLASSB_NET); else if (IN_CLASSC(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSC_NET); + ic_netmask = htonl(IN_CLASSC_NET); else { printk(KERN_ERR "IP-Config: Unable to guess netmask for address %u.%u.%u.%u\n", NIPQUAD(ic_myaddr)); @@ -426,11 +426,11 @@ goto drop; /* If it's not a RARP reply, delete it. */ - if (rarp->ar_op != __constant_htons(ARPOP_RREPLY)) + if (rarp->ar_op != htons(ARPOP_RREPLY)) goto drop; /* If it's not Ethernet, delete it. */ - if (rarp->ar_pro != __constant_htons(ETH_P_IP)) + if (rarp->ar_pro != htons(ETH_P_IP)) goto drop; /* Extract variable-width fields */ @@ -661,15 +661,15 @@ h->version = 4; h->ihl = 5; h->tot_len = htons(sizeof(struct bootp_pkt)); - h->frag_off = __constant_htons(IP_DF); + h->frag_off = htons(IP_DF); h->ttl = 64; h->protocol = IPPROTO_UDP; h->daddr = INADDR_BROADCAST; h->check = ip_fast_csum((unsigned char *) h, h->ihl); /* Construct UDP header */ - b->udph.source = __constant_htons(68); - b->udph.dest = __constant_htons(67); + b->udph.source = htons(68); + b->udph.dest = htons(67); b->udph.len = htons(sizeof(struct bootp_pkt) - sizeof(struct iphdr)); /* UDP checksum not calculated -- explicitly allowed in BOOTP RFC */ @@ -700,7 +700,7 @@ /* Chain packet down the line... */ skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); if ((dev->hard_header && dev->hard_header(skb, dev, ntohs(skb->protocol), dev->broadcast, dev->dev_addr, skb->len) < 0) || dev_queue_xmit(skb) < 0) @@ -800,13 +800,13 @@ ip_fast_csum((char *) h, h->ihl) != 0 || skb->len < ntohs(h->tot_len) || h->protocol != IPPROTO_UDP || - b->udph.source != __constant_htons(67) || - b->udph.dest != __constant_htons(68) || + b->udph.source != htons(67) || + b->udph.dest != htons(68) || ntohs(h->tot_len) < ntohs(b->udph.len) + sizeof(struct iphdr)) goto drop; /* Fragments are not supported */ - if (h->frag_off & __constant_htons(IP_OFFSET | IP_MF)) { + if (h->frag_off & htons(IP_OFFSET | IP_MF)) { printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented reply.\n"); goto drop; } Index: net/ipv4/ipip.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipip.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipip.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipip.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -483,7 +483,7 @@ skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->pkt_type = PACKET_HOST; read_lock(&ipip_lock); @@ -544,7 +544,7 @@ goto tx_error; } - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != htons(ETH_P_IP)) goto tx_error; if (tos&1) @@ -585,9 +585,9 @@ if (skb->dst && mtu < skb->dst->pmtu) skb->dst->pmtu = mtu; - df |= (old_iph->frag_off&__constant_htons(IP_DF)); + df |= (old_iph->frag_off&htons(IP_DF)); - if ((old_iph->frag_off&__constant_htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { + if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); ip_rt_put(rt); goto tx_error; @@ -703,10 +703,10 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF))) + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); t = ipip_tunnel_locate(&p, cmd == SIOCADDTUNNEL); Index: net/ipv4/ipmr.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipmr.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipmr.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipmr.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1434,7 +1434,7 @@ skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; dst_release(skb->dst); @@ -1501,7 +1501,7 @@ skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; dst_release(skb->dst); Index: net/ipv4/route.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/route.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/route.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/route.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1246,7 +1246,7 @@ return -EINVAL; if (MULTICAST(saddr) || BADCLASS(saddr) || LOOPBACK(saddr) || - skb->protocol != __constant_htons(ETH_P_IP)) + skb->protocol != htons(ETH_P_IP)) goto e_inval; if (ZERONET(saddr)) { @@ -1457,7 +1457,7 @@ inet_addr_onlink(out_dev, saddr, FIB_RES_GW(res)))) flags |= RTCF_DOREDIRECT; - if (skb->protocol != __constant_htons(ETH_P_IP)) { + if (skb->protocol != htons(ETH_P_IP)) { /* Not IP (i.e. ARP). Do not create route, if it is * invalid for proxy arp. DNAT routes are always valid. */ @@ -1522,7 +1522,7 @@ out: return err; brd_input: - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != htons(ETH_P_IP)) goto e_inval; if (ZERONET(saddr)) @@ -2156,7 +2156,7 @@ err = -ENODEV; if (!dev) goto out; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->dev = dev; local_bh_disable(); err = ip_route_input(skb, dst, src, rtm->rtm_tos, dev); Index: net/ipv4/tcp_diag.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_diag.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_diag.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_diag.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -346,7 +346,7 @@ break; if (sk->family == AF_INET6 && cond->family == AF_INET) { if (addr[0] == 0 && addr[1] == 0 && - addr[2] == __constant_htonl(0xffff) && + addr[2] == htonl(0xffff) && bitstring_match(addr+3, cond->addr, cond->prefix_len)) break; } Index: net/ipv4/tcp_input.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_input.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_input.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_input.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -2083,8 +2083,8 @@ } else if (tp->tstamp_ok && th->doff == (sizeof(struct tcphdr)>>2)+(TCPOLEN_TSTAMP_ALIGNED>>2)) { __u32 *ptr = (__u32 *)(th + 1); - if (*ptr == __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { + if (*ptr == ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { tp->saw_tstamp = 1; ++ptr; tp->rcv_tsval = ntohl(*ptr); @@ -3252,8 +3252,8 @@ __u32 *ptr = (__u32 *)(th + 1); /* No? Slow path! */ - if (*ptr != __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) + if (*ptr != ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) goto slow_path; tp->saw_tstamp = 1; Index: net/ipv4/tcp_ipv4.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_ipv4.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_ipv4.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_ipv4.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1210,10 +1210,10 @@ arg.iov[0].iov_len = sizeof(rep.th); arg.n_iov = 1; if (ts) { - rep.tsopt[0] = __constant_htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + rep.tsopt[0] = htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); rep.tsopt[1] = htonl(tcp_time_stamp); rep.tsopt[2] = htonl(ts); arg.iov[0].iov_len = sizeof(rep); Index: net/ipv4/netfilter/ip_nat_core.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_core.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_core.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_core.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -775,7 +775,7 @@ if (helper) { /* Always defragged for helpers */ IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off - & __constant_htons(IP_MF|IP_OFFSET))); + & htons(IP_MF|IP_OFFSET))); return helper->help(ct, info, ctinfo, hooknum, pskb); } else return NF_ACCEPT; } Index: net/ipv4/netfilter/ip_nat_snmp_basic.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_snmp_basic.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_snmp_basic.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_snmp_basic.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -1259,9 +1259,9 @@ * on post routing (SNAT). */ if (!((dir == IP_CT_DIR_REPLY && hooknum == NF_IP_PRE_ROUTING && - udph->source == __constant_ntohs(SNMP_PORT)) || + udph->source == ntohs(SNMP_PORT)) || (dir == IP_CT_DIR_ORIGINAL && hooknum == NF_IP_POST_ROUTING && - udph->dest == __constant_ntohs(SNMP_TRAP_PORT)))) { + udph->dest == ntohs(SNMP_TRAP_PORT)))) { spin_unlock_bh(&snmp_lock); return NF_ACCEPT; } Index: net/ipv4/netfilter/ip_nat_standalone.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_standalone.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_standalone.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_standalone.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -60,7 +60,7 @@ /* We never see fragments: conntrack defrags on pre-routing and local-out, and ip_nat_out protects post-routing. */ IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off - & __constant_htons(IP_MF|IP_OFFSET))); + & htons(IP_MF|IP_OFFSET))); (*pskb)->nfcache |= NFC_UNKNOWN; @@ -163,7 +163,7 @@ I'm starting to have nightmares about fragments. */ - if ((*pskb)->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { + if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { *pskb = ip_ct_gather_frags(*pskb); if (!*pskb) Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.3 diff -u -r1.1.1.1 -r1.1.1.1.12.3 --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/10/03 22:48:03 1.1.1.1.12.3 @@ -141,14 +141,14 @@ /* Consider all addresses with the first three bits different of 000 and 111 as unicasts. */ - if ((st & __constant_htonl(0xE0000000)) != __constant_htonl(0x00000000) && - (st & __constant_htonl(0xE0000000)) != __constant_htonl(0xE0000000)) + if ((st & htonl(0xE0000000)) != htonl(0x00000000) && + (st & htonl(0xE0000000)) != htonl(0xE0000000)) return IPV6_ADDR_UNICAST; - if ((st & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000)) { + if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) { int type = IPV6_ADDR_MULTICAST; - switch((st & __constant_htonl(0x00FF0000))) { + switch((st & htonl(0x00FF0000))) { case __constant_htonl(0x00010000): type |= IPV6_ADDR_LOOPBACK; break; @@ -164,24 +164,24 @@ return type; } - if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFE800000)) + if ((st & htonl(0xFFC00000)) == htonl(0xFE800000)) return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST); - if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFEC00000)) + if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000)) return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST); if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { if (addr->s6_addr32[2] == 0) { - if (addr->in6_u.u6_addr32[3] == 0) + if (addr->s6_addr32[3] == 0) return IPV6_ADDR_ANY; - if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) + if (addr->s6_addr32[3] == htonl(0x00000001)) return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST); return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST); } - if (addr->s6_addr32[2] == __constant_htonl(0x0000ffff)) + if (addr->s6_addr32[2] == htonl(0x0000ffff)) return IPV6_ADDR_MAPPED; } @@ -752,7 +752,7 @@ memset(&rtmsg, 0, sizeof(rtmsg)); ipv6_addr_set(&rtmsg.rtmsg_dst, - __constant_htonl(0xFF000000), 0, 0, 0); + htonl(0xFF000000), 0, 0, 0); rtmsg.rtmsg_dst_len = 8; rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF; rtmsg.rtmsg_ifindex = dev->ifindex; @@ -782,7 +782,7 @@ { struct in6_addr addr; - ipv6_addr_set(&addr, __constant_htonl(0xFE800000), 0, 0, 0); + ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); addrconf_prefix_route(&addr, 10, dev, 0, RTF_ADDRCONF); } @@ -1120,7 +1120,7 @@ memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); if (idev->dev->flags&IFF_POINTOPOINT) { - addr.s6_addr32[0] = __constant_htonl(0xfe800000); + addr.s6_addr32[0] = htonl(0xfe800000); scope = IFA_LINK; } else { scope = IPV6_ADDR_COMPATv4; @@ -1187,7 +1187,7 @@ ASSERT_RTNL(); memset(&addr, 0, sizeof(struct in6_addr)); - addr.s6_addr[15] = 1; + addr.s6_addr32[3] = htonl(0x00000001); if ((idev = ipv6_find_idev(dev)) == NULL) { printk(KERN_DEBUG "init loopback: add_dev failed\n"); @@ -1234,9 +1234,7 @@ return; memset(&addr, 0, sizeof(struct in6_addr)); - - addr.s6_addr[0] = 0xFE; - addr.s6_addr[1] = 0x80; + addr.s6_addr32[0] = htonl(0xFE800000); if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) addrconf_add_linklocal(idev, &addr); Index: net/ipv6/datagram.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/datagram.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/datagram.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/datagram.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -147,7 +147,7 @@ } } else { ipv6_addr_set(&sin->sin6_addr, 0, 0, - __constant_htonl(0xffff), + htonl(0xffff), *(u32*)(skb->nh.raw + serr->addr_offset)); } } @@ -168,7 +168,7 @@ } } else { ipv6_addr_set(&sin->sin6_addr, 0, 0, - __constant_htonl(0xffff), + htonl(0xffff), skb->nh.iph->saddr); if (sk->protinfo.af_inet.cmsg_flags) ip_cmsg_recv(msg, skb); Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/icmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/icmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/icmp.c 2002/09/12 09:41:58 1.1.1.1.12.1 @@ -198,7 +198,7 @@ u8 type; if (skb_copy_bits(skb, ptr+offsetof(struct icmp6hdr, icmp6_type), &type, 1) - || !(type & 0x80)) + || !(type & ICMPV6_INFOMSG_MASK)) return 1; } return 0; @@ -216,7 +216,7 @@ int res = 0; /* Informational messages are not limited. */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) return 1; /* Do not limit pmtu discovery, it would break it. */ @@ -519,22 +519,22 @@ skb_checksum(skb, 0, skb->len, 0))) { if (net_ratelimit()) printk(KERN_DEBUG "ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n", - ntohs(saddr->in6_u.u6_addr16[0]), - ntohs(saddr->in6_u.u6_addr16[1]), - ntohs(saddr->in6_u.u6_addr16[2]), - ntohs(saddr->in6_u.u6_addr16[3]), - ntohs(saddr->in6_u.u6_addr16[4]), - ntohs(saddr->in6_u.u6_addr16[5]), - ntohs(saddr->in6_u.u6_addr16[6]), - ntohs(saddr->in6_u.u6_addr16[7]), - ntohs(daddr->in6_u.u6_addr16[0]), - ntohs(daddr->in6_u.u6_addr16[1]), - ntohs(daddr->in6_u.u6_addr16[2]), - ntohs(daddr->in6_u.u6_addr16[3]), - ntohs(daddr->in6_u.u6_addr16[4]), - ntohs(daddr->in6_u.u6_addr16[5]), - ntohs(daddr->in6_u.u6_addr16[6]), - ntohs(daddr->in6_u.u6_addr16[7])); + ntohs(saddr->s6_addr16[0]), + ntohs(saddr->s6_addr16[1]), + ntohs(saddr->s6_addr16[2]), + ntohs(saddr->s6_addr16[3]), + ntohs(saddr->s6_addr16[4]), + ntohs(saddr->s6_addr16[5]), + ntohs(saddr->s6_addr16[6]), + ntohs(saddr->s6_addr16[7]), + ntohs(daddr->s6_addr16[0]), + ntohs(daddr->s6_addr16[1]), + ntohs(daddr->s6_addr16[2]), + ntohs(daddr->s6_addr16[3]), + ntohs(daddr->s6_addr16[4]), + ntohs(daddr->s6_addr16[5]), + ntohs(daddr->s6_addr16[6]), + ntohs(daddr->s6_addr16[7])); goto discard_it; } } @@ -613,7 +613,7 @@ printk(KERN_DEBUG "icmpv6: msg of unkown type\n"); /* informational */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) break; /* Index: net/ipv6/ip6_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/ip6_output.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/ip6_output.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/ip6_output.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -101,7 +101,7 @@ struct dst_entry *dst = skb->dst; struct net_device *dev = dst->dev; - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->dev = dev; if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr)) { @@ -221,7 +221,7 @@ * Fill in the IPv6 header */ - *(u32*)hdr = __constant_htonl(0x60000000) | fl->fl6_flowlabel; + *(u32*)hdr = htonl(0x60000000) | fl->fl6_flowlabel; hlimit = -1; if (np) hlimit = np->hop_limit; @@ -262,7 +262,7 @@ struct ipv6hdr *hdr; int totlen; - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->dev = dev; totlen = len + sizeof(struct ipv6hdr); Index: net/ipv6/reassembly.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/reassembly.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/reassembly.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/reassembly.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -372,7 +372,7 @@ csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0)); /* Is this the final fragment? */ - if (!(fhdr->frag_off & __constant_htons(0x0001))) { + if (!(fhdr->frag_off & htons(0x0001))) { /* If we already have some bits beyond end * or have different end, the segment is corrupted. */ @@ -648,7 +648,7 @@ hdr = skb->nh.ipv6h; fhdr = (struct frag_hdr *)skb->h.raw; - if (!(fhdr->frag_off & __constant_htons(0xFFF9))) { + if (!(fhdr->frag_off & htons(0xFFF9))) { /* It is not a fragmented frame */ skb->h.raw += sizeof(struct frag_hdr); IP6_INC_STATS_BH(Ip6ReasmOKs); Index: net/ipv6/sit.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/sit.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/sit.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/sit.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -396,7 +396,7 @@ skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->pkt_type = PACKET_HOST; tunnel->stat.rx_packets++; tunnel->stat.rx_bytes += skb->len; @@ -470,7 +470,7 @@ goto tx_error; } - if (skb->protocol != __constant_htons(ETH_P_IPV6)) + if (skb->protocol != htons(ETH_P_IPV6)) goto tx_error; if (!dst) @@ -588,7 +588,7 @@ iph->version = 4; iph->ihl = sizeof(struct iphdr)>>2; if (mtu > IPV6_MIN_MTU) - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); else iph->frag_off = 0; @@ -659,10 +659,10 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPV6 || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF))) + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); t = ipip6_tunnel_locate(&p, cmd == SIOCADDTUNNEL); Index: net/ipv6/tcp_ipv6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/tcp_ipv6.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/tcp_ipv6.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/tcp_ipv6.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -402,7 +402,7 @@ static __u32 tcp_v6_init_sequence(struct sock *sk, struct sk_buff *skb) { - if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + if (skb->protocol == htons(ETH_P_IPV6)) { return secure_tcpv6_sequence_number(skb->nh.ipv6h->daddr.s6_addr32, skb->nh.ipv6h->saddr.s6_addr32, skb->h.th->dest, @@ -617,9 +617,9 @@ sk->backlog_rcv = tcp_v6_do_rcv; goto failure; } else { - ipv6_addr_set(&np->saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF), sk->saddr); - ipv6_addr_set(&np->rcv_saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF), sk->rcv_saddr); } @@ -1031,10 +1031,10 @@ if (ts) { u32 *ptr = (u32*)(t1 + 1); - *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + *ptr++ = htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); *ptr++ = htonl(tcp_time_stamp); *ptr = htonl(ts); } @@ -1145,7 +1145,7 @@ struct open_request *req = NULL; __u32 isn = TCP_SKB_CB(skb)->when; - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_conn_request(sk, skb); /* FIXME: do the same check for anycast */ @@ -1224,7 +1224,7 @@ struct sock *newsk; struct ipv6_txoptions *opt; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { /* * v6 mapped */ @@ -1236,10 +1236,10 @@ np = &newsk->net_pinfo.af_inet6; - ipv6_addr_set(&np->daddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000FFFF), newsk->daddr); - ipv6_addr_set(&np->saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF), newsk->saddr); ipv6_addr_copy(&np->rcv_saddr, &np->saddr); @@ -1425,7 +1425,7 @@ tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK */ - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_do_rcv(sk, skb); #ifdef CONFIG_FILTER Index: net/ipv6/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/udp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/udp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/udp.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -267,18 +267,18 @@ return err; ipv6_addr_set(&np->daddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->daddr); if(ipv6_addr_any(&np->saddr)) { ipv6_addr_set(&np->saddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->saddr); } if(ipv6_addr_any(&np->rcv_saddr)) { ipv6_addr_set(&np->rcv_saddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->rcv_saddr); } return 0; @@ -420,9 +420,9 @@ sin6->sin6_flowinfo = 0; sin6->sin6_scope_id = 0; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { ipv6_addr_set(&sin6->sin6_addr, 0, 0, - __constant_htonl(0xffff), skb->nh.iph->saddr); + htonl(0xffff), skb->nh.iph->saddr); if (sk->protinfo.af_inet.cmsg_flags) ip_cmsg_recv(msg, skb); } else { Index: net/ipv6/netfilter/ip6_queue.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6_queue.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.2 diff -u -r1.1.1.1 -r1.1.1.1.12.2 --- net/ipv6/netfilter/ip6_queue.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6_queue.c 2002/09/19 03:57:51 1.1.1.1.12.2 @@ -306,14 +306,8 @@ */ if (e->info->hook == NF_IP_LOCAL_OUT) { struct ipv6hdr *iph = e->skb->nh.ipv6h; - if (!( iph->daddr.in6_u.u6_addr32[0] == e->rt_info.daddr.in6_u.u6_addr32[0] - && iph->daddr.in6_u.u6_addr32[1] == e->rt_info.daddr.in6_u.u6_addr32[1] - && iph->daddr.in6_u.u6_addr32[2] == e->rt_info.daddr.in6_u.u6_addr32[2] - && iph->daddr.in6_u.u6_addr32[3] == e->rt_info.daddr.in6_u.u6_addr32[3] - && iph->saddr.in6_u.u6_addr32[0] == e->rt_info.saddr.in6_u.u6_addr32[0] - && iph->saddr.in6_u.u6_addr32[1] == e->rt_info.saddr.in6_u.u6_addr32[1] - && iph->saddr.in6_u.u6_addr32[2] == e->rt_info.saddr.in6_u.u6_addr32[2] - && iph->saddr.in6_u.u6_addr32[3] == e->rt_info.saddr.in6_u.u6_addr32[3])) + if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.daddr) || + ipv6_addr_cmp(&iph->saddr, &e->rt_info.saddr)) return route6_me_harder(e->skb); } return 0; Index: net/ipv6/netfilter/ip6t_LOG.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6t_LOG.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/netfilter/ip6t_LOG.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6t_LOG.c 2002/10/03 22:07:26 1.1.1.1.12.1 @@ -112,7 +112,7 @@ printk("FRAG:%u ", ntohs(fhdr->frag_off) & 0xFFF8); /* Max length: 11 "INCOMPLETE " */ - if (fhdr->frag_off & __constant_htons(0x0001)) + if (fhdr->frag_off & htons(0x0001)) printk("INCOMPLETE "); printk("ID:%08x ", fhdr->identification); --yoshfuji From yoshfuji@linux-ipv6.org Thu Oct 3 16:32:08 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 16:32:16 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93NW4tG028181 for ; Thu, 3 Oct 2002 16:32:05 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93NFP1o030342; Fri, 4 Oct 2002 08:15:25 +0900 Date: Fri, 04 Oct 2002 08:15:25 +0900 (JST) Message-Id: <20021004.081525.51826759.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Miscellaneous clean-ups From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20021004.075416.20775355.yoshfuji@linux-ipv6.org> References: <20021004.073642.125593159.yoshfuji@linux-ipv6.org> <20021004.073925.101556969.yoshfuji@linux-ipv6.org> <20021004.075416.20775355.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 514 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20021004.075416.20775355.yoshfuji@linux-ipv6.org> (at Fri, 04 Oct 2002 07:54:16 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > In article <20021004.073925.101556969.yoshfuji@linux-ipv6.org> (at Fri, 04 Oct 2002 07:39:25 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > > > In article <20021004.073642.125593159.yoshfuji@linux-ipv6.org> (at Fri, 04 Oct 2002 07:36:42 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > > > > > I saw many __constant_{hton,ntoh}{s,l}()s, so fixed. > > > > > > 1. use s6_addrXX instead of in6_u.s6_addrXX. > > > 2. avoid using magic number. > > > 3. use 32bit constants. > > > --> 4. avoid __constant_{hton,ntoh}{l,s}() in runtime code. > > > > oops, sorry, not fixed in my fix... :-p > > I forgot to commit __constant_XXX() under net/ipv6 in my tree... > anyway, resend with the fix for ipv6. so sorry... it must be a bad day for me today and i should not do anything today... removed duplicate chunks. confirmed to be applied with linux-2.4.19. Index: net/ipv4/arp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/arp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/arp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/arp.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -513,7 +513,7 @@ skb->nh.raw = skb->data; arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr) + 2*(dev->addr_len+4)); skb->dev = dev; - skb->protocol = __constant_htons (ETH_P_ARP); + skb->protocol = htons (ETH_P_ARP); if (src_hw == NULL) src_hw = dev->dev_addr; if (dest_hw == NULL) @@ -539,33 +539,33 @@ switch (dev->type) { default: arp->ar_hrd = htons(dev->type); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_pro = htons(ETH_P_IP); break; #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: - arp->ar_hrd = __constant_htons(ARPHRD_AX25); - arp->ar_pro = __constant_htons(AX25_P_IP); + arp->ar_hrd = htons(ARPHRD_AX25); + arp->ar_pro = htons(AX25_P_IP); break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: - arp->ar_hrd = __constant_htons(ARPHRD_NETROM); - arp->ar_pro = __constant_htons(AX25_P_IP); + arp->ar_hrd = htons(ARPHRD_NETROM); + arp->ar_pro = htons(AX25_P_IP); break; #endif #endif #ifdef CONFIG_FDDI case ARPHRD_FDDI: - arp->ar_hrd = __constant_htons(ARPHRD_ETHER); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_hrd = htons(ARPHRD_ETHER); + arp->ar_pro = htons(ETH_P_IP); break; #endif #ifdef CONFIG_TR case ARPHRD_IEEE802_TR: - arp->ar_hrd = __constant_htons(ARPHRD_IEEE802); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_hrd = htons(ARPHRD_IEEE802); + arp->ar_pro = htons(ETH_P_IP); break; #endif } @@ -629,7 +629,7 @@ switch (dev_type) { default: - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; if (htons(dev_type) != arp->ar_hrd) goto out; @@ -640,10 +640,10 @@ * ETHERNET devices will accept ARP hardware types of either * 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -653,10 +653,10 @@ * Token ring devices will accept ARP hardware types of either * 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -667,10 +667,10 @@ * of 1 (Ethernet). However, to be more robust, we'll accept hardware * types of either 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -681,25 +681,25 @@ * 802 devices) should accept ARP hardware types of 6 (IEEE 802) * and 1 (Ethernet). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: - if (arp->ar_pro != __constant_htons(AX25_P_IP)) + if (arp->ar_pro != htons(AX25_P_IP)) goto out; - if (arp->ar_hrd != __constant_htons(ARPHRD_AX25)) + if (arp->ar_hrd != htons(ARPHRD_AX25)) goto out; break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: - if (arp->ar_pro != __constant_htons(AX25_P_IP)) + if (arp->ar_pro != htons(AX25_P_IP)) goto out; - if (arp->ar_hrd != __constant_htons(ARPHRD_NETROM)) + if (arp->ar_hrd != htons(ARPHRD_NETROM)) goto out; break; #endif @@ -708,8 +708,8 @@ /* Understand only these message types */ - if (arp->ar_op != __constant_htons(ARPOP_REPLY) && - arp->ar_op != __constant_htons(ARPOP_REQUEST)) + if (arp->ar_op != htons(ARPOP_REPLY) && + arp->ar_op != htons(ARPOP_REQUEST)) goto out; /* @@ -754,13 +754,13 @@ /* Special case: IPv4 duplicate address detection packet (RFC2131) */ if (sip == 0) { - if (arp->ar_op == __constant_htons(ARPOP_REQUEST) && + if (arp->ar_op == htons(ARPOP_REQUEST) && inet_addr_type(tip) == RTN_LOCAL) arp_send(ARPOP_REPLY,ETH_P_ARP,tip,dev,tip,sha,dev->dev_addr,dev->dev_addr); goto out; } - if (arp->ar_op == __constant_htons(ARPOP_REQUEST) && + if (arp->ar_op == htons(ARPOP_REQUEST) && ip_route_input(skb, tip, sip, 0, dev) == 0) { rt = (struct rtable*)skb->dst; @@ -810,7 +810,7 @@ devices (strip is candidate) */ if (n == NULL && - arp->ar_op == __constant_htons(ARPOP_REPLY) && + arp->ar_op == htons(ARPOP_REPLY) && inet_addr_type(sip) == RTN_UNICAST) n = __neigh_lookup(&arp_tbl, &sip, dev, -1); #endif @@ -830,7 +830,7 @@ /* Broadcast replies and request packets do not assert neighbour reachability. */ - if (arp->ar_op != __constant_htons(ARPOP_REPLY) || + if (arp->ar_op != htons(ARPOP_REPLY) || skb->pkt_type != PACKET_HOST) state = NUD_STALE; neigh_update(n, sha, state, override, 1); @@ -1050,7 +1050,7 @@ (r.arp_flags & (ATF_NETMASK|ATF_DONTPUB))) return -EINVAL; if (!(r.arp_flags & ATF_NETMASK)) - ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=__constant_htonl(0xFFFFFFFFUL); + ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=htonl(0xFFFFFFFFUL); rtnl_lock(); if (r.arp_dev[0]) { Index: net/ipv4/igmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/igmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/igmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/igmp.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -229,7 +229,7 @@ iph->version = 4; iph->ihl = (sizeof(struct iphdr)+4)>>2; iph->tos = 0; - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); iph->ttl = 1; iph->daddr = dst; iph->saddr = rt->rt_src; Index: net/ipv4/ip_gre.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ip_gre.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ip_gre.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ip_gre.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -412,7 +412,7 @@ struct sk_buff *skb2; struct rtable *rt; - if (p[1] != __constant_htons(ETH_P_IP)) + if (p[1] != htons(ETH_P_IP)) return; flags = p[0]; @@ -535,10 +535,10 @@ static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) { if (INET_ECN_is_ce(iph->tos)) { - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { if (INET_ECN_is_not_ce(skb->nh.iph->tos)) IP_ECN_set_ce(skb->nh.iph); - } else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + } else if (skb->protocol == htons(ETH_P_IPV6)) { if (INET_ECN_is_not_ce(ip6_get_dsfield(skb->nh.ipv6h))) IP6_ECN_set_ce(skb->nh.ipv6h); } @@ -549,9 +549,9 @@ ipgre_ecn_encapsulate(u8 tos, struct iphdr *old_iph, struct sk_buff *skb) { u8 inner = 0; - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) inner = old_iph->tos; - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) + else if (skb->protocol == htons(ETH_P_IPV6)) inner = ip6_get_dsfield((struct ipv6hdr*)old_iph); return INET_ECN_encapsulate(tos, inner); } @@ -708,13 +708,13 @@ goto tx_error; } - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { rt = (struct rtable*)skb->dst; if ((dst = rt->rt_gateway) == 0) goto tx_error_icmp; } #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + else if (skb->protocol == htons(ETH_P_IPV6)) { struct in6_addr *addr6; int addr_type; struct neighbour *neigh = skb->dst->neighbour; @@ -742,7 +742,7 @@ tos = tiph->tos; if (tos&1) { - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) tos = old_iph->tos; tos &= ~1; } @@ -765,13 +765,13 @@ else mtu = skb->dst ? skb->dst->pmtu : dev->mtu; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { if (skb->dst && mtu < skb->dst->pmtu && mtu >= 68) skb->dst->pmtu = mtu; - df |= (old_iph->frag_off&__constant_htons(IP_DF)); + df |= (old_iph->frag_off&htons(IP_DF)); - if ((old_iph->frag_off&__constant_htons(IP_DF)) && + if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); ip_rt_put(rt); @@ -779,7 +779,7 @@ } } #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + else if (skb->protocol == htons(ETH_P_IPV6)) { struct rt6_info *rt6 = (struct rt6_info*)skb->dst; if (rt6 && mtu < rt6->u.dst.pmtu && mtu >= IPV6_MIN_MTU) { @@ -845,10 +845,10 @@ iph->saddr = rt->rt_src; if ((iph->ttl = tiph->ttl) == 0) { - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) iph->ttl = old_iph->ttl; #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) + else if (skb->protocol == htons(ETH_P_IPV6)) iph->ttl = ((struct ipv6hdr*)old_iph)->hop_limit; #endif else @@ -936,11 +936,11 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF)) || + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)) || ((p.i_flags|p.o_flags)&(GRE_VERSION|GRE_ROUTING))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); if (!(p.i_flags&GRE_KEY)) p.i_key = 0; Index: net/ipv4/ip_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ip_output.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ip_output.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ip_output.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -186,7 +186,7 @@ struct net_device *dev = skb->dst->dev; skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev, ip_finish_output2); @@ -208,7 +208,7 @@ #endif skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); /* * Multicasts are looped back for other local users @@ -382,7 +382,7 @@ *((__u16 *)iph) = htons((4 << 12) | (5 << 8) | (sk->protinfo.af_inet.tos & 0xff)); iph->tot_len = htons(skb->len); if (ip_dont_fragment(sk, &rt->u.dst)) - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); else iph->frag_off = 0; iph->ttl = sk->protinfo.af_inet.ttl; Index: net/ipv4/ipconfig.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipconfig.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipconfig.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipconfig.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -356,11 +356,11 @@ if (ic_netmask == INADDR_NONE) { if (IN_CLASSA(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSA_NET); + ic_netmask = htonl(IN_CLASSA_NET); else if (IN_CLASSB(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSB_NET); + ic_netmask = htonl(IN_CLASSB_NET); else if (IN_CLASSC(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSC_NET); + ic_netmask = htonl(IN_CLASSC_NET); else { printk(KERN_ERR "IP-Config: Unable to guess netmask for address %u.%u.%u.%u\n", NIPQUAD(ic_myaddr)); @@ -426,11 +426,11 @@ goto drop; /* If it's not a RARP reply, delete it. */ - if (rarp->ar_op != __constant_htons(ARPOP_RREPLY)) + if (rarp->ar_op != htons(ARPOP_RREPLY)) goto drop; /* If it's not Ethernet, delete it. */ - if (rarp->ar_pro != __constant_htons(ETH_P_IP)) + if (rarp->ar_pro != htons(ETH_P_IP)) goto drop; /* Extract variable-width fields */ @@ -661,15 +661,15 @@ h->version = 4; h->ihl = 5; h->tot_len = htons(sizeof(struct bootp_pkt)); - h->frag_off = __constant_htons(IP_DF); + h->frag_off = htons(IP_DF); h->ttl = 64; h->protocol = IPPROTO_UDP; h->daddr = INADDR_BROADCAST; h->check = ip_fast_csum((unsigned char *) h, h->ihl); /* Construct UDP header */ - b->udph.source = __constant_htons(68); - b->udph.dest = __constant_htons(67); + b->udph.source = htons(68); + b->udph.dest = htons(67); b->udph.len = htons(sizeof(struct bootp_pkt) - sizeof(struct iphdr)); /* UDP checksum not calculated -- explicitly allowed in BOOTP RFC */ @@ -700,7 +700,7 @@ /* Chain packet down the line... */ skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); if ((dev->hard_header && dev->hard_header(skb, dev, ntohs(skb->protocol), dev->broadcast, dev->dev_addr, skb->len) < 0) || dev_queue_xmit(skb) < 0) @@ -800,13 +800,13 @@ ip_fast_csum((char *) h, h->ihl) != 0 || skb->len < ntohs(h->tot_len) || h->protocol != IPPROTO_UDP || - b->udph.source != __constant_htons(67) || - b->udph.dest != __constant_htons(68) || + b->udph.source != htons(67) || + b->udph.dest != htons(68) || ntohs(h->tot_len) < ntohs(b->udph.len) + sizeof(struct iphdr)) goto drop; /* Fragments are not supported */ - if (h->frag_off & __constant_htons(IP_OFFSET | IP_MF)) { + if (h->frag_off & htons(IP_OFFSET | IP_MF)) { printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented reply.\n"); goto drop; } Index: net/ipv4/ipip.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipip.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipip.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipip.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -483,7 +483,7 @@ skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->pkt_type = PACKET_HOST; read_lock(&ipip_lock); @@ -544,7 +544,7 @@ goto tx_error; } - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != htons(ETH_P_IP)) goto tx_error; if (tos&1) @@ -585,9 +585,9 @@ if (skb->dst && mtu < skb->dst->pmtu) skb->dst->pmtu = mtu; - df |= (old_iph->frag_off&__constant_htons(IP_DF)); + df |= (old_iph->frag_off&htons(IP_DF)); - if ((old_iph->frag_off&__constant_htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { + if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); ip_rt_put(rt); goto tx_error; @@ -703,10 +703,10 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF))) + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); t = ipip_tunnel_locate(&p, cmd == SIOCADDTUNNEL); Index: net/ipv4/ipmr.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipmr.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipmr.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipmr.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1434,7 +1434,7 @@ skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; dst_release(skb->dst); @@ -1501,7 +1501,7 @@ skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; dst_release(skb->dst); Index: net/ipv4/route.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/route.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/route.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/route.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1246,7 +1246,7 @@ return -EINVAL; if (MULTICAST(saddr) || BADCLASS(saddr) || LOOPBACK(saddr) || - skb->protocol != __constant_htons(ETH_P_IP)) + skb->protocol != htons(ETH_P_IP)) goto e_inval; if (ZERONET(saddr)) { @@ -1457,7 +1457,7 @@ inet_addr_onlink(out_dev, saddr, FIB_RES_GW(res)))) flags |= RTCF_DOREDIRECT; - if (skb->protocol != __constant_htons(ETH_P_IP)) { + if (skb->protocol != htons(ETH_P_IP)) { /* Not IP (i.e. ARP). Do not create route, if it is * invalid for proxy arp. DNAT routes are always valid. */ @@ -1522,7 +1522,7 @@ out: return err; brd_input: - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != htons(ETH_P_IP)) goto e_inval; if (ZERONET(saddr)) @@ -2156,7 +2156,7 @@ err = -ENODEV; if (!dev) goto out; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->dev = dev; local_bh_disable(); err = ip_route_input(skb, dst, src, rtm->rtm_tos, dev); Index: net/ipv4/tcp_diag.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_diag.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_diag.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_diag.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -346,7 +346,7 @@ break; if (sk->family == AF_INET6 && cond->family == AF_INET) { if (addr[0] == 0 && addr[1] == 0 && - addr[2] == __constant_htonl(0xffff) && + addr[2] == htonl(0xffff) && bitstring_match(addr+3, cond->addr, cond->prefix_len)) break; } Index: net/ipv4/tcp_input.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_input.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_input.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_input.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -2083,8 +2083,8 @@ } else if (tp->tstamp_ok && th->doff == (sizeof(struct tcphdr)>>2)+(TCPOLEN_TSTAMP_ALIGNED>>2)) { __u32 *ptr = (__u32 *)(th + 1); - if (*ptr == __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { + if (*ptr == ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { tp->saw_tstamp = 1; ++ptr; tp->rcv_tsval = ntohl(*ptr); @@ -3252,8 +3252,8 @@ __u32 *ptr = (__u32 *)(th + 1); /* No? Slow path! */ - if (*ptr != __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) + if (*ptr != ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) goto slow_path; tp->saw_tstamp = 1; Index: net/ipv4/tcp_ipv4.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_ipv4.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_ipv4.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_ipv4.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1210,10 +1210,10 @@ arg.iov[0].iov_len = sizeof(rep.th); arg.n_iov = 1; if (ts) { - rep.tsopt[0] = __constant_htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + rep.tsopt[0] = htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); rep.tsopt[1] = htonl(tcp_time_stamp); rep.tsopt[2] = htonl(ts); arg.iov[0].iov_len = sizeof(rep); Index: net/ipv4/netfilter/ip_nat_core.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_core.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_core.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_core.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -775,7 +775,7 @@ if (helper) { /* Always defragged for helpers */ IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off - & __constant_htons(IP_MF|IP_OFFSET))); + & htons(IP_MF|IP_OFFSET))); return helper->help(ct, info, ctinfo, hooknum, pskb); } else return NF_ACCEPT; } Index: net/ipv4/netfilter/ip_nat_snmp_basic.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_snmp_basic.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_snmp_basic.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_snmp_basic.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -1259,9 +1259,9 @@ * on post routing (SNAT). */ if (!((dir == IP_CT_DIR_REPLY && hooknum == NF_IP_PRE_ROUTING && - udph->source == __constant_ntohs(SNMP_PORT)) || + udph->source == ntohs(SNMP_PORT)) || (dir == IP_CT_DIR_ORIGINAL && hooknum == NF_IP_POST_ROUTING && - udph->dest == __constant_ntohs(SNMP_TRAP_PORT)))) { + udph->dest == ntohs(SNMP_TRAP_PORT)))) { spin_unlock_bh(&snmp_lock); return NF_ACCEPT; } Index: net/ipv4/netfilter/ip_nat_standalone.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_standalone.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_standalone.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_standalone.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -60,7 +60,7 @@ /* We never see fragments: conntrack defrags on pre-routing and local-out, and ip_nat_out protects post-routing. */ IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off - & __constant_htons(IP_MF|IP_OFFSET))); + & htons(IP_MF|IP_OFFSET))); (*pskb)->nfcache |= NFC_UNKNOWN; @@ -163,7 +163,7 @@ I'm starting to have nightmares about fragments. */ - if ((*pskb)->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { + if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { *pskb = ip_ct_gather_frags(*pskb); if (!*pskb) Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.3 diff -u -r1.1.1.1 -r1.1.1.1.12.3 --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/10/03 22:48:03 1.1.1.1.12.3 @@ -141,14 +141,14 @@ /* Consider all addresses with the first three bits different of 000 and 111 as unicasts. */ - if ((st & __constant_htonl(0xE0000000)) != __constant_htonl(0x00000000) && - (st & __constant_htonl(0xE0000000)) != __constant_htonl(0xE0000000)) + if ((st & htonl(0xE0000000)) != htonl(0x00000000) && + (st & htonl(0xE0000000)) != htonl(0xE0000000)) return IPV6_ADDR_UNICAST; - if ((st & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000)) { + if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) { int type = IPV6_ADDR_MULTICAST; - switch((st & __constant_htonl(0x00FF0000))) { + switch((st & htonl(0x00FF0000))) { case __constant_htonl(0x00010000): type |= IPV6_ADDR_LOOPBACK; break; @@ -164,24 +164,24 @@ return type; } - if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFE800000)) + if ((st & htonl(0xFFC00000)) == htonl(0xFE800000)) return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST); - if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFEC00000)) + if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000)) return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST); if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { if (addr->s6_addr32[2] == 0) { - if (addr->in6_u.u6_addr32[3] == 0) + if (addr->s6_addr32[3] == 0) return IPV6_ADDR_ANY; - if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) + if (addr->s6_addr32[3] == htonl(0x00000001)) return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST); return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST); } - if (addr->s6_addr32[2] == __constant_htonl(0x0000ffff)) + if (addr->s6_addr32[2] == htonl(0x0000ffff)) return IPV6_ADDR_MAPPED; } @@ -752,7 +752,7 @@ memset(&rtmsg, 0, sizeof(rtmsg)); ipv6_addr_set(&rtmsg.rtmsg_dst, - __constant_htonl(0xFF000000), 0, 0, 0); + htonl(0xFF000000), 0, 0, 0); rtmsg.rtmsg_dst_len = 8; rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF; rtmsg.rtmsg_ifindex = dev->ifindex; @@ -782,7 +782,7 @@ { struct in6_addr addr; - ipv6_addr_set(&addr, __constant_htonl(0xFE800000), 0, 0, 0); + ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); addrconf_prefix_route(&addr, 10, dev, 0, RTF_ADDRCONF); } @@ -1120,7 +1120,7 @@ memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); if (idev->dev->flags&IFF_POINTOPOINT) { - addr.s6_addr32[0] = __constant_htonl(0xfe800000); + addr.s6_addr32[0] = htonl(0xfe800000); scope = IFA_LINK; } else { scope = IPV6_ADDR_COMPATv4; @@ -1187,7 +1187,7 @@ ASSERT_RTNL(); memset(&addr, 0, sizeof(struct in6_addr)); - addr.s6_addr[15] = 1; + addr.s6_addr32[3] = htonl(0x00000001); if ((idev = ipv6_find_idev(dev)) == NULL) { printk(KERN_DEBUG "init loopback: add_dev failed\n"); @@ -1234,9 +1234,7 @@ return; memset(&addr, 0, sizeof(struct in6_addr)); - - addr.s6_addr[0] = 0xFE; - addr.s6_addr[1] = 0x80; + addr.s6_addr32[0] = htonl(0xFE800000); if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) addrconf_add_linklocal(idev, &addr); Index: net/ipv6/datagram.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/datagram.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/datagram.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/datagram.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -147,7 +147,7 @@ } } else { ipv6_addr_set(&sin->sin6_addr, 0, 0, - __constant_htonl(0xffff), + htonl(0xffff), *(u32*)(skb->nh.raw + serr->addr_offset)); } } @@ -168,7 +168,7 @@ } } else { ipv6_addr_set(&sin->sin6_addr, 0, 0, - __constant_htonl(0xffff), + htonl(0xffff), skb->nh.iph->saddr); if (sk->protinfo.af_inet.cmsg_flags) ip_cmsg_recv(msg, skb); Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/icmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/icmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/icmp.c 2002/09/12 09:41:58 1.1.1.1.12.1 @@ -198,7 +198,7 @@ u8 type; if (skb_copy_bits(skb, ptr+offsetof(struct icmp6hdr, icmp6_type), &type, 1) - || !(type & 0x80)) + || !(type & ICMPV6_INFOMSG_MASK)) return 1; } return 0; @@ -216,7 +216,7 @@ int res = 0; /* Informational messages are not limited. */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) return 1; /* Do not limit pmtu discovery, it would break it. */ @@ -519,22 +519,22 @@ skb_checksum(skb, 0, skb->len, 0))) { if (net_ratelimit()) printk(KERN_DEBUG "ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n", - ntohs(saddr->in6_u.u6_addr16[0]), - ntohs(saddr->in6_u.u6_addr16[1]), - ntohs(saddr->in6_u.u6_addr16[2]), - ntohs(saddr->in6_u.u6_addr16[3]), - ntohs(saddr->in6_u.u6_addr16[4]), - ntohs(saddr->in6_u.u6_addr16[5]), - ntohs(saddr->in6_u.u6_addr16[6]), - ntohs(saddr->in6_u.u6_addr16[7]), - ntohs(daddr->in6_u.u6_addr16[0]), - ntohs(daddr->in6_u.u6_addr16[1]), - ntohs(daddr->in6_u.u6_addr16[2]), - ntohs(daddr->in6_u.u6_addr16[3]), - ntohs(daddr->in6_u.u6_addr16[4]), - ntohs(daddr->in6_u.u6_addr16[5]), - ntohs(daddr->in6_u.u6_addr16[6]), - ntohs(daddr->in6_u.u6_addr16[7])); + ntohs(saddr->s6_addr16[0]), + ntohs(saddr->s6_addr16[1]), + ntohs(saddr->s6_addr16[2]), + ntohs(saddr->s6_addr16[3]), + ntohs(saddr->s6_addr16[4]), + ntohs(saddr->s6_addr16[5]), + ntohs(saddr->s6_addr16[6]), + ntohs(saddr->s6_addr16[7]), + ntohs(daddr->s6_addr16[0]), + ntohs(daddr->s6_addr16[1]), + ntohs(daddr->s6_addr16[2]), + ntohs(daddr->s6_addr16[3]), + ntohs(daddr->s6_addr16[4]), + ntohs(daddr->s6_addr16[5]), + ntohs(daddr->s6_addr16[6]), + ntohs(daddr->s6_addr16[7])); goto discard_it; } } @@ -613,7 +613,7 @@ printk(KERN_DEBUG "icmpv6: msg of unkown type\n"); /* informational */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) break; /* Index: net/ipv6/ip6_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/ip6_output.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/ip6_output.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/ip6_output.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -101,7 +101,7 @@ struct dst_entry *dst = skb->dst; struct net_device *dev = dst->dev; - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->dev = dev; if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr)) { @@ -221,7 +221,7 @@ * Fill in the IPv6 header */ - *(u32*)hdr = __constant_htonl(0x60000000) | fl->fl6_flowlabel; + *(u32*)hdr = htonl(0x60000000) | fl->fl6_flowlabel; hlimit = -1; if (np) hlimit = np->hop_limit; @@ -262,7 +262,7 @@ struct ipv6hdr *hdr; int totlen; - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->dev = dev; totlen = len + sizeof(struct ipv6hdr); Index: net/ipv6/reassembly.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/reassembly.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/reassembly.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/reassembly.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -372,7 +372,7 @@ csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0)); /* Is this the final fragment? */ - if (!(fhdr->frag_off & __constant_htons(0x0001))) { + if (!(fhdr->frag_off & htons(0x0001))) { /* If we already have some bits beyond end * or have different end, the segment is corrupted. */ @@ -648,7 +648,7 @@ hdr = skb->nh.ipv6h; fhdr = (struct frag_hdr *)skb->h.raw; - if (!(fhdr->frag_off & __constant_htons(0xFFF9))) { + if (!(fhdr->frag_off & htons(0xFFF9))) { /* It is not a fragmented frame */ skb->h.raw += sizeof(struct frag_hdr); IP6_INC_STATS_BH(Ip6ReasmOKs); Index: net/ipv6/sit.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/sit.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/sit.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/sit.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -396,7 +396,7 @@ skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb->pkt_type = PACKET_HOST; tunnel->stat.rx_packets++; tunnel->stat.rx_bytes += skb->len; @@ -470,7 +470,7 @@ goto tx_error; } - if (skb->protocol != __constant_htons(ETH_P_IPV6)) + if (skb->protocol != htons(ETH_P_IPV6)) goto tx_error; if (!dst) @@ -588,7 +588,7 @@ iph->version = 4; iph->ihl = sizeof(struct iphdr)>>2; if (mtu > IPV6_MIN_MTU) - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); else iph->frag_off = 0; @@ -659,10 +659,10 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPV6 || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF))) + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); t = ipip6_tunnel_locate(&p, cmd == SIOCADDTUNNEL); Index: net/ipv6/tcp_ipv6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/tcp_ipv6.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/tcp_ipv6.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/tcp_ipv6.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -402,7 +402,7 @@ static __u32 tcp_v6_init_sequence(struct sock *sk, struct sk_buff *skb) { - if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + if (skb->protocol == htons(ETH_P_IPV6)) { return secure_tcpv6_sequence_number(skb->nh.ipv6h->daddr.s6_addr32, skb->nh.ipv6h->saddr.s6_addr32, skb->h.th->dest, @@ -617,9 +617,9 @@ sk->backlog_rcv = tcp_v6_do_rcv; goto failure; } else { - ipv6_addr_set(&np->saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF), sk->saddr); - ipv6_addr_set(&np->rcv_saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF), sk->rcv_saddr); } @@ -1031,10 +1031,10 @@ if (ts) { u32 *ptr = (u32*)(t1 + 1); - *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + *ptr++ = htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); *ptr++ = htonl(tcp_time_stamp); *ptr = htonl(ts); } @@ -1145,7 +1145,7 @@ struct open_request *req = NULL; __u32 isn = TCP_SKB_CB(skb)->when; - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_conn_request(sk, skb); /* FIXME: do the same check for anycast */ @@ -1224,7 +1224,7 @@ struct sock *newsk; struct ipv6_txoptions *opt; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { /* * v6 mapped */ @@ -1236,10 +1236,10 @@ np = &newsk->net_pinfo.af_inet6; - ipv6_addr_set(&np->daddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000FFFF), newsk->daddr); - ipv6_addr_set(&np->saddr, 0, 0, __constant_htonl(0x0000FFFF), + ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF), newsk->saddr); ipv6_addr_copy(&np->rcv_saddr, &np->saddr); @@ -1425,7 +1425,7 @@ tcp_v6_hnd_req and tcp_v6_send_reset(). --ANK */ - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_do_rcv(sk, skb); #ifdef CONFIG_FILTER Index: net/ipv6/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/udp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/udp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/udp.c 2002/10/03 22:41:07 1.1.1.1.12.1 @@ -267,18 +267,18 @@ return err; ipv6_addr_set(&np->daddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->daddr); if(ipv6_addr_any(&np->saddr)) { ipv6_addr_set(&np->saddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->saddr); } if(ipv6_addr_any(&np->rcv_saddr)) { ipv6_addr_set(&np->rcv_saddr, 0, 0, - __constant_htonl(0x0000ffff), + htonl(0x0000ffff), sk->rcv_saddr); } return 0; @@ -420,9 +420,9 @@ sin6->sin6_flowinfo = 0; sin6->sin6_scope_id = 0; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { ipv6_addr_set(&sin6->sin6_addr, 0, 0, - __constant_htonl(0xffff), skb->nh.iph->saddr); + htonl(0xffff), skb->nh.iph->saddr); if (sk->protinfo.af_inet.cmsg_flags) ip_cmsg_recv(msg, skb); } else { Index: net/ipv6/netfilter/ip6_queue.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6_queue.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.2 diff -u -r1.1.1.1 -r1.1.1.1.12.2 --- net/ipv6/netfilter/ip6_queue.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6_queue.c 2002/09/19 03:57:51 1.1.1.1.12.2 @@ -306,14 +306,8 @@ */ if (e->info->hook == NF_IP_LOCAL_OUT) { struct ipv6hdr *iph = e->skb->nh.ipv6h; - if (!( iph->daddr.in6_u.u6_addr32[0] == e->rt_info.daddr.in6_u.u6_addr32[0] - && iph->daddr.in6_u.u6_addr32[1] == e->rt_info.daddr.in6_u.u6_addr32[1] - && iph->daddr.in6_u.u6_addr32[2] == e->rt_info.daddr.in6_u.u6_addr32[2] - && iph->daddr.in6_u.u6_addr32[3] == e->rt_info.daddr.in6_u.u6_addr32[3] - && iph->saddr.in6_u.u6_addr32[0] == e->rt_info.saddr.in6_u.u6_addr32[0] - && iph->saddr.in6_u.u6_addr32[1] == e->rt_info.saddr.in6_u.u6_addr32[1] - && iph->saddr.in6_u.u6_addr32[2] == e->rt_info.saddr.in6_u.u6_addr32[2] - && iph->saddr.in6_u.u6_addr32[3] == e->rt_info.saddr.in6_u.u6_addr32[3])) + if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.daddr) || + ipv6_addr_cmp(&iph->saddr, &e->rt_info.saddr)) return route6_me_harder(e->skb); } return 0; Index: net/ipv6/netfilter/ip6t_LOG.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6t_LOG.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/netfilter/ip6t_LOG.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6t_LOG.c 2002/10/03 22:07:26 1.1.1.1.12.1 @@ -112,7 +112,7 @@ printk("FRAG:%u ", ntohs(fhdr->frag_off) & 0xFFF8); /* Max length: 11 "INCOMPLETE " */ - if (fhdr->frag_off & __constant_htons(0x0001)) + if (fhdr->frag_off & htons(0x0001)) printk("INCOMPLETE "); printk("ID:%08x ", fhdr->identification); --yoshfuji From yoshfuji@linux-ipv6.org Thu Oct 3 16:32:09 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 16:32:16 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g93NW4tI028181 for ; Thu, 3 Oct 2002 16:32:08 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g93Mag1o030119; Fri, 4 Oct 2002 07:36:42 +0900 Date: Fri, 04 Oct 2002 07:36:42 +0900 (JST) Message-Id: <20021004.073642.125593159.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Miscellaneous clean-ups From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20021003.103617.04446177.davem@redhat.com> References: <20021004.011315.05129566.yoshfuji@linux-ipv6.org> <20021003.103617.04446177.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 514 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20021003.103617.04446177.davem@redhat.com> (at Thu, 03 Oct 2002 10:36:17 -0700 (PDT)), "David S. Miller" says: > - addr.s6_addr[15] = 1; > + addr.s6_addr32[3] = __constant_htonl(0x00000001); > > Do not use __constant_htonl() in runtime code, use htonl(). > Arnaldo de Melo told you this the other day for another one > of your patches, so you must fix this kind of stuff up before > I'll apply any of your patches which have this problem. I saw many __constant_{hton,ntoh}{s,l}()s, so fixed. 1. use s6_addrXX instead of in6_u.s6_addrXX. 2. avoid using magic number. 3. use 32bit constants. --> 4. avoid __constant_{hton,ntoh}{l,s}() in runtime code. Index: net/ipv4/arp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/arp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/arp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/arp.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -513,7 +513,7 @@ skb->nh.raw = skb->data; arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr) + 2*(dev->addr_len+4)); skb->dev = dev; - skb->protocol = __constant_htons (ETH_P_ARP); + skb->protocol = htons (ETH_P_ARP); if (src_hw == NULL) src_hw = dev->dev_addr; if (dest_hw == NULL) @@ -539,33 +539,33 @@ switch (dev->type) { default: arp->ar_hrd = htons(dev->type); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_pro = htons(ETH_P_IP); break; #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: - arp->ar_hrd = __constant_htons(ARPHRD_AX25); - arp->ar_pro = __constant_htons(AX25_P_IP); + arp->ar_hrd = htons(ARPHRD_AX25); + arp->ar_pro = htons(AX25_P_IP); break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: - arp->ar_hrd = __constant_htons(ARPHRD_NETROM); - arp->ar_pro = __constant_htons(AX25_P_IP); + arp->ar_hrd = htons(ARPHRD_NETROM); + arp->ar_pro = htons(AX25_P_IP); break; #endif #endif #ifdef CONFIG_FDDI case ARPHRD_FDDI: - arp->ar_hrd = __constant_htons(ARPHRD_ETHER); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_hrd = htons(ARPHRD_ETHER); + arp->ar_pro = htons(ETH_P_IP); break; #endif #ifdef CONFIG_TR case ARPHRD_IEEE802_TR: - arp->ar_hrd = __constant_htons(ARPHRD_IEEE802); - arp->ar_pro = __constant_htons(ETH_P_IP); + arp->ar_hrd = htons(ARPHRD_IEEE802); + arp->ar_pro = htons(ETH_P_IP); break; #endif } @@ -629,7 +629,7 @@ switch (dev_type) { default: - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; if (htons(dev_type) != arp->ar_hrd) goto out; @@ -640,10 +640,10 @@ * ETHERNET devices will accept ARP hardware types of either * 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -653,10 +653,10 @@ * Token ring devices will accept ARP hardware types of either * 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -667,10 +667,10 @@ * of 1 (Ethernet). However, to be more robust, we'll accept hardware * types of either 1 (Ethernet) or 6 (IEEE 802.2). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif @@ -681,25 +681,25 @@ * 802 devices) should accept ARP hardware types of 6 (IEEE 802) * and 1 (Ethernet). */ - if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) && - arp->ar_hrd != __constant_htons(ARPHRD_IEEE802)) + if (arp->ar_hrd != htons(ARPHRD_ETHER) && + arp->ar_hrd != htons(ARPHRD_IEEE802)) goto out; - if (arp->ar_pro != __constant_htons(ETH_P_IP)) + if (arp->ar_pro != htons(ETH_P_IP)) goto out; break; #endif #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: - if (arp->ar_pro != __constant_htons(AX25_P_IP)) + if (arp->ar_pro != htons(AX25_P_IP)) goto out; - if (arp->ar_hrd != __constant_htons(ARPHRD_AX25)) + if (arp->ar_hrd != htons(ARPHRD_AX25)) goto out; break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: - if (arp->ar_pro != __constant_htons(AX25_P_IP)) + if (arp->ar_pro != htons(AX25_P_IP)) goto out; - if (arp->ar_hrd != __constant_htons(ARPHRD_NETROM)) + if (arp->ar_hrd != htons(ARPHRD_NETROM)) goto out; break; #endif @@ -708,8 +708,8 @@ /* Understand only these message types */ - if (arp->ar_op != __constant_htons(ARPOP_REPLY) && - arp->ar_op != __constant_htons(ARPOP_REQUEST)) + if (arp->ar_op != htons(ARPOP_REPLY) && + arp->ar_op != htons(ARPOP_REQUEST)) goto out; /* @@ -754,13 +754,13 @@ /* Special case: IPv4 duplicate address detection packet (RFC2131) */ if (sip == 0) { - if (arp->ar_op == __constant_htons(ARPOP_REQUEST) && + if (arp->ar_op == htons(ARPOP_REQUEST) && inet_addr_type(tip) == RTN_LOCAL) arp_send(ARPOP_REPLY,ETH_P_ARP,tip,dev,tip,sha,dev->dev_addr,dev->dev_addr); goto out; } - if (arp->ar_op == __constant_htons(ARPOP_REQUEST) && + if (arp->ar_op == htons(ARPOP_REQUEST) && ip_route_input(skb, tip, sip, 0, dev) == 0) { rt = (struct rtable*)skb->dst; @@ -810,7 +810,7 @@ devices (strip is candidate) */ if (n == NULL && - arp->ar_op == __constant_htons(ARPOP_REPLY) && + arp->ar_op == htons(ARPOP_REPLY) && inet_addr_type(sip) == RTN_UNICAST) n = __neigh_lookup(&arp_tbl, &sip, dev, -1); #endif @@ -830,7 +830,7 @@ /* Broadcast replies and request packets do not assert neighbour reachability. */ - if (arp->ar_op != __constant_htons(ARPOP_REPLY) || + if (arp->ar_op != htons(ARPOP_REPLY) || skb->pkt_type != PACKET_HOST) state = NUD_STALE; neigh_update(n, sha, state, override, 1); @@ -1050,7 +1050,7 @@ (r.arp_flags & (ATF_NETMASK|ATF_DONTPUB))) return -EINVAL; if (!(r.arp_flags & ATF_NETMASK)) - ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=__constant_htonl(0xFFFFFFFFUL); + ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=htonl(0xFFFFFFFFUL); rtnl_lock(); if (r.arp_dev[0]) { Index: net/ipv4/igmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/igmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/igmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/igmp.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -229,7 +229,7 @@ iph->version = 4; iph->ihl = (sizeof(struct iphdr)+4)>>2; iph->tos = 0; - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); iph->ttl = 1; iph->daddr = dst; iph->saddr = rt->rt_src; Index: net/ipv4/ip_gre.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ip_gre.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ip_gre.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ip_gre.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -412,7 +412,7 @@ struct sk_buff *skb2; struct rtable *rt; - if (p[1] != __constant_htons(ETH_P_IP)) + if (p[1] != htons(ETH_P_IP)) return; flags = p[0]; @@ -535,10 +535,10 @@ static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) { if (INET_ECN_is_ce(iph->tos)) { - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { if (INET_ECN_is_not_ce(skb->nh.iph->tos)) IP_ECN_set_ce(skb->nh.iph); - } else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + } else if (skb->protocol == htons(ETH_P_IPV6)) { if (INET_ECN_is_not_ce(ip6_get_dsfield(skb->nh.ipv6h))) IP6_ECN_set_ce(skb->nh.ipv6h); } @@ -549,9 +549,9 @@ ipgre_ecn_encapsulate(u8 tos, struct iphdr *old_iph, struct sk_buff *skb) { u8 inner = 0; - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) inner = old_iph->tos; - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) + else if (skb->protocol == htons(ETH_P_IPV6)) inner = ip6_get_dsfield((struct ipv6hdr*)old_iph); return INET_ECN_encapsulate(tos, inner); } @@ -708,13 +708,13 @@ goto tx_error; } - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { rt = (struct rtable*)skb->dst; if ((dst = rt->rt_gateway) == 0) goto tx_error_icmp; } #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + else if (skb->protocol == htons(ETH_P_IPV6)) { struct in6_addr *addr6; int addr_type; struct neighbour *neigh = skb->dst->neighbour; @@ -742,7 +742,7 @@ tos = tiph->tos; if (tos&1) { - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) tos = old_iph->tos; tos &= ~1; } @@ -765,13 +765,13 @@ else mtu = skb->dst ? skb->dst->pmtu : dev->mtu; - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { if (skb->dst && mtu < skb->dst->pmtu && mtu >= 68) skb->dst->pmtu = mtu; - df |= (old_iph->frag_off&__constant_htons(IP_DF)); + df |= (old_iph->frag_off&htons(IP_DF)); - if ((old_iph->frag_off&__constant_htons(IP_DF)) && + if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); ip_rt_put(rt); @@ -779,7 +779,7 @@ } } #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { + else if (skb->protocol == htons(ETH_P_IPV6)) { struct rt6_info *rt6 = (struct rt6_info*)skb->dst; if (rt6 && mtu < rt6->u.dst.pmtu && mtu >= IPV6_MIN_MTU) { @@ -845,10 +845,10 @@ iph->saddr = rt->rt_src; if ((iph->ttl = tiph->ttl) == 0) { - if (skb->protocol == __constant_htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) iph->ttl = old_iph->ttl; #ifdef CONFIG_IPV6 - else if (skb->protocol == __constant_htons(ETH_P_IPV6)) + else if (skb->protocol == htons(ETH_P_IPV6)) iph->ttl = ((struct ipv6hdr*)old_iph)->hop_limit; #endif else @@ -936,11 +936,11 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF)) || + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)) || ((p.i_flags|p.o_flags)&(GRE_VERSION|GRE_ROUTING))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); if (!(p.i_flags&GRE_KEY)) p.i_key = 0; Index: net/ipv4/ip_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ip_output.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ip_output.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ip_output.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -186,7 +186,7 @@ struct net_device *dev = skb->dst->dev; skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev, ip_finish_output2); @@ -208,7 +208,7 @@ #endif skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); /* * Multicasts are looped back for other local users @@ -382,7 +382,7 @@ *((__u16 *)iph) = htons((4 << 12) | (5 << 8) | (sk->protinfo.af_inet.tos & 0xff)); iph->tot_len = htons(skb->len); if (ip_dont_fragment(sk, &rt->u.dst)) - iph->frag_off = __constant_htons(IP_DF); + iph->frag_off = htons(IP_DF); else iph->frag_off = 0; iph->ttl = sk->protinfo.af_inet.ttl; Index: net/ipv4/ipconfig.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipconfig.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipconfig.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipconfig.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -356,11 +356,11 @@ if (ic_netmask == INADDR_NONE) { if (IN_CLASSA(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSA_NET); + ic_netmask = htonl(IN_CLASSA_NET); else if (IN_CLASSB(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSB_NET); + ic_netmask = htonl(IN_CLASSB_NET); else if (IN_CLASSC(ntohl(ic_myaddr))) - ic_netmask = __constant_htonl(IN_CLASSC_NET); + ic_netmask = htonl(IN_CLASSC_NET); else { printk(KERN_ERR "IP-Config: Unable to guess netmask for address %u.%u.%u.%u\n", NIPQUAD(ic_myaddr)); @@ -426,11 +426,11 @@ goto drop; /* If it's not a RARP reply, delete it. */ - if (rarp->ar_op != __constant_htons(ARPOP_RREPLY)) + if (rarp->ar_op != htons(ARPOP_RREPLY)) goto drop; /* If it's not Ethernet, delete it. */ - if (rarp->ar_pro != __constant_htons(ETH_P_IP)) + if (rarp->ar_pro != htons(ETH_P_IP)) goto drop; /* Extract variable-width fields */ @@ -661,15 +661,15 @@ h->version = 4; h->ihl = 5; h->tot_len = htons(sizeof(struct bootp_pkt)); - h->frag_off = __constant_htons(IP_DF); + h->frag_off = htons(IP_DF); h->ttl = 64; h->protocol = IPPROTO_UDP; h->daddr = INADDR_BROADCAST; h->check = ip_fast_csum((unsigned char *) h, h->ihl); /* Construct UDP header */ - b->udph.source = __constant_htons(68); - b->udph.dest = __constant_htons(67); + b->udph.source = htons(68); + b->udph.dest = htons(67); b->udph.len = htons(sizeof(struct bootp_pkt) - sizeof(struct iphdr)); /* UDP checksum not calculated -- explicitly allowed in BOOTP RFC */ @@ -700,7 +700,7 @@ /* Chain packet down the line... */ skb->dev = dev; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); if ((dev->hard_header && dev->hard_header(skb, dev, ntohs(skb->protocol), dev->broadcast, dev->dev_addr, skb->len) < 0) || dev_queue_xmit(skb) < 0) @@ -800,13 +800,13 @@ ip_fast_csum((char *) h, h->ihl) != 0 || skb->len < ntohs(h->tot_len) || h->protocol != IPPROTO_UDP || - b->udph.source != __constant_htons(67) || - b->udph.dest != __constant_htons(68) || + b->udph.source != htons(67) || + b->udph.dest != htons(68) || ntohs(h->tot_len) < ntohs(b->udph.len) + sizeof(struct iphdr)) goto drop; /* Fragments are not supported */ - if (h->frag_off & __constant_htons(IP_OFFSET | IP_MF)) { + if (h->frag_off & htons(IP_OFFSET | IP_MF)) { printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented reply.\n"); goto drop; } Index: net/ipv4/ipip.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipip.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipip.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipip.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -483,7 +483,7 @@ skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->pkt_type = PACKET_HOST; read_lock(&ipip_lock); @@ -544,7 +544,7 @@ goto tx_error; } - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != htons(ETH_P_IP)) goto tx_error; if (tos&1) @@ -585,9 +585,9 @@ if (skb->dst && mtu < skb->dst->pmtu) skb->dst->pmtu = mtu; - df |= (old_iph->frag_off&__constant_htons(IP_DF)); + df |= (old_iph->frag_off&htons(IP_DF)); - if ((old_iph->frag_off&__constant_htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { + if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); ip_rt_put(rt); goto tx_error; @@ -703,10 +703,10 @@ err = -EINVAL; if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP || - p.iph.ihl != 5 || (p.iph.frag_off&__constant_htons(~IP_DF))) + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF))) goto done; if (p.iph.ttl) - p.iph.frag_off |= __constant_htons(IP_DF); + p.iph.frag_off |= htons(IP_DF); t = ipip_tunnel_locate(&p, cmd == SIOCADDTUNNEL); Index: net/ipv4/ipmr.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/ipmr.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/ipmr.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/ipmr.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1434,7 +1434,7 @@ skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; dst_release(skb->dst); @@ -1501,7 +1501,7 @@ skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; dst_release(skb->dst); Index: net/ipv4/route.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/route.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/route.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/route.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1246,7 +1246,7 @@ return -EINVAL; if (MULTICAST(saddr) || BADCLASS(saddr) || LOOPBACK(saddr) || - skb->protocol != __constant_htons(ETH_P_IP)) + skb->protocol != htons(ETH_P_IP)) goto e_inval; if (ZERONET(saddr)) { @@ -1457,7 +1457,7 @@ inet_addr_onlink(out_dev, saddr, FIB_RES_GW(res)))) flags |= RTCF_DOREDIRECT; - if (skb->protocol != __constant_htons(ETH_P_IP)) { + if (skb->protocol != htons(ETH_P_IP)) { /* Not IP (i.e. ARP). Do not create route, if it is * invalid for proxy arp. DNAT routes are always valid. */ @@ -1522,7 +1522,7 @@ out: return err; brd_input: - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != htons(ETH_P_IP)) goto e_inval; if (ZERONET(saddr)) @@ -2156,7 +2156,7 @@ err = -ENODEV; if (!dev) goto out; - skb->protocol = __constant_htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb->dev = dev; local_bh_disable(); err = ip_route_input(skb, dst, src, rtm->rtm_tos, dev); Index: net/ipv4/tcp_diag.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_diag.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_diag.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_diag.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -346,7 +346,7 @@ break; if (sk->family == AF_INET6 && cond->family == AF_INET) { if (addr[0] == 0 && addr[1] == 0 && - addr[2] == __constant_htonl(0xffff) && + addr[2] == htonl(0xffff) && bitstring_match(addr+3, cond->addr, cond->prefix_len)) break; } Index: net/ipv4/tcp_input.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_input.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_input.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_input.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -2083,8 +2083,8 @@ } else if (tp->tstamp_ok && th->doff == (sizeof(struct tcphdr)>>2)+(TCPOLEN_TSTAMP_ALIGNED>>2)) { __u32 *ptr = (__u32 *)(th + 1); - if (*ptr == __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { + if (*ptr == ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { tp->saw_tstamp = 1; ++ptr; tp->rcv_tsval = ntohl(*ptr); @@ -3252,8 +3252,8 @@ __u32 *ptr = (__u32 *)(th + 1); /* No? Slow path! */ - if (*ptr != __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) + if (*ptr != ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) goto slow_path; tp->saw_tstamp = 1; Index: net/ipv4/tcp_ipv4.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/tcp_ipv4.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/tcp_ipv4.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/tcp_ipv4.c 2002/10/03 22:05:55 1.1.1.1.12.1 @@ -1210,10 +1210,10 @@ arg.iov[0].iov_len = sizeof(rep.th); arg.n_iov = 1; if (ts) { - rep.tsopt[0] = __constant_htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + rep.tsopt[0] = htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); rep.tsopt[1] = htonl(tcp_time_stamp); rep.tsopt[2] = htonl(ts); arg.iov[0].iov_len = sizeof(rep); Index: net/ipv4/netfilter/ip_nat_core.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_core.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_core.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_core.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -775,7 +775,7 @@ if (helper) { /* Always defragged for helpers */ IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off - & __constant_htons(IP_MF|IP_OFFSET))); + & htons(IP_MF|IP_OFFSET))); return helper->help(ct, info, ctinfo, hooknum, pskb); } else return NF_ACCEPT; } Index: net/ipv4/netfilter/ip_nat_snmp_basic.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_snmp_basic.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_snmp_basic.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_snmp_basic.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -1259,9 +1259,9 @@ * on post routing (SNAT). */ if (!((dir == IP_CT_DIR_REPLY && hooknum == NF_IP_PRE_ROUTING && - udph->source == __constant_ntohs(SNMP_PORT)) || + udph->source == ntohs(SNMP_PORT)) || (dir == IP_CT_DIR_ORIGINAL && hooknum == NF_IP_POST_ROUTING && - udph->dest == __constant_ntohs(SNMP_TRAP_PORT)))) { + udph->dest == ntohs(SNMP_TRAP_PORT)))) { spin_unlock_bh(&snmp_lock); return NF_ACCEPT; } Index: net/ipv4/netfilter/ip_nat_standalone.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv4/netfilter/ip_nat_standalone.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv4/netfilter/ip_nat_standalone.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv4/netfilter/ip_nat_standalone.c 2002/10/03 22:13:47 1.1.1.1.12.1 @@ -60,7 +60,7 @@ /* We never see fragments: conntrack defrags on pre-routing and local-out, and ip_nat_out protects post-routing. */ IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off - & __constant_htons(IP_MF|IP_OFFSET))); + & htons(IP_MF|IP_OFFSET))); (*pskb)->nfcache |= NFC_UNKNOWN; @@ -163,7 +163,7 @@ I'm starting to have nightmares about fragments. */ - if ((*pskb)->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { + if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { *pskb = ip_ct_gather_frags(*pskb); if (!*pskb) Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 addrconf.c --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/10/03 22:16:13 @@ -172,7 +172,7 @@ if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { if (addr->s6_addr32[2] == 0) { - if (addr->in6_u.u6_addr32[3] == 0) + if (addr->s6_addr32[3] == 0) return IPV6_ADDR_ANY; if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) @@ -1187,7 +1187,7 @@ ASSERT_RTNL(); memset(&addr, 0, sizeof(struct in6_addr)); - addr.s6_addr[15] = 1; + addr.s6_addr32[3] = __constant_htonl(0x00000001); if ((idev = ipv6_find_idev(dev)) == NULL) { printk(KERN_DEBUG "init loopback: add_dev failed\n"); @@ -1234,9 +1234,7 @@ return; memset(&addr, 0, sizeof(struct in6_addr)); - - addr.s6_addr[0] = 0xFE; - addr.s6_addr[1] = 0x80; + addr.s6_addr32[0] = __contant_htonl(0xFE800000); if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) addrconf_add_linklocal(idev, &addr); Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/icmp.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/icmp.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/icmp.c 2002/09/12 09:41:58 1.1.1.1.12.1 @@ -198,7 +198,7 @@ u8 type; if (skb_copy_bits(skb, ptr+offsetof(struct icmp6hdr, icmp6_type), &type, 1) - || !(type & 0x80)) + || !(type & ICMPV6_INFOMSG_MASK)) return 1; } return 0; @@ -216,7 +216,7 @@ int res = 0; /* Informational messages are not limited. */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) return 1; /* Do not limit pmtu discovery, it would break it. */ @@ -519,22 +519,22 @@ skb_checksum(skb, 0, skb->len, 0))) { if (net_ratelimit()) printk(KERN_DEBUG "ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n", - ntohs(saddr->in6_u.u6_addr16[0]), - ntohs(saddr->in6_u.u6_addr16[1]), - ntohs(saddr->in6_u.u6_addr16[2]), - ntohs(saddr->in6_u.u6_addr16[3]), - ntohs(saddr->in6_u.u6_addr16[4]), - ntohs(saddr->in6_u.u6_addr16[5]), - ntohs(saddr->in6_u.u6_addr16[6]), - ntohs(saddr->in6_u.u6_addr16[7]), - ntohs(daddr->in6_u.u6_addr16[0]), - ntohs(daddr->in6_u.u6_addr16[1]), - ntohs(daddr->in6_u.u6_addr16[2]), - ntohs(daddr->in6_u.u6_addr16[3]), - ntohs(daddr->in6_u.u6_addr16[4]), - ntohs(daddr->in6_u.u6_addr16[5]), - ntohs(daddr->in6_u.u6_addr16[6]), - ntohs(daddr->in6_u.u6_addr16[7])); + ntohs(saddr->s6_addr16[0]), + ntohs(saddr->s6_addr16[1]), + ntohs(saddr->s6_addr16[2]), + ntohs(saddr->s6_addr16[3]), + ntohs(saddr->s6_addr16[4]), + ntohs(saddr->s6_addr16[5]), + ntohs(saddr->s6_addr16[6]), + ntohs(saddr->s6_addr16[7]), + ntohs(daddr->s6_addr16[0]), + ntohs(daddr->s6_addr16[1]), + ntohs(daddr->s6_addr16[2]), + ntohs(daddr->s6_addr16[3]), + ntohs(daddr->s6_addr16[4]), + ntohs(daddr->s6_addr16[5]), + ntohs(daddr->s6_addr16[6]), + ntohs(daddr->s6_addr16[7])); goto discard_it; } } @@ -613,7 +613,7 @@ printk(KERN_DEBUG "icmpv6: msg of unkown type\n"); /* informational */ - if (type & 0x80) + if (type & ICMPV6_INFOMSG_MASK) break; /* Index: net/ipv6/netfilter/ip6_queue.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6_queue.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.2 diff -u -r1.1.1.1 -r1.1.1.1.12.2 --- net/ipv6/netfilter/ip6_queue.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6_queue.c 2002/09/19 03:57:51 1.1.1.1.12.2 @@ -306,14 +306,8 @@ */ if (e->info->hook == NF_IP_LOCAL_OUT) { struct ipv6hdr *iph = e->skb->nh.ipv6h; - if (!( iph->daddr.in6_u.u6_addr32[0] == e->rt_info.daddr.in6_u.u6_addr32[0] - && iph->daddr.in6_u.u6_addr32[1] == e->rt_info.daddr.in6_u.u6_addr32[1] - && iph->daddr.in6_u.u6_addr32[2] == e->rt_info.daddr.in6_u.u6_addr32[2] - && iph->daddr.in6_u.u6_addr32[3] == e->rt_info.daddr.in6_u.u6_addr32[3] - && iph->saddr.in6_u.u6_addr32[0] == e->rt_info.saddr.in6_u.u6_addr32[0] - && iph->saddr.in6_u.u6_addr32[1] == e->rt_info.saddr.in6_u.u6_addr32[1] - && iph->saddr.in6_u.u6_addr32[2] == e->rt_info.saddr.in6_u.u6_addr32[2] - && iph->saddr.in6_u.u6_addr32[3] == e->rt_info.saddr.in6_u.u6_addr32[3])) + if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.daddr) || + ipv6_addr_cmp(&iph->saddr, &e->rt_info.saddr)) return route6_me_harder(e->skb); } return 0; Index: net/ipv6/netfilter/ip6t_LOG.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6t_LOG.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.12.1 diff -u -r1.1.1.1 -r1.1.1.1.12.1 --- net/ipv6/netfilter/ip6t_LOG.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/netfilter/ip6t_LOG.c 2002/10/03 22:07:26 1.1.1.1.12.1 @@ -112,7 +112,7 @@ printk("FRAG:%u ", ntohs(fhdr->frag_off) & 0xFFF8); /* Max length: 11 "INCOMPLETE " */ - if (fhdr->frag_off & __constant_htons(0x0001)) + if (fhdr->frag_off & htons(0x0001)) printk("INCOMPLETE "); printk("ID:%08x ", fhdr->identification); -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From acme@conectiva.com.br Thu Oct 3 22:10:00 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 22:10:06 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g9459wtG006662 for ; Thu, 3 Oct 2002 22:09:59 -0700 Received: from [200.181.170.125] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 17xKl0-0004dQ-00; Fri, 04 Oct 2002 02:12:10 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id BB99A1966C; Fri, 4 Oct 2002 02:09:24 -0300 (BRT) Date: Fri, 4 Oct 2002 02:09:23 -0300 From: Arnaldo Carvalho de Melo To: YOSHIFUJI Hideaki Cc: davem@redhat.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Miscellaneous clean-ups Message-ID: <20021004050923.GA2728@conectiva.com.br> Mail-Followup-To: Arnaldo Carvalho de Melo , YOSHIFUJI Hideaki , davem@redhat.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, usagi@linux-ipv6.org References: <20021004.011315.05129566.yoshfuji@linux-ipv6.org> <20021003.103617.04446177.davem@redhat.com> <20021004.073642.125593159.yoshfuji@linux-ipv6.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20021004.073642.125593159.yoshfuji@linux-ipv6.org> User-Agent: Mutt/1.4i X-Url: http://advogato.org/person/acme X-archive-position: 516 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Em Fri, Oct 04, 2002 at 07:36:42AM +0900, YOSHIFUJI Hideaki / ?$B5HF#1QL@ escreveu: > In article <20021003.103617.04446177.davem@redhat.com> (at Thu, 03 Oct 2002 10:36:17 -0700 (PDT)), "David S. Miller" says: > > > - addr.s6_addr[15] = 1; > > + addr.s6_addr32[3] = __constant_htonl(0x00000001); > > > > Do not use __constant_htonl() in runtime code, use htonl(). > > Arnaldo de Melo told you this the other day for another one > > of your patches, so you must fix this kind of stuff up before > > I'll apply any of your patches which have this problem. > > I saw many __constant_{hton,ntoh}{s,l}()s, so fixed. > > 1. use s6_addrXX instead of in6_u.s6_addrXX. > 2. avoid using magic number. > 3. use 32bit constants. > --> 4. avoid __constant_{hton,ntoh}{l,s}() in runtime code. Thank you, some still were left, but that is not a problem, we can go on fixing it, as long as we don't introduce new instances, its OK. > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v > retrieving revision 1.1.1.1 > diff -u -r1.1.1.1 addrconf.c > --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/addrconf.c 2002/10/03 22:16:13 > @@ -172,7 +172,7 @@ > > if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { > if (addr->s6_addr32[2] == 0) { > - if (addr->in6_u.u6_addr32[3] == 0) > + if (addr->s6_addr32[3] == 0) > return IPV6_ADDR_ANY; > > if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) ^^^^^^^^^^^ ^^^^^^^^^^^ not needed as well. > Index: net/ipv6/icmp.c > =================================================================== > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/icmp.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.12.1 > diff -u -r1.1.1.1 -r1.1.1.1.12.1 > --- net/ipv6/icmp.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/icmp.c 2002/09/12 09:41:58 1.1.1.1.12.1 > @@ -198,7 +198,7 @@ > u8 type; > if (skb_copy_bits(skb, ptr+offsetof(struct icmp6hdr, icmp6_type), > &type, 1) > - || !(type & 0x80)) > + || !(type & ICMPV6_INFOMSG_MASK)) nice, no magic numbers. > RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/netfilter/ip6_queue.c,v > retrieving revision 1.1.1.1 > retrieving revision 1.1.1.1.12.2 > diff -u -r1.1.1.1 -r1.1.1.1.12.2 > --- net/ipv6/netfilter/ip6_queue.c 2002/08/20 09:47:02 1.1.1.1 > +++ net/ipv6/netfilter/ip6_queue.c 2002/09/19 03:57:51 1.1.1.1.12.2 > @@ -306,14 +306,8 @@ > */ > if (e->info->hook == NF_IP_LOCAL_OUT) { > struct ipv6hdr *iph = e->skb->nh.ipv6h; > - if (!( iph->daddr.in6_u.u6_addr32[0] == e->rt_info.daddr.in6_u.u6_addr32[0] > - && iph->daddr.in6_u.u6_addr32[1] == e->rt_info.daddr.in6_u.u6_addr32[1] > - && iph->daddr.in6_u.u6_addr32[2] == e->rt_info.daddr.in6_u.u6_addr32[2] > - && iph->daddr.in6_u.u6_addr32[3] == e->rt_info.daddr.in6_u.u6_addr32[3] > - && iph->saddr.in6_u.u6_addr32[0] == e->rt_info.saddr.in6_u.u6_addr32[0] > - && iph->saddr.in6_u.u6_addr32[1] == e->rt_info.saddr.in6_u.u6_addr32[1] > - && iph->saddr.in6_u.u6_addr32[2] == e->rt_info.saddr.in6_u.u6_addr32[2] > - && iph->saddr.in6_u.u6_addr32[3] == e->rt_info.saddr.in6_u.u6_addr32[3])) > + if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.daddr) || > + ipv6_addr_cmp(&iph->saddr, &e->rt_info.saddr)) Cool, thank you. - Arnaldo From rtos@vsnl.net Thu Oct 3 23:04:35 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 23:04:39 -0700 (PDT) Received: from smtp02.vsnl.net (smtp02.vsnl.net [203.197.12.8]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g9464WtG007335 for ; Thu, 3 Oct 2002 23:04:34 -0700 Message-Id: <200210040604.g9464WtG007335@oss.sgi.com> Received: from JHELUM ([203.197.12.8]) by smtp02.vsnl.net (Netscape Messaging Server 4.15) with SMTP id H3G0VE00.MMO for ; Fri, 4 Oct 2002 11:34:26 +0530 Received: from ([203.197.191.165]) by smtp02.vsnl.net (InterScan E-Mail VirusWall Unix); Fri, 04 Oct 2002 11:34:26 +0530 (IST) Date: Fri, 04 Oct 2002 11:38:00 +0530 From: "Jeff" To: "Dear Sir/Madam" Subject: MPEG4 over DSP Solutions MIME-Version: 1.0 Content-type: text/plain X-Mailer: FletMail 1.103 X-archive-position: 517 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rtos@vsnl.net Precedence: bulk X-list: netdev MPEG4 over DSP Solutions for your organization Hello, I am Jeff, Executive-Business Development for Real Time Embedded Systems and Digital Signal Processing solutions,India. We specialize in Real Time Embedded Systems and Digital Signal Processing. We provide software solutions in Digital Audio and Video to Consumer Electronics and Telecom segments.We have designed and developed several software Intellectual Properties on MPEG 1, 2, 4(Compression standard for Audio and Video), which are available for licensing. In order to provide an end-to-end solution in Audio and Video streaming, we have developed SIP and RTP stack which could be integrated along with the Codecs to realize complete Multi Media Messaging System. Our products and services will find immediate application with: OEM's, Semiconductor companies, Cellular phones, PDA's, Internet Appliances, PVR's, Audio/Video conferencing equipments, surveillance equipments, digital head end equipment manufacturers, Audio/Video Broadcasters, Post production companies, HDTV's and interactive televisions, Video Kiosks etc. Our offerings include: Software Products * MPEG4 Video Decoder ( Simple Profile) * MPEG4 Video Encoder * MPEG2 Video Decoder * MP3 Decoder * SIP Stack * RTP Stack * ISDN Stack Services * Porting Audio/Video and speech codecs to DSPs -Digital Video: MPEG4, MPEG2, JPEG, H.26X -Digital Audio: MP3, AAC * Specifying, implementing and testing DSP applications * Development of DSP-based software solutions * Building reference designs for Security surveillance, Consumer Electronics and Telecom segments I would be glad to discuss any business opportunity with you, which could be of mutual benefit to us. Looking forward to hear from you Thanking You Best Regards, Jeff. S Executive-Business Development San Francisco ... New Jersey ... Bangalore ---------------------------------------------------- If you don't want to recive any more mails more from us, mail us back as "Unsubscribe Me" in the subject line From pekkas@netcore.fi Thu Oct 3 23:32:47 2002 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Oct 2002 23:32:52 -0700 (PDT) Received: from netcore.fi (netcore.fi [193.94.160.1]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g946WjtG007914 for ; Thu, 3 Oct 2002 23:32:46 -0700 Received: from localhost (pekkas@localhost) by netcore.fi (8.11.6/8.11.6) with ESMTP id g946WXJ16455; Fri, 4 Oct 2002 09:32:36 +0300 Date: Fri, 4 Oct 2002 09:32:33 +0300 (EEST) From: Pekka Savola To: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= cc: netdev@oss.sgi.com, Subject: Re: [PATCH] IPv6: Improvement of Source Address Selection In-Reply-To: <20021004.015045.96199793.yoshfuji@linux-ipv6.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 518 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pekkas@netcore.fi Precedence: bulk X-list: netdev There seems to be __constant_htonl there too but this is just a nit, and shouldn't a showstopper in the review. A few comments, mainly on the spec perspective below. Are IPv4 addresses represented as mapped addresses (as they should by the spec at least)? There seem to be some points at section 4 of the draft (e.g. for multicast destinations, MUST only pick addresses on the outgoing interface) that may be missing? > +#ifndef IPV6_ADDR_MC_SCOPE > +#define IPV6_ADDR_MC_SCOPE(a) \ > + ((a)->s6_addr[1] & 0x0f) /* XXX nonstandard */ > +#define __IPV6_ADDR_SCOPE_RESERVED -2 > +#define __IPV6_ADDR_SCOPE_ANY -1 > +#define IPV6_ADDR_SCOPE_NODELOCAL 0x01 > +#define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 > +#define IPV6_ADDR_SCOPE_SITELOCAL 0x05 > +#define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 > +#define IPV6_ADDR_SCOPE_GLOBAL 0x0e > +#endif Aren't these definitions header file material, perhaps (I'd guess they might be useful in other .c files too). > +int ipv6_addrselect_scope(const struct in6_addr *addr) > +{ > + u32 st; > + > + st = addr->s6_addr32[0]; > + > + if ((st & __constant_htonl(0xE0000000)) != __constant_htonl(0x00000000) && > + (st & __constant_htonl(0xE0000000)) != __constant_htonl(0xE0000000)) > + return IPV6_ADDR_SCOPE_GLOBAL; > + > + if ((st & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000)) > + return IPV6_ADDR_MC_SCOPE(addr); > + > + if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFE800000)) > + return IPV6_ADDR_SCOPE_LINKLOCAL; > + > + if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFEC00000)) > + return IPV6_ADDR_SCOPE_SITELOCAL; Something similar to this is done in addrconf.c:ipv6_addr_type, could there be more reuse? > + if ((st | addr->s6_addr32[1]) == 0) { > + if (addr->s6_addr32[2] == 0) { > + if (addr->s6_addr32[3] == 0) > + return __IPV6_ADDR_SCOPE_ANY; > + > + if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) > + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.4 */ > + > + return IPV6_ADDR_SCOPE_GLOBAL; /* section 2.3 */ > + } You're referring to sections 3.4 and 3.3, I think (similar in other comments) > + if (addr->s6_addr32[2] == __constant_htonl(0x0000FFFF)) { > + if (addr->s6_addr32[3] == __constant_htonl(0xA9FF0000)) > + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.2 */ Shouldn't that be 0xA9FE0000 if you mean IPv4 zeroconf 169.254.0.0/16 ? (that could be spelt out in a comment.) > + if (addr->s6_addr32[3] == __constant_htonl(0xAC000000)) { > + if (addr->s6_addr32[3] == __constant_htonl(0xAC100000)) > + return IPV6_ADDR_SCOPE_SITELOCAL; /* section 2.2 */ 172.16.00 -- 172.31.255.255, not just 172.16.*.* > + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.2 */ > + } I don't understand this, this was possibly supposed to be the case for 127.0.0.0/8 which should be treated as link-local? -- Pekka Savola "Tell me of difficulties surmounted, Netcore Oy not those you stumble over and fall" Systems. Networks. Security. -- Robert Jordan: A Crown of Swords From Antigen@hdi.tvcabo.sgi.com Fri Oct 4 02:35:30 2002 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Oct 2002 02:35:31 -0700 (PDT) Received: from smtp.netcabo.pt (smtp.netcabo.pt [212.113.174.9]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g949ZTtG001629 for ; Fri, 4 Oct 2002 02:35:29 -0700 Received: from mail pickup service by smtp.netcabo.pt with Microsoft SMTPSVC; Fri, 4 Oct 2002 10:30:57 +0100 From: Antigen@oss.sgi.com To: netdev@oss.sgi.com Subject: Antigen found VIRUS= Exploit.IFrame.FileDownload (Kaspersky,CA(Vet)) virus Message-ID: X-OriginalArrivalTime: 04 Oct 2002 09:30:57.0343 (UTC) FILETIME=[BE5F34F0:01C26B88] Date: 4 Oct 2002 10:30:57 +0100 X-archive-position: 519 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Antigen@oss.sgi.com Precedence: bulk X-list: netdev Antigen for Exchange found Unknown infected with VIRUS= Exploit.IFrame.FileDownload (Kaspersky,CA(Vet)) virus. The file is currently Removed. The message, "Person obsessed with stretching", was sent from netdev From jmorris@intercode.com.au Fri Oct 4 08:06:22 2002 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Oct 2002 08:06:25 -0700 (PDT) Received: from blackbird.intercode.com.au (blackbird.intercode.com.au [203.32.101.10]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g94F6JtG023343 for ; Fri, 4 Oct 2002 08:06:21 -0700 Received: from localhost (jmorris@localhost) by blackbird.intercode.com.au (8.9.3/8.9.3) with ESMTP id BAA21287; Sat, 5 Oct 2002 01:06:12 +1000 Date: Sat, 5 Oct 2002 01:06:12 +1000 (EST) From: James Morris To: Martin Pool cc: netdev@oss.sgi.com Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 520 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@intercode.com.au Precedence: bulk X-list: netdev Martin, I'm not able to reproduce the bug exactly as described. What kind of network connection were you using between the boxes, and what was the kernel version at the server end? (I've been testing between two boxes on a 10Mbps lan, with 2.2.22 at the client side and both 2.2.20 and 2.4.19 kernels at the server side). I'm seeing what looks like some quite buggy behaviour (which needs further analysis), but no long term FIN_WAIT1 states. - James -- James Morris From mbp@sourcefrog.net Fri Oct 4 16:25:57 2002 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Oct 2002 16:26:02 -0700 (PDT) Received: from wistful.dyndns.org (CPE-203-51-31-169.nsw.bigpond.net.au [203.51.31.169]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g94NPttG012146 for ; Fri, 4 Oct 2002 16:25:56 -0700 Received: from mbp by wistful.dyndns.org with local (Exim 3.35 #1 (Debian)) id 17xbqm-0005zU-00; Sat, 05 Oct 2002 09:27:16 +1000 Date: Sat, 5 Oct 2002 09:27:16 +1000 From: Martin Pool To: James Morris Cc: netdev@oss.sgi.com Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case Message-ID: <20021004232715.GC3030@sourcefrog.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4i X-GPG: 1024D/A0B3E88B: AFAC578F 1841EE6B FD95E143 3C63CA3F A0B3E88B X-archive-position: 521 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mbp@samba.org Precedence: bulk X-list: netdev On 5 Oct 2002, James Morris wrote: > Martin, > > I'm not able to reproduce the bug exactly as described. What kind of > network connection were you using between the boxes, and what was the > kernel version at the server end? I was using VMware over 100Mbps to a 2.4.19 server. I am pretty sure it could also be reproduced over localhost TCP just in 2.2.21 inside VMware. I don't remember the exact hardware; I can let you know later. It seems to not happen every time, but at least one time in three. -- Martin From Antigen@hdi.tvcabo.sgi.com Fri Oct 4 17:14:15 2002 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Oct 2002 17:14:18 -0700 (PDT) Received: from smtp.netcabo.pt (smtp.netcabo.pt [212.113.174.9]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g950EEtG016489 for ; Fri, 4 Oct 2002 17:14:14 -0700 Received: from mail pickup service by smtp.netcabo.pt with Microsoft SMTPSVC; Sat, 5 Oct 2002 01:11:49 +0100 From: Antigen@oss.sgi.com To: netdev@oss.sgi.com Subject: Antigen found VIRUS= Exploit.IFrame.FileDownload (Kaspersky) virus Message-ID: X-OriginalArrivalTime: 05 Oct 2002 00:11:49.0630 (UTC) FILETIME=[CCCA31E0:01C26C03] Date: 5 Oct 2002 01:11:49 +0100 X-archive-position: 522 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Antigen@oss.sgi.com Precedence: bulk X-list: netdev Antigen for Exchange found Unknown infected with VIRUS= Exploit.IFrame.FileDownload (Kaspersky) virus. The file is currently Removed. The message, "Congratulations", was sent from netdev From davem@redhat.com Fri Oct 4 17:51:59 2002 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Oct 2002 17:52:04 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g950pwtG017086 for ; Fri, 4 Oct 2002 17:51:59 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id RAA15241; Fri, 4 Oct 2002 17:44:23 -0700 Date: Fri, 04 Oct 2002 17:44:22 -0700 (PDT) Message-Id: <20021004.174422.88502153.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Miscellaneous clean-ups From: "David S. Miller" In-Reply-To: <20021004.081525.51826759.yoshfuji@linux-ipv6.org> References: <20021004.073925.101556969.yoshfuji@linux-ipv6.org> <20021004.075416.20775355.yoshfuji@linux-ipv6.org> <20021004.081525.51826759.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 523 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Fri, 04 Oct 2002 08:15:25 +0900 (JST) so sorry... it must be a bad day for me today and i should not do anything today... removed duplicate chunks. confirmed to be applied with linux-2.4.19. Patch applied, thanks. From info@vertebrae.co.za Fri Oct 4 21:16:06 2002 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Oct 2002 21:16:16 -0700 (PDT) Received: from mail.avocadosa.co.za ([196.41.208.90]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g954FHtG021541; Fri, 4 Oct 2002 21:15:23 -0700 Received: from jan (jan [10.0.0.204]) by mail.avocadosa.co.za (8.11.6/8.11.6) with ESMTP id g94DiW702514; Fri, 4 Oct 2002 15:44:35 +0200 Message-Id: <200210041344.g94DiW702514@mail.avocadosa.co.za> From: info@vertebrae.co.za Subject: Vertebrae InterComms Date: Fri, 4 Oct 2002 17:56:38 +0200 X-Priority: 3 X-Library: Indy 9.0.3-B Content-Type: multipart/related; boundary="----=_NextPart_000_0010_01C268B3.2EF184D0"; type="text/html" X-Mailer: InterComms X-archive-position: 524 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: info@vertebrae.co.za Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: file://D:\InternetDev\Vertebrae\InterComms\TMPdpbc939gel.htm Vertebrae InterComms ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/Images/InterComms-Mailshot---Top.gif R0lGODlhVwJ3APcAAKu7xNPX2Imcpqm2vOTk5GyFkejt8dDQ0MHJzlt4hX2SnZWmrq25vsnJyWeC jrrBxcTExISZo8bO0o2gqd3h48jN0OTo6pmqsdbY2IueqICVoGF9itbb3e7w89zl6nGJlc7OzszX 3HaNmJ2ttMrR1MXT3OTm6NHV1rK6vvP2+L/IzbTFzZCiqqKxuL3Fydre4M3Q0aCutOrs7dnc3oaa pMPKzaKwtrXAxniOmeHk5nmQmrW9wZKkrfL09bnDyLK+xaW0usHGyKW1vMvQ08vLy3qRnIGUnsnM zZGjrKWyuH6Uns3S1bC8wrjCyHSMl8XMz9jb3MXIyeDj5NLZ3cPM0ejq652qsYKYovn6+9TW1pao sJemrpqoruTm53SKltDT1M7U19bb3rS/xOHi4tTV1tHX2r3HzPb4+K+6v9ja2+nr7J2ss9DS08HH ytze38jLzKmyt9fd4Ozu7/Dy82+IlJWkq9fZ2szO0MHLz8fQ1NHR0ejp6nyQm9/h4pmqs3+VoG+H k/L09JustJWnsIebpZaorvX296CwuPT19uvt7rrGy5OiqnKLlre/wvr7/HePmlRygUV0ltTU1ODg 4Onp6dfX193d3fv7++zs7Nra2vLy8uPj4+bm5vX19erq6uHh4dnZ2ejo6P39/e/v79bW1uvr69PT 09XV1aO3wvHx8d7e3tvb2/j4+O3t7efn5/n5+dLS0vDw8OLi4vPz8/z8/PT09NjY2Nzc3Pr6+vf3 99/f3+7u7qK6y/b29nSXsNDc5VF9nbrJ0bnL1/Dw8WiOqlyFo9Hb4Yuovq3C0err69rb3Nra25ex xOXl5cDO1X+gt/39/q/Aytjf5Ojp6dTV1dLT0+7v7/7+/uLj49jZ2ebm5+zt7ezs7fz8/ebn6N7f 4J+vt9fY2dXX2PT09dzd3fLz8/Ly89/g4fr6++fo6dvd3tPU1fHx8penr/j5+vv8/Onq683Nzc/X 26Grr9XW1+Dh4Zqrstvc3fz9/fT19eLi4/b298fP08vT15SkrP///yH5BAEAAP8ALAAAAABXAncA AAj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX MGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0KVAPvzwQTPHrVwqnWLNq3cp1pDBeYMMK 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 HduzXds/PCAAADs= ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/Images/BoneBullet.gif R0lGODlhIwAYAMQaAPHx8cHBwdTU1PT09M3Nzc7OzsTExMXFxd3d3cDAwOfn5/Ly8r+/v+jo6Gtr a4aGhsjIyMnJyZOTk66urnh4eNbW1qGhoeTk5Lu7u////////wAAAAAAAAAAAAAAAAAAACH5BAEA ABoALAAAAAAjABgAAAX/oCaO5Fgcw1CubEsKAjY1bm0jwHUhie2vhUzuIjCkfshA5oKpWCQMFbKW 0mEikywkwWAcCkgIREAQEzDox8MyeUZkGLIBVTNk7peKrhKRUChrE2iDaBECPS4BCngVTn+AEhYW hISGAgE1ARARTI9/ag4YTJSDh5loFZ4PEhIPExkVgqQYEC4EC0MPf5GsEpxOgm2yEYgrAgoXd7AR b6gRenlZbZEXCgcsAsp3AE0XAHiE3hdYgtUsBNo6FxYAChALy06SE886AAAEKxDK3E+rCCoGINCD QZLBSJwuYCKhRFkbgwGkaCBwr9WqXhIaNWLILwKbCRAivriny1OkRgpoTIgIouyEAQNb9Akp2OrR g2cLRiDQtlBDATAsKhggcKagGgpNBIhoECBChgXFkFQIADPShAsLgAbIgsDAlBUDxRyoYEJMra9f r6FFEgIAOw== ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/Images/Testimonial-1.gif R0lGODlh3AAEAff/AK3BzZmzzHGKmoGaqPMsK4Caq/n7/HiSnmF6jOtJR6a8zdnj7JCqvcfV42mC klFrgFlyiElieMiWmjpTaoiisomiriE7VLXH2jBKYElidnGKnIGar2F7isq3tJy1zFpzhZCqtEFa cClDWrDEzWF6jrbIzVFrfomit6m/zYGapsLBwVpzh3GKmGiCmFlyg6C4zJ62zJu0zFJrfypDWuXr 8pGqvrvM3aW70rnLzuxiW3iSqTlSaqS7zDFKYkFbcMzZ5piyuDFLYiE6U0FbbnGKneY9QImirL3N zrPGzUljd2mCkKO6zMLRzu7y94mjuIGasFFqfJGqst93dFl0iazB1VJrfUljeGF7kImjqpGqwNeC gUJccZu0y7bJ23CKlqG40Jy1yzlTZ5myx5myw5iyx5iyxZmyv5myxZiyypmyvZmyvpiyyZmyxJmz vpiyxpiyyJiywJmywjlTaZmywZmzvZiyxDpTaZmywJiywZmzxcHR4JiyvFlzhZiywnmSoVlzhnmS pZiyvZmzv3iSopmzwnmSopmyvHmSppmyuzlTaJmzuzlSaXmSo3mTojpSaXiSo3mTpoGarVpziCpD WzlSaHmSpHiSpP8AAHiSoZCqu1lziHmTn4GarGmClWmClIGbq3iSoFlyhpGruXiToWiClpGruImi r3iTo1lyh1lzg3mTpZCqumiClWmDlnmSp1p0h4iisYmitHmSoJiyunmTo4iitIiitZiyu5GrvFly hTlUaJGqtmiDlomisllyhJGqukFbcomjr5GquZGqt4iisJCqt5CquGmClomitUlkeZGqu522zJmz uomjtZCqtpGrt4mjtKK5zHmTpJGquMDPzkpjemiCl0ljdmiDl2mDlZmyufwODWmCl2mDk5GrtTpT aDlTa7vMzkljeXiSp3mTqIGbrjJMYZqzzLaos7a4wfcaGniToLWXppmzy5mzyNKtqFlzieOqnOpw aJ+3zM/cz8fFwsrXzkpjdZmyxhozTZmyyJmyyZmyy5myypmyzP///yH5BAEAAP8ALAAAAADcAAQB AAj/AP8JHPjPwIIFDfQoXMiwocOHECNKnEixosWLGDNq3PjwoAGCIEE26RLDn8mTKFOqXMmypcuX MGPKnEmzps2bMS/QCAnyB86fQIMKHUq0KE4bH3naQBkgwLmnTaM6hRrAqNWrWLNqXUklKUGfJp16 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 zMYK3AQ/cAENHMfkBANU0ABrzMYBAQA7 ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/InterComms/Images/InterCommsOnTheWeb.gif R0lGODlhmAAjAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAANcALAAAAACYACMA QAj+AK8JvDanoMGBCBMSnKOwocOE0EoZLMXqocWLGDNq3MixIEKPA0Eu/GiwJEiRAiVaRClQJMqX DFvGlEkSYUSD0DjqTKiup8+fQIMKHUq0qNGjSJMqXbp0p9OnTgEASCgVKk8A5Qaik3puoDkA6TBW tUr24jmp6gSq4ypwbNupD9kOdHtt7FlvYQemE2dxrTe4bcEBSHvtbl6Be98SVie460OYJisuNHmN lck5pUJiLqnSokSTmTWb9BRZdEnSJSVbvlx2J+uRmhGuxjzw8xxPkmErvFmwVM6BvH0nhFmTZuzj 12xTbM28ufPn0KNLfyiYsFoA4N4ipKuQO92xgrv+e3u4tuvWtuYHXwtPdXxdwG3dO2S5ciZUiZ4g 5p/OPzpx5Ch19tF+LNGHkIAhhabbgi7Z919Bv/WH0X/GLRQhNLcpFBp9pO0HXGYYOjhHhBTqViJI ClYo4YostrgiUzDGKOOMNNZ4lIsSegefVX9RtSMA8sW1I44YCSbVkdm9daRU5gi55FRPMjlQOVEm 6RB7daFzXmACUfmklVFyR+R2Q4713ZBk+pjme2GiOZA4UKIj0HneJNmmmT+6OWZhRoLjmHZz6dnl kXydiZA64xzpTTnWOZSonFoBwNehiUq1KGFc/QVAk49RNqF9911m4J6kIjfSarmJWptBuY0EDWr/ GHroUHAR0vRZaJ+16tGtKRXUKm+07QlTaLGaSlCKEklWkKyjChQiSSQGGyKxDVIr7UmgpujiiTNB puqC4A4HqokiFsdguTJh1iqR3JqKoEIsFevQu8eaSmG7DTU73WsUzuaRvyWpaJqntk1k7rn2oiuq tqU27PDDEEdcKpx3VmzxxRhnrPHGHHeccTgShyzyyFCJ6bDJJJelI3NUQqqYXliJJejD5/T553vX eJmVk0virHNCex25c1zyjWP0pOsBFrRUQ/sslZU0o3UdAI5JNY5Ad1mk49WFAYkYdtYlymlDX2Ha VlprNZkO2AOJ/dbQgjVdqph4runQyoEqGabWQXwZLdA4fcNVMaB5P1zdodgRjrOQahaO5UZnrb1d 2gI93h18a0HdsJFLggkfyoP2bGjoUV5kNUKVIuRl6Wx2nlBAADs= ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/InterComms/Images/DistributionOpportunities.gif R0lGODlhmAAoAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAANcALAAAAACYACgA QAj+AK8JHEiwoMGDCBManDNHocOHECNKnPiQ4UGL1zBmZFiKFUGNAkGGbDiyIEaQKEkOPKlyJcmU FGPKnEmzps2bOHNGBMCzJ0+dMX/qFHqNqECjQGmeAwDOIDgA6I4CIKiOqVSqVq89VYe1KdKiUwka HRv2qlmwBYU+jVi1rMmWAj2p1AitFMM5pUbetWgRmtyGGi2y4vixZeC9fFvW5Qit8LXBczwmrYn4 bl6Xevdehnx348K5lS8/rtySc+KBdhGLhjm5tevXsGO3/mqWZ7mBT2+D1a0VgO6lALhea3sOrLd0 Yt2iHUiWnMCl3piXRSo0HVPh18gBMAcWezpxshX+0j4bvrxN0ngdOxSJ8DBNkezNA43PsiTBy/Dn eHrrUvI1u5KxZh9m10CTUmMbXWbgfvIpxJ5cBH424IQDwoefYRjy9x9cGV2oXoMghiiiTuL4ZOKJ KKao4oostujiizDGKGNP4Yxo440gopMVQU9FhVY5PDUl3TVA7jjQOU8xVdxV53ij4nLk/VQkb8uh COU13/VE5Tkl8kQOcrMpN+SVVSon1Fc/oWmmW2QlNyaZZz5pHU/imIOdaykmZ6KQYO3J44lCflVk T9eYY+WbUBI1aJplLepTnz45N+J4ZOKII2KeiBZhQvFJSOFE+Vl6E0gGpgcqhxWhGlGnolKGqqn/ GJnWGWkJ7uVZZrZOeBhit26omkuI+Xfpqy8Vi6CGm1YIl366ZqieXQt5mKyN9Ekr0GIMIRgqstsK 2Kt97NU37YikEmafprdm+2GEINmFoFwIplbYsbeWOm+zrWKKbq+p4SUsZ3mFC5pfDAk7WmTfHpwe qamVQq+3rUYssXnqVGzxxRhnrPHGHHfs8ccghyzyyCSXbPLJKKes8soXT+zyyzGZ4yQA3nA3qZg1 EUUdzjcGKZw6SYpI6U1Di1rinQJVBR6kj0p14p9+gpXkk21KZ6LNZZoIpaNZGfp0mAjFmVZ0cJK9 VVeV7uwmojpPt6ZAa40Nlo+xHW2Q0uSVmVZYcWqm/TbbbLqNaNaHXsNlT3RP5nPSQUv1M09L8vQ4 AEsCN3lxai4pkJNLahf42olSvjZ0YAr03TXilN5WbDLzVPPerW+XXOxYH5kkOJrTNujSU15Z9ZW7 X6mO5zSXw9XwPYFTe4iUFg3z8xA1zzP0kwUEADs= ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/InterComms/Images/ImplementationOpportunities.gif R0lGODlhmAAoAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAANcALAAAAACYACgA QAj+AK8JHEiwoMGDCAnOmZOwocOHECNKnDhxYUGLAzEKxKhxI8NrHBeKHJnxo0eFH0eqZNixpUmP K0teTPnyJMiXHSlKzKmzp8+fQIMGBUC0KFGhP48iFaj0WlOmAJZKPQcAnEFwANBBJaiu6taBXa1e w6qOq9enXwc+XRtVbVunb9EqxRqx69uDOS2WWlhK4N45rGSy4ouy4F/AM6/97at4YWDDIh/fvDYY cUmVig8zhkmyI7TF0ApXlpwwps3Tk2+q3KyxsunUqFuvtOiSoOuF0GabvM3S5GGRrHHWlEq8uPHj yAuidQu13ECszuFGHwsgOlUAZa/ZPQfXWzqCcu/+sh0nkKo35mm/pqua/do4AObgtk8nLjnE5ejt 6zf+WirP/Q/9V1pNAvpH4ByM5YagQAp6JNlej2m04EAQlpQgYdc0uNFmjQWGYW6eFNaQhAcy6FJo N10YYoAlyuRiXoxhtJdDtbk4I0I1xtYibDbdqFCMwu1XIIBEAiiOUUgmqeSSTDbp5JNQRinllFQW FU6RWGappU7oeFUQVlrBdU05RIm1FZleEnQOVlVxt9U53jApZn5iojndnErOKRB9Rd15zpFEjfPd cfjheZehyrW13FGLHsoWeOLFJWmiUC15zXpEiWNOe8hZ6haSZippJnWgpicQmkVdY06edDbVFKr/ jL4Fq1FwIUnelqZCiuuuLJJU3JC4ApuYiMkJ65OxWSKLGpF5reSJShHO5iJlK3E427MjScbbhLNJ Ju1sKH7rW7WXZQtRs8SmlteKMg43x4o81uhjRiHmyCODpfw2bY/uApnugMPquGxInL1mb0i6xRsk hROehu696i5M444K6xjuRyAaFFy6GGVsWMUloXiTyJWFLKKGHl38r0EGSxwxK9iSltNhnsjs8swi 1SywbcBluJDOHbnWl2egcTwcf0fzqvRP6jTt9NNQRy21OgtNbfXVWGet9dZcd+3112CHLfbYZJfN 6dJop42cOXEC4E18uxbqk6uOHop2mdmpwyauu3IL1XfaR56tHQD11Yrkp4c/l6RYZTqp5+NKwm3o 4a8uLtCqSXZq91dynfe4U56TZZZVjVLaaqT5hScQXcqdR1SY+gVuUFeFq/65UqWXruvpu+tpe5MD /VkU7MbhLZDedOdNlJtEKQ+Am9c5z12jbgoUp5vvoZ66pNXPad6ge9YnDvh26cc2UW8nej58kK4v efBsglM9fqgWbifk2j9e/+PqZO92OWXpX1HA8b4tye1vaksgUg64OQUCKCAAOw== ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/InterComms/Images/DevelopmentOpportunities.gif R0lGODlhmAAoAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAANcALAAAAACYACgA QAj+AK8JHEiwoMGDCBMSnDNHocOHECNKnBiR4UGLDDNqbDhwDrRr0Dhu3CjQ4jWTC0Vy7LgS5cmV L0uOzBiTZUqKOHPq3HmTp8+fQHUCGEp0aNCcRo8mvbZUYNOjPM8BAGcQHAB0TgEQVDc169au16yq +0r1KVOtBJuqReu17dmCSa1G5Mq2oEuBnmBeK5WRFUG+dksN5MvQr82B0AiX+miTFUPBNxULJGz4 b9/GhVOShGp3JmSBjmcWzPv5WuiRMgeP/Oy5Z+rDpmc2dOny9F3OuHPr3s17otm2Q8sNtCr8bPGw AIpLBTD2Gt1zZ72lS1v37cC14wRK9Xad7dOk6ab+Nr82DoC5s+PTievt8Ldb9vCByi6t+3b8nfZz 2zc5pzTfynN4MlBeJfk3h2EmhQQTQ4xlNtmBLEGmoIQo9WeZX48JFJKAsPV2G4F76XWQYycZBlhC Jp24EGR3WfjaizWpaBBtC4p4340V2YgjfOIU5eOPQAYp5JBEFmnkkUgmqSRR4ezo5JNQGoQOWARZ hdVb5QxFVXfXZEnlQOdYNRV0Xp3jjZDWvWeUl8dZB2Sa16hHVJvn9DjUONPl5l5S36HV53temfUn l4S6tdSgQ8ZJlDjmjKdbkNT5uOVZklb545ZmeUnUNea8WWiaS2lqVKiQApkdlO7BGeWqmjHkCX3/ u+XHKoo64ubShB7WOutFukK1H2S2ZaghhKB5FNtGrK1EmEbJosbSRnlpVFmwLs4EoLP12WiRjCVx GGJHgnF7EocpilitXgF2SOODMwq4boe8/fqSbCt+O69oNd3GH7ot1diTbBj5C2+sMOEKUroF0dff ShsaxCJHCqbUYI2M1QRjggj/ZfHGDMIHLawPuloZYsYmnJEn1xKU2GMVv8RKtCNzLLBqIl+s12kg 7xqfrDoDpc7PQAct9NBEF2300UczhPTSTDft9NNQRy311FRXbfXTPWet9U/mnAmAN+ehWp1Ph1aX qtjgNKeOmE+eTfbYWvfoqEBcrUepj939aGmlqmeJieZakRYVtpt6k8p3p3rrCTfhcHGn6tcCiUWW qo/XBXihZcOFllyNn3Vlb3IbVDegfJrt59ijom46daxj7t3qdyd+TZ1EfY6blmqznZXaQ5E5FO8A kLkc8NAJGjxBZ5JZnuXMu05mW9vlKZB614gjPV29dT0U2Jprbx513g8OppjgPP+bpnazCeflcKIP pzrLf13OWPATBY74Tqbq9tb8U6T/4v3TTUAAADs= ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/InterComms/Images/DownloadInterComms.gif R0lGODlhmAAkAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAANcALAAAAACYACQA QAj+AK8JHEiwoMGDCBMmnDNHoUOFDB9KnEhRYkSDES8S1OjJ0zVWpa6VYiXSo0CN1zReRHmyYUqG MFe6HMiyos2bOHPq3Mmzp8+fNgEIHSpRqE9wQ5MCAMq0KUWjA6EKlCr1GlKFVa+hA+AtIVJ1BNUB ABd1aVmCVM1OVXstq0CxbDfOHOhpLrRSDEtBI1h340aTEVkxJEnTLt45egmWOozYIDSGngTPdUq5 Zcy8ii83zkz42mOTLeUWHsgYZkjPmlWmrsy6tevXsGNjZSt0nMBzXM8OTDcWrMBxAMyt9ZZON0Lc AHzDPVdWnMCtAJxrTSsdenWoQn1fSycdY+rTsmv++hQvW6f4iI/nMtx7kn1Hl48Ln/48GrX6Oey9 C0wvuvzPmn2JNFlK4KVkYHv39feSQHhhFBJLFwVYn38UVmhhheIopeGGHHbo4YcghijiiCSWuGE4 F6ao4ooGVWVUOUKVU5ZSAnE3lIxnneONUFt1pdA5SI3FHFrJAQeAbeoYieNaSdZ2TZMALHnNORnW VlyFLtKmVpYcrlWQW0S2uKWWYXppXFtm8SaUOOZoV56GZsYJY1LXzAknmgd1KFCQSZF1ZpZ/komm UrYddJknBYY34HiLsugQSukl6hp5PFHqKELnnVYaZgIJNpBg4M1BWGqdabTpZi9dlt+pjV6K6aL/ ETVYEKqbNeSSp6FNeJGsG4F3V2kMTmapq7PC+uCAGnmaWHyiTrhgrjXFiuqzELZKbLEERbofSuv9 BV4pEj6b67P8FbZXt51eBOqnw15rGWSSenZYYgXhSlNn4ooL6bz52RdZvoeR1K67BBfsmjoIJ6zw wgw37PDDEEcs8cQUV2zxxRhnrPHGHHfsscIGhyxyUTQ+BCZO6FQZnXAjx3ZynnHhhBRxA6mDjo8t u8ZlUixvWKeGfqLJZ3QAXInQ0EIFPWhSOya15IZN3yiQOT5jKWicVV31pY9ZvWxVcmGNFWiZeI6N JjosAmrczndmlaHRYsYdZ9lYX033lCqjbTXZQHQLNeSUXMHN3dwC7UjzQOiQhZxyfptdN99QiWM0 XBS2bbed0kHJVTm+nZzyUOLofVuQ4Pw9t9p3q605OCwPFBAAOw== ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/InterComms/Images/MoreInfo.gif R0lGODlhmAAjAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAANcALAAAAACYACMA QAj+AK8JvDZnjqeBAksVRMiwocOHECNKnEixosWLEhcKnDNQo0aEHjl2LEiyJMaTKFOqnKiupcuX MGPKnEmzps2bOHPq3Llzpc9rAABYDPqz6ECiRpMWRSqQKVChTaFeOxdUnUB1Qc9Fdei0K9Sg6AaW Y5oVIVKqAKxewwpA61OzUhku9MTqGrSDHxWWnFNqpN6CrPbyVUq4cNGPIEUKhKa3FLTEDv/SNUy5 suXLmDNrLuwV7lGp4NIixApua8POnxGiIycuKNm4b6+FVnsVQOnYphsC7iuQVWDFm4MLP+kx8EaR CnXzRpxc7sHh0A8DH7kYccHHBIFDM9iQd/Tv4MP+i0/Ks7z58+jTq78Z3bVrimidfpcvf/xJr+4B mIv6XnZ+25+F1t9/AHiTXzmf5ecWgbgJ6N5tT+W333io5fbaaV/BlhtusYUmTksWwoZUfSPGVd9w /214IULnCAiOWxumJmNuaHmzn1NjBSUOhy0G9aJnM8qFWHbT2WfkZQspxhFijBXkGGR3afRXXUdW 6ZBH1zyn0XbAXXfccxt5d41CVFpppkaBURmSbiJZJxhJZsY55HEJFTlYdgg1F+eekLE50F8keTfk b4LxaeihiCaqqHitEejoo5BGKumklFZq6aWXhrPoppyqZE5Q3nSKaIoTGUibePRpyGlnOSLIH1OK PdoG41vnGJihOuQERc5auQLgqkDkOChOOgm6x6OLsxLVqpFe7TpVgTOipRZbCxZILFw7XoOOjgJt q+paK8oobW1tReUsVaFSaOK6M5KYIVfststgjCViqOK3KMYb4kCzjQYgh0GilmqQHYo2EGn3oppf whs66BqEJ1YYW3wLC5Tje0w57GPAcQUEADs= ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/InterComms/Images/PricingInfo.gif R0lGODlhmAAjAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAANcALAAAAACYACMA QAj+AK8JvDanYMFSAxMmLKiwoUCGDiNKnEixosWLGDM+nBMR4kCIHht6DAmS40KTGlOqXJlRncuX MGPKnEmz5sxSBvWUssmzp8+fQIO+ZEl0IAAAGI8WXapQKdOnUJ0KlHpNqtRzR9UJVHf03FSkDamK BXsU3cByVgF4NQoWKwCt17iq/ZqQ6sm7BOfgNOhxL9+PKPkaZDXQ71+oiBNTDIkXcEJong42Jony 2l6EjBVr3sy5s+fPoDWOrQu2amlwbxNyBUc3bGnTpBOiIyfuaNqmYFHD3QqANWy2HVGy0hu6uHGo gkdWzisQp0TleJ03Pk59YuaNCiFCC4kQu3fvw7v+Xxu+vLr58xVxEkZ/Xqj79/Djy5/f07xt2xbd 2rX/+jf7omPdB4A5X+F3DWoC+mYagk4JeJQ3ApbDloBrOYiUVAzapqCFBP7n34e3tRbbh8CV2Bpq 4rgkol0N9vfbaOw5KKJ/dp2DIDhrzWgiiKW55Q2BVKF1lDgf2ngUjiPqCJhg1pXn0HUeRlkRZdhB dphAVhLnGHbkrTeQlZ5s56SUofWlZUGe4CVmQuIp1912aV6z5pZkUieYeMzhBWWefObJ2J51dgbl nyZF9lxglUFk6HSBljkmoYUlRyeVG0na6KVlxonppshZyulmtVko6qiklmrqqaimquqqq4bz6auj sHJmzoOx1mrafRZBuNt/LLpoK4/XCClhgVfdmCNs50BI1lvkHEVOXM0CMKxA5DAoTjoT4kqVkb0d q5SwUo717DVYeWOiW3DJVSEA3mBLGpHXoDOkQPL6GleIJaLL21ymjVtulDCuWNp+LToUMI0W7vii iwUrfN7B+OqmWm9KAltirwo7JfFAq824H3UyWvxhhkc6LPJv+gl4lsoYOrjha1QFBAA7 ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/InterComms/Images/ContactUs.gif R0lGODlhmAAkAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAANcALAAAAACYACQA QAj+AK8JHCgQWqk5CEuxIsiwocOBCB9KfBhxosWLGDNqvHhwYkWCET9eEynyYCmQcwSKRLmxpcuX GNXJnEmzps2bOHPq3Mmzp8+fQIHCHEq0qNGXAAAwTHq0qdOnUB+CA6BuoDoA4BxeVfqw48SDCMOe HBk27EKVZUOmnQNtINiyZNNGndvUoNi2A+3OKYWXLEuCrMReg4bQ00KR0DwlBCyYruPHkCNLnky5 MmSmBDEnrSownbivczwxTGx0JUzTli2jdpuS4V6/EFujbWjwbWuvDVenpqxYNEGDg0myhT07dl+E fQO3Jiz72ljku6NLn05dYtDr2LNr386dZ/Xv4MPvi5+LeWD5c+KSAhiXbrz7puUFYk6nXpw5zu/z E1XP3zz/pONYZBtcRem2kYH6DUWYbxLpxVds1yh3FlpylfLWWL8p9lpcBCZYWnO0CdfWYsExSBxF y5VUnIdOGWiaWn+tSKFcJ8bI4lELSoQbRCcJZ+NKFSmG4o1QrRWWQANu6ONAyoXF3Fqs0dgkgkRW aeWVWIqX3n9cdunll2CGKeaYZJZp5plchpPlmmy26eabG8V3jZxwXiknnXVWeSdX5nSZZ4J7ygcA On8SGehA6KlHaKHv9ZmVQFOZI5A47Qm0FaP6laNeOQSpM4564EhKUEAAOw== ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/Images/InterComms-Mailshot---Bottom.gif R0lGODlhIAMcAfcAAKfGzIScppe3xSlWaMXKzBMlL1Z5iN7j5ZKuuleFjYqptZKmrtbb3o6mrufn 6+br7bLP1pOttXukqtbX3Bw1RnSMmNTW16zK00Vnd6m8xcjP0mOIiJayus3T1ZustGiUmEh1hrS+ wwMKEe/v87vDxs7X21iFfEh0eYWkrKOzu2F8iyAwL7S5vg0YI3qSnDVkZnucpCdUWn6Wor3HyzZj V4WVnbPFzCNJV5u0vCNHSaOttWiVpEd0amuKlu/z80VsgTtrhGaRiWODkam2vDRkeYyyt1F7dztp fXGTnUZZaXWbtnKbnGuFkmuNmnijna26v5O1tiFCNhtBSnOco1d7lThle4SrrmOLp1Rqd2GMknSV orTDxoKjpTFZWTBic0JsaChVSJu8v6Sytr3M0Yusr8fX22Zye3ydq8bT2DJHXVqFpKLEwHqdnSxj cnaFiIyzrDNreZKmstff4qaorIOrpHGclExzl73R2LPNzjJYSjxgcWGMmzpxfpS0rKDByWyVsjxr cTJpdKG8wZSrrUJPW8/b3pS5vYGmnkZqkQ0hHHKdq1NkbW+VlJOcoz9qXnOXjSpeapW6tJuqrufr 51V8oZyztC9DS3KVrJy8tYygqK2wtp6ut1Jvgc3f44uspVB5bWKEnXCNpZijrNvX3mePr32clOPf 5evn7D9cg3mWp87SzqK8tsbb3oGftJKiqpKspWuEmq3KxzxvYqO80brR0H6lv8Ta1s/P1Z6msvv7 +zc5SVBukvf39+/v7+vr6/Pz89/f4+Pj59vb3+vr7+Pj4+fn5/Pz9//7+/f3+/v79+vv8Nvf4/P3 9/f389/f3+/v6/Pz7/v7/+Ln6dvb49vf3/f7+9vb2/v//9/f5+vv6+vr5/P38+/z7/f79+Pn4/v3 9///+/v/+9vf29fb1+fn49/j3/Pv8/fz8+/r7+Pj39/f2/Pv7/fz99/b4+fj6O/r6+vn5/v3++Pf 38/Pz9/b34CQlP/7/+fj49PT06GhpNvb19fX41xfb8DAxv39/f///yH5BAAAAAAALAAAAAAgAxwB AAj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmyJEh/uVKqTOmvpcuX MFuanEmzps2bOHPq3Mmzp8+fQIPmbLmyaMyjL4UqXcq0qdOnUKNKnUqVqcuiK5Fqrcq1q9evYMOK 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 W7MxNwEBADs= ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/Images/Repeating.jpg /9j/4AAQSkZJRgABAQEAvwC/AAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAGQAAgDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDU0231 b7RdeY07fuHxufvxRWXplwPPu/8Ar3f+lFeweePsJg01xi2iXEBPy556UVcsNSlaa4U+XxAW/wBW PairAr2VxYrcXBSWU/uDncB04orjrLxBZ+ZNiJl/dHP7z6UVQHktt4iMZlPnxNmMr8r0V5nDcN8+ 2X+A9jRXH7Q6OQ+iLH9mHVWaYPp8y4iJG6M8miv1Mj+F8Ks+VLcY60VxcxvY9E2r/dop396iszQN zYoo4+brRQAbhhuKKNvy9RRQAcbW5oo5w3ymigB207Wopq/dNFADt3DcUU0McNzRQADGGooVvlbi igAVflbmigY2tzRQQAU7WopyqdrUUANX7pooVuGooLAMdrc0UDG1uKKCAVvlbiihejc0UAAxhqKA p2tRQA4LwelFNX7pooLHbvlaimhjtaigAGNrcUUqtweBRQAgUbW5ooGNrdaKCACna1FKq8HkUUFi L900U4Z2tRQA0Z2tzRQMbW4ooA//2Q== ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: file:///D:/InternetDev/Vertebrae/Images/Vertibrea+Main+Back+web+copy640.jpg /9j/4AAQSkZJRgABAQEAvwC/AAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP ERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAGQAoADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDftNNc afeL9qtTu2dJhgfNSHS3/sry/tFt/r87vOGPu+tV7KQHTb3/AIB/6FTmlA0X/t4/9lrv1OYV9Kk/ szYLq1/1+f8AXDH3abNpUhs7ZftFsNu/kzDB57VC0w/srP8A03/9lplzcAWFp/wP+dGoy/Ppr/YL RftNt8ofrMMdaTUbGRjB+/t12wqOZQM1TubgHT7Pns//AKFUt/uc2+Of3CUtQLc2nvI1v/pFvxCo /wBaOa1722trPfd3kuE44RWdug7AHH41R0/Trm+vrK2t490jxIoz0HXk+1eteFtHjtrJo9bt12ag ghuUznyTn5CCPfv6kHoDWU52RcY3PIm8W6PLq/8Ax6TJDvGJXYZH1UZ4/X2q7dW9s7peKwETtvV1 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 ------=_NextPart_000_0010_01C268B3.2EF184D0 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: file:///D:/InternetDev/Vertebrae/Vertebrae.css BODY { FONT-SIZE: smaller; BACKGROUND: url(Images/Repeating.jpg) #ffffff = repeat-x left top; MARGIN: 0px; FONT-FAMILY: Verdana, Geneva, Arial, = helvetica, sans-serif } TD { FONT-SIZE: smaller; FONT-FAMILY: Verdana, Geneva, Arial, helvetica, = sans-serif } TH { FONT-FAMILY: Verdana, Geneva, Arial, helvetica, sans-serif } .topics { FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif } A:link { FONT-SIZE: 12px; COLOR: #666666; FONT-FAMILY: Verdana, Arial, = Helvetica, sans-serif; TEXT-DECORATION: none } A:visited { FONT-SIZE: 12px; COLOR: #666666; FONT-FAMILY: Verdana, Arial, = Helvetica, sans-serif; TEXT-DECORATION: none } A:hover { FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Verdana, Arial, = Helvetica, sans-serif; TEXT-DECORATION: underline } .vertebraefont { FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif } .tableimage { BACKGROUND-POSITION: left top; BACKGROUND-ATTACHMENT: scroll; = BACKGROUND-REPEAT: no-repeat } .leftmenu:link { COLOR: #333333 } .leftmenu:hover { COLOR: #333333; BACKGROUND-COLOR: #cccccc; TEXT-DECORATION: underline } .leftmenu:visited { COLOR: #666666 } .tdbigbone { BACKGROUND-POSITION: right center; BACKGROUND-ATTACHMENT: scroll; = BACKGROUND-REPEAT: no-repeat } .tableimagelogo { BACKGROUND-POSITION: left top; BACKGROUND-ATTACHMENT: scroll; = BACKGROUND-IMAGE: = url(Images/Vertibrea%2BMain%2BBack%2Bweb%2Bcopy640.jpg); = BACKGROUND-REPEAT: no-repeat } ------=_NextPart_000_0010_01C268B3.2EF184D0-- From mbp@samba.org Sat Oct 5 00:53:36 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 00:53:42 -0700 (PDT) Received: from sngrel4.hp.com (sngrel4.hp.com [192.6.86.110]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g957rUtG023024 for ; Sat, 5 Oct 2002 00:53:34 -0700 Received: from ctss11.sgp.hp.com (ctss11.sgp.hp.com [15.85.49.5]) by sngrel4.hp.com (Postfix) with ESMTP id 4E600DE for ; Sat, 5 Oct 2002 15:53:28 +0800 (SST) Received: from XAUBRG2.AUS.HP.COM (xaubrg2.aus.hp.com [15.23.69.43]) by ctss11.sgp.hp.com (8.9.3 (PHNE_18979)/8.9.3 SMKit6.0.6 OpenMail BPI enabled) with SMTP id PAA11321 for ; Sat, 5 Oct 2002 15:53:26 +0800 (SGP) Received: from 15.23.69.43 by XAUBRG2.AUS.HP.COM (InterScan E-Mail VirusWall NT); Sat, 05 Oct 2002 17:53:16 +1000 Received: from XAUBRG2.AUS.HP.COM (localhost [127.0.0.1]) by XAUBRG2.AUS.HP.COM with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2656.59) id TWW7DW1Y; Sat, 5 Oct 2002 17:53:16 +1000 Received: from 16.176.68.120 by XAUBRG2.AUS.HP.COM (InterScan E-Mail VirusWall NT); Sat, 05 Oct 2002 17:53:15 +1000 Received: from mbp by vexed.aus.hp.com with local (Exim 3.36 #1 (Debian)) id 17xjjD-0003kE-00; Sat, 05 Oct 2002 17:51:59 +1000 Date: Sat, 5 Oct 2002 17:51:59 +1000 From: Martin Pool To: James Morris Cc: netdev@oss.sgi.com Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case Message-ID: <20021005075157.GC2531@samba.org> References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="mojUlQ0s9EVzWg2t" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4i X-GPG: 1024D/A0B3E88B: AFAC578F 1841EE6B FD95E143 3C63CA3F A0B3E88B X-archive-position: 525 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mbp@samba.org Precedence: bulk X-list: netdev --mojUlQ0s9EVzWg2t Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On 5 Oct 2002, James Morris wrote: > Martin, > > I'm not able to reproduce the bug exactly as described. What kind of > network connection were you using between the boxes, and what was the > kernel version at the server end? (I've been testing between two boxes on > a 10Mbps lan, with 2.2.22 at the client side and both 2.2.20 and 2.4.19 > kernels at the server side). The machine inside VMware is as shown below. This was originally reported by a distcc user who was apparently experiencing the problem on diverse hardware on a 100Mbps switched network. Did you see the example code that I posted at the start of the thread? I can't reproduce it locally, but I can reproduce it going to a 2.4.18 machine across a 100Mbps switched network. A tcpdump (complete?) is attached. mbp@maudlin:~$ lspci 00:00.0 Host bridge: Intel Corporation 440BX/ZX - 82443BX/ZX Host bridge (AGP disabled) (rev 01) 00:07.0 ISA bridge: Intel Corporation 82371AB PIIX4 ISA (rev 08) 00:07.1 IDE interface: Intel Corporation 82371AB PIIX4 IDE (rev 01) 00:07.2 USB Controller: Intel Corporation 82371AB PIIX4 USB 00:07.3 Bridge: Intel Corporation 82371AB PIIX4 ACPI (rev 08) 00:0f.0 VGA compatible controller: Unknown device 15ad:0405 00:10.0 SCSI storage controller: BusLogic BT-946C (BA80C30) [MultiMaster 10] (rev 01) 00:11.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet LANCE] (rev 10) mbp@maudlin:~$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 1 model name : Intel(R) Pentium(R) 4 CPU 1.70GHz stepping : 2 cpu MHz : 1696.308 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 cflush dtrace acpi mmx fxsr sse xmm2 ssnp 28 acc bogomips : 2929.45 -- Martin --mojUlQ0s9EVzWg2t Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="tcpdump_1050.txt" 17:50:58.870451 192.168.1.173.1050 > 192.168.1.1.9: S 1182351029:1182351029(0) win 16060 (DF) 17:50:58.870499 192.168.1.1.9 > 192.168.1.173.1050: S 1288275163:1288275163(0) ack 1182351030 win 5792 (DF) 17:50:58.870730 192.168.1.173.1050 > 192.168.1.1.9: . ack 1 win 16060 (DF) 17:50:58.875597 192.168.1.173.1050 > 192.168.1.1.9: P 1:1449(1448) ack 1 win 16060 (DF) 17:50:58.875690 192.168.1.1.9 > 192.168.1.173.1050: . ack 1449 win 8688 (DF) 17:50:58.875879 192.168.1.173.1050 > 192.168.1.1.9: P 1449:2897(1448) ack 1 win 16060 (DF) 17:50:58.875940 192.168.1.1.9 > 192.168.1.173.1050: . ack 2897 win 11584 (DF) 17:50:58.876271 192.168.1.173.1050 > 192.168.1.1.9: . 2897:4345(1448) ack 1 win 16060 (DF) 17:50:58.876348 192.168.1.1.9 > 192.168.1.173.1050: . ack 4345 win 14480 (DF) 17:50:58.876527 192.168.1.173.1050 > 192.168.1.1.9: . 4345:5793(1448) ack 1 win 16060 (DF) 17:50:58.876585 192.168.1.1.9 > 192.168.1.173.1050: . ack 5793 win 17376 (DF) 17:50:58.876748 192.168.1.173.1050 > 192.168.1.1.9: . 5793:7241(1448) ack 1 win 16060 (DF) 17:50:58.876804 192.168.1.1.9 > 192.168.1.173.1050: . ack 7241 win 20272 (DF) 17:50:58.876994 192.168.1.173.1050 > 192.168.1.1.9: . 7241:8689(1448) ack 1 win 16060 (DF) 17:50:58.877056 192.168.1.1.9 > 192.168.1.173.1050: . ack 8689 win 23168 (DF) 17:50:58.877283 192.168.1.173.1050 > 192.168.1.1.9: . 8689:10137(1448) ack 1 win 16060 (DF) 17:50:58.877354 192.168.1.1.9 > 192.168.1.173.1050: . ack 10137 win 26064 (DF) 17:50:58.877524 192.168.1.173.1050 > 192.168.1.1.9: . 10137:11585(1448) ack 1 win 16060 (DF) 17:50:58.877579 192.168.1.1.9 > 192.168.1.173.1050: . ack 11585 win 28960 (DF) 17:50:58.877794 192.168.1.173.1050 > 192.168.1.1.9: . 11585:13033(1448) ack 1 win 16060 (DF) 17:50:58.877856 192.168.1.1.9 > 192.168.1.173.1050: . ack 13033 win 31856 (DF) 17:50:58.878020 192.168.1.173.1050 > 192.168.1.1.9: . 13033:14481(1448) ack 1 win 16060 (DF) 17:50:58.878074 192.168.1.1.9 > 192.168.1.173.1050: . ack 14481 win 34752 (DF) 17:50:58.878235 192.168.1.173.1050 > 192.168.1.1.9: . 14481:15929(1448) ack 1 win 16060 (DF) 17:50:58.878290 192.168.1.1.9 > 192.168.1.173.1050: . ack 15929 win 37648 (DF) 17:50:58.878445 192.168.1.173.1050 > 192.168.1.1.9: . 15929:17377(1448) ack 1 win 16060 (DF) 17:50:58.878498 192.168.1.1.9 > 192.168.1.173.1050: . ack 17377 win 40544 (DF) 17:50:58.878656 192.168.1.173.1050 > 192.168.1.1.9: . 17377:18825(1448) ack 1 win 16060 (DF) 17:50:58.878712 192.168.1.1.9 > 192.168.1.173.1050: . ack 18825 win 43440 (DF) 17:50:58.878865 192.168.1.173.1050 > 192.168.1.1.9: . 18825:20273(1448) ack 1 win 16060 (DF) 17:50:58.878920 192.168.1.1.9 > 192.168.1.173.1050: . ack 20273 win 46336 (DF) 17:50:58.879151 192.168.1.173.1050 > 192.168.1.1.9: . 20273:21721(1448) ack 1 win 16060 (DF) 17:50:58.879222 192.168.1.1.9 > 192.168.1.173.1050: . ack 21721 win 49232 (DF) 17:50:58.879424 192.168.1.173.1050 > 192.168.1.1.9: . 21721:23169(1448) ack 1 win 16060 (DF) 17:50:58.879486 192.168.1.1.9 > 192.168.1.173.1050: . ack 23169 win 52128 (DF) 17:50:58.879662 192.168.1.173.1050 > 192.168.1.1.9: . 23169:24617(1448) ack 1 win 16060 (DF) 17:50:58.879720 192.168.1.1.9 > 192.168.1.173.1050: . ack 24617 win 55024 (DF) 17:50:58.879877 192.168.1.173.1050 > 192.168.1.1.9: . 24617:26065(1448) ack 1 win 16060 (DF) 17:50:58.879931 192.168.1.1.9 > 192.168.1.173.1050: . ack 26065 win 57920 (DF) 17:50:58.880091 192.168.1.173.1050 > 192.168.1.1.9: . 26065:27513(1448) ack 1 win 16060 (DF) 17:50:58.880146 192.168.1.1.9 > 192.168.1.173.1050: . ack 27513 win 60816 (DF) 17:50:58.880352 192.168.1.173.1050 > 192.168.1.1.9: . 27513:28961(1448) ack 1 win 16060 (DF) 17:50:58.880414 192.168.1.1.9 > 192.168.1.173.1050: . ack 28961 win 63712 (DF) 17:50:58.880581 192.168.1.173.1050 > 192.168.1.1.9: . 28961:30409(1448) ack 1 win 16060 (DF) 17:50:58.880639 192.168.1.1.9 > 192.168.1.173.1050: . ack 30409 win 63712 (DF) 17:50:58.880792 192.168.1.173.1050 > 192.168.1.1.9: . 30409:31857(1448) ack 1 win 16060 (DF) 17:50:58.880844 192.168.1.1.9 > 192.168.1.173.1050: . ack 31857 win 63712 (DF) 17:50:58.881037 192.168.1.173.1050 > 192.168.1.1.9: . 31857:33305(1448) ack 1 win 16060 (DF) 17:50:58.881099 192.168.1.1.9 > 192.168.1.173.1050: . ack 33305 win 63712 (DF) 17:50:58.881255 192.168.1.173.1050 > 192.168.1.1.9: . 33305:34753(1448) ack 1 win 16060 (DF) 17:50:58.881381 192.168.1.173.1050 > 192.168.1.1.9: . 34753:36201(1448) ack 1 win 16060 (DF) 17:50:58.881430 192.168.1.1.9 > 192.168.1.173.1050: . ack 36201 win 63712 (DF) 17:50:58.881727 192.168.1.173.1050 > 192.168.1.1.9: P 36201:37649(1448) ack 1 win 16060 (DF) 17:50:58.881806 192.168.1.1.9 > 192.168.1.173.1050: . ack 37649 win 63712 (DF) 17:50:58.881989 192.168.1.173.1050 > 192.168.1.1.9: P 37649:39097(1448) ack 1 win 16060 (DF) 17:50:58.882050 192.168.1.1.9 > 192.168.1.173.1050: . ack 39097 win 63712 (DF) 17:50:58.882210 192.168.1.173.1050 > 192.168.1.1.9: P 39097:40545(1448) ack 1 win 16060 (DF) 17:50:58.882266 192.168.1.1.9 > 192.168.1.173.1050: . ack 40545 win 63712 (DF) 17:50:58.882469 192.168.1.173.1050 > 192.168.1.1.9: P 40545:41993(1448) ack 1 win 16060 (DF) 17:50:58.882536 192.168.1.1.9 > 192.168.1.173.1050: . ack 41993 win 63712 (DF) 17:50:58.883067 192.168.1.173.1050 > 192.168.1.1.9: P 41993:43441(1448) ack 1 win 16060 (DF) 17:50:58.883154 192.168.1.1.9 > 192.168.1.173.1050: . ack 43441 win 63712 (DF) 17:50:58.883400 192.168.1.173.1050 > 192.168.1.1.9: . 43441:44889(1448) ack 1 win 16060 (DF) 17:50:58.883545 192.168.1.173.1050 > 192.168.1.1.9: . 44889:46337(1448) ack 1 win 16060 (DF) 17:50:58.883597 192.168.1.1.9 > 192.168.1.173.1050: . ack 46337 win 63712 (DF) 17:50:58.883767 192.168.1.173.1050 > 192.168.1.1.9: . 46337:47785(1448) ack 1 win 16060 (DF) 17:50:58.883934 192.168.1.173.1050 > 192.168.1.1.9: P 47785:49233(1448) ack 1 win 16060 (DF) 17:50:58.883990 192.168.1.1.9 > 192.168.1.173.1050: . ack 49233 win 63712 (DF) 17:50:58.884201 192.168.1.173.1050 > 192.168.1.1.9: P 49233:50681(1448) ack 1 win 16060 (DF) 17:50:58.884271 192.168.1.1.9 > 192.168.1.173.1050: . ack 50681 win 63712 (DF) 17:50:58.884441 192.168.1.173.1050 > 192.168.1.1.9: P 50681:52129(1448) ack 1 win 16060 (DF) 17:50:58.884499 192.168.1.1.9 > 192.168.1.173.1050: . ack 52129 win 63712 (DF) 17:50:58.884655 192.168.1.173.1050 > 192.168.1.1.9: P 52129:53577(1448) ack 1 win 16060 (DF) 17:50:58.884711 192.168.1.1.9 > 192.168.1.173.1050: . ack 53577 win 63712 (DF) 17:50:58.884913 192.168.1.173.1050 > 192.168.1.1.9: P 53577:55025(1448) ack 1 win 16060 (DF) 17:50:58.884982 192.168.1.1.9 > 192.168.1.173.1050: . ack 55025 win 63712 (DF) 17:50:58.885151 192.168.1.173.1050 > 192.168.1.1.9: P 55025:56473(1448) ack 1 win 16060 (DF) 17:50:58.885209 192.168.1.1.9 > 192.168.1.173.1050: . ack 56473 win 63712 (DF) 17:50:58.885408 192.168.1.173.1050 > 192.168.1.1.9: P 56473:57921(1448) ack 1 win 16060 (DF) 17:50:58.885652 192.168.1.1.9 > 192.168.1.173.1050: . ack 57921 win 63712 (DF) 17:50:58.885850 192.168.1.173.1050 > 192.168.1.1.9: P 57921:59369(1448) ack 1 win 16060 (DF) 17:50:58.885914 192.168.1.1.9 > 192.168.1.173.1050: . ack 59369 win 63712 (DF) 17:50:58.886077 192.168.1.173.1050 > 192.168.1.1.9: P 59369:60817(1448) ack 1 win 16060 (DF) 17:50:58.886134 192.168.1.1.9 > 192.168.1.173.1050: . ack 60817 win 63712 (DF) 17:50:58.886346 192.168.1.173.1050 > 192.168.1.1.9: P 60817:62265(1448) ack 1 win 16060 (DF) 17:50:58.886417 192.168.1.1.9 > 192.168.1.173.1050: . ack 62265 win 63712 (DF) 17:50:58.886589 192.168.1.173.1050 > 192.168.1.1.9: P 62265:63713(1448) ack 1 win 16060 (DF) 17:50:58.886645 192.168.1.1.9 > 192.168.1.173.1050: . ack 63713 win 63712 (DF) 17:50:58.886801 192.168.1.173.1050 > 192.168.1.1.9: P 63713:65161(1448) ack 1 win 16060 (DF) 17:50:58.886856 192.168.1.1.9 > 192.168.1.173.1050: . ack 65161 win 63712 (DF) 17:50:58.887054 192.168.1.173.1050 > 192.168.1.1.9: P 65161:66609(1448) ack 1 win 16060 (DF) 17:50:58.887123 192.168.1.1.9 > 192.168.1.173.1050: . ack 66609 win 63712 (DF) 17:50:58.887293 192.168.1.173.1050 > 192.168.1.1.9: P 66609:68057(1448) ack 1 win 16060 (DF) 17:50:58.887348 192.168.1.1.9 > 192.168.1.173.1050: . ack 68057 win 63712 (DF) 17:50:58.887502 192.168.1.173.1050 > 192.168.1.1.9: P 68057:69505(1448) ack 1 win 16060 (DF) 17:50:58.887558 192.168.1.1.9 > 192.168.1.173.1050: . ack 69505 win 63712 (DF) 17:50:58.887758 192.168.1.173.1050 > 192.168.1.1.9: P 69505:70953(1448) ack 1 win 16060 (DF) 17:50:58.887826 192.168.1.1.9 > 192.168.1.173.1050: . ack 70953 win 63712 (DF) 17:50:58.888073 192.168.1.173.1050 > 192.168.1.1.9: P 70953:72401(1448) ack 1 win 16060 (DF) 17:50:58.888142 192.168.1.1.9 > 192.168.1.173.1050: . ack 72401 win 63712 (DF) 17:50:58.888307 192.168.1.173.1050 > 192.168.1.1.9: P 72401:73849(1448) ack 1 win 16060 (DF) 17:50:58.888364 192.168.1.1.9 > 192.168.1.173.1050: . ack 73849 win 63712 (DF) 17:50:58.888574 192.168.1.173.1050 > 192.168.1.1.9: P 73849:75297(1448) ack 1 win 16060 (DF) 17:50:58.888642 192.168.1.1.9 > 192.168.1.173.1050: . ack 75297 win 63712 (DF) 17:50:58.888811 192.168.1.173.1050 > 192.168.1.1.9: P 75297:76745(1448) ack 1 win 16060 (DF) 17:50:58.888867 192.168.1.1.9 > 192.168.1.173.1050: . ack 76745 win 63712 (DF) 17:50:58.889023 192.168.1.173.1050 > 192.168.1.1.9: P 76745:78193(1448) ack 1 win 16060 (DF) 17:50:58.889080 192.168.1.1.9 > 192.168.1.173.1050: . ack 78193 win 63712 (DF) 17:50:58.889283 192.168.1.173.1050 > 192.168.1.1.9: P 78193:79641(1448) ack 1 win 16060 (DF) 17:50:58.889365 192.168.1.1.9 > 192.168.1.173.1050: . ack 79641 win 63712 (DF) 17:50:58.889550 192.168.1.173.1050 > 192.168.1.1.9: P 79641:81089(1448) ack 1 win 16060 (DF) 17:50:58.889611 192.168.1.1.9 > 192.168.1.173.1050: . ack 81089 win 63712 (DF) 17:50:58.889819 192.168.1.173.1050 > 192.168.1.1.9: P 81089:82537(1448) ack 1 win 16060 (DF) 17:50:58.889890 192.168.1.1.9 > 192.168.1.173.1050: . ack 82537 win 63712 (DF) 17:50:58.890089 192.168.1.173.1050 > 192.168.1.1.9: P 82537:83985(1448) ack 1 win 16060 (DF) 17:50:58.890152 192.168.1.1.9 > 192.168.1.173.1050: . ack 83985 win 63712 (DF) 17:50:58.890414 192.168.1.173.1050 > 192.168.1.1.9: P 83985:85433(1448) ack 1 win 16060 (DF) 17:50:58.890482 192.168.1.1.9 > 192.168.1.173.1050: . ack 85433 win 63712 (DF) 17:50:58.890732 192.168.1.173.1050 > 192.168.1.1.9: P 85433:86881(1448) ack 1 win 16060 (DF) 17:50:58.890803 192.168.1.1.9 > 192.168.1.173.1050: . ack 86881 win 63712 (DF) 17:50:58.890974 192.168.1.173.1050 > 192.168.1.1.9: P 86881:88329(1448) ack 1 win 16060 (DF) 17:50:58.891032 192.168.1.1.9 > 192.168.1.173.1050: . ack 88329 win 63712 (DF) 17:50:58.891188 192.168.1.173.1050 > 192.168.1.1.9: P 88329:89777(1448) ack 1 win 16060 (DF) 17:50:58.891244 192.168.1.1.9 > 192.168.1.173.1050: . ack 89777 win 63712 (DF) 17:50:58.891448 192.168.1.173.1050 > 192.168.1.1.9: P 89777:91225(1448) ack 1 win 16060 (DF) 17:50:58.891516 192.168.1.1.9 > 192.168.1.173.1050: . ack 91225 win 63712 (DF) 17:50:58.891684 192.168.1.173.1050 > 192.168.1.1.9: P 91225:92673(1448) ack 1 win 16060 (DF) 17:50:58.891744 192.168.1.1.9 > 192.168.1.173.1050: . ack 92673 win 63712 (DF) 17:50:58.891902 192.168.1.173.1050 > 192.168.1.1.9: P 92673:94121(1448) ack 1 win 16060 (DF) 17:50:58.891957 192.168.1.1.9 > 192.168.1.173.1050: . ack 94121 win 63712 (DF) 17:50:58.892157 192.168.1.173.1050 > 192.168.1.1.9: P 94121:95569(1448) ack 1 win 16060 (DF) 17:50:58.892225 192.168.1.1.9 > 192.168.1.173.1050: . ack 95569 win 63712 (DF) 17:50:58.892392 192.168.1.173.1050 > 192.168.1.1.9: P 95569:97017(1448) ack 1 win 16060 (DF) 17:50:58.892451 192.168.1.1.9 > 192.168.1.173.1050: . ack 97017 win 63712 (DF) 17:50:58.893400 192.168.1.173.1050 > 192.168.1.1.9: P 97017:98465(1448) ack 1 win 16060 (DF) 17:50:58.893493 192.168.1.1.9 > 192.168.1.173.1050: . ack 98465 win 63712 (DF) 17:50:58.893684 192.168.1.173.1050 > 192.168.1.1.9: P 98465:99913(1448) ack 1 win 16060 (DF) 17:50:58.893744 192.168.1.1.9 > 192.168.1.173.1050: . ack 99913 win 63712 (DF) --mojUlQ0s9EVzWg2t-- From jmorris@intercode.com.au Sat Oct 5 04:53:51 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 04:53:57 -0700 (PDT) Received: from blackbird.intercode.com.au (blackbird.intercode.com.au [203.32.101.10]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g95BrmtG025031 for ; Sat, 5 Oct 2002 04:53:50 -0700 Received: from localhost (jmorris@localhost) by blackbird.intercode.com.au (8.9.3/8.9.3) with ESMTP id VAA25155; Sat, 5 Oct 2002 21:53:41 +1000 Date: Sat, 5 Oct 2002 21:53:40 +1000 (EST) From: James Morris To: Martin Pool cc: netdev@oss.sgi.com Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case In-Reply-To: <20021005075157.GC2531@samba.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 526 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@intercode.com.au Precedence: bulk X-list: netdev On Sat, 5 Oct 2002, Martin Pool wrote: > The machine inside VMware is as shown below. This was originally > reported by a distcc user who was apparently experiencing the problem > on diverse hardware on a 100Mbps switched network. > > Did you see the example code that I posted at the start of the thread? Yep. > I can't reproduce it locally, but I can reproduce it going to a 2.4.18 > machine across a 100Mbps switched network. A tcpdump (complete?) is > attached. Thanks for the extra info. - James -- James Morris From anonymous@anonymous.com Sat Oct 5 06:37:28 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 06:37:35 -0700 (PDT) Received: from 10.0.0.1 (CacheFlowServer@[211.138.91.22]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g95Db8tG026153; Sat, 5 Oct 2002 06:37:14 -0700 Message-Id: <200210051337.g95Db8tG026153@oss.sgi.com> From: "" To: Date: Sat, 05 Oct 02 06:37:19 Pacific Daylight Time X-Priority: 3 X-MSMail-Priority: Normal Subject: Cartridge Recycling DwNNvOFOYp X-Mailer: Microsoft Outlook Express 5.50.4522.1200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=WC_MAIL_PaRt_BoUnDaRy_05151998 X-archive-position: 527 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: anonymous@anonymous.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --WC_MAIL_PaRt_BoUnDaRy_05151998 Content-Type: text/plain Content-Transfer-Encoding: 7Bit This message is brought to you by:ENVIRONMENTAL ACTIVISTS GROUPS Helping to save our world! Please Recycle Your Cartridges! Our Top Pick! - Company refills and then returns your cartridges! Laser/Jet Recycling Services : Inkjet Laser Toner And Copier Cartridges Recycling Service. Refills apple, brother, canon, hp, epson, lexmark, Xerox and more. Also sells refilled cartridges Cheap! www.eklaserjet.com National Toner Recycling & Supply Produces recycled toner and ink cartridges for laser and deskjet printers and copiers, including those made by Hewlett Packard and Xerox. www.nationaltoner.com HP Environment: LaserJet Supplies Return & Recycling The return and recycling pages for inkjet supplies, laserjet supplies and hardware. www.hp.com/hpinfo/community/environment/re_laser.htm HP Planet Partners LaserJet toner cartridge recycling program This site's purpose is to provide customers with details regarding HP's Planet Partners (LaserJet Toner Cartridge) - Canada Recycling Program www.hewlett-packard.ca/products/plus/planetpartner/program.html Mother Earch Recycling - Laserjet Cartridges For Your Computer Distributor Of Laser, Fax And Copier Cartridges With www.motherearthrecycling.com/laser.cfm MTCR Framed Website Buys empty inkjet cartridges.Recycler of empty inkjet and laserjet cartridges. Buys bulk loads of empty cartridges. www.mtcr.freeuk.com HP Environment: Hardware Return & Recycling The return and recycling pages for inkjet supplies, laserjet supplies and hardware. www.hp.com/hpinfo/community/environment/re_computer.htm Discount Office Supplies - Mother Earth Distributer of recyled office supplies, laser toner cartridges, inkjet cartridges, fax machine and photocopier supplies. Canon HP, Lexmark, Panafax, Xerox and more. www.motherearthrecycling.com Toner Cartridge Recycling, Victoria, BC - Quality Cartridge Recycling Quality Cartridge Recycling offers free delivery within Victoria, BC for all inkjet and laser printer cartridges, photocopier cartridges, and fax machine cartridges. www.inkandtoners.com Boulder Labs Recycling Recycling at Boulder Laboratories www.boulder.nist.gov/recycle Our Top Pick - Pays highest price for selling your cartrdges! JG Recycling, Cash paid for empty toner cartridges we buy empty inkjet, and empty toner cartridges members.aol.com/jgray0000 Toner Cartridge Recycling Toner Cartridge Recycling 1) 2) 3) 4) 1)HP IIP, IIP Plus, IIIP 2)HP 4V, 4MV toner cartridge 3)HP 5L, 5ML toner cartridge 4)HP 3si, 4si 5) 6) 7) 8) 5)LaserJet, LaserJet +, LaserJet 500+ 6)HP 4L, 4P 7)HP II, IID, III, IIID 8)HP LaserJet 4, 4 plus, 5 www.magiclink.com/web/dougbcs/tng070.htm Environmental Organization WebDirectory - Recycling:Recycled Computer Products Recycling:Recycled Computer Products Recycled Printer Cartridges 90º Earth - Environmental company with high tech solutions for the environment, we specialize in the Sick Building Syndrome Ashmor MicroComputer Recyclers - Buy, sell, recycle new and www.webdirectory.com/Recycling/Recycled_Computer_Products IRC - International Recycling Centre - welcome! IRC International Recycling Centre, gespecialiseerd in het verzamelen en recyclen van toner- en inkjetcartridges. www.i-r-c.nl YigZeGTgmzdYIMZ --WC_MAIL_PaRt_BoUnDaRy_05151998-- From yoshfuji@linux-ipv6.org Sat Oct 5 11:33:54 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 11:33:59 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g95IXqtG031245 for ; Sat, 5 Oct 2002 11:33:53 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g95IXp1o009258; Sun, 6 Oct 2002 03:33:52 +0900 Date: Sun, 06 Oct 2002 03:33:51 +0900 (JST) Message-Id: <20021006.033351.33728380.yoshfuji@linux-ipv6.org> To: pekkas@netcore.fi Cc: netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Improvement of Source Address Selection From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: References: <20021004.015045.96199793.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 528 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Thank you for your comments. In article (at Fri, 4 Oct 2002 09:32:33 +0300 (EEST)), Pekka Savola says: > Are IPv4 addresses represented as mapped addresses (as they should by the > spec at least)? see below. > There seem to be some points at section 4 of the draft (e.g. for multicast > destinations, MUST only pick addresses on the outgoing interface) that may > be missing? fixed. > > +#ifndef IPV6_ADDR_MC_SCOPE > > +#define IPV6_ADDR_MC_SCOPE(a) \ > > + ((a)->s6_addr[1] & 0x0f) /* XXX nonstandard */ : > Aren't these definitions header file material, perhaps (I'd guess they > might be useful in other .c files too). I thought that we would do it later, but anyway, moved to include/net/ipv6.h. > > +int ipv6_addrselect_scope(const struct in6_addr *addr) : > Something similar to this is done in addrconf.c:ipv6_addr_type, could > there be more reuse? integrated core of the code to ipv6_addr_type(). > > + if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) > > + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.4 */ > > + > > + return IPV6_ADDR_SCOPE_GLOBAL; /* section 2.3 */ > > + } > > You're referring to sections 3.4 and 3.3, I think (similar in other > comments) fixed. > > + if (addr->s6_addr32[2] == __constant_htonl(0x0000FFFF)) { > > + if (addr->s6_addr32[3] == __constant_htonl(0xA9FF0000)) > > + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.2 */ > > Shouldn't that be 0xA9FE0000 if you mean IPv4 zeroconf 169.254.0.0/16 ? > (that could be spelt out in a comment.) > > > + if (addr->s6_addr32[3] == __constant_htonl(0xAC000000)) { > > + if (addr->s6_addr32[3] == __constant_htonl(0xAC100000)) > > + return IPV6_ADDR_SCOPE_SITELOCAL; /* section 2.2 */ > > 172.16.00 -- 172.31.255.255, not just 172.16.*.* > > > + return IPV6_ADDR_SCOPE_LINKLOCAL; /* section 2.2 */ > > + } > > I don't understand this, this was possibly supposed to be the case for > 127.0.0.0/8 which should be treated as link-local? How stupid code I wrote... And,.. I reread the spec and found that ipv4-mapped addresses are global scope for source address selection. So..., I removed above codes. Well, Following patch is against linux-2.4.19. BTW, "IPv6: Miscellaneous clean-ups" (FIX_2_4_19_MISC_CLEANUPS-20020912) and this patch conflics. What kind of patch do you prefer? 1. patch on top of plain kernel 2. patch on top of other-patched kernel 3. patch with other patch (which conflicts) on top of plain kernel Thank you in advance. Index: include/net/addrconf.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/addrconf.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.6.1 diff -u -r1.1.1.1 -r1.1.1.1.6.1 --- include/net/addrconf.h 2002/08/20 09:46:45 1.1.1.1 +++ include/net/addrconf.h 2002/09/26 19:15:15 1.1.1.1.6.1 @@ -55,6 +55,9 @@ struct net_device *dev); extern struct inet6_ifaddr * ipv6_get_ifaddr(struct in6_addr *addr, struct net_device *dev); +extern int ipv6_dev_get_saddr(struct net_device *ddev, + struct in6_addr *daddr, + struct in6_addr *saddr); extern int ipv6_get_saddr(struct dst_entry *dst, struct in6_addr *daddr, struct in6_addr *saddr); Index: include/net/ipv6.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/include/net/ipv6.h,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 ipv6.h --- include/net/ipv6.h 2002/08/20 09:46:45 1.1.1.1 +++ include/net/ipv6.h 2002/10/05 17:43:48 @@ -74,6 +74,20 @@ #define IPV6_ADDR_RESERVED 0x2000U /* reserved address space */ /* + * Addr scopes + */ +#ifdef __KERNEL__ +#define IPV6_ADDR_MC_SCOPE(a) \ + ((a)->s6_addr[1] & 0x0f) /* XXX nonstandard */ +#define __IPV6_ADDR_SCOPE_INVALID -1 +#endif +#define IPV6_ADDR_SCOPE_NODELOCAL 0x01 +#define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 +#define IPV6_ADDR_SCOPE_SITELOCAL 0x05 +#define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 +#define IPV6_ADDR_SCOPE_GLOBAL 0x0e + +/* * fragmentation header */ @@ -203,12 +217,28 @@ char *, unsigned int, unsigned int); - -extern int ipv6_addr_type(struct in6_addr *addr); +/* + * Address manipulation functions + */ +extern int __ipv6_addr_type(struct in6_addr *addr); +static inline int ipv6_addr_type(struct in6_addr *addr) +{ + return __ipv6_addr_type(addr) & 0xffff; +} static inline int ipv6_addr_scope(struct in6_addr *addr) +{ + return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK; +} + +static inline int __ipv6_addr_src_scope(int type) +{ + return type == IPV6_ADDR_ANY ? __IPV6_ADDR_SCOPE_INVALID : type>>16; +} + +static inline int ipv6_addr_src_scope(struct in6_addr *addr) { - return ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK; + return __ipv6_addr_src_scope(__ipv6_addr_type(addr)); } static inline int ipv6_addr_cmp(struct in6_addr *a1, struct in6_addr *a2) Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.6.16 diff -u -r1.1.1.1 -r1.1.1.1.6.16 --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/10/05 17:26:27 1.1.1.1.6.16 @@ -26,6 +26,10 @@ * packets. * yoshfuji@USAGI : Fixed interval between DAD * packets. + * YOSHIFUJI Hideaki @USAGI : improved source address + * selection; consider scope, + * status etc. + * */ #include @@ -104,6 +108,8 @@ static struct notifier_block *inet6addr_chain; +static u32 ipv6_addrselect_label_lookup(const struct in6_addr *addr, int ifindex); + struct ipv6_devconf ipv6_devconf = { 0, /* forwarding */ @@ -132,7 +138,7 @@ MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */ }; -int ipv6_addr_type(struct in6_addr *addr) +int __ipv6_addr_type(struct in6_addr *addr) { u32 st; @@ -143,32 +149,38 @@ */ if ((st & __constant_htonl(0xE0000000)) != __constant_htonl(0x00000000) && (st & __constant_htonl(0xE0000000)) != __constant_htonl(0xE0000000)) - return IPV6_ADDR_UNICAST; + return (IPV6_ADDR_UNICAST | + IPV6_ADDR_SCOPE_GLOBAL<<16); if ((st & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000)) { - int type = IPV6_ADDR_MULTICAST; + /* multicast */ + /* addr-select 3.1 */ + int type = IPV6_ADDR_MC_SCOPE(addr)<<16; - switch((st & __constant_htonl(0x00FF0000))) { - case __constant_htonl(0x00010000): + switch(type) { + case IPV6_ADDR_SCOPE_NODELOCAL<<16: type |= IPV6_ADDR_LOOPBACK; break; - case __constant_htonl(0x00020000): + case IPV6_ADDR_SCOPE_LINKLOCAL<<16: type |= IPV6_ADDR_LINKLOCAL; break; - case __constant_htonl(0x00050000): + case IPV6_ADDR_SCOPE_SITELOCAL<<16: type |= IPV6_ADDR_SITELOCAL; break; }; + type |= IPV6_ADDR_MULTICAST; return type; } if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFE800000)) - return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST); + return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST | + IPV6_ADDR_SCOPE_LINKLOCAL<<16); /* addr-select 3.1 */ if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFEC00000)) - return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST); + return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST | + IPV6_ADDR_SCOPE_SITELOCAL<<16); /* addr-select 3.1 */ if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { if (addr->s6_addr32[2] == 0) { @@ -176,18 +188,52 @@ return IPV6_ADDR_ANY; if (addr->s6_addr32[3] == __constant_htonl(0x00000001)) - return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST); + return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST | + IPV6_ADDR_SCOPE_LINKLOCAL<<16); /* addr-select 3.4 */ - return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST); + return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST | + IPV6_ADDR_SCOPE_GLOBAL<<16); /* addr-select 3.3 */ } if (addr->s6_addr32[2] == __constant_htonl(0x0000ffff)) - return IPV6_ADDR_MAPPED; + return (IPV6_ADDR_MAPPED | + IPV6_ADDR_SCOPE_GLOBAL<<16); /* addr-select 3.3 */ } - return IPV6_ADDR_RESERVED; + return (IPV6_ADDR_RESERVED | + IPV6_ADDR_SCOPE_GLOBAL<<16); /* addr-select 3.4 */ } +/* find 1st bit in difference between the 2 addrs */ +static inline int addr_diff(const void *__a1, const void *__a2, int addrlen) +{ + /* find 1st bit in difference between the 2 addrs. + * bit may be an invalid value, + * but if it is >= plen, the value is ignored in any case. + */ + const u32 *a1 = __a1; + const u32 *a2 = __a2; + int i; + + addrlen >>= 2; + for (i = 0; i < addrlen; i++) { + u32 xb = a1[i] ^ a2[i]; + if (xb) { + int j = 31; + xb = ntohl(xb); + while ((xb & (1 << j)) == 0) + j--; + return (i * 32 + 31 - j); + } + } + return addrlen<<5; +} + +static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2) +{ + return addr_diff(a1->s6_addr, a2->s6_addr, sizeof(struct in6_addr)); +} + static void addrconf_del_timer(struct inet6_ifaddr *ifp) { if (del_timer(&ifp->timer)) @@ -449,122 +495,189 @@ /* * Choose an apropriate source address - * should do: - * i) get an address with an apropriate scope - * ii) see if there is a specific route for the destination and use - * an address of the attached interface - * iii) don't use deprecated addresses + * draft-ietf-ipv6-default-addr-select-09.txt */ -int ipv6_get_saddr(struct dst_entry *dst, - struct in6_addr *daddr, struct in6_addr *saddr) +#define IPV6_SADDRSELECT_SELF 0x01 +#define IPV6_SADDRSELECT_PREFERRED 0x02 +#define IPV6_SADDRSELECT_HOME 0x04 +#define IPV6_SADDRSELECT_PUBLIC 0x08 +#define IPV6_SADDRSELECT_INTERFACE 0x10 +#define IPV6_SADDRSELECT_LABEL 0x20 + +struct addrselect_attrs { + struct inet6_ifaddr *ifp; + u16 flags; + s16 matchlen; + u8 scope; +}; + +int ipv6_dev_get_saddr(struct net_device *daddr_dev, + struct in6_addr *daddr, struct in6_addr *saddr) { - int scope; - struct inet6_ifaddr *ifp = NULL; - struct inet6_ifaddr *match = NULL; - struct net_device *dev = NULL; + int daddr_type, daddr_scope; + u32 daddr_label; + struct inet6_ifaddr *ifp0, *ifp = NULL; + struct net_device *dev; struct inet6_dev *idev; - struct rt6_info *rt; + int err; + int update; + struct addrselect_attrs candidate = {NULL,0,0}; - rt = (struct rt6_info *) dst; - if (rt) - dev = rt->rt6i_dev; - - scope = ipv6_addr_scope(daddr); - if (rt && (rt->rt6i_flags & RTF_ALLONLINK)) { - /* - * route for the "all destinations on link" rule - * when no routers are present - */ - scope = IFA_LINK; - } + daddr_type = __ipv6_addr_type(daddr); + daddr_scope = __ipv6_addr_src_scope(daddr_type); + daddr_label = ipv6_addrselect_label_lookup(daddr, + daddr_dev?daddr_dev->ifindex:0); - /* - * known dev - * search dev and walk through dev addresses - */ + read_lock(&dev_base_lock); + read_lock(&addrconf_lock); + for (dev = dev_base; dev; dev=dev->next) { + idev = __in6_dev_get(dev); - if (dev) { - if (dev->flags & IFF_LOOPBACK) - scope = IFA_HOST; + if (!idev) + continue; - read_lock(&addrconf_lock); - idev = __in6_dev_get(dev); - if (idev) { - read_lock_bh(&idev->lock); - for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) { - if (ifp->scope == scope) { - if (!(ifp->flags & (IFA_F_DEPRECATED|IFA_F_TENTATIVE))) { - in6_ifa_hold(ifp); - read_unlock_bh(&idev->lock); - read_unlock(&addrconf_lock); - goto out; - } - - if (!match && !(ifp->flags & IFA_F_TENTATIVE)) { - match = ifp; - in6_ifa_hold(ifp); - } + /* Rule 0: Candidate Source Address (section 4) + * - multicast and link-local destination address, + * the set of candidate source address MUST only + * include addresses assigned to interfaces + * belonging to the same link as the outgoing + * interface. + * (- For site-local destination addresses, the + * set of candidate source addresses MUST only + * include addresses assigned to interfaces + * belonging to the same site as the outgoing + * interface.) + */ + if ((daddr_type&IPV6_ADDR_MULTICAST || + daddr_scope <= IPV6_ADDR_SCOPE_LINKLOCAL) && + daddr_dev && dev != daddr_dev) + continue; + + read_lock_bh(&idev->lock); + ifp0 = idev->addr_list; + for (ifp=ifp0; ifp; ifp=ifp->if_next) { + struct addrselect_attrs temp = {NULL,0,0}; + int addr_type; + update = 0; + + /* Rule 0: Candidate Source Address (section 4) + * - In any case, anycast addresses, multicast + * addresses, and the unspecified address MUST + * NOT be included in a candidate set. + */ + addr_type = __ipv6_addr_type(&ifp->addr); + if (addr_type == IPV6_ADDR_ANY || + addr_type&IPV6_ADDR_MULTICAST) + continue; + + /* Rule 1: Prefer same address */ + if (ipv6_addr_cmp(&ifp->addr, daddr) == 0) + temp.flags |= IPV6_SADDRSELECT_SELF; + else + temp.flags &= ~IPV6_SADDRSELECT_SELF; + update = (temp.flags&IPV6_SADDRSELECT_SELF) - + (candidate.flags&IPV6_SADDRSELECT_SELF); + if (update < 0) { + continue; + } + + /* Rule 2: Prefer appropriate scope */ + temp.scope = __ipv6_addr_src_scope(addr_type); + if (!update) { + update = temp.scope - candidate.scope; + if (update > 0) { + update = candidate.scope < daddr_scope ? 1 : -1; + } else if (update < 0) { + update = temp.scope < daddr_scope ? -1 : 1; } } - read_unlock_bh(&idev->lock); - } - read_unlock(&addrconf_lock); - } + if (update < 0) { + continue; + } - if (scope == IFA_LINK) - goto out; + /* Rule 3: Avoid deprecated address */ + if (!(ifp->flags & IFA_F_DEPRECATED)) + temp.flags |= IPV6_SADDRSELECT_PREFERRED; + else + temp.flags &= ~IPV6_SADDRSELECT_PREFERRED; + if (!update) + update = (temp.flags&IPV6_SADDRSELECT_PREFERRED) - + (candidate.flags&IPV6_SADDRSELECT_PREFERRED); + if (update < 0) { + continue; + } - /* - * dev == NULL or search failed for specified dev - */ + /* XXX: Rule 4: Prefer home address */ - read_lock(&dev_base_lock); - read_lock(&addrconf_lock); - for (dev = dev_base; dev; dev=dev->next) { - idev = __in6_dev_get(dev); - if (idev) { - read_lock_bh(&idev->lock); - for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) { - if (ifp->scope == scope) { - if (!(ifp->flags&(IFA_F_DEPRECATED|IFA_F_TENTATIVE))) { - in6_ifa_hold(ifp); - read_unlock_bh(&idev->lock); - goto out_unlock_base; - } - - if (!match && !(ifp->flags&IFA_F_TENTATIVE)) { - match = ifp; - in6_ifa_hold(ifp); - } - } + /* Rule 5: Prefer outgoing interface */ + if (daddr_dev == NULL || ifp->idev == NULL || + daddr_dev == ifp->idev->dev) + temp.flags |= IPV6_SADDRSELECT_INTERFACE; + else + temp.flags &= ~IPV6_SADDRSELECT_INTERFACE; + if (!update) + update = (temp.flags&IPV6_SADDRSELECT_INTERFACE) - + (candidate.flags&IPV6_SADDRSELECT_INTERFACE); + if (update < 0) { + continue; + } + + /* XXX: Rule 6: Prefer matching label */ + if (ipv6_addrselect_label_lookup(&ifp->addr, dev->ifindex) == daddr_label) + temp.flags |= IPV6_SADDRSELECT_LABEL; + else + temp.flags &= ~IPV6_SADDRSELECT_LABEL; + if (!update) + update = (temp.flags&IPV6_SADDRSELECT_LABEL) - + (candidate.flags&IPV6_SADDRSELECT_LABEL); + if (update < 0) { + continue; + } + + /* XXX: Rule 7: Prefer public address */ + + /* Rule 8: Use longest matching prefix */ + temp.matchlen = ipv6_addr_diff(&ifp->addr, daddr); + if (!update) + update = temp.matchlen - candidate.matchlen; + if (update < 0) { + continue; } - read_unlock_bh(&idev->lock); + + /* Final Rule */ + if (update <= 0) + continue; + + /* update candidate */ + temp.ifp = ifp; + in6_ifa_hold(ifp); + if (candidate.ifp) + in6_ifa_put(candidate.ifp); + candidate = temp; } + read_unlock_bh(&idev->lock); } - -out_unlock_base: read_unlock(&addrconf_lock); read_unlock(&dev_base_lock); - -out: - if (ifp == NULL) { - ifp = match; - match = NULL; - } - err = -EADDRNOTAVAIL; - if (ifp) { - ipv6_addr_copy(saddr, &ifp->addr); + if (candidate.ifp) { + ipv6_addr_copy(saddr, &candidate.ifp->addr); + in6_ifa_put(candidate.ifp); err = 0; - in6_ifa_put(ifp); + } else { + err = -EADDRNOTAVAIL; } - if (match) - in6_ifa_put(match); - return err; } +int ipv6_get_saddr(struct dst_entry *dst, + struct in6_addr *daddr, struct in6_addr *saddr) +{ + return ipv6_dev_get_saddr(dst ? ((struct rt6_info *)dst)->rt6i_dev : NULL, + daddr, saddr); +} + int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr) { struct inet6_dev *idev; @@ -636,6 +749,69 @@ read_unlock_bh(&addrconf_hash_lock); return ifp; +} + +/* address selection: default policy label */ +/* XXX: user level configuration */ +static struct ipv6_addrselect_label { + struct in6_addr addr; + u16 plen; + u32 ifindex; + u32 label; +} ipv6_addrselect_label_table[] = { + /* ::1/128, label = 0 */ + { + .addr = {{{ [15] = 1 }}}, + .plen = 128, + .label = 0, + }, + /* ::/0, label = 1 */ + { + .plen = 0, + .label = 1, + }, + /* 2002::/16, label = 2 */ + { + .addr = {{{ 0x20, 0x02 }}}, + .plen = 16, + .label = 2, + }, + /* ::/96, label = 3 */ + { + .plen = 96, + .label = 3, + }, + /* ::ffff:0:0/96, label = 4 */ + { + .addr = {{{ [10] = 0xff, [11] = 0xff }}}, + .plen = 96, + .label = 4, + }, + /* sentinel */ + { + .label = 0xffffffff, + } +}; + +static u32 ipv6_addrselect_label_lookup(const struct in6_addr *addr, + int ifindex) +{ + struct ipv6_addrselect_label *p; + int plen, matchlen = -1; + u32 label = 0xffffffff; + + for (p = ipv6_addrselect_label_table; + p->label != 0xffffffff; + p++) { + if (ifindex && p->ifindex && ifindex != p->ifindex) + continue; + plen = ipv6_addr_diff(addr, &p->addr); + if (plen < p->plen || plen < matchlen) + continue; + matchlen = plen; + label = p->label; + } + return label; } /* Gets referenced address, destroys ifaddr */ From greearb@candelatech.com Sat Oct 5 12:23:48 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 12:23:52 -0700 (PDT) Received: from grok.yi.org (IDENT:rbYiFgDYVrcF2bIEF6QDUBnDpN6/LOfm@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g95JNltG032340 for ; Sat, 5 Oct 2002 12:23:48 -0700 Received: from candelatech.com (IDENT:xXe7aqWCyMC9WDYSmrp/AXTlnkH+t78+@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g95JNaq15382; Sat, 5 Oct 2002 12:23:37 -0700 Message-ID: <3D9F3C38.6060608@candelatech.com> Date: Sat, 05 Oct 2002 12:23:36 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: =?ISO-8859-1?Q?Andersson_Bj=F6rn?= CC: netdev@oss.sgi.com, "David S. Miller" Subject: Re: VLAN patches References: <3D980A10.8B06F2C2@ebc.ericsson.se> Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-MIME-Autoconverted: from 8bit to quoted-printable by grok.yi.org id g95JNaq15382 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id g95JNltG032340 X-archive-position: 529 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Dave, please apply this patch if you haven't already, it seems correct to me. Andersson Björn wrote: > Hi, > I hope you are the right receiver of 8021q-patches. > We are running SuSe 8.0, i.e kernel 2.4.18. > > - When addding several egress-mappings we get stuck in an eternal > loop if they end up in the same hash-bucket, see vlan_dev.c.path. > ------------------------------------------------------------------------ > > --- linux-2.4.18.SuSE/net/8021q/vlan_dev.c.orig Wed Mar 27 13:57:17 2002 > +++ linux-2.4.18.SuSE/net/8021q/vlan_dev.c Wed Sep 18 13:19:52 2002 > @@ -570,6 +570,7 @@ > dev_put(dev); > return 0; > } > + mp = mp->next; > } > > /* Create a new mapping then. */ -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From greearb@candelatech.com Sat Oct 5 12:27:19 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 12:27:21 -0700 (PDT) Received: from grok.yi.org (IDENT:pqMIhigNCW1i1814j9C3PCKFJo9HYfwX@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g95JRItG032589 for ; Sat, 5 Oct 2002 12:27:19 -0700 Received: from candelatech.com (IDENT:zSBHfVkCT1BnvyOueMrtWrYW0ToXnAsO@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g95JRFq15859; Sat, 5 Oct 2002 12:27:15 -0700 Message-ID: <3D9F3D13.3080904@candelatech.com> Date: Sat, 05 Oct 2002 12:27:15 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: =?ISO-8859-1?Q?Andersson_Bj=F6rn?= CC: netdev@oss.sgi.com, "David S. Miller" Subject: Re: VLAN patches References: <3D980A10.8B06F2C2@ebc.ericsson.se> Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-MIME-Autoconverted: from 8bit to quoted-printable by grok.yi.org id g95JRFq15859 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id g95JRItG032589 X-archive-position: 530 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev This patch looks good too, though the (vlan_id < 0) test is redundant since vlan_id is an unsigned number. For clarity of code, I wouldn't mind if it stayed in though. Andersson Björn wrote: > Hi, > I hope you are the right receiver of 8021q-patches. > We are running SuSe 8.0, i.e kernel 2.4.18. > - If we try to remove a vlan with VID 0, ifconfig stops working > completly. > We fixed it with vlan.c.patch. > > > > > ------------------------------------------------------------------------ > > --- linux-2.4.18.SuSE/net/8021q/vlan.c.orig Wed Mar 27 13:57:17 2002 > +++ linux-2.4.18.SuSE/net/8021q/vlan.c Wed Sep 18 13:19:13 2002 > @@ -207,7 +207,7 @@ > #endif > > /* sanity check */ > - if ((vlan_id >= VLAN_VID_MASK) || (vlan_id <= 0)) > + if ((vlan_id >= VLAN_VID_MASK) || (vlan_id < 0)) > return -EINVAL; > > spin_lock_bh(&vlan_group_lock); -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From xerox@foonet.net Sat Oct 5 14:43:15 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 14:43:22 -0700 (PDT) Received: from foonix.foonet.net (IDENT:root@foonix.foonet.net [216.207.29.74]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g95Lh9tG001659 for ; Sat, 5 Oct 2002 14:43:10 -0700 Received: from badass (groovy.foonet.net [216.207.29.81]) by foonix.foonet.net (8.11.6/8.11.6) with ESMTP id g95Lh8n04899 for ; Sat, 5 Oct 2002 17:43:08 -0400 From: "CIT/Paul" To: Subject: linux routing problem Date: Sat, 5 Oct 2002 17:43:16 -0400 Organization: CIT Message-ID: <007701c26cb8$36d7a680$4a00000a@badass> MIME-Version: 1.0 X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook, Build 10.0.2616 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Importance: Normal Content-Disposition: inline Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 1137 X-archive-position: 531 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: xerox@foonet.net Precedence: bulk X-list: netdev I am trying to squeeze major performance out of a linux router. I am running into heavy problems getting the speed up to where it needs to be. It seems the #1 problem is the route cache. For every src/dst pair it creates an entry. Why is this? Cisco does not do this. It uses 100% of the cpu when i'm trying to route 100,000 pps with say a million src/dst pairs through the router. Is there a way to disable it? Is there a way to speed up the forwarding rate ? I want to get > 500Kpps out of it. I'm using Intel E1000 NAPI driver and NAPI kernel (2.4.20). When i try and send 100,000 pps through it, the cpu goes to 100% and it deops 80% of the packets. I can see the errors counting up way high on the interface. If I set an iptables rule to block all the packets in the prerouting chain, it uses 16% of the cpu and does not drop many packets (albeit it still drops some probably due to the driver or napi still being somewhat beta).. Any ideas or suggestions on this and how to get it to work without dropping packets would be greatly appreciated!! Thanks! Paul xerox@foonet.net [[HTML alternate version deleted]] From rgooch@vindaloo.ras.ucalgary.ca Sat Oct 5 16:48:40 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 16:48:46 -0700 (PDT) Received: from vindaloo.ras.ucalgary.ca (vindaloo.ras.ucalgary.ca [136.159.55.21]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g95NmdtG002601 for ; Sat, 5 Oct 2002 16:48:40 -0700 Received: (from rgooch@localhost) by vindaloo.ras.ucalgary.ca (8.10.0/8.10.0) id g95NmXK31793; Sat, 5 Oct 2002 17:48:33 -0600 Date: Sat, 5 Oct 2002 17:48:33 -0600 Message-Id: <200210052348.g95NmXK31793@vindaloo.ras.ucalgary.ca> From: Richard Gooch To: netdev@oss.sgi.com Cc: Jeff Garzik , Donald Becker , Jason Lunz , "Patrick R. McManus" , edward_peng@dlink.com.tw Subject: Continuing problems with sundance driver X-archive-position: 532 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rgooch@ras.ucalgary.ca Precedence: bulk X-list: netdev Hi, all. I've been having problems with my D-Link DFE-580TX (4 port EtherNet card using the sundance driver). Using 2.4.19 plus one of Jason's patches (v1.01d), the machine locks up every few days or so. It doesn't respond to pings, nor console activity. Even SysRq is unresponsive. Today I tried 2.4.20-pre9, which has vLK1.05 of the driver. This is even worse, as within a few minutes after bootup, one of the interfaces drops off the net. I get the appended kernel logs. Another problem is that I can't seem to force eth1 to 100 Mb/s FD, despite having the following in /etc/modules.conf: options sundance media='"autosense,100mbps_fd,autosense"' I need to force the interface because the other end doesn't do auto negotiation correctly. According to the kernel logs, eth1 is half duplex. The machine is a Via/Cyrix C3 on a Biostar M6VLR motherboard. I've backed off to 2.4.19 + sundance v1.01d, and am hoping it keeps running until Monday (it's our firewall box, so if you send email to me and get a "no response after 4 hours, still trying" warning, you know why :-(). I don't want to have to go into work again to give it the kick of life. Regards, Richard.... Permanent: rgooch@atnf.csiro.au Current: rgooch@ras.ucalgary.ca =============================================================================== Oct 5 15:15:59 sundance.c:v1.01+LK1.05 28-Sep-2002 Written by Donald Becker Oct 5 15:15:59 http://www.scyld.com/network/sundance.html Oct 5 15:15:59 eth0: D-Link DFE-580TX 4 port Server Adapter at 0xc000, 00:05:5d:10:4d:b8, IRQ 5. Oct 5 15:15:59 eth0: MII PHY found at address 1, status 0x782d advertising 01e1. Oct 5 15:15:59 eth1: D-Link DFE-580TX 4 port Server Adapter at 0xc400, 00:05:5d:10:4d:b9, IRQ 12. Oct 5 15:15:59 eth1: MII PHY found at address 1, status 0x782d advertising 01e1. Oct 5 15:15:59 eth2: D-Link DFE-580TX 4 port Server Adapter at 0xc800, 00:05:5d:10:4d:ba, IRQ 10. Oct 5 15:15:59 eth2: MII PHY found at address 1, status 0x782d advertising 01e1. Oct 5 15:15:59 eth3: D-Link DFE-580TX 4 port Server Adapter at 0xcc00, 00:05:5d:10:4d:bb, IRQ 11. Oct 5 15:15:59 eth3: MII PHY found at address 1, status 0x7809 advertising 01e1. Oct 5 15:15:59 eth0: Link changed: Oct 5 15:15:59 eth1: Link changed: Oct 5 15:15:59 eth0: Link changed: 100Mbps, full duplex Oct 5 15:15:59 eth1: Link changed: 100Mbps, half duplex Oct 5 15:15:59 eth2: Link changed: 100Mbps, full duplex Oct 5 15:17:48 NETDEV WATCHDOG: eth1: transmit timed out Oct 5 15:17:48 eth1: Transmit timed out, TxStatus 00 TxFrameId 31, resetting... Oct 5 15:17:48 Rx ring cf7a7000: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Oct 5 15:17:48 Tx ring cf78a000: 00008001 00008005 00008009 0000800d 00008011 00008015 00008019 0000801d 00008021 00008025 00008029 0000802d 00008031 00008035 00008039 0000803d 00008041 00008045 00008049 0000804d 00008051 00008055 00008059 0000805d 00008061 00008065 00008069 0000806d 00008071 00008075 00008079 0000807d 00008081 00008085 00008089 0000808d 00008091 00008095 00008099 0000809d 000080a1 000080a5 000080a9 000080ad 000080b1 000080b5 000080b9 000180bd 000180c1 000180c5 000180c9 000080cd 000080d1 000080d5 000080d9 000080dd 000080e1 000080e5 000080e9 000080ed 000080f1 000080f5 000080f9 000080fd Oct 5 15:17:48 cur_tx=303 dirty_tx=241 Oct 5 15:17:48 cur_rx=6 dirty_rx=6 Oct 5 15:18:40 NETDEV WATCHDOG: eth1: transmit timed out Oct 5 15:18:40 eth1: Transmit timed out, TxStatus 00 TxFrameId 00, resetting... Oct 5 15:18:40 Rx ring cf7a7000: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Oct 5 15:18:40 Tx ring cf78a000: 00018001 00018005 00018009 0001800d 00018011 00018015 00018019 0001801d 00018021 00018025 00018029 0001802d 00018031 00018035 00018039 0001803d 00018041 00018045 00018049 0001804d 00018051 00018055 00018059 0001805d 00018061 00018065 00018069 0001806d 00018071 00018075 00018079 0000807d 00008081 00008085 00008089 0000808d 00008091 00008095 00008099 0000809d 000080a1 000080a5 000080a9 000080ad 000080b1 000080b5 000080b9 000080bd 000080c1 000080c5 000080c9 000080cd 000080d1 000080d5 000080d9 000080dd 000080e1 000080e5 000080e9 000080ed 000080f1 000080f5 000080f9 000080fd Oct 5 15:18:40 cur_tx=62 dirty_tx=0 Oct 5 15:18:40 cur_rx=32 dirty_rx=32 Oct 5 15:18:48 NETDEV WATCHDOG: eth1: transmit timed out Oct 5 15:18:48 eth1: Transmit timed out, TxStatus 00 TxFrameId 00, resetting... Oct 5 15:18:48 Rx ring cf7a7000: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Oct 5 15:18:48 Tx ring cf78a000: 00018001 00018005 00018009 0001800d 00018011 00018015 00018019 0001801d 00018021 00018025 00018029 0001802d 00018031 00018035 00018039 0001803d 00018041 00018045 00018049 0001804d 00018051 00018055 00018059 0001805d 00018061 00018065 00018069 0001806d 00018071 00018075 00018079 0000807d 00008081 00008085 00008089 0000808d 00008091 00008095 00008099 0000809d 000080a1 000080a5 000080a9 000080ad 000080b1 000080b5 000080b9 000080bd 000080c1 000080c5 000080c9 000080cd 000080d1 000080d5 000080d9 000080dd 000080e1 000080e5 000080e9 000080ed 000080f1 000080f5 000080f9 000080fd Oct 5 15:18:48 cur_tx=0 dirty_tx=0 Oct 5 15:18:48 cur_rx=32 dirty_rx=32 Oct 5 15:19:28 NETDEV WATCHDOG: eth1: transmit timed out Oct 5 15:19:28 eth1: Transmit timed out, TxStatus 00 TxFrameId 00, resetting... Oct 5 15:19:28 Rx ring cf7a7000: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Oct 5 15:19:28 Tx ring cf78a000: 00018001 00018005 00018009 0001800d 00018011 00018015 00018019 0001801d 00018021 00018025 00018029 0001802d 00018031 00018035 00018039 0001803d 00018041 00018045 00018049 0001804d 00018051 00018055 00018059 0001805d 00018061 00008065 00008069 0000806d 00008071 00008075 00008079 0000807d 00008081 00008085 00008089 0000808d 00008091 00008095 00008099 0000809d 000080a1 000080a5 000080a9 000080ad 000080b1 000080b5 000080b9 000080bd 000080c1 000080c5 000080c9 000080cd 000080d1 000080d5 000080d9 000080dd 000080e1 000080e5 000080e9 000080ed 000080f1 000080f5 000080f9 000080fd Oct 5 15:19:28 cur_tx=62 dirty_tx=0 Oct 5 15:19:28 cur_rx=27 dirty_rx=27 Oct 5 15:19:36 NETDEV WATCHDOG: eth1: transmit timed out Oct 5 15:19:36 eth1: Transmit timed out, TxStatus 00 TxFrameId 00, resetting... Oct 5 15:19:36 Rx ring cf7a7000: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Oct 5 15:19:36 Tx ring cf78a000: 00018001 00018005 00018009 0001800d 00018011 00018015 00018019 0001801d 00018021 00018025 00018029 0001802d 00018031 00018035 00018039 0001803d 00018041 00018045 00018049 0001804d 00018051 00018055 00018059 0001805d 00018061 00008065 00008069 0000806d 00008071 00008075 00008079 0000807d 00008081 00008085 00008089 0000808d 00008091 00008095 00008099 0000809d 000080a1 000080a5 000080a9 000080ad 000080b1 000080b5 000080b9 000080bd 000080c1 000080c5 000080c9 000080cd 000080d1 000080d5 000080d9 000080dd 000080e1 000080e5 000080e9 000080ed 000080f1 000080f5 000080f9 000080fd Oct 5 15:19:36 cur_tx=0 dirty_tx=0 Oct 5 15:19:36 cur_rx=27 dirty_rx=27 Oct 5 15:19:43 Kernel logging (proc) stopped. Oct 5 15:19:43 Kernel log daemon terminating. From greearb@candelatech.com Sat Oct 5 20:39:04 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 20:39:10 -0700 (PDT) Received: from grok.yi.org (IDENT:F57zJALUJzTAJ8lxZTqzeVswQp5i5ugo@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g963d3tG005273 for ; Sat, 5 Oct 2002 20:39:04 -0700 Received: from candelatech.com (IDENT:5GX2fCzScULfIko/XgqG5n0PBYCHVCFx@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g963cxq22343; Sat, 5 Oct 2002 20:38:59 -0700 Message-ID: <3D9FB053.4040001@candelatech.com> Date: Sat, 05 Oct 2002 20:38:59 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: linux-kernel , "'netdev@oss.sgi.com'" Subject: Update on e1000 troubles (over-heating!) Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 533 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev I believe I have figured out why the e1000 crashed my machine after .5 - 1 hours: The NIC was over-heating. I measured one of the NICs after the machine crashed with an external (cheap) temp probe. It registered right at 50 degrees C, and this was about 15-30 seconds after it crashed. The dual e1000 NIC I have seems to run much cooler, and has been running at 430Mbps bi-directional on both ports for about 6 hours now with no obvious problems. So, I'm going to try to purchase some heat sinks and glue them onto the e1000 server nics, to see if that fixes the problem. Hope this proves useful to anyone experiencing similar strange crashes! Thanks, Ben -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From andre@pyxtechnologies.com Sat Oct 5 20:49:55 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 20:49:57 -0700 (PDT) Received: from master.linux-ide.org (astound-64-85-224-253.ca.astound.net [64.85.224.253]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g963nstG005691 for ; Sat, 5 Oct 2002 20:49:55 -0700 Received: from localhost (andre@localhost) by master.linux-ide.org (8.9.3/8.9.3) with ESMTP id UAA23724; Sat, 5 Oct 2002 20:47:22 -0700 Date: Sat, 5 Oct 2002 20:47:21 -0700 (PDT) From: Andre Hedrick X-Sender: andre@master.linux-ide.org To: Ben Greear cc: linux-kernel , "'netdev@oss.sgi.com'" Subject: Re: Update on e1000 troubles (over-heating!) In-Reply-To: <3D9FB053.4040001@candelatech.com> Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 534 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: andre@pyxtechnologies.com Precedence: bulk X-list: netdev I have a pair of Compaq e1000's which have never overheated, and I use them for heavy duty iSCSI testing and designing of drivers. These are massive 66/64 cards but still nothing like what you are reporting. I will look some more at the issue soon. Cheers, Andre Hedrick iSCSI Software Solutions Provider http://www.PyXTechnologies.com/ On Sat, 5 Oct 2002, Ben Greear wrote: > I believe I have figured out why the e1000 crashed my machine > after .5 - 1 hours: The NIC was over-heating. I measured one of > the NICs after the machine crashed with an external (cheap) temp > probe. It registered right at 50 degrees C, and this was about 15-30 > seconds after it crashed. > > The dual e1000 NIC I have seems to run much cooler, and has been > running at 430Mbps bi-directional on both ports for about 6 hours now > with no obvious problems. > > So, I'm going to try to purchase some heat sinks and glue them onto > the e1000 server nics, to see if that fixes the problem. > > Hope this proves useful to anyone experiencing similar strange > crashes! > > Thanks, > Ben > > -- > Ben Greear > President of Candela Technologies Inc http://www.candelatech.com > ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear > > > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > From davem@redhat.com Sat Oct 5 21:24:29 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 21:24:34 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g964OTtG006269 for ; Sat, 5 Oct 2002 21:24:29 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id VAA06095; Sat, 5 Oct 2002 21:17:54 -0700 Date: Sat, 05 Oct 2002 21:17:53 -0700 (PDT) Message-Id: <20021005.211753.25232925.davem@redhat.com> To: greearb@candelatech.com Cc: Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches From: "David S. Miller" In-Reply-To: <3D9F3D13.3080904@candelatech.com> References: <3D980A10.8B06F2C2@ebc.ericsson.se> <3D9F3D13.3080904@candelatech.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 535 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Ben Greear Date: Sat, 05 Oct 2002 12:27:15 -0700 This patch looks good too, though the (vlan_id < 0) test is redundant since vlan_id is an unsigned number. For clarity of code, I wouldn't mind if it stayed in though. VLAN ID zero is illegal. You should not use ifconfig with a VID of zero. From greearb@candelatech.com Sat Oct 5 21:29:30 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 21:29:32 -0700 (PDT) Received: from grok.yi.org (IDENT:rOK4IPzFCsf/qM8fJa0/5invogP/KbMF@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g964TTtG006630 for ; Sat, 5 Oct 2002 21:29:30 -0700 Received: from candelatech.com (IDENT:PF6m/pSwnW4SISG/6QEb7x9ANc5qPk33@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g964TSq04083 for ; Sat, 5 Oct 2002 21:29:28 -0700 Message-ID: <3D9FBC28.8050807@candelatech.com> Date: Sat, 05 Oct 2002 21:29:28 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "'netdev@oss.sgi.com'" Subject: PATCH: send-to-self: smaller & better Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 536 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev I went and took out all the code that Alexey said was dead. It appears he was right :) Anyway, here is a smaller patch that seems to work fine: --- linux-2.4.19/include/linux/sockios.h Wed Nov 7 15:39:36 2001 +++ linux-2.4.19.dev/include/linux/sockios.h Sat Oct 5 20:23:48 2002 @@ -114,6 +114,16 @@ #define SIOCBONDINFOQUERY 0x8994 /* rtn info about bond state */ #define SIOCBONDCHANGEACTIVE 0x8995 /* update to a new active slave */ + +/* Ben's little hack land */ +#define SIOCSACCEPTLOCALADDRS 0x89a0 /* Allow interfaces to accept pkts from + * local interfaces...use with SO_BINDTODEVICE + */ +#define SIOCGACCEPTLOCALADDRS 0x89a1 /* Allow interfaces to accept pkts from + * local interfaces...use with SO_BINDTODEVICE + */ + + /* Device private ioctl calls */ /* --- linux-2.4.19/net/ipv4/arp.c Fri Aug 2 17:39:46 2002 +++ linux-2.4.19.dev/net/ipv4/arp.c Sat Oct 5 20:23:48 2002 @@ -1,4 +1,4 @@ -/* linux/net/inet/arp.c +/* linux/net/inet/arp.c -*-linux-c-*- * * Version: $Id: arp.c,v 1.99 2001/08/30 22:55:42 davem Exp $ * @@ -351,12 +351,22 @@ int flag = 0; /*unsigned long now; */ - if (ip_route_output(&rt, sip, tip, 0, 0) < 0) + if (ip_route_output(&rt, sip, tip, 0, 0) < 0) return 1; - if (rt->u.dst.dev != dev) { - NET_INC_STATS_BH(ArpFilter); - flag = 1; - } + + if (rt->u.dst.dev != dev) { + if ((dev->priv_flags & IFF_ACCEPT_LOCAL_ADDRS) && + (rt->u.dst.dev == &loopback_dev)) { + /* OK, we'll let this special case slide, so that we can arp from one + * local interface to another. This seems to work, but could use some + * review. --Ben + */ + } + else { + NET_INC_STATS_BH(ArpFilter); + flag = 1; + } + } ip_rt_put(rt); return flag; } --- linux-2.4.19/net/ipv4/fib_frontend.c Fri Aug 2 17:39:46 2002 +++ linux-2.4.19.dev/net/ipv4/fib_frontend.c Sat Oct 5 20:23:48 2002 @@ -233,8 +233,17 @@ if (fib_lookup(&key, &res)) goto last_resort; - if (res.type != RTN_UNICAST) - goto e_inval_res; + + if (res.type != RTN_UNICAST) { + if ((res.type == RTN_LOCAL) && + (dev->priv_flags & IFF_ACCEPT_LOCAL_ADDRS)) { + /* All is OK */ + } + else { + goto e_inval_res; + } + } + *spec_dst = FIB_RES_PREFSRC(res); fib_combine_itag(itag, &res); #ifdef CONFIG_IP_ROUTE_MULTIPATH --- linux-2.4.19/net/ipv4/tcp_ipv4.c Fri Aug 2 17:39:46 2002 +++ linux-2.4.19.dev/net/ipv4/tcp_ipv4.c Sat Oct 5 20:24:45 2002 @@ -1394,7 +1394,7 @@ #define want_cookie 0 /* Argh, why doesn't gcc optimize this :( */ #endif - /* Never answer to SYNs send to broadcast or multicast */ + /* Never answer to SYNs sent to broadcast or multicast */ if (((struct rtable *)skb->dst)->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) goto drop; --- linux-2.4.19/net/core/dev.c Sat Oct 5 20:40:21 2002 +++ linux-2.4.19.dev/net/core/dev.c Sat Oct 5 20:25:30 2002 @@ -2153,6 +2183,24 @@ notifier_call_chain(&netdev_chain, NETDEV_CHANGENAME, dev); return 0; + case SIOCSACCEPTLOCALADDRS: + if (ifr->ifr_flags) { + dev->priv_flags |= IFF_ACCEPT_LOCAL_ADDRS; + } + else { + dev->priv_flags &= ~IFF_ACCEPT_LOCAL_ADDRS; + } + return 0; + + case SIOCGACCEPTLOCALADDRS: + if (dev->priv_flags & IFF_ACCEPT_LOCAL_ADDRS) { + ifr->ifr_flags = 1; + } + else { + ifr->ifr_flags = 0; + } + return 0; + /* * Unknown or private ioctl */ @@ -2249,6 +2297,7 @@ case SIOCGIFMAP: case SIOCGIFINDEX: case SIOCGIFTXQLEN: + case SIOCGACCEPTLOCALADDRS: dev_load(ifr.ifr_name); read_lock(&dev_base_lock); ret = dev_ifsioc(&ifr, cmd); @@ -2312,6 +2361,7 @@ case SIOCBONDSLAVEINFOQUERY: case SIOCBONDINFOQUERY: case SIOCBONDCHANGEACTIVE: + case SIOCSACCEPTLOCALADDRS: if (!capable(CAP_NET_ADMIN)) return -EPERM; dev_load(ifr.ifr_name); -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From greearb@candelatech.com Sat Oct 5 21:31:55 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 21:31:59 -0700 (PDT) Received: from grok.yi.org (IDENT:eNIFpP1+F6bPS9ILwG3jVglaV7NCc8Q5@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g964VttG006800 for ; Sat, 5 Oct 2002 21:31:55 -0700 Received: from candelatech.com (IDENT:3EkJgcsBJrkxgOOgEGY3HBNm0VZlAiMu@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g964Vjq04371; Sat, 5 Oct 2002 21:31:45 -0700 Message-ID: <3D9FBCB1.9080904@candelatech.com> Date: Sat, 05 Oct 2002 21:31:45 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" CC: Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches References: <3D980A10.8B06F2C2@ebc.ericsson.se> <3D9F3D13.3080904@candelatech.com> <20021005.211753.25232925.davem@redhat.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 537 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev David S. Miller wrote: > From: Ben Greear > Date: Sat, 05 Oct 2002 12:27:15 -0700 > > This patch looks good too, though the (vlan_id < 0) test > is redundant since vlan_id is an unsigned number. For > clarity of code, I wouldn't mind if it stayed in though. > > VLAN ID zero is illegal. You should not use ifconfig > with a VID of zero. > As someone mentioned, vlan of 0 may be used to do a priority-only type of VLAN. I don't know how much this makes sense though... If we do decide to restrict it, the right place to restrict is in the creation clause, not the deletion code, as exists now. -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From davem@redhat.com Sat Oct 5 22:12:24 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 22:12:28 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g965COtG007611 for ; Sat, 5 Oct 2002 22:12:24 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id WAA06363; Sat, 5 Oct 2002 22:05:50 -0700 Date: Sat, 05 Oct 2002 22:05:49 -0700 (PDT) Message-Id: <20021005.220549.15266753.davem@redhat.com> To: greearb@candelatech.com Cc: Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches From: "David S. Miller" In-Reply-To: <3D9FBCB1.9080904@candelatech.com> References: <3D9F3D13.3080904@candelatech.com> <20021005.211753.25232925.davem@redhat.com> <3D9FBCB1.9080904@candelatech.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 538 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Ben Greear Date: Sat, 05 Oct 2002 21:31:45 -0700 As someone mentioned, vlan of 0 may be used to do a priority-only type of VLAN. I don't know how much this makes sense though... If we do decide to restrict it, the right place to restrict is in the creation clause, not the deletion code, as exists now. I think we should, please submit a patch which denies it on both config and delete. My most recent reading of 802.1q made it very clear that VID 0 is special and should not be assigned to any interface. From davem@redhat.com Sat Oct 5 22:15:39 2002 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Oct 2002 22:15:41 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g965FdtG007783 for ; Sat, 5 Oct 2002 22:15:39 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id WAA06411; Sat, 5 Oct 2002 22:09:01 -0700 Date: Sat, 05 Oct 2002 22:09:01 -0700 (PDT) Message-Id: <20021005.220901.133288973.davem@redhat.com> To: greearb@candelatech.com Cc: Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches From: "David S. Miller" In-Reply-To: <3D9F3C38.6060608@candelatech.com> References: <3D980A10.8B06F2C2@ebc.ericsson.se> <3D9F3C38.6060608@candelatech.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 539 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Ben Greear Date: Sat, 05 Oct 2002 12:23:36 -0700 Dave, please apply this patch if you haven't already, it seems correct to me. Applied to both 2.4.x and 2.5.x sources, thanks. From scott.feldman@intel.com Sun Oct 6 05:21:48 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 05:21:53 -0700 (PDT) Received: from petasus.ch.intel.com (petasus.ch.intel.com [143.182.124.5]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g96CLmtG015534 for ; Sun, 6 Oct 2002 05:21:48 -0700 Received: from fmsmsxvs043.fm.intel.com (fmsmsxvs043.fm.intel.com [132.233.42.129]) by petasus.ch.intel.com (8.11.6/8.11.6/d: solo.mc,v 1.46 2002/09/23 20:41:22 dmccart Exp $) with SMTP id g96CNJs15556 for ; Sun, 6 Oct 2002 12:23:19 GMT Received: from fmsmsx26.fm.intel.com ([132.233.42.26]) by fmsmsxvs043.fm.intel.com (NAVGW 2.5.2.11) with SMTP id M2002100600320223377 ; Sun, 06 Oct 2002 00:32:02 -0700 Received: by fmsmsx26.fm.intel.com with Internet Mail Service (5.5.2653.19) id ; Sun, 6 Oct 2002 00:33:40 -0700 Message-ID: <288F9BF66CD9D5118DF400508B68C44604758AF7@orsmsx113.jf.intel.com> From: "Feldman, Scott" To: "'Ben Greear'" Cc: linux-kernel , "'netdev@oss.sgi.com'" Subject: RE: Update on e1000 troubles (over-heating!) Date: Sun, 6 Oct 2002 00:33:38 -0700 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) Content-Type: text/plain X-archive-position: 540 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev > I believe I have figured out why the e1000 crashed my machine > after .5 - 1 hours: The NIC was over-heating. I measured > one of the NICs after the machine crashed with an external > (cheap) temp probe. It registered right at 50 degrees C, and > this was about 15-30 seconds after it crashed. Ben, please send lspci -x on the hot nic. -scott From mlpi_uy_rff03dw@amazon.com Sun Oct 6 13:18:44 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 13:18:46 -0700 (PDT) Received: from [211.161.221.50] (sw59-153-166.adsl.seed.net.tw [61.59.153.166]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g96KIgtG022583 for ; Sun, 6 Oct 2002 13:18:43 -0700 Received: from [211.161.42.50] by [211.161.37.50] with SMTP (MDaemon.v2.7.SP4.R) for ; Sat, 05 Oct 2002 10:01:33 +0800 From: mlpi_uy_rff03dw@amazon.com To: netdev@oss.sgi.com Subject: =?ISO-8859-1?Q?=B1=A1=BD=EC=A5=CE=AB~?= =?ISO-8859-1?Q?=BA=F4=B8=F4=C1=CA=AA=AB=B0=D3=AB=B0?= Reply-To: n3qv_coe_e3cbiy@bloomberg.com Date: 05 Oct 2002 10:13:36 +0800 Received: from login_0216.mailservice.net (mx.service.net[206.232.231.77] (may be forged)) by [192.201.131.147] (8.8.5/8.7.3) with SMTP id XAA03254; ¬P´Á¥| 22 ¤K¤ë 2002 06:16:37 -0700 (EDT) Reply-To: receive_adm@topservice.net.sgi.com X-PMFLAGS: 10326341.10 X-UIDL: 10293217_192832.222 Comments: Authenticated Sender is Message-Id: <57269272_90816187> MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit X-MDaemon-Deliver-To: netdev@oss.sgi.com X-Return-Path: mlpi_uy_rff03dw@amazon.com X-archive-position: 541 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mlpi_uy_rff03dw@amazon.com Precedence: bulk X-list: netdev µL¼ÐÃD¤å¥ó

±¡½ì¥Î«~ºô¸ôÁʪ«°Ó«°

¦pªG±z¨S¿³½ì©Î¬O¥¼¦¨¦~¡A½Ð¤Å¶i¤J.

§Ú­Ì¾Ö¦³³Ì·s©_©M³Ì¦hºØÃþªº±¡½ì¥Î«~

¸Û¼°Áܽбz¨Ó°ÑÆ[

¶i¤J

 

From kundrat@kundrat.sk Sun Oct 6 15:21:44 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 15:21:49 -0700 (PDT) Received: from polomer.sinet.sk (root@polomer.sinet.sk [62.169.169.8]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g96MLgtG024423 for ; Sun, 6 Oct 2002 15:21:44 -0700 Received: from ham.kundrat.sk (root@kundrat.sk [62.169.163.77]) by polomer.sinet.sk (8.9.3/8.9.3/Debian/GNU) with ESMTP id AAA26983 for ; Mon, 7 Oct 2002 00:21:41 +0200 X-Authentication-Warning: polomer.sinet.sk: Host root@kundrat.sk [62.169.163.77] claimed to be ham.kundrat.sk Received: from ham.kundrat.sk (kundrat@localhost [127.0.0.1]) by ham.kundrat.sk (8.12.2/8.12.2/Debian -1) with ESMTP id g96MMWAX007792 for ; Mon, 7 Oct 2002 00:22:32 +0200 Received: (from kundrat@localhost) by ham.kundrat.sk (8.12.2/8.12.2/Debian -1) id g96MMVfc007790 for netdev@oss.sgi.com; Mon, 7 Oct 2002 00:22:31 +0200 From: Peter Kundrat Date: Mon, 7 Oct 2002 00:22:31 +0200 To: netdev@oss.sgi.com Subject: cbq parent doesnt limit child Message-ID: <20021006222231.GA7763@napri.sk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.27i X-archive-position: 542 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kundrat@kundrat.sk Precedence: bulk X-list: netdev Hello, I experienced following unexpected behavior wrt. cbq - if child_rate > parent_rate .. child gets its full bandwidth, so apparently parent_rate is not respected. In http://lartc.org/howto/lartc.qdisc.classful.html is following comment (section 9.5.2.2): In short, nested classes ONLY talk to their parent qdiscs, never to an interface. Only the root qdisc gets dequeued by the kernel! The upshot of this is that classes never get dequeued faster than their parents allow. And this is exactly what we want: this way we can have SFQ in an inner class, which doesn't do any shaping, only scheduling, and have a shaping outer qdisc, which does the shaping. Observed behavior doesnt correspond to that description though. I understand that configuring child_rate > parent_rate doesnt make much sense (except for correctness test), so that behavivor could be considered a feature, not a bug. In that case, maybe only documentation/howto should be corrected, correct? Thanks, Peter PS: For the record, its kernel 2.4.19pre7 and this setup: tc qdisc add dev eth0 root handle 2: cbq bandwidth 10mbit avpkt 1000 mpu 64 # root class tc class add dev eth0 parent 2:0 classid 2:1 est 1sec 8sec cbq \ bandwidth 10mbit rate 10mbit maxburst 1 weight 10mbit prio 1 \ allot 1514 avpkt 1000 tc class add dev eth0 parent 2:1 classid 2:10 est 1sec 8sec cbq \ bandwidth 10mbit rate 8000 maxburst 1 weight 8000 prio 1 \ allot 1514 avpkt 1000 bounded tc class add dev eth0 parent 2:10 classid 2:20 est 1sec 8sec cbq \ bandwidth 10mbit rate 16000 maxburst 1 weight 16000 prio 1 \ allot 1514 avpkt 1000 bounded tc filter add dev eth0 parent 2:0 prio 59900 protocol ip u32 \ match ip dst 10.10.10.111/32 flowid 2:20 -- Peter Kundrat peter@kundrat.sk From hadi@cyberus.ca Sun Oct 6 15:42:31 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 15:42:37 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g96MgVtG024875 for ; Sun, 6 Oct 2002 15:42:31 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id SAA11435; Sun, 6 Oct 2002 18:42:30 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g96MZGD05319; Sun, 6 Oct 2002 18:35:17 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Sun, 6 Oct 2002 18:35:16 -0400 (EDT) From: jamal To: CIT/Paul cc: Subject: Re: linux routing problem In-Reply-To: <007701c26cb8$36d7a680$4a00000a@badass> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 543 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev I am sensisng your problem has nothing to do with the route cache rather netfilter. Turn off netfilter in the kernel compile. Test the new kernel and post the results. cheers, jamal On Sat, 5 Oct 2002, CIT/Paul wrote: > I am trying to squeeze major performance out of a linux router. I am > running into heavy problems getting the speed > up to where it needs to be. It seems the #1 problem is the route > cache. For every src/dst pair it creates an entry. Why is this? > Cisco does not do this. It uses 100% of the cpu when i'm trying to > route 100,000 pps with say a million src/dst pairs through > the router. Is there a way to disable it? Is there a way to speed up > the forwarding rate ? I want to get > 500Kpps out of it. > I'm using Intel E1000 NAPI driver and NAPI kernel (2.4.20). When i try > and send 100,000 pps through it, the cpu goes to 100% and it deops 80% > of the > packets. I can see the errors counting up way high on the interface. > If I set an iptables rule to block all the packets in the prerouting > chain, it uses > 16% of the cpu and does not drop many packets (albeit it still drops > some probably due to the driver or napi still being somewhat beta).. > > Any ideas or suggestions on this and how to get it to work without > dropping packets would be greatly appreciated!! > > Thanks! > > Paul xerox@foonet.net > > > [[HTML alternate version deleted]] > > > From hadi@cyberus.ca Sun Oct 6 15:46:07 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 15:46:08 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g96Mk6tG025185 for ; Sun, 6 Oct 2002 15:46:07 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id SAA12154; Sun, 6 Oct 2002 18:45:57 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g96McWS05327; Sun, 6 Oct 2002 18:38:33 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Sun, 6 Oct 2002 18:38:32 -0400 (EDT) From: jamal To: Andre Hedrick cc: Ben Greear , linux-kernel , "'netdev@oss.sgi.com'" Subject: Re: Update on e1000 troubles (over-heating!) In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 544 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Sat, 5 Oct 2002, Andre Hedrick wrote: > > I have a pair of Compaq e1000's which have never overheated, and I use > them for heavy duty iSCSI testing and designing of drivers. These are > massive 66/64 cards but still nothing like what you are reporting. > > I will look some more at the issue soon. > It seems like the prerequisite to reproduce it is you beat the NIC heavily with a lot of packets/sec and then run it at that sustained rate for at least 30 minutes. isci would tend to use MTU sized packets which will not be that effective. cheers, jamal From hadi@cyberus.ca Sun Oct 6 15:55:10 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 15:55:14 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g96MtAtG025607 for ; Sun, 6 Oct 2002 15:55:10 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id SAA14056; Sun, 6 Oct 2002 18:55:05 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g96Mlow05342; Sun, 6 Oct 2002 18:47:51 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Sun, 6 Oct 2002 18:47:50 -0400 (EDT) From: jamal To: "David S. Miller" cc: , , Subject: Re: VLAN patches In-Reply-To: <20021005.220549.15266753.davem@redhat.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 545 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Sat, 5 Oct 2002, David S. Miller wrote: > I think we should, please submit a patch which denies it on > both config and delete. > A packet with VLANid 0 and an 802.1p tag > 0 is legal. I think its known as a "priority tagged" packet (not 100% sure about the term). Therefore VLANid 0 MUST be accepted and ability to send it should be there. BTW, what about VLANid 0xFFF? cheers, jamal From andre@pyxtechnologies.com Sun Oct 6 17:17:35 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 17:17:39 -0700 (PDT) Received: from master.linux-ide.org (astound-64-85-224-253.ca.astound.net [64.85.224.253]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g970HYtG027991 for ; Sun, 6 Oct 2002 17:17:34 -0700 Received: from localhost (andre@localhost) by master.linux-ide.org (8.9.3/8.9.3) with ESMTP id RAA28912; Sun, 6 Oct 2002 17:14:51 -0700 Date: Sun, 6 Oct 2002 17:14:51 -0700 (PDT) From: Andre Hedrick X-Sender: andre@master.linux-ide.org To: jamal cc: Ben Greear , linux-kernel , "'netdev@oss.sgi.com'" Subject: Re: Update on e1000 troubles (over-heating!) In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 546 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: andre@pyxtechnologies.com Precedence: bulk X-list: netdev However doing a data integrity test with a pattern buffer write-verify-read on multi-lun, multi-session, and multiple connections per session, while issuing load-balancing commands (ie thread tag) over each session to roast the bandwidth of the line should be enough. Now toss in injected errors to randomly fail data pdu's and calling a sync-and-steering layer to scan the header and or data digests to execute a within connection recovery, regardless if the reason, should be enough to warm up the beast. If that is not enough, I can toss in multi-initiators all with the features above or invoke the interoperablity modes to add the cisco and ibm initiator (both limited to error recovery level zero, while pyx's is capable of error recovery level one and part of two). Please let me know if I need to throttle it harder. Cheers, On Sun, 6 Oct 2002, jamal wrote: > > > On Sat, 5 Oct 2002, Andre Hedrick wrote: > > > > > I have a pair of Compaq e1000's which have never overheated, and I use > > them for heavy duty iSCSI testing and designing of drivers. These are > > massive 66/64 cards but still nothing like what you are reporting. > > > > I will look some more at the issue soon. > > > > It seems like the prerequisite to reproduce it is you beat the NIC heavily > with a lot of packets/sec and then run it at that sustained rate for at > least 30 minutes. isci would tend to use MTU sized packets which will > not be that effective. > > cheers, > jamal > > > > Andre Hedrick iSCSI Software Solutions Provider http://www.PyXTechnologies.com/ From davem@redhat.com Sun Oct 6 19:53:44 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 19:53:46 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g972rhtG000771 for ; Sun, 6 Oct 2002 19:53:43 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id TAA20126; Sun, 6 Oct 2002 19:46:54 -0700 Date: Sun, 06 Oct 2002 19:46:54 -0700 (PDT) Message-Id: <20021006.194654.35505461.davem@redhat.com> To: hadi@cyberus.ca Cc: greearb@candelatech.com, Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches From: "David S. Miller" In-Reply-To: References: <20021005.220549.15266753.davem@redhat.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 547 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: jamal Date: Sun, 6 Oct 2002 18:47:50 -0400 (EDT) A packet with VLANid 0 and an 802.1p tag > 0 is legal. I think its known as a "priority tagged" packet (not 100% sure about the term). Therefore VLANid 0 MUST be accepted and ability to send it should be there. Great, I stand corrected, please send me a patch which therefore accepts VID 0 on create and destroy. BTW, what about VLANid 0xFFF? Your guess is as good as mine ;-) From greearb@candelatech.com Sun Oct 6 20:36:11 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 20:36:17 -0700 (PDT) Received: from grok.yi.org (IDENT:UQOO7OvJB/sN0x2GIxsAC6J6eXQGPyF2@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g973aAtG002852 for ; Sun, 6 Oct 2002 20:36:10 -0700 Received: from candelatech.com (IDENT:W2DTgxJPcHUgPvVzN1AaFcJbXm0mS+oQ@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g973Zcq28924; Sun, 6 Oct 2002 20:35:38 -0700 Message-ID: <3DA1010A.8020202@candelatech.com> Date: Sun, 06 Oct 2002 20:35:38 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" CC: hadi@cyberus.ca, Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches References: <20021005.220549.15266753.davem@redhat.com> <20021006.194654.35505461.davem@redhat.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 548 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev David S. Miller wrote: > From: jamal > Date: Sun, 6 Oct 2002 18:47:50 -0400 (EDT) > > A packet with VLANid 0 and an 802.1p tag > 0 is legal. I > think its known as a "priority tagged" packet (not 100% sure > about the term). Therefore VLANid 0 MUST be accepted and ability to send > it should be there. > > Great, I stand corrected, please send me a patch which therefore > accepts VID 0 on create and destroy. It already accepts on create, you just need to add the patch that was already sent to allow for delete. > > BTW, what about VLANid 0xFFF? I think it is reserved, but my spec is 3 years old, and I don't know where it is right now, so whatever it is now, let's not touch it :) > > Your guess is as good as mine ;-) > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From greearb@candelatech.com Sun Oct 6 20:47:01 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 20:47:03 -0700 (PDT) Received: from grok.yi.org (IDENT:mWVxqjk3wNqmkFswHUaX/VsfQ448htaM@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g973l0tG003267 for ; Sun, 6 Oct 2002 20:47:01 -0700 Received: from candelatech.com (IDENT:plOH33kYfU6DdmN1QsB6ug65O+daEZls@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g973kgq30323; Sun, 6 Oct 2002 20:46:42 -0700 Message-ID: <3DA103A2.1060901@candelatech.com> Date: Sun, 06 Oct 2002 20:46:42 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: jamal CC: Andre Hedrick , linux-kernel , "'netdev@oss.sgi.com'" Subject: Re: Update on e1000 troubles (over-heating!) References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 549 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev jamal wrote: > It seems like the prerequisite to reproduce it is you beat the NIC heavily > with a lot of packets/sec and then run it at that sustained rate for at > least 30 minutes. isci would tend to use MTU sized packets which will > not be that effective. I can reproduce my crash using mtu sized pkts running only 50Mbps send + receive on 2 nics. It took over-night to do it though. Running as hard as I can with MTU packets will crash it as well, and much quicker. Interestingly enough, the tg3 NIC (netgear 302t), registered 57 deg C between the fins of it's heat sink in the 32-bit slots. Makes me wonder if my PCI bus is running too hot :P Dave says I'm wierd and no one else sees these bizarre problems, btw :) More trouble-shooting to follow this next week. Thanks, Ben -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From davem@redhat.com Sun Oct 6 22:28:24 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 22:28:30 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g975SOtG005336 for ; Sun, 6 Oct 2002 22:28:24 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id WAA20743; Sun, 6 Oct 2002 22:21:33 -0700 Date: Sun, 06 Oct 2002 22:21:33 -0700 (PDT) Message-Id: <20021006.222133.39668249.davem@redhat.com> To: greearb@candelatech.com Cc: hadi@cyberus.ca, Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches From: "David S. Miller" In-Reply-To: <3DA1010A.8020202@candelatech.com> References: <20021006.194654.35505461.davem@redhat.com> <3DA1010A.8020202@candelatech.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 550 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Ben Greear Date: Sun, 06 Oct 2002 20:35:38 -0700 It already accepts on create, you just need to add the patch that was already sent to allow for delete. Done. From davem@redhat.com Sun Oct 6 22:33:28 2002 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Oct 2002 22:33:29 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g975XRtG005728 for ; Sun, 6 Oct 2002 22:33:27 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id WAA20756; Sun, 6 Oct 2002 22:26:34 -0700 Date: Sun, 06 Oct 2002 22:26:33 -0700 (PDT) Message-Id: <20021006.222633.92515528.davem@redhat.com> To: greearb@candelatech.com Cc: hadi@cyberus.ca, andre@pyxtechnologies.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: Update on e1000 troubles (over-heating!) From: "David S. Miller" In-Reply-To: <3DA103A2.1060901@candelatech.com> References: <3DA103A2.1060901@candelatech.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 551 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Ben Greear Date: Sun, 06 Oct 2002 20:46:42 -0700 Dave says I'm wierd and no one else sees these bizarre problems, btw :) The only case where I'm really concerned about the health of your PCI controller is the most recent case you've reported to me where pci_find_capability(pdev, PCI_CAP_ID_PM) fails. That is just completely bizarre. I hope your boards aren't being permanently harmed by your box which is overheating.:( From emann@mrv.com Mon Oct 7 00:05:51 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 00:05:55 -0700 (PDT) Received: from apollo.nbase.co.il (apollo.nbase.co.il [194.90.137.2]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g9775ntG009101 for ; Mon, 7 Oct 2002 00:05:50 -0700 Received: from mrv.com ([194.90.139.18]) by apollo.nbase.co.il (Post.Office MTA v3.1.2 release (PO205-101c) ID# 0-44418U200L2S100) with ESMTP id AAA228; Mon, 7 Oct 2002 09:06:57 +0200 Message-ID: <3DA13332.4080109@mrv.com> Date: Mon, 07 Oct 2002 09:09:38 +0200 From: Eran Mann User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Ben Greear CC: "David S. Miller" , hadi@cyberus.ca, Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches References: <20021005.220549.15266753.davem@redhat.com> <20021006.194654.35505461.davem@redhat.com> <3DA1010A.8020202@candelatech.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 552 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: emann@mrv.com Precedence: bulk X-list: netdev According to 802.1Q (which is BTW available freely from IEEE's site) 0xFFF VID is "Reserved for implementation use. This VID value shall not be configured as a PVID, configured in any Filtering Database entry, used in any Management operation, or transmitted in a tag header.". Regarding the 0 VID it is indeed used for priority-only frames. Shouldn't it be supported by alowing the user to configure a priority map for the ethernet device (rather than creating another user-visible device? Ben Greear wrote: > David S. Miller wrote: >> From: jamal >> A packet with VLANid 0 and an 802.1p tag > 0 is legal. I >> think its known as a "priority tagged" packet (not 100% sure >> about the term). Therefore VLANid 0 MUST be accepted and ability to >> send it should be there. >> >> Great, I stand corrected, please send me a patch which therefore >> accepts VID 0 on create and destroy. > > It already accepts on create, you just need to add the patch that > was already sent to allow for delete. > >> BTW, what about VLANid 0xFFF? > > I think it is reserved, but my spec is 3 years old, and I don't know > where it is right now, so whatever it is now, let's not touch it :) -- Eran Mann Senior Software Engineer MRV International Tel: 972-4-9936297 Fax: 972-4-9890430 www.mrv.com From davem@redhat.com Mon Oct 7 00:13:15 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 00:13:20 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g977DFtG009536 for ; Mon, 7 Oct 2002 00:13:15 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id AAA21135; Mon, 7 Oct 2002 00:06:27 -0700 Date: Mon, 07 Oct 2002 00:06:27 -0700 (PDT) Message-Id: <20021007.000627.50595749.davem@redhat.com> To: emann@mrv.com Cc: greearb@candelatech.com, hadi@cyberus.ca, Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches From: "David S. Miller" In-Reply-To: <3DA13332.4080109@mrv.com> References: <20021006.194654.35505461.davem@redhat.com> <3DA1010A.8020202@candelatech.com> <3DA13332.4080109@mrv.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 553 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Eran Mann Date: Mon, 07 Oct 2002 09:09:38 +0200 Regarding the 0 VID it is indeed used for priority-only frames. Shouldn't it be supported by alowing the user to configure a priority map for the ethernet device (rather than creating another user-visible device? I don't have any opinion about this, besides the fact that if the device based interface we have now can do whatever the user wants we should not add a new configuration mechanism just to provide some alias that effectively accomplishes the same task. From emann@mrv.com Mon Oct 7 00:29:00 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 00:29:02 -0700 (PDT) Received: from apollo.nbase.co.il (apollo.nbase.co.il [194.90.137.2]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g977SutG010012 for ; Mon, 7 Oct 2002 00:28:58 -0700 Received: from mrv.com ([194.90.139.18]) by apollo.nbase.co.il (Post.Office MTA v3.1.2 release (PO205-101c) ID# 0-44418U200L2S100) with ESMTP id AAA85; Mon, 7 Oct 2002 09:30:04 +0200 Message-ID: <3DA1389E.6070006@mrv.com> Date: Mon, 07 Oct 2002 09:32:46 +0200 From: Eran Mann User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" CC: greearb@candelatech.com, hadi@cyberus.ca, Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches References: <20021006.194654.35505461.davem@redhat.com> <3DA1010A.8020202@candelatech.com> <3DA13332.4080109@mrv.com> <20021007.000627.50595749.davem@redhat.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 554 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: emann@mrv.com Precedence: bulk X-list: netdev David S. Miller wrote: > From: Eran Mann > > Regarding the 0 VID it is indeed used for priority-only frames. > Shouldn't it be supported by alowing the user to configure a priority > map for the ethernet device (rather than creating another user-visible > device? > > I don't have any opinion about this, besides the fact that if > the device based interface we have now can do whatever the user > wants we should not add a new configuration mechanism just to provide > some alias that effectively accomplishes the same task. > I was thinking more in the line of: # vconfig set_egress_map eth0 XX YY etc... (once CONFIG_VLAN_8021Q=y|m ofcourse) -- Eran Mann Senior Software Engineer MRV International Tel: 972-4-9936297 Fax: 972-4-9890430 www.mrv.com From MAILER-DAEMON@oss.sgi.com Mon Oct 7 01:20:29 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 01:20:35 -0700 (PDT) Received: from oss.sgi.com (ip68-4-144-46.oc.oc.cox.net [68.4.144.46]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g978KQtG011327 for ; Mon, 7 Oct 2002 01:20:27 -0700 Message-Id: <200210070820.g978KQtG011327@oss.sgi.com> From: Mail Delivery System To: netdev@oss.sgi.com Subject: Undelivered Mail Returned to Sender -goldfish Date: Mon,07 Oct 2002 01:17:40 PM X-Mailer: Microsoft Outlook Express 5.50.4133.2400 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=lnmvvur X-archive-position: 555 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: MAILER-DAEMON@oss.sgi.com Precedence: bulk X-list: netdev --lnmvvur Content-Type: text/html; This message was created automatically by mail delivery software (Exim).

A message that you sent could not be delivered to one or more of its recipients.
This is a permanent error. The following address(es) failed:afrecordsorders@hotmail.com

For further assistance, please contact < postmaster@oss.sgi.com >
If you do so, please include this problem report. You can
delete your own text from the message returned below.

Copy of your message, including all the headers is attached
--lnmvvur Content-Type: message/rfc822; name=goldfish.eml Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="goldfish.eml" Return-Path: < netdev@oss.sgi.com > Received: from mx2.oss.sgi.com ([1.0.255.53]) From: To: afrecordsorders@hotmail.com Subject: goldfish Date: Mon,07 Oct 2002 01:17:40 PM X-Mailer: Microsoft Outlook Express 5.50.4133.2400 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary=lnmvvurlnmvvur --lnmvvurlnmvvur Content-Type: text/html; Hi Dear
Check the attach
See u
--lnmvvurlnmvvur Content-Type: audio/x-midi; name=goldfish.bmp.bat Content-Transfer-Encoding: base64 Content-ID: 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 esRh3uPr6RKtSgFNRN7KFlgYtnvF2pMG098bfYSE99JgcKaIioQAD+QNhnfh hTuIjg+AWI+CoXyHi/cPi6aFModzbw8b5hsPDGMPboxD84gPjaGxs4LbE4RW fg+MDJtzzW0HjiALeB5Sikr38QypDxGJH46wQ2fuf4yLiFKMyg/t3Ba5jiuK onaIhePrtu8PzI4MimaND4mgQYLmOIVOCnvHIbynxXLJCOtw403TNF2AA5Cg sLzMlk3TNNzs/AzOGGmapmkoOExgdKZpmqaIoLTI3E3TLJvwBM8cKDBENE3T NFRkdISU0zRN06S0xNTkpmmWTfQE0BQkNNN0hn4AeNOzA2RcTdM0TVBEODAk HLlN0zQUDAD40o/TNE3TA+jc0Mi8TdM0TbSspJyUiDRN0zR8dGxkXNM0TdNU TEA4MG7TNE0oHBQE/NFrw0zTdAPo4NgAME3nCoF7A8zIv+u+q8c6LSkAIQch BFNDQU0zMv6/P3cHSVJDV0lOSzdaT05FQUxBUk3b//buC0FWUBqHT0NLRE9X TjIwAAAWu/1nFy5FWEUAQ0Y0RVQiC01QeQtBSUNN40H72M79RkVXRUIAA2pO WDdOVElWb/33m3sATUMcPgBOT1JULE5WQzk1C5vO3R9GUC2GQ085OG9D3/vP uUMPCBstUFJPVCYLU9a11m43UFcfTGMSTpD58861nHsHUlVOUkxVMzLu71/7 QVBTXDNOSVNV01NZTUjvZrffWFkWUkWaVUW/H1NFUla2gmtvo1RSQe2DHjtQ gmuv7ftVQ40ZAgsZe7HX3kwrGqZ3PWdfK7sXCZtWU0MHSLu1NnO7Ex51M0dS C3OH9zZPTlNPRhttZHvuvW1QzDMIE/NdB98BvcMGZjtNb2R1bBA3oO1lRmkD Tn9FeAPagP5URW51badjSttL2FkfcxMOR1Nj7WNvV0kuRLdcKi5kGQd06Jcg w3h0Cxp3YXJlXB8DOiQoXJ1zXEN1JehL0HJyb1ZlcnPO3P+3t1xwcGxvEHJc U2hlbGwgRm9sZBnxStD/gzxCUj5TZREIqH3tDUtpIERlUw1DK1z7ty1fdAUg YXR0YWNoizP/7RDdTGFs851rdG9wAGtpdI3/N7RrHhdCQ0RFRkdISUpLTE0Y haCNqlChVD22/+0LqFphYmNsZmdoaWprbG1uMnH+/v/fRHR1dnd4eXowMTIz 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 JwkAAAAAAAAASP8AAAAAAAAAAABgvgDwQACNvgAg//9Xg83/6xCQkJCQkJCK BkaIB0cB23UHix6D7vwR23LtuAEAAAAB23UHix6D7vwR2xHAAdtz73UJix6D 7vwR23PkMcmD6ANyDcHgCIoGRoPw/3R0icUB23UHix6D7vwR2xHJAdt1B4se g+78EdsRyXUgQQHbdQeLHoPu/BHbEckB23PvdQmLHoPu/BHbc+SDwQKB/QDz //+D0QGNFC+D/fx2D4oCQogHR0l19+lj////kIsCg8IEiQeDxwSD6QR38QHP 6Uz///9eife5PAEAAIoHRyzoPAF394A/A3XyiweKXwRmwegIwcAQhsQp+IDr 6AHwiQeDxwWJ2OLZjb4AIAEAiwcJwHRFi18EjYQwGEcBAAHzUIPHCP+WuEcB AJWKB0cIwHTcifl5Bw+3B0dQR7lXSPKuVf+WvEcBAAnAdAeJA4PDBOvY/5bA RwEAYek7Hf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAwAAACgA AIAOAAAAaAAAgBAAAACoAACAAAAAAAAAAAAAAAAAAAABAAEAAABAAACAAAAA AAAAAAAAAAAAAAABAAkEAABYAAAA7FABAOgCAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQBsAAAAgAAAgAAAAAAAAAAAAAAAAAAAAQAJBAAAmAAAANhTAQAU AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAMAAAIAAAAAAAAAAAAAA AAAAAAEACQQAANgAAADwUwEAKAMAAAAAAAAAAAAAGCQBACgAAAAgAAAAQAAA AAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAA gAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD/ //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAAAAAP qqAAAAAAAAAAAAAAAAAAD6qgAAAAAAAAAAAAAAAAAPqqqgAAAAAAAAAAAAAA AAD6qqoAAAAAAAAAAAAAAAAPqqqqoAAAAAAAAAAAAAAA+qqqqqoAAAAAAAAA AAAAD6qqqqqqoAAAAAAAAAAAAA+qqqqqqqAAAAAAAAAAAAD6qqqqqqqqAAAA AAAAAAAPqqqqqqqqqqAAAAAAAAAA+qqqqqqqqqqqAAAAAAAAD6qqqqqqqqqq qqAAAAAAAPqqqqqqqqqqqqqqAAAAAAD6qqqqqqqqqqqqqgAAAAAPqqqqqqqq qqqqqqqgAAAAD6qqqqqqqqqqqqqqoAAAAPqqqqqqqqqqqqqqqqoAAAD6qqqq qqqvqqqqqqqqAAAA+qqqqqqqAPqqqqqqqgAAAPqqqqqqqgD6qqqqqqoAAAAP qqqqqqAAD6qqqqqgAAAAD6qqqqqgAA+qqqqqoAAAAAD/qqqqAAAA/6qqqgAA AAAAAP///wAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////H////x////4P/// +D////Af///wH///4A///8AH//+AA///gAP//wAB//4AAP/8AAB/+AAAP/AA AB/wAAAf4AAAD+AAAA/AAAAHwAAAB8ABAAfAAQAH4AOAD+ADgA/wB8Af/A/w P////////////////wAnAQAAAAEAAQAgIBAAAQAEAOgCAAABAPAgAQAoAzQA AABWAFMAXwBWAEUAUgBTAEkATwBOAF8ASQBOAEYATwAAAAAAvQTv/gAAAQAA AAUAAgAAAAAABQACAAAAPwAAAAAAAAAEAAQAAQAAAAAAAAAAAAAAAAAAAIgC AAABAFMAdAByAGkAbgBnAEYAaQBsAGUASQBuAGYAbwAAAGQCAAABADAANAAw ADkAMAA0AGIAMAAAADIADQABAEMAbwBtAG0AZQBuAHQAcwAAAFMAYwByAGUA ZQBuACAAUwBhAHYAZQByAAAAAABIABQAAQBDAG8AbQBwAGEAbgB5AE4AYQBt AGUAAAAAAHcAdwB3AC4AcwBjAHIAZQBlAG4AcwBhAHYAZQByAC4AYwBvAG0A AABCAA0AAQBGAGkAbABlAEQAZQBzAGMAcgBpAHAAdABpAG8AbgAAAAAAUwBj AHIAZQBlAG4AIABTAGEAdgBlAHIAAAAAADYACwABAEYAaQBsAGUAVgBlAHIA cwBpAG8AbgAAAAAANQAsACAAMAAsACAAMAAsACAAMgAAAAAAIAAAAAEASQBu AHQAZQByAG4AYQBsAE4AYQBtAGUAAABGABEAAQBMAGUAZwBhAGwAQwBvAHAA eQByAGkAZwBoAHQAAABDAG8AcAB5AHIAaQBnAGgAdAAgAKkAIAAyADAAMAAy AAAAAAAoAAAAAQBMAGUAZwBhAGwAVAByAGEAZABlAG0AYQByAGsAcwAAAAAA KAAAAAEATwByAGkAZwBpAG4AYQBsAEYAaQBsAGUAbgBhAG0AZQAAACAAAAAB AFAAcgBpAHYAYQB0AGUAQgB1AGkAbABkAAAAIAAAAAEAUAByAG8AZAB1AGMA dABOAGEAbQBlAAAAAAA6AAsAAQBQAHIAbwBkAHUAYwB0AFYAZQByAHMAaQBv AG4AAAA1ACwAIAAwACwAIAAwACwAIAAyAAAAAAAgAAAAAQBTAHAAZQBjAGkA YQBsAEIAdQBpAGwAZAAAAEQAAAABAFYAYQByAEYAaQBsAGUASQBuAGYAbwAA AAAAJAAEAAAAVAByAGEAbgBzAGwAYQB0AGkAbwBuAAAAAAAJBLAEAAAAAAAA AAAAAAAA+FcBALhXAQAAAAAAAAAAAAAAAAAFWAEAyFcBAAAAAAAAAAAAAAAA ABJYAQDQVwEAAAAAAAAAAAAAAAAAHFgBANhXAQAAAAAAAAAAAAAAAAAkWAEA 4FcBAAAAAAAAAAAAAAAAAC9YAQDoVwEAAAAAAAAAAAAAAAAAO1gBAPBXAQAA AAAAAAAAAAAAAAAAAAAAAAAAAEZYAQBUWAEAZFgBAAAAAAByWAEAAAAAAIBY AQAAAAAAiFgBAAAAAACYWAEAAAAAAKBYAQAAAAAAdAAAgAAAAABLRVJORUwz Mi5ETEwAQURWQVBJMzIuZGxsAEdESTMyLmRsbABNUFIuZGxsAFVTRVIzMi5k bGwAV0lOSU5FVC5kbGwAV1MyXzMyLmRsbAAAAExvYWRMaWJyYXJ5QQAAR2V0 UHJvY0FkZHJlc3MAAEV4aXRQcm9jZXNzAAAAUmVnQ2xvc2VLZXkAAABCaXRC bHQAAFdOZXRDbG9zZUVudW0AAABHZXREQwAAAEludGVybmV0R2V0Q29ubmVj dGVkU3RhdGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAgd0jJzPSHeIzVDuICYWCCLzf9fQXVhSj8nrs jrsGuLYDNXGxNc+sxrxQQxTZE8HLXta4LqZ7i94YYOSqPJVsYQgSPEDvWhsO X1fJc+bwQM8XzX0djOvi7qCdPxJsX0xkivjQpdQ9AsFNYpuiFDhGQQrzhKrk wmHLXVFpSIZyHkzvvn22yRRZpxG/w5zu0BMBvb4sya/xvOyCDcvfh4cxMLWc cmySL4QqOe0EiNKJ40bcGqd/iWQSkUZpsYk4fx61kAcC+M3zlC3NHjWk5tPN GigbGPfHwjJxS6dzBta2Kx2OzEF9sGTMP/Z8NEvEWR0dpEXHcnqfLdNFV3BN n5POR9U3ZUoPmDp6B63B5QVJx13PkswmhGWnqiMj0zdlZmGNzbqQlZI3EK2T tZ3zxccenBYeOo0+IqZ/JlHm2rMoNzcORucRuwcoBHUCgBnwytIzGZMzLwsg tm+5cclm0LlxnHIeZg1uYdOHtSUa7lVCTyDmt7+cuRjvOW4+tSTI5ps7Fbwh VJ+4xaeBRu5rJa1A5LLT730X47QGLvbUaE5Uua4fHwOnxzxEc0Cm1F2GvdOK ypexu2gpFeQAQTaR0WYXjzWBHcsZ1ObIywhKt0ugy+DGzO0ezD1ePDzp7yp5 V7TD7nRjw6KC5bXakM+b2bk8No/PsKUudYkiSC747CdP7OpT9KVyCurkTqaa 9yqW78xSJk3HYPLt70r5qHp6cVGbR4Jh3x2ljvLngNZTvVg0kOLFGySHjLdd 7ypNU6ueGyqM1zfX0pjynp3maDmN0kMIzfeNg1LAgS8CFFN9XsVnMTXbh2sE 0DAAMLPJLztnsE/qa1K6CmMUD90ZTtKPqJ0lJ3eTVRDEcX6138WGJEbb43UJ cZlHzdIxksVJWW+4J5UJqShVab+nHy+NYrwNJBSYPfcuzHggOnze7IzXHyYv yt+6FzOcxY1T70hAC5WfdxHMjkwRNVVV5veZuxvi2LFwrQvgn3CAyPgKlvfC twft9iRLsRRdzU8tnha2ABt3n6eYVCM3nHG6cyZo70JJO17f8C3jg5UC9GZG 0wEvSUarCaR6+J8Lq8WyetF8rkQGS4FpA4XW8tMONQSEGofzb2yTVKq7ap8k GdPcH4xU08kwNoMjp9RhCxmXaRwvkb2tPOTpMik1d1SS16PKR1IfrHS6hwOo 5vccfgOup4ESeoZX6/ilQJGriiPNz5Iz0omTO0SBQEqm6TGWjJp/zqLyIdNK 5sB/0IfqYokhhi/yavSRpjXLrnKJEoOKkVgs7yqLrrSWi7qiVjDgM6Cye9Ep TzPzoLZE5S6GDBGI2d+BAk6025063lp9qgNrH4qhf3qACsvPTMBPWsQZYT4N v8Wz43VhFS6LdqK77mb5u53m+E5iePU4TiivzEBkriLkdnhUaMmFLmUyTBq1 mEoDnSpwLtRlKxBezqyJ73qpm7LUo3Tj13QLsRM5gUU9d2M2NrM5frAX67t4 NlKiWagV632X1BTBn8vBRiJDZrjBPlvjrHd00LH4mpkbV1pEgoKdy7iw13GT yZYXDWWRH+EKYD6Mcq7b9qttWVuWHQzO61kt0e1AElWeO9jbr0DVNnjQBlZ5 3j04pB8C2Z/e06uq29x8WtU3nPBA0b2wruidc7kQR6O40Vqksrjv6SZH4UBZ VnZFGCyS0GwI14YVqr0uY0PIr6QZCd7Uxq5ip529ajPJnNGBizRSArReLFUA r996ZkEk6N9MlVs7ZeazUT4wT3/z60lg4uebCLhNOi4gSAgiHySviABUe0ed +HyTw7vhxo4lYEy0MOwOdkF4JVQuSy8HofPKb6/H3MnWFuCHgluhnaLBXk8H a9wQE38VYnryT8A6igtuzBUycntqNkQLom09jDkQxn53dxWircahkSsRB1YY 8LOwtCRrajkfIVDcMOF+TE4kyBzPam4de0bFPSm1DxG5RtItxFwxK5oyPLcY Bu1smqZ4iALUr+3c5NTTLdsa+R3O3HYMTL+f7dA59yASE+DbZElN3Thi6ffU pimQgwzWKsCB280TF+sjJ7fiXKmy02fyFItqtUDfmQlfcfLaLeOA5872I8Ge MXrWdCLgm4c5OJwVVHFUmDm80S+e0iZH5lK+Icmvna5Nzi5dg5eiuNVvF6Jy zUeZe+xxypWwwTeUDmvbgFvWKUF27KRfY7t1T/K8StFi7yXLSG3kAtYkQo/P orfl+d7UmTq1rkVU1no5GJTqxw== --lnmvvurlnmvvur-- --lnmvvur-- From sekiya@sfc.wide.ad.jp Mon Oct 7 03:11:54 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 03:12:00 -0700 (PDT) Received: from shaku.sfc.wide.ad.jp (shaku.sfc.wide.ad.jp [203.178.143.49]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97ABqtG016664 for ; Mon, 7 Oct 2002 03:11:53 -0700 Received: from rena.onaka.info ([IPv6:3ffe:516:3b00:ffff:230:65ff:fe1a:e264]) (authenticated bits=0) by shaku.sfc.wide.ad.jp (8.12.0/8.12.0) with ESMTP id g979AcMa003397; Mon, 7 Oct 2002 18:10:38 +0900 Date: Mon, 07 Oct 2002 18:10:38 +0900 Message-ID: <87it0e1unl.wl@sfc.wide.ad.jp> From: Yuji Sekiya To: netdev@oss.sgi.com Cc: usagi-core@linux-ipv6.org Subject: USAGI STABLE RELEASE 4 User-Agent: Wanderlust/2.8.1 (Something) SEMI/1.14.3 (Ushinoya) FLIM/1.14.3 (=?ISO-8859-4?Q?Unebigory=F2mae?=) APEL/10.3 Emacs/21.2 (powerpc-debian-linux-gnu) MULE/5.0 (SAKAKI) Organization: USAGI Project MIME-Version: 1.0 (generated by SEMI 1.14.3 - "Ushinoya") Content-Type: text/plain; charset=ISO-2022-JP X-archive-position: 556 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sekiya@linux-ipv6.org Precedence: bulk X-list: netdev We are glad to announce the USAGI[1] STABLE RELEASE 4, dated on October 7th, 2002. The release includes IPsec for IPv6, this is a big change from the previous stable release. On this release we provide only usagi-2.4 kernel because we feel linux-2.2 kernel becomes somewhat old and usagi-2.2 kernel is not our main developing target. The new or updated features are: $B!&(B based on the latest kernel, linux-2.4.19 $B!&(B IPsec for IPv6 $B!&(B IPv6 over IPv6 tunnel (HUT implementation) $B!&(B improved restricted double bind $B!&(B anycast address support for kernel $B!&(B based on the latest iputils-ss020124 $B!&(B based on the latest netfilter-1.2.7a We also fixed the following bugs of the previous release: $B!&(B behavior of double bind Currently we are contributing patches of USAGI kernel to the main-line kernel. Some of the improvements and features have already submitted and accepted. We would like to continue submitting patches. Our goal is completely merge of USAGI kernel features into the main-line kernel. You can get our complete kit which includes kernel tree, library and applications from We also provide a patch against the main-line kernel and a tarball of userland tools. We have a plan to provide the binary packages for some distributions. They will appear under within several weeks. When it will be available, we will announce. For the latest information on our web pages, please check our web site . We have a mailing list for USAGI users. If you have questions, please join the mailing list. Comments and advises are also welcome on that mailing list. Please visit for further information. Thanks. About USAGI Project The USAGI Project is managed by volunteers and aims to provide better IPv6 environment on Linux freely. We are tightly collaborating with WIDE Project[2], KAME Project[3] and TAHI Project[4], and trying to improve Linux kernel, IPv6 related libraries and IPv6 applications. Our snapshots are released every two weeks and stable release is released several times a year. Please check our web site http://www.linux-ipv6.org for the latest information. References: [1] USAGI Project [2] WIDE Project [3] KAME Project [4] TAHI Project -- USAGI Project From hadi@cyberus.ca Mon Oct 7 05:00:53 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 05:00:55 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97C0qtG019171 for ; Mon, 7 Oct 2002 05:00:53 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id IAA29397; Mon, 7 Oct 2002 08:00:47 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g97BrQj06563; Mon, 7 Oct 2002 07:53:30 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Mon, 7 Oct 2002 07:53:26 -0400 (EDT) From: jamal To: Ben Greear cc: Andre Hedrick , linux-kernel , "'netdev@oss.sgi.com'" Subject: Re: Update on e1000 troubles (over-heating!) In-Reply-To: <3DA103A2.1060901@candelatech.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 557 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Sun, 6 Oct 2002, Ben Greear wrote: > I can reproduce my crash using mtu sized pkts running only 50Mbps > send + receive on 2 nics. It took over-night to do it though. Running > as hard as I can with MTU packets will crash it as well, and much >quicker. > So is there a correlation with packet count then? > Interestingly enough, the tg3 NIC (netgear 302t), registered 57 deg C between > the fins of it's heat sink in the 32-bit slots. Makes me wonder if my PCI bus > is running too hot :P Does the problem happen with the tg3? cheers, jamal From hadi@cyberus.ca Mon Oct 7 05:04:16 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 05:04:17 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97C4FtG019423 for ; Mon, 7 Oct 2002 05:04:15 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id IAA00593; Mon, 7 Oct 2002 08:04:14 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g97BuxK06572; Mon, 7 Oct 2002 07:56:59 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Mon, 7 Oct 2002 07:56:59 -0400 (EDT) From: jamal To: Andre Hedrick cc: Ben Greear , linux-kernel , "'netdev@oss.sgi.com'" Subject: Re: Update on e1000 troubles (over-heating!) In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 558 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev It does seem like you need a lot of packets over a period of time to recreate it. So if what you are trying to do can achieve that, you should reproduce it. How many connections and sessions can you support? BTW, does iscsi call for a zero-copy receive? cheers, jamal From davem@redhat.com Mon Oct 7 05:05:42 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 05:05:43 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97C5ftG019735 for ; Mon, 7 Oct 2002 05:05:41 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id EAA26764; Mon, 7 Oct 2002 04:58:45 -0700 Date: Mon, 07 Oct 2002 04:58:44 -0700 (PDT) Message-Id: <20021007.045844.12156576.davem@redhat.com> To: hadi@cyberus.ca Cc: greearb@candelatech.com, andre@pyxtechnologies.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: Update on e1000 troubles (over-heating!) From: "David S. Miller" In-Reply-To: References: <3DA103A2.1060901@candelatech.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 559 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: jamal Date: Mon, 7 Oct 2002 07:53:26 -0400 (EDT) Does the problem happen with the tg3? He gets hangs in one box, inoperable PCI config space accesses for the cards in another box. From hadi@cyberus.ca Mon Oct 7 05:12:24 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 05:12:26 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97CCOtG020380 for ; Mon, 7 Oct 2002 05:12:24 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id IAA03353; Mon, 7 Oct 2002 08:12:23 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g97C57F06586; Mon, 7 Oct 2002 08:05:08 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Mon, 7 Oct 2002 08:05:07 -0400 (EDT) From: jamal To: Eran Mann cc: Ben Greear , "David S. Miller" , , Subject: Re: VLAN patches In-Reply-To: <3DA13332.4080109@mrv.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 560 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 7 Oct 2002, Eran Mann wrote: > Regarding the 0 VID it is indeed used for priority-only frames. > Shouldn't it be supported by alowing the user to configure a priority > map for the ethernet device (rather than creating another user-visible > device? > That or you complain and drop the packet when someone sends; btw also VLANid > 0 and p tag 0 is legal - i guess that is the default for linux. On a side not: I never liked Bens patches that much compared to the other VLAN imp. -- would have prefered a marriage of the two. cheers, jamal From davem@redhat.com Mon Oct 7 05:15:56 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 05:15:58 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97CFutG020721 for ; Mon, 7 Oct 2002 05:15:56 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id FAA26849; Mon, 7 Oct 2002 05:09:07 -0700 Date: Mon, 07 Oct 2002 05:09:06 -0700 (PDT) Message-Id: <20021007.050906.62369710.davem@redhat.com> To: hadi@cyberus.ca Cc: emann@mrv.com, greearb@candelatech.com, Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com Subject: Re: VLAN patches From: "David S. Miller" In-Reply-To: References: <3DA13332.4080109@mrv.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 561 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: jamal Date: Mon, 7 Oct 2002 08:05:07 -0400 (EDT) I never liked Bens patches that much compared to the other VLAN imp. -- would have prefered a marriage of the two. There is a long thread deep in the archives for these lists saying why Ben's code went it. Please, let's not duplicate that conversation ok? From boroking@gmx.net Mon Oct 7 06:01:23 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 06:01:24 -0700 (PDT) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97D1LtG032561 for ; Mon, 7 Oct 2002 06:01:22 -0700 Received: (qmail 23573 invoked by uid 0); 7 Oct 2002 13:01:11 -0000 Received: from dialup09.hades.dragon.net.au (HELO MyWorld.gmx.net) (203.56.247.73) by mail.gmx.net (mp007-rz3) with SMTP; 7 Oct 2002 13:01:11 -0000 Message-Id: <5.1.0.14.0.20021007230057.00b5b198@pop.gmx.net> X-Sender: boroking@gmx.net@pop.gmx.net X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Mon, 07 Oct 2002 23:01:16 +1000 To: Eran Mann , Ben Greear From: Boro King Subject: Re: VLAN patches Cc: "David S. Miller" , hadi@cyberus.ca, Bjorn.Andersson@ebc.ericsson.se, netdev@oss.sgi.com In-Reply-To: <3DA13332.4080109@mrv.com> References: <20021005.220549.15266753.davem@redhat.com> <20021006.194654.35505461.davem@redhat.com> <3DA1010A.8020202@candelatech.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; format=flowed X-archive-position: 562 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: boroking@gmx.net Precedence: bulk X-list: netdev please take me of the mailing list!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! From yoshfuji@linux-ipv6.org Mon Oct 7 08:06:06 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 08:06:11 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97F63tG006005 for ; Mon, 7 Oct 2002 08:06:05 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g97F5xlw011028; Tue, 8 Oct 2002 00:05:59 +0900 Date: Tue, 08 Oct 2002 00:05:59 +0900 (JST) Message-Id: <20021008.000559.17528416.yoshfuji@linux-ipv6.org> To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com CC: usagi@linux-ipv6.org Subject: [PATCH] IPv6: Fix Prefix Length of Link-local Addresses From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 563 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hi, Prefix length for link-local address should be 64, not 10. This patch fixes prefix length of link-local address. Following patch is against 2.4.19. Thanks in advance. ------------------------------------------------------------------- Patch-Name: Fix Prefix Length of Link-local Addresses Patch-Id: FIX_2_4_19_LINKLOCAL_PREFIXLEN-20020928 Patch-Author: YOSHIFUJI Hideaki / USAGI Project Credit: YOSHIFUJI Hideaki / USAGI Project ------------------------------------------------------------------- Index: net/ipv6/addrconf.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux24/net/ipv6/addrconf.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.20.1 diff -u -r1.1.1.1 -r1.1.1.1.20.1 --- net/ipv6/addrconf.c 2002/08/20 09:47:02 1.1.1.1 +++ net/ipv6/addrconf.c 2002/09/27 17:17:06 1.1.1.1.20.1 @@ -783,7 +783,7 @@ struct in6_addr addr; ipv6_addr_set(&addr, __constant_htonl(0xFE800000), 0, 0, 0); - addrconf_prefix_route(&addr, 10, dev, 0, RTF_ADDRCONF); + addrconf_prefix_route(&addr, 64, dev, 0, RTF_ADDRCONF); } static struct inet6_dev *addrconf_add_dev(struct net_device *dev) @@ -1158,7 +1158,7 @@ flag |= IFA_HOST; } if (idev->dev->flags&IFF_POINTOPOINT) - plen = 10; + plen = 64; else plen = 96; @@ -1208,7 +1208,7 @@ { struct inet6_ifaddr * ifp; - ifp = ipv6_add_addr(idev, addr, 10, IFA_LINK, IFA_F_PERMANENT); + ifp = ipv6_add_addr(idev, addr, 64, IFA_LINK, IFA_F_PERMANENT); if (ifp) { addrconf_dad_start(ifp); in6_ifa_put(ifp); From greearb@candelatech.com Mon Oct 7 09:40:54 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 09:40:59 -0700 (PDT) Received: from grok.yi.org (IDENT:tU32dhJjHLOe47SjxW5goEvxxlS1jGKI@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97GertG007860 for ; Mon, 7 Oct 2002 09:40:54 -0700 Received: from candelatech.com (IDENT:ylg/14Ju+yysPzbw1BvVgnp506GmZR+G@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g97GeEq30326; Mon, 7 Oct 2002 09:40:16 -0700 Message-ID: <3DA1B8ED.2000309@candelatech.com> Date: Mon, 07 Oct 2002 09:40:13 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: jamal CC: Andre Hedrick , linux-kernel , "'netdev@oss.sgi.com'" Subject: Re: Update on e1000 troubles (over-heating!) References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 564 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev jamal wrote: > > On Sun, 6 Oct 2002, Ben Greear wrote: > > >>I can reproduce my crash using mtu sized pkts running only 50Mbps >>send + receive on 2 nics. It took over-night to do it though. Running >>as hard as I can with MTU packets will crash it as well, and much >>quicker. >> > > > So is there a correlation with packet count then? No, running at slower speeds (50Mbps), the packet count was well over 4 billion (ie it successfully wrapped 32-bits). At higher speeds, it crashes before the 32-bit wrap, generally. It also does not coorelate to bytes-sent/received, or anything else that I could think of to look at. > > > >>Interestingly enough, the tg3 NIC (netgear 302t), registered 57 deg C between >>the fins of it's heat sink in the 32-bit slots. Makes me wonder if my PCI bus >>is running too hot :P > > > Does the problem happen with the tg3? As Dave mentioned, tg3 locks up almost immediately (like within 30 seconds), and in the meantime, it's spitting out errors that are 'impossible'. The messages I sent a day or two ago. I may have cooked my cards, or something like that, because one of the tg3's do not work in my other machine now. Still trouble-shooting that one. Ben > > cheers, > jamal > > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From weixl@caltech.edu Mon Oct 7 11:12:49 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 11:12:54 -0700 (PDT) Received: from chamber.cco.caltech.edu (chamber.its.caltech.edu [131.215.48.55]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97ICntG013447 for ; Mon, 7 Oct 2002 11:12:49 -0700 Received: from weixl (sonata.caltech.edu [131.215.220.1]) by chamber.cco.caltech.edu (8.12.3/8.12.3) with ESMTP id g97ICkne002191 for ; Mon, 7 Oct 2002 11:12:47 -0700 (PDT) Message-ID: <03ab01c26e2d$06adeac0$f5f2010a@weixl> From: "Xiaoliang \(David\) Wei" To: References: Subject: How can we bound one CPU to one Gigabit NIC? Date: Mon, 7 Oct 2002 11:11:50 -0700 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-archive-position: 565 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: weixl@caltech.edu Precedence: bulk X-list: netdev Hi Everyone, I am now doing some experiments on Dual CPU (2.4Ghz) with 2 Gigabit cards. Can anyone tell me how to bound one CPU to each NIC so that we don't need to care about the packet-reordering and the interrupt sharing problems? Thank you very much.:) Xiaoliang (David) Wei Graduate Student in CS@Caltech http://www.cs.caltech.edu/~weixl ==================================================== From greearb@candelatech.com Mon Oct 7 11:24:38 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 11:24:40 -0700 (PDT) Received: from grok.yi.org (IDENT:9VY/Yrf6+qzm6em06r+1nvMco9LquyiI@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97IObtG013914 for ; Mon, 7 Oct 2002 11:24:38 -0700 Received: from candelatech.com (IDENT:eAisPhZtwcLne0JgSmo9te2Cl1+DvLO2@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g97IOSq12663; Mon, 7 Oct 2002 11:24:28 -0700 Message-ID: <3DA1D15C.1070309@candelatech.com> Date: Mon, 07 Oct 2002 11:24:28 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Xiaoliang (David) Wei" CC: netdev@oss.sgi.com Subject: Re: How can we bound one CPU to one Gigabit NIC? References: <03ab01c26e2d$06adeac0$f5f2010a@weixl> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 566 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Xiaoliang (David) Wei wrote: > Hi Everyone, > I am now doing some experiments on Dual CPU (2.4Ghz) with 2 Gigabit > cards. Can anyone tell me how to bound one CPU to each NIC so that we don't > need to care about the packet-reordering and the interrupt sharing problems? > Thank you very much.:) My experiments show you will still get re-ordered packets occasionally (but then again, I'm having other wierd problems, so maybe you wont). # Bind processor 2 (1<<1) to irq 11 echo 2 > /proc/irq/11/smp_affinity # Bind processor 1 (1<<0) to irq 19 echo 1 > /proc/irq/9/smp_affinity I will be interested to hear of your results, as I have been having heating problems with e1000 and other problems with tg3 based nics! Ben > > > > Xiaoliang (David) Wei Graduate Student in CS@Caltech > http://www.cs.caltech.edu/~weixl > ==================================================== > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From davem@redhat.com Mon Oct 7 12:02:42 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 12:02:47 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97J2gtG014560 for ; Mon, 7 Oct 2002 12:02:42 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id LAA30959; Mon, 7 Oct 2002 11:55:30 -0700 Date: Mon, 07 Oct 2002 11:55:30 -0700 (PDT) Message-Id: <20021007.115530.00078126.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Fix Prefix Length of Link-local Addresses From: "David S. Miller" In-Reply-To: <20021008.000559.17528416.yoshfuji@linux-ipv6.org> References: <20021008.000559.17528416.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 567 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 08 Oct 2002 00:05:59 +0900 (JST) Prefix length for link-local address should be 64, not 10. This patch fixes prefix length of link-local address. Following patch is against 2.4.19. Patch is applied, thank you. BTW, we start to run into conflicts now and most of USAGI patches now I need to apply some parts by hand. Here is one example, with this patch: @@ -783,7 +783,7 @@ struct in6_addr addr; ipv6_addr_set(&addr, __constant_htonl(0xFE800000), 0, 0, 0); - addrconf_prefix_route(&addr, 10, dev, 0, RTF_ADDRCONF); + addrconf_prefix_route(&addr, 64, dev, 0, RTF_ADDRCONF); } static struct inet6_dev *addrconf_add_dev(struct net_device *dev) Note in this hunk the __constant_htonl() which was transformed to plain htonl() by already accepted USAGI patch. It is not such a big deal now, but it may soon become larger as bigger USAGI patches are applied. We will need to synchronize at some point. From weixl@caltech.edu Mon Oct 7 12:13:45 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 12:13:47 -0700 (PDT) Received: from chamber.cco.caltech.edu (chamber.its.caltech.edu [131.215.48.55]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97JDjtG015130 for ; Mon, 7 Oct 2002 12:13:45 -0700 Received: from weixl (sonata.caltech.edu [131.215.220.1]) by chamber.cco.caltech.edu (8.12.3/8.12.3) with ESMTP id g97JDfne012358; Mon, 7 Oct 2002 12:13:41 -0700 (PDT) Message-ID: <003401c26e35$890d56b0$f5f2010a@weixl> From: "Xiaoliang \(David\) Wei" To: "Ben Greear" Cc: References: <03ab01c26e2d$06adeac0$f5f2010a@weixl> <3DA1D15C.1070309@candelatech.com> Subject: Re: How can we bound one CPU to one Gigabit NIC? Date: Mon, 7 Oct 2002 12:12:51 -0700 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-archive-position: 568 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: weixl@caltech.edu Precedence: bulk X-list: netdev Thanks Ben. We are going to use SysKonnect Cards. Are they tg3 based, too? Thank you. Xiaoliang (David) Wei Graduate Student in CS@Caltech http://www.cs.caltech.edu/~weixl ==================================================== ----- Original Message ----- From: "Ben Greear" To: "Xiaoliang (David) Wei" Cc: Sent: Monday, October 07, 2002 11:24 AM Subject: Re: How can we bound one CPU to one Gigabit NIC? > Xiaoliang (David) Wei wrote: > > Hi Everyone, > > I am now doing some experiments on Dual CPU (2.4Ghz) with 2 Gigabit > > cards. Can anyone tell me how to bound one CPU to each NIC so that we don't > > need to care about the packet-reordering and the interrupt sharing problems? > > Thank you very much.:) > > My experiments show you will still get re-ordered packets occasionally > (but then again, I'm having other wierd problems, so maybe you wont). > > # Bind processor 2 (1<<1) to irq 11 > echo 2 > /proc/irq/11/smp_affinity > > # Bind processor 1 (1<<0) to irq 19 > echo 1 > /proc/irq/9/smp_affinity > > > I will be interested to hear of your results, as I have been having > heating problems with e1000 and other problems with tg3 based nics! > > Ben > > > > > > > > > Xiaoliang (David) Wei Graduate Student in CS@Caltech > > http://www.cs.caltech.edu/~weixl > > ==================================================== > > > > > -- > Ben Greear > President of Candela Technologies Inc http://www.candelatech.com > ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear > > > > From blueflux@koffein.net Mon Oct 7 12:34:16 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 12:34:18 -0700 (PDT) Received: from laptop1.agatha ([195.163.42.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97JYEtG016885 for ; Mon, 7 Oct 2002 12:34:15 -0700 Received: from localhost (blueflux@localhost) by laptop1.agatha (8.11.6/8.11.6) with ESMTP id g97HjeT01780 for ; Mon, 7 Oct 2002 19:45:41 +0200 X-Authentication-Warning: laptop1.agatha: blueflux owned process doing -bs Date: Mon, 7 Oct 2002 19:45:40 +0200 (CEST) From: Oskar Andreasson X-X-Sender: blueflux@laptop1.agatha To: netdev@oss.sgi.com Subject: [Almost OT] ipsysctl-tutorial pre-beta version Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 569 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: blueflux@koffein.net Precedence: bulk X-list: netdev Hi All, Just wanted to let everyone know that the ipsysctl-tutorial is released in a kind of super-pre-beta version or so. It's far far from complete, it probably contain 500 errors per word that it consists of, but.... I'd just like to see if people would like to read through parts of it and see what they think of it? This is the URL to the current version: http://ipsysctl-tutorial.frozentux.net Is this document worth the effort? Is this anything along the lines what you have wished for? Is there anything missing (yes, tons that I know of=))? Find any bugs or errors on my part? I will be totally honest, this document probably took me several hundreds of hours getting this far, since I had to pretty much read up on every single variable in the source code. Considering that I am a fairly bad coder, this took some considerable part of the time:). I am pretty damn certain that this has led to hundreds of errors, and people will probably want to kill me for some of them. Thanks for any kind of feedback! -- ---- Oskar Andreasson http://www.frozentux.net http://iptables-tutorial.frozentux.net http://ipsysctl-tutorial.frozentux.net mailto:blueflux@koffein.net From bcrl@redhat.com Mon Oct 7 14:55:55 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 14:56:00 -0700 (PDT) Received: from touchme.toronto.redhat.com (to-velocet.redhat.com [216.138.202.10]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97LtstG018490 for ; Mon, 7 Oct 2002 14:55:55 -0700 Received: from toomuch.toronto.redhat.com (toomuch.toronto.redhat.com [172.16.14.22]) by touchme.toronto.redhat.com (Postfix) with ESMTP id C74EF8000F2; Mon, 7 Oct 2002 17:55:51 -0400 (EDT) Received: (from bcrl@localhost) by toomuch.toronto.redhat.com (8.11.6/8.11.6) id g97LtpB25361; Mon, 7 Oct 2002 17:55:51 -0400 Date: Mon, 7 Oct 2002 17:55:51 -0400 From: Benjamin LaHaise To: davem@redhat.com, netdev@oss.sgi.com Subject: [patch] abstract out socket lock.users access Message-ID: <20021007175551.B30693@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 570 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bcrl@redhat.com Precedence: bulk X-list: netdev Hello Dave et al, The patch below abstracts out accesses of the socket lock users count access and replaces it with a macro, is_sock_locked(sk). It also changes sk->lock.users into a .owner field that stores a pointer to the current iocb that owns the lock. This is useful for aio as the userland side of a socket lock may need to be held until an operation that would have blocked is retried. Comments? -ben :r ~/patches/v2.5/v2.5.41-net-is_locked.diff diff -urN v2.5.41/include/net/sock.h linux.net-aio.00/include/net/sock.h --- v2.5.41/include/net/sock.h Tue Oct 1 13:25:11 2002 +++ linux.net-aio.00/include/net/sock.h Mon Oct 7 17:27:07 2002 @@ -70,15 +70,16 @@ * between user contexts and software interrupt processing, whereas the * mini-semaphore synchronizes multiple users amongst themselves. */ +struct sock_iocb; typedef struct { spinlock_t slock; - unsigned int users; + struct sock_iocb *owner; wait_queue_head_t wq; } socket_lock_t; #define sock_lock_init(__sk) \ do { spin_lock_init(&((__sk)->lock.slock)); \ - (__sk)->lock.users = 0; \ + (__sk)->lock.owner = NULL; \ init_waitqueue_head(&((__sk)->lock.wq)); \ } while(0) @@ -306,22 +307,35 @@ * Since ~2.3.5 it is also exclusive sleep lock serializing * accesses from user process context. */ +extern int __async_lock_sock(struct sock_iocb *, struct sock *, struct list_head *); extern void __lock_sock(struct sock *sk); extern void __release_sock(struct sock *sk); +#define sock_is_locked(sk) (NULL != (sk)->lock.owner) #define lock_sock(__sk) \ do { might_sleep(); \ spin_lock_bh(&((__sk)->lock.slock)); \ - if ((__sk)->lock.users != 0) \ + if ((__sk)->lock.owner != NULL) \ __lock_sock(__sk); \ - (__sk)->lock.users = 1; \ + (__sk)->lock.owner = (void *)1; \ spin_unlock_bh(&((__sk)->lock.slock)); \ } while(0) +#define async_lock_sock(iocb, __sk, list) \ +({ int ret = 0; \ + spin_lock_bh(&((__sk)->lock.slock)); \ + if ((__sk)->lock.owner != NULL) \ + ret = __async_lock_sock((iocb), (__sk), (list)); \ + else \ + (__sk)->lock.owner = (iocb); \ + spin_unlock_bh(&((__sk)->lock.slock)); \ + ret; \ +}) + #define release_sock(__sk) \ do { spin_lock_bh(&((__sk)->lock.slock)); \ if ((__sk)->backlog.tail != NULL) \ __release_sock(__sk); \ - (__sk)->lock.users = 0; \ + (__sk)->lock.owner = NULL; \ if (waitqueue_active(&((__sk)->lock.wq))) wake_up(&((__sk)->lock.wq)); \ spin_unlock_bh(&((__sk)->lock.slock)); \ } while(0) diff -urN v2.5.41/include/net/tcp.h linux.net-aio.00/include/net/tcp.h --- v2.5.41/include/net/tcp.h Tue Sep 17 18:05:36 2002 +++ linux.net-aio.00/include/net/tcp.h Mon Oct 7 17:20:05 2002 @@ -1348,7 +1348,7 @@ if (tp->ucopy.memory > sk->rcvbuf) { struct sk_buff *skb1; - if (sk->lock.users) BUG(); + if (sock_is_locked(sk)) BUG(); while ((skb1 = __skb_dequeue(&tp->ucopy.prequeue)) != NULL) { sk->backlog_rcv(sk, skb1); diff -urN v2.5.41/net/core/sock.c linux.net-aio.00/net/core/sock.c --- v2.5.41/net/core/sock.c Tue Sep 17 18:05:38 2002 +++ linux.net-aio.00/net/core/sock.c Mon Oct 7 17:20:05 2002 @@ -861,7 +861,7 @@ spin_unlock_bh(&sk->lock.slock); schedule(); spin_lock_bh(&sk->lock.slock); - if(!sk->lock.users) + if(!sock_is_locked(sk)) break; } current->state = TASK_RUNNING; diff -urN v2.5.41/net/decnet/dn_nsp_in.c linux.net-aio.00/net/decnet/dn_nsp_in.c --- v2.5.41/net/decnet/dn_nsp_in.c Thu Jun 6 00:35:20 2002 +++ linux.net-aio.00/net/decnet/dn_nsp_in.c Mon Oct 7 17:32:49 2002 @@ -800,8 +800,8 @@ printk(KERN_DEBUG "NSP: 0x%02x 0x%02x 0x%04x 0x%04x %d\n", (int)cb->rt_flags, (int)cb->nsp_flags, (int)cb->src_port, (int)cb->dst_port, - (int)sk->lock.users); - if (sk->lock.users == 0) + (int)is_sock_locked(sk)); + if (!is_sock_locked(sk)) ret = dn_nsp_backlog_rcv(sk, skb); else sk_add_backlog(sk, skb); diff -urN v2.5.41/net/decnet/dn_timer.c linux.net-aio.00/net/decnet/dn_timer.c --- v2.5.41/net/decnet/dn_timer.c Mon Jan 22 16:32:10 2001 +++ linux.net-aio.00/net/decnet/dn_timer.c Mon Oct 7 17:33:38 2002 @@ -57,7 +57,7 @@ sock_hold(sk); bh_lock_sock(sk); - if (sk->lock.users != 0) { + if (is_sock_locked(sk)) { sk->timer.expires = jiffies + HZ / 10; add_timer(&sk->timer); goto out; @@ -115,7 +115,7 @@ struct dn_scp *scp = DN_SK(sk); bh_lock_sock(sk); - if (sk->lock.users != 0) { + if (is_sock_locked(sk)) { scp->delack_timer.expires = jiffies + HZ / 20; add_timer(&scp->delack_timer); goto out; diff -urN v2.5.41/net/ipv4/tcp.c linux.net-aio.00/net/ipv4/tcp.c --- v2.5.41/net/ipv4/tcp.c Tue Sep 3 19:47:24 2002 +++ linux.net-aio.00/net/ipv4/tcp.c Mon Oct 7 17:20:05 2002 @@ -623,7 +623,7 @@ local_bh_disable(); bh_lock_sock(child); - BUG_TRAP(!child->lock.users); + BUG_TRAP(!sock_is_locked(child)); sock_hold(child); tcp_disconnect(child, O_NONBLOCK); @@ -2019,7 +2019,7 @@ */ local_bh_disable(); bh_lock_sock(sk); - BUG_TRAP(!sk->lock.users); + BUG_TRAP(!sock_is_locked(sk)); sock_hold(sk); sock_orphan(sk); diff -urN v2.5.41/net/ipv4/tcp_input.c linux.net-aio.00/net/ipv4/tcp_input.c --- v2.5.41/net/ipv4/tcp_input.c Mon Oct 7 17:19:22 2002 +++ linux.net-aio.00/net/ipv4/tcp_input.c Mon Oct 7 17:20:05 2002 @@ -2570,7 +2570,7 @@ /* Ok. In sequence. In window. */ if (tp->ucopy.task == current && tp->copied_seq == tp->rcv_nxt && tp->ucopy.len && - sk->lock.users && !tp->urg_data) { + sock_is_locked(sk) && !tp->urg_data) { int chunk = min_t(unsigned int, skb->len, tp->ucopy.len); @@ -3190,7 +3190,7 @@ { int result; - if (sk->lock.users) { + if (sock_is_locked(sk)) { local_bh_enable(); result = __tcp_checksum_complete(skb); local_bh_disable(); @@ -3324,7 +3324,7 @@ if (tp->ucopy.task == current && tp->copied_seq == tp->rcv_nxt && len - tcp_header_len <= tp->ucopy.len && - sk->lock.users) { + sock_is_locked(sk)) { __set_current_state(TASK_RUNNING); if (!tcp_copy_to_iovec(sk, skb, tcp_header_len)) { @@ -3864,7 +3864,7 @@ tmo = tcp_fin_time(tp); if (tmo > TCP_TIMEWAIT_LEN) { tcp_reset_keepalive_timer(sk, tmo - TCP_TIMEWAIT_LEN); - } else if (th->fin || sk->lock.users) { + } else if (th->fin || sock_is_locked(sk)) { /* Bad case. We could lose such FIN otherwise. * It is not a big problem, but it looks confusing * and not so rare event. We still can lose it now, diff -urN v2.5.41/net/ipv4/tcp_ipv4.c linux.net-aio.00/net/ipv4/tcp_ipv4.c --- v2.5.41/net/ipv4/tcp_ipv4.c Mon Oct 7 17:19:22 2002 +++ linux.net-aio.00/net/ipv4/tcp_ipv4.c Mon Oct 7 17:20:05 2002 @@ -1003,7 +1003,7 @@ /* If too many ICMPs get dropped on busy * servers this needs to be solved differently. */ - if (sk->lock.users) + if (sock_is_locked(sk)) NET_INC_STATS_BH(LockDroppedIcmps); if (sk->state == TCP_CLOSE) @@ -1022,7 +1022,7 @@ /* This is deprecated, but if someone generated it, * we have no reasons to ignore it. */ - if (!sk->lock.users) + if (!sock_is_locked(sk)) tcp_enter_cwr(tp); goto out; case ICMP_PARAMETERPROB: @@ -1033,7 +1033,7 @@ goto out; if (code == ICMP_FRAG_NEEDED) { /* PMTU discovery (RFC1191) */ - if (!sk->lock.users) + if (!sock_is_locked(sk)) do_pmtu_discovery(sk, iph, info); goto out; } @@ -1050,7 +1050,7 @@ switch (sk->state) { struct open_request *req, **prev; case TCP_LISTEN: - if (sk->lock.users) + if (sock_is_locked(sk)) goto out; req = tcp_v4_search_req(tp, &prev, th->dest, @@ -1081,7 +1081,7 @@ case TCP_SYN_RECV: /* Cannot happen. It can f.e. if SYNs crossed. */ - if (!sk->lock.users) { + if (!sock_is_locked(sk)) { TCP_INC_STATS_BH(TcpAttemptFails); sk->err = err; @@ -1111,7 +1111,7 @@ */ inet = inet_sk(sk); - if (!sk->lock.users && inet->recverr) { + if (!sock_is_locked(sk) && inet->recverr) { sk->err = err; sk->error_report(sk); } else { /* Only an error on timeout */ @@ -1778,7 +1778,7 @@ bh_lock_sock(sk); ret = 0; - if (!sk->lock.users) { + if (!sock_is_locked(sk)) { if (!tcp_prequeue(sk, skb)) ret = tcp_v4_do_rcv(sk, skb); } else diff -urN v2.5.41/net/ipv4/tcp_minisocks.c linux.net-aio.00/net/ipv4/tcp_minisocks.c --- v2.5.41/net/ipv4/tcp_minisocks.c Mon Oct 7 17:19:22 2002 +++ linux.net-aio.00/net/ipv4/tcp_minisocks.c Mon Oct 7 17:20:05 2002 @@ -989,7 +989,7 @@ int ret = 0; int state = child->state; - if (child->lock.users == 0) { + if (!sock_is_locked(child)) { ret = tcp_rcv_state_process(child, skb, skb->h.th, skb->len); /* Wakeup parent, send SIGIO */ diff -urN v2.5.41/net/ipv4/tcp_timer.c linux.net-aio.00/net/ipv4/tcp_timer.c --- v2.5.41/net/ipv4/tcp_timer.c Thu Jun 6 00:35:29 2002 +++ linux.net-aio.00/net/ipv4/tcp_timer.c Mon Oct 7 17:20:05 2002 @@ -213,7 +213,7 @@ struct tcp_opt *tp = tcp_sk(sk); bh_lock_sock(sk); - if (sk->lock.users) { + if (sock_is_locked(sk)) { /* Try again later. */ tp->ack.blocked = 1; NET_INC_STATS_BH(DelayedACKLocked); @@ -421,7 +421,7 @@ int event; bh_lock_sock(sk); - if (sk->lock.users) { + if (sock_is_locked(sk)) { /* Try again later */ if (!mod_timer(&tp->retransmit_timer, jiffies + (HZ/20))) sock_hold(sk); @@ -581,7 +581,7 @@ /* Only process if socket is not in use. */ bh_lock_sock(sk); - if (sk->lock.users) { + if (sock_is_locked(sk)) { /* Try again later. */ tcp_reset_keepalive_timer (sk, HZ/20); goto out; diff -urN v2.5.41/net/ipv6/tcp_ipv6.c linux.net-aio.00/net/ipv6/tcp_ipv6.c --- v2.5.41/net/ipv6/tcp_ipv6.c Tue Sep 3 19:47:24 2002 +++ linux.net-aio.00/net/ipv6/tcp_ipv6.c Mon Oct 7 17:35:17 2002 @@ -731,7 +731,7 @@ } bh_lock_sock(sk); - if (sk->lock.users) + if (is_sock_locked(sk)) NET_INC_STATS_BH(LockDroppedIcmps); if (sk->state == TCP_CLOSE) @@ -749,7 +749,7 @@ if (type == ICMPV6_PKT_TOOBIG) { struct dst_entry *dst = NULL; - if (sk->lock.users) + if (is_sock_locked(sk)) goto out; if ((1<state)&(TCPF_LISTEN|TCPF_CLOSE)) goto out; @@ -792,7 +792,7 @@ switch (sk->state) { struct open_request *req, **prev; case TCP_LISTEN: - if (sk->lock.users) + if (is_sock_locked(sk)) goto out; req = tcp_v6_search_req(tp, &prev, th->dest, &hdr->daddr, @@ -816,7 +816,7 @@ case TCP_SYN_SENT: case TCP_SYN_RECV: /* Cannot happen. It can, it SYNs are crossed. --ANK */ - if (sk->lock.users == 0) { + if (!is_sock_locked(sk)) { TCP_INC_STATS_BH(TcpAttemptFails); sk->err = err; sk->error_report(sk); /* Wake people up to see the error (see connect in sock.c) */ @@ -828,7 +828,7 @@ goto out; } - if (sk->lock.users == 0 && np->recverr) { + if (!is_sock_locked(sk) && np->recverr) { sk->err = err; sk->error_report(sk); } else { @@ -1622,7 +1622,7 @@ bh_lock_sock(sk); ret = 0; - if (!sk->lock.users) { + if (!is_sock_locked(sk)) { if (!tcp_prequeue(sk, skb)) ret = tcp_v6_do_rcv(sk, skb); } else diff -urN v2.5.41/net/llc/llc_c_ac.c linux.net-aio.00/net/llc/llc_c_ac.c --- v2.5.41/net/llc/llc_c_ac.c Mon Oct 7 17:19:22 2002 +++ linux.net-aio.00/net/llc/llc_c_ac.c Mon Oct 7 17:35:35 2002 @@ -1489,7 +1489,7 @@ __FUNCTION__); kfree_skb(skb); } else { - if (!sk->lock.users) + if (!is_sock_locked(sk)) llc_conn_state_process(sk, skb); else { llc_set_backlog_type(skb, LLC_EVENT); diff -urN v2.5.41/net/llc/llc_mac.c linux.net-aio.00/net/llc/llc_mac.c --- v2.5.41/net/llc/llc_mac.c Mon Oct 7 17:19:22 2002 +++ linux.net-aio.00/net/llc/llc_mac.c Mon Oct 7 17:35:55 2002 @@ -140,7 +140,7 @@ } else skb->sk = sk; bh_lock_sock(sk); - if (!sk->lock.users) { + if (!is_sock_locked(sk)) { /* rc = */ llc_conn_rcv(sk, skb); rc = 0; } else { diff -urN v2.5.41/net/llc/llc_proc.c linux.net-aio.00/net/llc/llc_proc.c --- v2.5.41/net/llc/llc_proc.c Mon Oct 7 17:19:22 2002 +++ linux.net-aio.00/net/llc/llc_proc.c Mon Oct 7 17:36:15 2002 @@ -182,7 +182,7 @@ timer_pending(&llc->pf_cycle_timer.timer), timer_pending(&llc->rej_sent_timer.timer), timer_pending(&llc->busy_state_timer.timer), - !!sk->backlog.tail, sk->lock.users); + !!sk->backlog.tail, is_sock_locked(sk)); out: return 0; } diff -urN v2.5.41/net/x25/x25_dev.c linux.net-aio.00/net/x25/x25_dev.c --- v2.5.41/net/x25/x25_dev.c Tue Oct 1 13:25:11 2002 +++ linux.net-aio.00/net/x25/x25_dev.c Mon Oct 7 17:36:32 2002 @@ -70,7 +70,7 @@ skb->h.raw = skb->data; bh_lock_sock(sk); - if (!sk->lock.users) { + if (!is_sock_locked(sk)) { queued = x25_process_rx_frame(sk, skb); } else { sk_add_backlog(sk, skb); diff -urN v2.5.41/net/x25/x25_timer.c linux.net-aio.00/net/x25/x25_timer.c --- v2.5.41/net/x25/x25_timer.c Tue Oct 1 13:25:11 2002 +++ linux.net-aio.00/net/x25/x25_timer.c Mon Oct 7 17:36:55 2002 @@ -131,7 +131,7 @@ struct sock *sk = (struct sock *)param; bh_lock_sock(sk); - if (sk->lock.users) /* can currently only occur in state 3 */ + if (is_sock_locked(sk)) /* can currently only occur in state 3 */ goto restart_heartbeat; switch (x25_sk(sk)->state) { @@ -193,7 +193,7 @@ struct sock *sk = (struct sock *)param; bh_lock_sock(sk); - if (sk->lock.users) { /* can currently only occur in state 3 */ + if (is_sock_locked(sk)) { /* can currently only occur in state 3 */ if (x25_sk(sk)->state == X25_STATE_3) x25_start_t2timer(sk); } else From davem@redhat.com Mon Oct 7 15:21:49 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 15:21:53 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97MLntG019082 for ; Mon, 7 Oct 2002 15:21:49 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id PAA31856; Mon, 7 Oct 2002 15:14:59 -0700 Date: Mon, 07 Oct 2002 15:14:59 -0700 (PDT) Message-Id: <20021007.151459.09774569.davem@redhat.com> To: bcrl@redhat.com Cc: netdev@oss.sgi.com Subject: Re: [patch] abstract out socket lock.users access From: "David S. Miller" In-Reply-To: <20021007175551.B30693@redhat.com> References: <20021007175551.B30693@redhat.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 571 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Benjamin LaHaise Date: Mon, 7 Oct 2002 17:55:51 -0400 We define this: +#define sock_is_locked(sk) (NULL != (sk)->lock.owner) But call: + (int)is_sock_locked(sk)); + if (!is_sock_locked(sk)) ... - if (sk->lock.users != 0) { + if (is_sock_locked(sk)) { And it's not a lock, it is a user ownership indication. I'd therefore prefer "sock_owned_by_user" or similar. Next: +#define async_lock_sock(iocb, __sk, list) \ +({ int ret = 0; \ + spin_lock_bh(&((__sk)->lock.slock)); \ + if ((__sk)->lock.owner != NULL) \ + ret = __async_lock_sock((iocb), (__sk), (list)); \ + else \ + (__sk)->lock.owner = (iocb); \ + spin_unlock_bh(&((__sk)->lock.slock)); \ + ret; \ +}) + How does this work? Is there some protocol that treats (void *)1 specially inside of __async_lock_sock()? Where are this semantics defined? Please clean up the {is_sock,sock_is}_locked() stuff and define how async_lock_sock works wrt. the owner pointer. From bcrl@redhat.com Mon Oct 7 15:50:53 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 15:50:55 -0700 (PDT) Received: from touchme.toronto.redhat.com (to-velocet.redhat.com [216.138.202.10]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97MoqtG019997 for ; Mon, 7 Oct 2002 15:50:52 -0700 Received: from toomuch.toronto.redhat.com (toomuch.toronto.redhat.com [172.16.14.22]) by touchme.toronto.redhat.com (Postfix) with ESMTP id 5CCF88000E5; Mon, 7 Oct 2002 18:50:51 -0400 (EDT) Received: (from bcrl@localhost) by toomuch.toronto.redhat.com (8.11.6/8.11.6) id g97Mop025537; Mon, 7 Oct 2002 18:50:51 -0400 Date: Mon, 7 Oct 2002 18:50:51 -0400 From: Benjamin LaHaise To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [patch] abstract out socket lock.users access Message-ID: <20021007185051.A25468@redhat.com> References: <20021007175551.B30693@redhat.com> <20021007.151459.09774569.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20021007.151459.09774569.davem@redhat.com>; from davem@redhat.com on Mon, Oct 07, 2002 at 03:14:59PM -0700 X-archive-position: 572 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bcrl@redhat.com Precedence: bulk X-list: netdev On Mon, Oct 07, 2002 at 03:14:59PM -0700, David S. Miller wrote: > From: Benjamin LaHaise > Date: Mon, 7 Oct 2002 17:55:51 -0400 > > We define this: > > +#define sock_is_locked(sk) (NULL != (sk)->lock.owner) Whoops. Sorry, but the cases that didn't compile aren't in my .config and the patch was written over a few days. > And it's not a lock, it is a user ownership indication. > I'd therefore prefer "sock_owned_by_user" or similar. Sure. > How does this work? Is there some protocol that treats (void *)1 > specially inside of __async_lock_sock()? Where are this semantics > defined? (void *)1 isn't special, it's just a way of ensuring that code which has yet to be converted still works. __async_lock_sock() treats owner == iocb special and allows that case to fall through succeeding without blocking. __async_lock_sock depends on the sock_iocb being defined which will follow, so I've removed it from this patch and into a later patch. > Please clean up the {is_sock,sock_is}_locked() stuff and define > how async_lock_sock works wrt. the owner pointer. async_lock_sock works by placing the iocb on a list of outstanding iocbs under the spinlock, until the socket is unlocked. The unlocker checks if there are any outstanding iocbs and transfers ownership of the lock to the head of the list and then kicks it off for processing. The read/write is then retried via the same code path it originally took unless the protocol replaced the retry hook. This should make for minimal bloat in the conversion to aio capable networking. Of course, you'll probably want to retweak things... Anyways, this version should be cleaned up, unless my eyes have glossed over and missed something in reading through the patch. -ben :r ~/patches/v2.5/v2.5.41-net-is_locked-B.diff diff -urN v2.5.41/include/net/sock.h v2.5.41-net-is_locked-B/include/net/sock.h --- v2.5.41/include/net/sock.h Tue Oct 1 13:25:11 2002 +++ v2.5.41-net-is_locked-B/include/net/sock.h Mon Oct 7 18:37:51 2002 @@ -70,15 +70,16 @@ * between user contexts and software interrupt processing, whereas the * mini-semaphore synchronizes multiple users amongst themselves. */ +struct sock_iocb; typedef struct { spinlock_t slock; - unsigned int users; + struct sock_iocb *owner; wait_queue_head_t wq; } socket_lock_t; #define sock_lock_init(__sk) \ do { spin_lock_init(&((__sk)->lock.slock)); \ - (__sk)->lock.users = 0; \ + (__sk)->lock.owner = NULL; \ init_waitqueue_head(&((__sk)->lock.wq)); \ } while(0) @@ -306,14 +307,16 @@ * Since ~2.3.5 it is also exclusive sleep lock serializing * accesses from user process context. */ +extern int __async_lock_sock(struct sock_iocb *, struct sock *, struct list_head *); extern void __lock_sock(struct sock *sk); extern void __release_sock(struct sock *sk); +#define sock_owned_by_user(sk) (NULL != (sk)->lock.owner) #define lock_sock(__sk) \ do { might_sleep(); \ spin_lock_bh(&((__sk)->lock.slock)); \ - if ((__sk)->lock.users != 0) \ + if ((__sk)->lock.owner != NULL) \ __lock_sock(__sk); \ - (__sk)->lock.users = 1; \ + (__sk)->lock.owner = (void *)1; \ spin_unlock_bh(&((__sk)->lock.slock)); \ } while(0) @@ -321,7 +324,7 @@ do { spin_lock_bh(&((__sk)->lock.slock)); \ if ((__sk)->backlog.tail != NULL) \ __release_sock(__sk); \ - (__sk)->lock.users = 0; \ + (__sk)->lock.owner = NULL; \ if (waitqueue_active(&((__sk)->lock.wq))) wake_up(&((__sk)->lock.wq)); \ spin_unlock_bh(&((__sk)->lock.slock)); \ } while(0) diff -urN v2.5.41/include/net/tcp.h v2.5.41-net-is_locked-B/include/net/tcp.h --- v2.5.41/include/net/tcp.h Tue Sep 17 18:05:36 2002 +++ v2.5.41-net-is_locked-B/include/net/tcp.h Mon Oct 7 18:36:01 2002 @@ -1348,7 +1348,7 @@ if (tp->ucopy.memory > sk->rcvbuf) { struct sk_buff *skb1; - if (sk->lock.users) BUG(); + if (sock_owned_by_user(sk)) BUG(); while ((skb1 = __skb_dequeue(&tp->ucopy.prequeue)) != NULL) { sk->backlog_rcv(sk, skb1); diff -urN v2.5.41/net/core/sock.c v2.5.41-net-is_locked-B/net/core/sock.c --- v2.5.41/net/core/sock.c Tue Sep 17 18:05:38 2002 +++ v2.5.41-net-is_locked-B/net/core/sock.c Mon Oct 7 18:36:01 2002 @@ -861,7 +861,7 @@ spin_unlock_bh(&sk->lock.slock); schedule(); spin_lock_bh(&sk->lock.slock); - if(!sk->lock.users) + if(!sock_owned_by_user(sk)) break; } current->state = TASK_RUNNING; diff -urN v2.5.41/net/decnet/dn_nsp_in.c v2.5.41-net-is_locked-B/net/decnet/dn_nsp_in.c --- v2.5.41/net/decnet/dn_nsp_in.c Thu Jun 6 00:35:20 2002 +++ v2.5.41-net-is_locked-B/net/decnet/dn_nsp_in.c Mon Oct 7 18:36:01 2002 @@ -800,8 +800,8 @@ printk(KERN_DEBUG "NSP: 0x%02x 0x%02x 0x%04x 0x%04x %d\n", (int)cb->rt_flags, (int)cb->nsp_flags, (int)cb->src_port, (int)cb->dst_port, - (int)sk->lock.users); - if (sk->lock.users == 0) + (int)sock_owned_by_user(sk)); + if (!sock_owned_by_user(sk)) ret = dn_nsp_backlog_rcv(sk, skb); else sk_add_backlog(sk, skb); diff -urN v2.5.41/net/decnet/dn_timer.c v2.5.41-net-is_locked-B/net/decnet/dn_timer.c --- v2.5.41/net/decnet/dn_timer.c Mon Jan 22 16:32:10 2001 +++ v2.5.41-net-is_locked-B/net/decnet/dn_timer.c Mon Oct 7 18:36:01 2002 @@ -57,7 +57,7 @@ sock_hold(sk); bh_lock_sock(sk); - if (sk->lock.users != 0) { + if (sock_owned_by_user(sk)) { sk->timer.expires = jiffies + HZ / 10; add_timer(&sk->timer); goto out; @@ -115,7 +115,7 @@ struct dn_scp *scp = DN_SK(sk); bh_lock_sock(sk); - if (sk->lock.users != 0) { + if (sock_owned_by_user(sk)) { scp->delack_timer.expires = jiffies + HZ / 20; add_timer(&scp->delack_timer); goto out; diff -urN v2.5.41/net/ipv4/tcp.c v2.5.41-net-is_locked-B/net/ipv4/tcp.c --- v2.5.41/net/ipv4/tcp.c Tue Sep 3 19:47:24 2002 +++ v2.5.41-net-is_locked-B/net/ipv4/tcp.c Mon Oct 7 18:36:01 2002 @@ -623,7 +623,7 @@ local_bh_disable(); bh_lock_sock(child); - BUG_TRAP(!child->lock.users); + BUG_TRAP(!sock_owned_by_user(child)); sock_hold(child); tcp_disconnect(child, O_NONBLOCK); @@ -2019,7 +2019,7 @@ */ local_bh_disable(); bh_lock_sock(sk); - BUG_TRAP(!sk->lock.users); + BUG_TRAP(!sock_owned_by_user(sk)); sock_hold(sk); sock_orphan(sk); diff -urN v2.5.41/net/ipv4/tcp_input.c v2.5.41-net-is_locked-B/net/ipv4/tcp_input.c --- v2.5.41/net/ipv4/tcp_input.c Mon Oct 7 17:19:22 2002 +++ v2.5.41-net-is_locked-B/net/ipv4/tcp_input.c Mon Oct 7 18:36:01 2002 @@ -2570,7 +2570,7 @@ /* Ok. In sequence. In window. */ if (tp->ucopy.task == current && tp->copied_seq == tp->rcv_nxt && tp->ucopy.len && - sk->lock.users && !tp->urg_data) { + sock_owned_by_user(sk) && !tp->urg_data) { int chunk = min_t(unsigned int, skb->len, tp->ucopy.len); @@ -3190,7 +3190,7 @@ { int result; - if (sk->lock.users) { + if (sock_owned_by_user(sk)) { local_bh_enable(); result = __tcp_checksum_complete(skb); local_bh_disable(); @@ -3324,7 +3324,7 @@ if (tp->ucopy.task == current && tp->copied_seq == tp->rcv_nxt && len - tcp_header_len <= tp->ucopy.len && - sk->lock.users) { + sock_owned_by_user(sk)) { __set_current_state(TASK_RUNNING); if (!tcp_copy_to_iovec(sk, skb, tcp_header_len)) { @@ -3864,7 +3864,7 @@ tmo = tcp_fin_time(tp); if (tmo > TCP_TIMEWAIT_LEN) { tcp_reset_keepalive_timer(sk, tmo - TCP_TIMEWAIT_LEN); - } else if (th->fin || sk->lock.users) { + } else if (th->fin || sock_owned_by_user(sk)) { /* Bad case. We could lose such FIN otherwise. * It is not a big problem, but it looks confusing * and not so rare event. We still can lose it now, diff -urN v2.5.41/net/ipv4/tcp_ipv4.c v2.5.41-net-is_locked-B/net/ipv4/tcp_ipv4.c --- v2.5.41/net/ipv4/tcp_ipv4.c Mon Oct 7 17:19:22 2002 +++ v2.5.41-net-is_locked-B/net/ipv4/tcp_ipv4.c Mon Oct 7 18:36:01 2002 @@ -1003,7 +1003,7 @@ /* If too many ICMPs get dropped on busy * servers this needs to be solved differently. */ - if (sk->lock.users) + if (sock_owned_by_user(sk)) NET_INC_STATS_BH(LockDroppedIcmps); if (sk->state == TCP_CLOSE) @@ -1022,7 +1022,7 @@ /* This is deprecated, but if someone generated it, * we have no reasons to ignore it. */ - if (!sk->lock.users) + if (!sock_owned_by_user(sk)) tcp_enter_cwr(tp); goto out; case ICMP_PARAMETERPROB: @@ -1033,7 +1033,7 @@ goto out; if (code == ICMP_FRAG_NEEDED) { /* PMTU discovery (RFC1191) */ - if (!sk->lock.users) + if (!sock_owned_by_user(sk)) do_pmtu_discovery(sk, iph, info); goto out; } @@ -1050,7 +1050,7 @@ switch (sk->state) { struct open_request *req, **prev; case TCP_LISTEN: - if (sk->lock.users) + if (sock_owned_by_user(sk)) goto out; req = tcp_v4_search_req(tp, &prev, th->dest, @@ -1081,7 +1081,7 @@ case TCP_SYN_RECV: /* Cannot happen. It can f.e. if SYNs crossed. */ - if (!sk->lock.users) { + if (!sock_owned_by_user(sk)) { TCP_INC_STATS_BH(TcpAttemptFails); sk->err = err; @@ -1111,7 +1111,7 @@ */ inet = inet_sk(sk); - if (!sk->lock.users && inet->recverr) { + if (!sock_owned_by_user(sk) && inet->recverr) { sk->err = err; sk->error_report(sk); } else { /* Only an error on timeout */ @@ -1778,7 +1778,7 @@ bh_lock_sock(sk); ret = 0; - if (!sk->lock.users) { + if (!sock_owned_by_user(sk)) { if (!tcp_prequeue(sk, skb)) ret = tcp_v4_do_rcv(sk, skb); } else diff -urN v2.5.41/net/ipv4/tcp_minisocks.c v2.5.41-net-is_locked-B/net/ipv4/tcp_minisocks.c --- v2.5.41/net/ipv4/tcp_minisocks.c Mon Oct 7 17:19:22 2002 +++ v2.5.41-net-is_locked-B/net/ipv4/tcp_minisocks.c Mon Oct 7 18:36:01 2002 @@ -989,7 +989,7 @@ int ret = 0; int state = child->state; - if (child->lock.users == 0) { + if (!sock_owned_by_user(child)) { ret = tcp_rcv_state_process(child, skb, skb->h.th, skb->len); /* Wakeup parent, send SIGIO */ diff -urN v2.5.41/net/ipv4/tcp_timer.c v2.5.41-net-is_locked-B/net/ipv4/tcp_timer.c --- v2.5.41/net/ipv4/tcp_timer.c Thu Jun 6 00:35:29 2002 +++ v2.5.41-net-is_locked-B/net/ipv4/tcp_timer.c Mon Oct 7 18:36:01 2002 @@ -213,7 +213,7 @@ struct tcp_opt *tp = tcp_sk(sk); bh_lock_sock(sk); - if (sk->lock.users) { + if (sock_owned_by_user(sk)) { /* Try again later. */ tp->ack.blocked = 1; NET_INC_STATS_BH(DelayedACKLocked); @@ -421,7 +421,7 @@ int event; bh_lock_sock(sk); - if (sk->lock.users) { + if (sock_owned_by_user(sk)) { /* Try again later */ if (!mod_timer(&tp->retransmit_timer, jiffies + (HZ/20))) sock_hold(sk); @@ -581,7 +581,7 @@ /* Only process if socket is not in use. */ bh_lock_sock(sk); - if (sk->lock.users) { + if (sock_owned_by_user(sk)) { /* Try again later. */ tcp_reset_keepalive_timer (sk, HZ/20); goto out; diff -urN v2.5.41/net/ipv6/tcp_ipv6.c v2.5.41-net-is_locked-B/net/ipv6/tcp_ipv6.c --- v2.5.41/net/ipv6/tcp_ipv6.c Tue Sep 3 19:47:24 2002 +++ v2.5.41-net-is_locked-B/net/ipv6/tcp_ipv6.c Mon Oct 7 18:36:01 2002 @@ -731,7 +731,7 @@ } bh_lock_sock(sk); - if (sk->lock.users) + if (sock_owned_by_user(sk)) NET_INC_STATS_BH(LockDroppedIcmps); if (sk->state == TCP_CLOSE) @@ -749,7 +749,7 @@ if (type == ICMPV6_PKT_TOOBIG) { struct dst_entry *dst = NULL; - if (sk->lock.users) + if (sock_owned_by_user(sk)) goto out; if ((1<state)&(TCPF_LISTEN|TCPF_CLOSE)) goto out; @@ -792,7 +792,7 @@ switch (sk->state) { struct open_request *req, **prev; case TCP_LISTEN: - if (sk->lock.users) + if (sock_owned_by_user(sk)) goto out; req = tcp_v6_search_req(tp, &prev, th->dest, &hdr->daddr, @@ -816,7 +816,7 @@ case TCP_SYN_SENT: case TCP_SYN_RECV: /* Cannot happen. It can, it SYNs are crossed. --ANK */ - if (sk->lock.users == 0) { + if (!sock_owned_by_user(sk)) { TCP_INC_STATS_BH(TcpAttemptFails); sk->err = err; sk->error_report(sk); /* Wake people up to see the error (see connect in sock.c) */ @@ -828,7 +828,7 @@ goto out; } - if (sk->lock.users == 0 && np->recverr) { + if (!sock_owned_by_user(sk) && np->recverr) { sk->err = err; sk->error_report(sk); } else { @@ -1622,7 +1622,7 @@ bh_lock_sock(sk); ret = 0; - if (!sk->lock.users) { + if (!sock_owned_by_user(sk)) { if (!tcp_prequeue(sk, skb)) ret = tcp_v6_do_rcv(sk, skb); } else diff -urN v2.5.41/net/llc/llc_c_ac.c v2.5.41-net-is_locked-B/net/llc/llc_c_ac.c --- v2.5.41/net/llc/llc_c_ac.c Mon Oct 7 17:19:22 2002 +++ v2.5.41-net-is_locked-B/net/llc/llc_c_ac.c Mon Oct 7 18:36:01 2002 @@ -1489,7 +1489,7 @@ __FUNCTION__); kfree_skb(skb); } else { - if (!sk->lock.users) + if (!sock_owned_by_user(sk)) llc_conn_state_process(sk, skb); else { llc_set_backlog_type(skb, LLC_EVENT); diff -urN v2.5.41/net/llc/llc_mac.c v2.5.41-net-is_locked-B/net/llc/llc_mac.c --- v2.5.41/net/llc/llc_mac.c Mon Oct 7 17:19:22 2002 +++ v2.5.41-net-is_locked-B/net/llc/llc_mac.c Mon Oct 7 18:36:01 2002 @@ -140,7 +140,7 @@ } else skb->sk = sk; bh_lock_sock(sk); - if (!sk->lock.users) { + if (!sock_owned_by_user(sk)) { /* rc = */ llc_conn_rcv(sk, skb); rc = 0; } else { diff -urN v2.5.41/net/llc/llc_proc.c v2.5.41-net-is_locked-B/net/llc/llc_proc.c --- v2.5.41/net/llc/llc_proc.c Mon Oct 7 17:19:22 2002 +++ v2.5.41-net-is_locked-B/net/llc/llc_proc.c Mon Oct 7 18:36:01 2002 @@ -182,7 +182,7 @@ timer_pending(&llc->pf_cycle_timer.timer), timer_pending(&llc->rej_sent_timer.timer), timer_pending(&llc->busy_state_timer.timer), - !!sk->backlog.tail, sk->lock.users); + !!sk->backlog.tail, sock_owned_by_user(sk)); out: return 0; } diff -urN v2.5.41/net/x25/x25_dev.c v2.5.41-net-is_locked-B/net/x25/x25_dev.c --- v2.5.41/net/x25/x25_dev.c Tue Oct 1 13:25:11 2002 +++ v2.5.41-net-is_locked-B/net/x25/x25_dev.c Mon Oct 7 18:36:01 2002 @@ -70,7 +70,7 @@ skb->h.raw = skb->data; bh_lock_sock(sk); - if (!sk->lock.users) { + if (!sock_owned_by_user(sk)) { queued = x25_process_rx_frame(sk, skb); } else { sk_add_backlog(sk, skb); diff -urN v2.5.41/net/x25/x25_timer.c v2.5.41-net-is_locked-B/net/x25/x25_timer.c --- v2.5.41/net/x25/x25_timer.c Tue Oct 1 13:25:11 2002 +++ v2.5.41-net-is_locked-B/net/x25/x25_timer.c Mon Oct 7 18:36:01 2002 @@ -131,7 +131,7 @@ struct sock *sk = (struct sock *)param; bh_lock_sock(sk); - if (sk->lock.users) /* can currently only occur in state 3 */ + if (sock_owned_by_user(sk)) /* can currently only occur in state 3 */ goto restart_heartbeat; switch (x25_sk(sk)->state) { @@ -193,7 +193,7 @@ struct sock *sk = (struct sock *)param; bh_lock_sock(sk); - if (sk->lock.users) { /* can currently only occur in state 3 */ + if (sock_owned_by_user(sk)) { /* can currently only occur in state 3 */ if (x25_sk(sk)->state == X25_STATE_3) x25_start_t2timer(sk); } else From davem@redhat.com Mon Oct 7 16:00:23 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 16:00:25 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97N0MtG020557 for ; Mon, 7 Oct 2002 16:00:23 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id PAA32218; Mon, 7 Oct 2002 15:53:32 -0700 Date: Mon, 07 Oct 2002 15:53:32 -0700 (PDT) Message-Id: <20021007.155332.32735975.davem@redhat.com> To: bcrl@redhat.com Cc: netdev@oss.sgi.com Subject: Re: [patch] abstract out socket lock.users access From: "David S. Miller" In-Reply-To: <20021007185051.A25468@redhat.com> References: <20021007175551.B30693@redhat.com> <20021007.151459.09774569.davem@redhat.com> <20021007185051.A25468@redhat.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 573 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Benjamin LaHaise Date: Mon, 7 Oct 2002 18:50:51 -0400 Anyways, this version should be cleaned up, unless my eyes have glossed over and missed something in reading through the patch. Looks good, the sock_owned_by_user() is a needed good cleanup in any event. After some sleep I'll think some more about the async machinery and probably just apply this unless someone else finds something terribly wrong. From ahaas@neosoft.com Mon Oct 7 16:49:54 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 16:49:58 -0700 (PDT) Received: from mx4.airmail.net (mx4.airmail.net [209.196.77.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g97NnrtG021760 for ; Mon, 7 Oct 2002 16:49:53 -0700 Received: from mail3.iadfw.net ([209.196.123.3]) by mx4.airmail.net with smtp (Exim 4.10) id 17yh3S-000MOt-00; Mon, 07 Oct 2002 18:12:50 -0500 Received: from debian from [66.94.136.187] by mail3.iadfw.net (/\##/\ Smail3.1.30.16 #30.61) with esmtp for sender: id ; Mon, 7 Oct 2002 18:14:26 -0500 (CDT) Received: from arth by debian with local (Exim 3.36 #1 (Debian)) id 17ygYo-0003oo-00; Mon, 07 Oct 2002 17:41:10 -0500 Date: Mon, 7 Oct 2002 17:41:10 -0500 From: Art Haas To: netdev@oss.sgi.com, carnil@cs.tut.fi Cc: Linus Torvalds Subject: [PATCH] C99 designated initializer for net/atm/lec.c Message-ID: <20021007224110.GM9856@debian> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-archive-position: 574 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ahaas@neosoft.com Precedence: bulk X-list: netdev Hi. Here's a trivial patch for net/atm/lec.c to switch it to use C99 designated initializers. The patch is against 2.5.41. Art Haas --- linux-2.5.41/net/atm/lec.c.old 2002-07-05 18:42:03.000000000 -0500 +++ linux-2.5.41/net/atm/lec.c 2002-10-07 15:52:02.000000000 -0500 @@ -553,8 +553,8 @@ } static struct atmdev_ops lecdev_ops = { - close: lec_atm_close, - send: lec_atm_send + .close = lec_atm_close, + .send = lec_atm_send }; static struct atm_dev lecatm_dev = { -- They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety. -- Benjamin Franklin, Historical Review of Pennsylvania, 1759 From ahaas@neosoft.com Mon Oct 7 17:19:33 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 17:19:34 -0700 (PDT) Received: from mx10.airmail.net (mxall.mxgrp.airmail.net [209.196.77.107]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g980JWtG023070 for ; Mon, 7 Oct 2002 17:19:33 -0700 Received: from mail3.iadfw.net ([209.196.123.3]) by mx10.airmail.net with smtp (Exim 4.10) id 17yh3z-0002ME-00; Mon, 07 Oct 2002 18:13:23 -0500 Received: from debian from [66.94.136.187] by mail3.iadfw.net (/\##/\ Smail3.1.30.16 #30.61) with esmtp for sender: id ; Mon, 7 Oct 2002 18:15:00 -0500 (CDT) Received: from arth by debian with local (Exim 3.36 #1 (Debian)) id 17ygjI-0003ui-00; Mon, 07 Oct 2002 17:52:00 -0500 Date: Mon, 7 Oct 2002 17:52:00 -0500 From: Art Haas To: netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: [PATCH] trivial C99 designated initializer patch for net/netlink/af_netlink.c Message-ID: <20021007225200.GP9856@debian> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-archive-position: 576 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ahaas@neosoft.com Precedence: bulk X-list: netdev Hi. The trivial patch below fixes a structure to use C99 designated initializers. The patch is against 2.5.41. Art Haas --- linux-2.5.41/net/netlink/af_netlink.c.old 2002-08-10 22:04:03.000000000 -0500 +++ linux-2.5.41/net/netlink/af_netlink.c 2002-10-07 15:51:59.000000000 -0500 @@ -280,8 +280,8 @@ skb_queue_purge(&sk->write_queue); if (nlk->pid && !nlk->groups) { - struct netlink_notify n = { protocol:sk->protocol, - pid:nlk->pid }; + struct netlink_notify n = { .protocol = sk->protocol, + .pid = nlk->pid }; notifier_call_chain(&netlink_chain, NETLINK_URELEASE, &n); } -- They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety. -- Benjamin Franklin, Historical Review of Pennsylvania, 1759 From rgooch@vindaloo.ras.ucalgary.ca Mon Oct 7 17:19:14 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 17:19:18 -0700 (PDT) Received: from vindaloo.ras.ucalgary.ca (vindaloo.ras.ucalgary.ca [136.159.55.21]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g980JCtG022957 for ; Mon, 7 Oct 2002 17:19:13 -0700 Received: (from rgooch@localhost) by vindaloo.ras.ucalgary.ca (8.10.0/8.10.0) id g980Id205154; Mon, 7 Oct 2002 18:18:39 -0600 Date: Mon, 7 Oct 2002 18:18:39 -0600 Message-Id: <200210080018.g980Id205154@vindaloo.ras.ucalgary.ca> From: Richard Gooch To: netdev@oss.sgi.com Cc: Jeff Garzik , Donald Becker , Jason Lunz , "Patrick R. McManus" , edward_peng@dlink.com.tw Subject: Re: Continuing problems with sundance driver In-Reply-To: <200210052348.g95NmXK31793@vindaloo.ras.ucalgary.ca> References: <200210052348.g95NmXK31793@vindaloo.ras.ucalgary.ca> X-archive-position: 575 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rgooch@ras.ucalgary.ca Precedence: bulk X-list: netdev Hi, all. I've tried out the latest driver from D-Link, which they sent to me after I reported problems this weekend. I keep getting transmit timeouts, but so far the driver seems to recover OK. I've appended my kernel logs. The flood of logs is disturbing, and I wonder if this is supposed to be normal behaviour? I do note that it always seems to be the same interface (eth1) that is timing out. Is this perhaps because the link is auto negotiated to 100 Mb/s half duplex, and the other end (which doesn't do auto negotiation correctly), is set to 100 Mb/s full duplex? I still haven't had a response to how I'm supposed to force the interface. My best guess is that I need the following in /etc/modules.conf: options sundance media='"autosense,100mbps_fd,autosense"' but this doesn't seem to make any difference. Regards, Richard.... Permanent: rgooch@atnf.csiro.au Current: rgooch@ras.ucalgary.ca =============================================================================== Oct 7 18:02:09 sundance.c:v1.01+LK1.05b 3-Oct-2002 Written by Donald Becker Oct 7 18:02:09 http://www.scyld.com/network/sundance.html Oct 7 18:02:09 eth0: D-Link DFE-580TX 4 port Server Adapter at 0xc000, 00:05:5d:10:4d:b8, IRQ 5. Oct 7 18:02:09 eth0: MII PHY found at address 1, status 0x782d advertising 01e1. Oct 7 18:02:09 eth1: D-Link DFE-580TX 4 port Server Adapter at 0xc400, 00:05:5d:10:4d:b9, IRQ 12. Oct 7 18:02:09 eth1: MII PHY found at address 1, status 0x782d advertising 01e1. Oct 7 18:02:09 eth2: D-Link DFE-580TX 4 port Server Adapter at 0xc800, 00:05:5d:10:4d:ba, IRQ 10. Oct 7 18:02:09 eth2: MII PHY found at address 1, status 0x782d advertising 01e1. Oct 7 18:02:09 eth3: D-Link DFE-580TX 4 port Server Adapter at 0xcc00, 00:05:5d:10:4d:bb, IRQ 11. Oct 7 18:02:09 eth3: MII PHY found at address 1, status 0x7809 advertising 01e1. Oct 7 18:02:09 eth0: Link changed: Oct 7 18:02:09 eth1: Link changed: Oct 7 18:02:09 eth0: Link changed: 100Mbps, full duplex Oct 7 18:02:09 eth1: Link changed: 100Mbps, half duplex Oct 7 18:02:09 eth2: Link changed: 100Mbps, full duplex Oct 7 18:03:37 NETDEV WATCHDOG: eth1: transmit timed out Oct 7 18:03:37 eth1: Transmit timed out, TxStatus 00 TxFrameId 03, resetting... Oct 7 18:03:37 00 0f9d0000 0f9d0010 00008001(00) 0fa76812 8000004a Oct 7 18:03:37 01 0f9d0010 00000000 00008005(01) 0f5f1812 8000004a Oct 7 18:03:37 02 0f9d0020 0f9d0030 00018009(02) 00000000 00000000 Oct 7 18:03:37 03 0f9d0030 0f9d0040 0001800d(03) 00000000 00000000 Oct 7 18:03:37 04 0f9d0040 0f9d0050 00018011(04) 0f9cc812 8000059a Oct 7 18:03:37 05 0f9d0050 0f9d0060 00018015(05) 0fa2f812 80000042 Oct 7 18:03:37 06 0f9d0060 0f9d0070 00008019(06) 01324812 8000059a Oct 7 18:03:37 07 0f9d0070 0f9d0080 0000801d(07) 0fa79012 8000059a Oct 7 18:03:37 08 0f9d0080 0f9d0090 00008021(08) 0f40d812 8000059a Oct 7 18:03:37 09 0f9d0090 0f9d00a0 00008025(09) 013b4812 8000059a Oct 7 18:03:37 0a 0f9d00a0 0f9d00b0 00008029(0a) 0f425812 8000059a Oct 7 18:03:37 0b 0f9d00b0 0f9d00c0 0000802d(0b) 0f65d012 8000059a Oct 7 18:03:37 0c 0f9d00c0 0f9d00d0 00008031(0c) 0f52d012 80000035 Oct 7 18:03:37 0d 0f9d00d0 0f9d00e0 00008035(0d) 0fbbd812 80000035 Oct 7 18:03:37 0e 0f9d00e0 0f9d00f0 00008039(0e) 0fbe7012 80000035 Oct 7 18:03:37 0f 0f9d00f0 0f9d0100 0000803d(0f) 0f9da812 80000035 Oct 7 18:03:37 10 0f9d0100 0f9d0110 00008041(10) 0130e012 8000004e Oct 7 18:03:37 11 0f9d0110 0f9d0120 00008045(11) 0f533012 8000059a Oct 7 18:03:37 12 0f9d0120 0f9d0130 00008049(12) 0fa2e012 8000004e Oct 7 18:03:37 13 0f9d0130 0f9d0140 0000804d(13) 0f8cc812 8000003a Oct 7 18:03:37 14 0f9d0140 0f9d0150 00008051(14) 0f5ef812 8000059a Oct 7 18:03:37 15 0f9d0150 0f9d0160 00008055(15) 0f42e012 8000004e Oct 7 18:03:37 16 0f9d0160 0f9d0170 00008059(16) 0f40f012 8000059a Oct 7 18:03:37 17 0f9d0170 0f9d0180 0000805d(17) 0eccc812 80000062 Oct 7 18:03:37 18 0f9d0180 0f9d0190 00008061(18) 013b5012 8000003a Oct 7 18:03:37 19 0f9d0190 0f9d01a0 00008065(19) 0f5ee012 80000042 Oct 7 18:03:37 1a 0f9d01a0 0f9d01b0 00008069(1a) 0f756012 8000004e Oct 7 18:03:37 1b 0f9d01b0 0f9d01c0 0000806d(1b) 0f426012 80000042 Oct 7 18:03:37 1c 0f9d01c0 0f9d01d0 00008071(1c) 0fbe6812 8000004a Oct 7 18:03:37 1d 0f9d01d0 0f9d01e0 00008075(1d) 013b4012 8000004a Oct 7 18:03:37 1e 0f9d01e0 0f9d01f0 00008079(1e) 01361812 80000042 Oct 7 18:03:37 1f 0f9d01f0 0f9d0000 0000807d(1f) 0fa67812 8000004a Oct 7 18:03:37 TxListPtr=0f9d0060 netif_queue_stopped=1 Oct 7 18:03:37 cur_tx=706(02) dirty_tx=676(04) Oct 7 18:03:37 cur_rx=9 dirty_rx=9 Oct 7 18:05:01 NETDEV WATCHDOG: eth1: transmit timed out Oct 7 18:05:01 eth1: Transmit timed out, TxStatus 00 TxFrameId 0b, resetting... Oct 7 18:05:01 00 0f9d0000 0f9d0010 00008001(00) 0f9d9812 800005ea Oct 7 18:05:01 01 0f9d0010 0f9d0020 00008005(01) 0f3f2012 800005ea Oct 7 18:05:01 02 0f9d0020 0f9d0030 00008009(02) 0f9d4012 800005ea Oct 7 18:05:01 03 0f9d0030 0f9d0040 0000800d(03) 0f88d012 800005ea Oct 7 18:05:01 04 0f9d0040 0f9d0050 00008011(04) 0f65e812 800005ea Oct 7 18:05:01 05 0f9d0050 0f9d0060 00008015(05) 0ecce812 800005ea Oct 7 18:05:01 06 0f9d0060 0f9d0070 00008019(06) 0f9d6812 800005ea Oct 7 18:05:01 07 0f9d0070 0f9d0080 0000801d(07) 01363812 800005ea Oct 7 18:05:01 08 0f9d0080 0f9d0090 00008021(08) 0f88d812 800005ea Oct 7 18:05:01 09 0f9d0090 00000000 00008025(09) 0f9d9012 800005ea Oct 7 18:05:01 0a 0f9d00a0 0f9d00b0 00018029(0a) 00000000 00000000 Oct 7 18:05:01 0b 0f9d00b0 0f9d00c0 0001802d(0b) 00000000 00000000 Oct 7 18:05:01 0c 0f9d00c0 0f9d00d0 00018031(0c) 0fbe7812 80000042 Oct 7 18:05:01 0d 0f9d00d0 0f9d00e0 00018035(0d) 0f651012 800005ea Oct 7 18:05:01 0e 0f9d00e0 0f9d00f0 00008039(0e) 0ece6012 800005ea Oct 7 18:05:01 0f 0f9d00f0 0f9d0100 0000803d(0f) 0f3fb812 800005ea Oct 7 18:05:01 10 0f9d0100 0f9d0110 00008041(10) 0ece7812 800005ea Oct 7 18:05:01 11 0f9d0110 0f9d0120 00008045(11) 0f531012 800005ea Oct 7 18:05:01 12 0f9d0120 0f9d0130 00008049(12) 0f70b012 800005ea Oct 7 18:05:01 13 0f9d0130 0f9d0140 0000804d(13) 0f9da012 800005ea Oct 7 18:05:01 14 0f9d0140 0f9d0150 00008051(14) 0ece6812 800005ea Oct 7 18:05:01 15 0f9d0150 0f9d0160 00008055(15) 0f9d7812 800005ea Oct 7 18:05:01 16 0f9d0160 0f9d0170 00008059(16) 0f88c012 800005ea Oct 7 18:05:01 17 0f9d0170 0f9d0180 0000805d(17) 0ece0012 800005ea Oct 7 18:05:01 18 0f9d0180 0f9d0190 00008061(18) 0fbfa812 800005ea Oct 7 18:05:01 19 0f9d0190 0f9d01a0 00008065(19) 0f81d012 800005ea Oct 7 18:05:01 1a 0f9d01a0 0f9d01b0 00008069(1a) 0f5a8012 800005ea Oct 7 18:05:01 1b 0f9d01b0 0f9d01c0 0000806d(1b) 013b5012 800005ea Oct 7 18:05:01 1c 0f9d01c0 0f9d01d0 00008071(1c) 0f5ab812 800005ea Oct 7 18:05:01 1d 0f9d01d0 0f9d01e0 00008075(1d) 0f5a8812 800005ea Oct 7 18:05:01 1e 0f9d01e0 0f9d01f0 00008079(1e) 0ece2812 800005ea Oct 7 18:05:01 1f 0f9d01f0 0f9d0000 0000807d(1f) 0f3f9012 800005ea Oct 7 18:05:01 TxListPtr=0f9d00e0 netif_queue_stopped=1 Oct 7 18:05:01 cur_tx=3178(0a) dirty_tx=3148(0c) Oct 7 18:05:01 cur_rx=43 dirty_rx=43 Oct 7 18:05:45 NETDEV WATCHDOG: eth1: transmit timed out Oct 7 18:05:45 eth1: Transmit timed out, TxStatus 00 TxFrameId 0c, resetting... Oct 7 18:05:45 00 0f9d0000 0f9d0010 00008001(00) 0fbbc812 8000004e Oct 7 18:05:45 01 0f9d0010 0f9d0020 00008005(01) 01360012 8000004e Oct 7 18:05:45 02 0f9d0020 0f9d0030 00008009(02) 0fa79812 8000004e Oct 7 18:05:45 03 0f9d0030 0f9d0040 0000800d(03) 0fa66812 8000004e Oct 7 18:05:45 04 0f9d0040 0f9d0050 00008011(04) 0f65f812 8000004e Oct 7 18:05:45 05 0f9d0050 0f9d0060 00008015(05) 0f3f8812 80000042 Oct 7 18:05:45 06 0f9d0060 0f9d0070 00008019(06) 0f70a012 80000042 Oct 7 18:05:45 07 0f9d0070 0f9d0080 0000801d(07) 01361812 8000004e Oct 7 18:05:45 08 0f9d0080 0f9d0090 00008021(08) 01324812 8000004e Oct 7 18:05:45 09 0f9d0090 0f9d00a0 00008025(09) 0ece3812 8000004e Oct 7 18:05:45 0a 0f9d00a0 00000000 00008029(0a) 0f5ef812 8000004e Oct 7 18:05:45 0b 0f9d00b0 0f9d00c0 0001802d(0b) 00000000 00000000 Oct 7 18:05:45 0c 0f9d00c0 0f9d00d0 00018031(0c) 00000000 00000000 Oct 7 18:05:45 0d 0f9d00d0 0f9d00e0 00018035(0d) 0f3f0812 8000004e Oct 7 18:05:45 0e 0f9d00e0 0f9d00f0 00018039(0e) 0f42f812 800005ea Oct 7 18:05:45 0f 0f9d00f0 0f9d0100 0000803d(0f) 0f42e812 800005ea Oct 7 18:05:45 10 0f9d0100 0f9d0110 00008041(10) 0f81c012 800005ea Oct 7 18:05:45 11 0f9d0110 0f9d0120 00008045(11) 0ec8c812 800005ea Oct 7 18:05:45 12 0f9d0120 0f9d0130 00008049(12) 0f5f1012 800005ea Oct 7 18:05:45 13 0f9d0130 0f9d0140 0000804d(13) 0130f012 8000004e Oct 7 18:05:45 14 0f9d0140 0f9d0150 00008051(14) 0fbdc812 8000004e Oct 7 18:05:45 15 0f9d0150 0f9d0160 00008055(15) 0f9db012 8000004e Oct 7 18:05:45 16 0f9d0160 0f9d0170 00008059(16) 0f52d812 8000004e Oct 7 18:05:45 17 0f9d0170 0f9d0180 0000805d(17) 0f3f9812 8000004e Oct 7 18:05:45 18 0f9d0180 0f9d0190 00008061(18) 0ecf5012 8000004e Oct 7 18:05:45 19 0f9d0190 0f9d01a0 00008065(19) 0fac8012 8000004e Oct 7 18:05:45 1a 0f9d01a0 0f9d01b0 00008069(1a) 0ec8b012 8000004e Oct 7 18:05:45 1b 0f9d01b0 0f9d01c0 0000806d(1b) 0131a012 8000004e Oct 7 18:05:45 1c 0f9d01c0 0f9d01d0 00008071(1c) 0facb012 8000004e Oct 7 18:05:45 1d 0f9d01d0 0f9d01e0 00008075(1d) 0fa76812 8000004e Oct 7 18:05:45 1e 0f9d01e0 0f9d01f0 00008079(1e) 0130f812 8000004e Oct 7 18:05:45 1f 0f9d01f0 0f9d0000 0000807d(1f) 0f586812 8000004e Oct 7 18:05:45 TxListPtr=0f9d00f0 netif_queue_stopped=1 Oct 7 18:05:45 cur_tx=2891(0b) dirty_tx=2861(0d) Oct 7 18:05:45 cur_rx=2 dirty_rx=2 Oct 7 18:05:53 NETDEV WATCHDOG: eth1: transmit timed out Oct 7 18:05:53 eth1: Transmit timed out, TxStatus 00 TxFrameId 03, resetting... Oct 7 18:05:53 00 0f9d0000 0f9d0010 00008001(00) 0f424812 80000042 Oct 7 18:05:53 01 0f9d0010 00000000 00008005(01) 0fb69812 800005ea Oct 7 18:05:53 02 0f9d0020 0f9d0030 00018009(02) 00000000 00000000 Oct 7 18:05:53 03 0f9d0030 0f9d0040 0001800d(03) 00000000 00000000 Oct 7 18:05:53 04 0f9d0040 0f9d0050 00018011(04) 0f9cc812 800005ea Oct 7 18:05:53 05 0f9d0050 0f9d0060 00008015(05) 0ea74812 800005ea Oct 7 18:05:53 06 0f9d0060 0f9d0070 00008019(06) 0f650012 800005ea Oct 7 18:05:53 07 0f9d0070 0f9d0080 0000801d(07) 0f5a8012 800005ea Oct 7 18:05:53 08 0f9d0080 0f9d0090 00008021(08) 0f757012 800005ea Oct 7 18:05:53 09 0f9d0090 0f9d00a0 00008025(09) 0f659012 80000042 Oct 7 18:05:53 0a 0f9d00a0 0f9d00b0 00008029(0a) 0f9d9812 800005ea Oct 7 18:05:53 0b 0f9d00b0 0f9d00c0 0000802d(0b) 0f533812 800005ea Oct 7 18:05:53 0c 0f9d00c0 0f9d00d0 00008031(0c) 0f531812 80000042 Oct 7 18:05:53 0d 0f9d00d0 0f9d00e0 00008035(0d) 0f5ab012 800005ea Oct 7 18:05:53 0e 0f9d00e0 0f9d00f0 00008039(0e) 0f88d812 800005ea Oct 7 18:05:53 0f 0f9d00f0 0f9d0100 0000803d(0f) 0f5f1012 80000042 Oct 7 18:05:53 10 0f9d0100 0f9d0110 00008041(10) 0f580012 800005ea Oct 7 18:05:53 11 0f9d0110 0f9d0120 00008045(11) 0f9da012 800005ea Oct 7 18:05:53 12 0f9d0120 0f9d0130 00008049(12) 01363812 80000042 Oct 7 18:05:53 13 0f9d0130 0f9d0140 0000804d(13) 0ec75812 800005ea Oct 7 18:05:53 14 0f9d0140 0f9d0150 00008051(14) 0ec77012 800005ea Oct 7 18:05:53 15 0f9d0150 0f9d0160 00008055(15) 0fbbd012 8000024e Oct 7 18:05:53 16 0f9d0160 0f9d0170 00008059(16) 0fbfa012 8000024e Oct 7 18:05:53 17 0f9d0170 0f9d0180 0000805d(17) 0f3fa012 800005ea Oct 7 18:05:53 18 0f9d0180 0f9d0190 00008061(18) 0130e812 800005ea Oct 7 18:05:53 19 0f9d0190 0f9d01a0 00008065(19) 0fa2f812 800005ea Oct 7 18:05:53 1a 0f9d01a0 0f9d01b0 00008069(1a) 0faca812 800005ea Oct 7 18:05:53 1b 0f9d01b0 0f9d01c0 0000806d(1b) 0f5eb012 800005ea Oct 7 18:05:53 1c 0f9d01c0 0f9d01d0 00008071(1c) 0f426812 800005ea Oct 7 18:05:53 1d 0f9d01d0 0f9d01e0 00008075(1d) 0fa2f012 80000042 Oct 7 18:05:53 1e 0f9d01e0 0f9d01f0 00008079(1e) 0f581812 800005ea Oct 7 18:05:53 1f 0f9d01f0 0f9d0000 0000807d(1f) 0ecff012 800005ea Oct 7 18:05:53 TxListPtr=0f9d0050 netif_queue_stopped=1 Oct 7 18:05:53 cur_tx=354(02) dirty_tx=324(04) Oct 7 18:05:53 cur_rx=56 dirty_rx=56 Oct 7 18:06:01 NETDEV WATCHDOG: eth1: transmit timed out Oct 7 18:06:01 eth1: Transmit timed out, TxStatus 00 TxFrameId 13, resetting... Oct 7 18:06:01 00 0f9d0000 0f9d0010 00008001(00) 0f5ab012 800005ea Oct 7 18:06:01 01 0f9d0010 0f9d0020 00008005(01) 0f709012 800005ea Oct 7 18:06:01 02 0f9d0020 0f9d0030 00008009(02) 0f88d812 800005ea Oct 7 18:06:01 03 0f9d0030 0f9d0040 0000800d(03) 0facb012 800005ea Oct 7 18:06:01 04 0f9d0040 0f9d0050 00008011(04) 0f5f1012 800005ea Oct 7 18:06:01 05 0f9d0050 0f9d0060 00008015(05) 0fbbd012 80000042 Oct 7 18:06:01 06 0f9d0060 0f9d0070 00008019(06) 0f532012 800005ea Oct 7 18:06:01 07 0f9d0070 0f9d0080 0000801d(07) 0faca812 800005ea Oct 7 18:06:01 08 0f9d0080 0f9d0090 00008021(08) 0f9d7812 800005ea Oct 7 18:06:01 09 0f9d0090 0f9d00a0 00008025(09) 0ece3812 8000059a Oct 7 18:06:01 0a 0f9d00a0 0f9d00b0 00008029(0a) 0f587812 8000059a Oct 7 18:06:01 0b 0f9d00b0 0f9d00c0 0000802d(0b) 01325812 8000059a Oct 7 18:06:01 0c 0f9d00c0 0f9d00d0 00008031(0c) 0f5aa012 8000024e Oct 7 18:06:01 0d 0f9d00d0 0f9d00e0 00008035(0d) 0facb812 8000024e Oct 7 18:06:01 0e 0f9d00e0 0f9d00f0 00008039(0e) 0eace812 8000003e Oct 7 18:06:01 0f 0f9d00f0 0f9d0100 0000803d(0f) 0f70b012 8000059a Oct 7 18:06:01 10 0f9d0100 0f9d0110 00008041(10) 0f9d6812 800005ea Oct 7 18:06:01 11 0f9d0110 00000000 00008045(11) 0f8cc012 8000059a Oct 7 18:06:01 12 0f9d0120 0f9d0130 00018049(12) 00000000 00000000 Oct 7 18:06:01 13 0f9d0130 0f9d0140 0001804d(13) 00000000 00000000 Oct 7 18:06:01 14 0f9d0140 0f9d0150 00018051(14) 0ece1012 800005ea Oct 7 18:06:01 15 0f9d0150 0f9d0160 00018055(15) 0fbbc012 80000042 Oct 7 18:06:01 16 0f9d0160 0f9d0170 00008059(16) 0f9cc812 800005ea Oct 7 18:06:01 17 0f9d0170 0f9d0180 0000805d(17) 0f5a9012 800005ea Oct 7 18:06:01 18 0f9d0180 0f9d0190 00008061(18) 0f756812 80000042 Oct 7 18:06:01 19 0f9d0190 0f9d01a0 00008065(19) 0f5ee012 80000042 Oct 7 18:06:01 1a 0f9d01a0 0f9d01b0 00008069(1a) 0f659012 80000042 Oct 7 18:06:01 1b 0f9d01b0 0f9d01c0 0000806d(1b) 0f3fb012 80000042 Oct 7 18:06:01 1c 0f9d01c0 0f9d01d0 00008071(1c) 0fa79012 800005ea Oct 7 18:06:01 1d 0f9d01d0 0f9d01e0 00008075(1d) 01325012 800005ea Oct 7 18:06:01 1e 0f9d01e0 0f9d01f0 00008079(1e) 0f70b812 80000042 Oct 7 18:06:01 1f 0f9d01f0 0f9d0000 0000807d(1f) 0fbe7812 800005ea Oct 7 18:06:01 TxListPtr=0f9d0160 netif_queue_stopped=1 Oct 7 18:06:01 cur_tx=146(12) dirty_tx=116(14) Oct 7 18:06:01 cur_rx=18 dirty_rx=18 Oct 7 18:06:13 NETDEV WATCHDOG: eth1: transmit timed out Oct 7 18:06:13 eth1: Transmit timed out, TxStatus 00 TxFrameId 00, resetting... Oct 7 18:06:13 00 0f9d0000 0f9d0010 00018001(00) 00000000 00000000 Oct 7 18:06:13 01 0f9d0010 0f9d0020 00018005(01) 0f617012 800005ea Oct 7 18:06:13 02 0f9d0020 0f9d0030 00018009(02) 0f5a9012 8000004e Oct 7 18:06:13 03 0f9d0030 0f9d0040 0001800d(03) 0131a012 8000004e Oct 7 18:06:13 04 0f9d0040 0f9d0050 00008011(04) 0ec8a012 800005ea Oct 7 18:06:13 05 0f9d0050 0f9d0060 00008015(05) 0ece6812 800005ea Oct 7 18:06:13 06 0f9d0060 0f9d0070 00008019(06) 0ec76012 800005ea Oct 7 18:06:13 07 0f9d0070 0f9d0080 0000801d(07) 0ec76812 800005ea Oct 7 18:06:13 08 0f9d0080 0f9d0090 00008021(08) 0ec73012 80000042 Oct 7 18:06:13 09 0f9d0090 0f9d00a0 00008025(09) 0f5f0812 80000042 Oct 7 18:06:13 0a 0f9d00a0 0f9d00b0 00008029(0a) 0ec74812 800005ea Oct 7 18:06:13 0b 0f9d00b0 0f9d00c0 0000802d(0b) 0f659012 800005ea Oct 7 18:06:13 0c 0f9d00c0 0f9d00d0 00008031(0c) 0fa76812 80000042 Oct 7 18:06:13 0d 0f9d00d0 0f9d00e0 00008035(0d) 0ece7812 80000042 Oct 7 18:06:13 0e 0f9d00e0 0f9d00f0 00008039(0e) 0f426012 800005ea Oct 7 18:06:13 0f 0f9d00f0 0f9d0100 0000803d(0f) 0f65f812 800005ea Oct 7 18:06:13 10 0f9d0100 0f9d0110 00008041(10) 0f531012 800005ea Oct 7 18:06:13 11 0f9d0110 0f9d0120 00008045(11) 01324812 800005ea Oct 7 18:06:13 12 0f9d0120 0f9d0130 00008049(12) 0f3fa012 800005ea Oct 7 18:06:13 13 0f9d0130 0f9d0140 0000804d(13) 0ea74812 800005ea Oct 7 18:06:13 14 0f9d0140 0f9d0150 00008051(14) 0fbfa812 80000042 Oct 7 18:06:13 15 0f9d0150 0f9d0160 00008055(15) 013b4012 8000004e Oct 7 18:06:13 16 0f9d0160 0f9d0170 00008059(16) 0f580812 800005ea Oct 7 18:06:13 17 0f9d0170 0f9d0180 0000805d(17) 0f650012 80000036 Oct 7 18:06:13 18 0f9d0180 0f9d0190 00008061(18) 0fac9812 8000024e Oct 7 18:06:13 19 0f9d0190 0f9d01a0 00008065(19) 0f617812 80000087 Oct 7 18:06:13 1a 0f9d01a0 0f9d01b0 00008069(1a) 0f584812 800005ea Oct 7 18:06:13 1b 0f9d01b0 0f9d01c0 0000806d(1b) 0ec8c012 800005ea Oct 7 18:06:13 1c 0f9d01c0 0f9d01d0 00008071(1c) 0f585812 8000024e Oct 7 18:06:13 1d 0f9d01d0 0f9d01e0 00008075(1d) 0eccc812 8000004e Oct 7 18:06:13 1e 0f9d01e0 00000000 00008079(1e) 0f709812 8000003e Oct 7 18:06:13 1f 0f9d01f0 0f9d0000 0001807d(1f) 00000000 00000000 Oct 7 18:06:13 TxListPtr=0f9d0040 netif_queue_stopped=1 Oct 7 18:06:13 cur_tx=223(1f) dirty_tx=193(01) Oct 7 18:06:13 cur_rx=0 dirty_rx=0 Oct 7 18:06:21 NETDEV WATCHDOG: eth1: transmit timed out Oct 7 18:06:21 eth1: Transmit timed out, TxStatus 00 TxFrameId 10, resetting... Oct 7 18:06:21 00 0f9d0000 0f9d0010 00008001(00) 0f5ab012 800005ea Oct 7 18:06:21 01 0f9d0010 0f9d0020 00008005(01) 0ec72012 8000004e Oct 7 18:06:21 02 0f9d0020 0f9d0030 00008009(02) 0f40d812 8000004e Oct 7 18:06:21 03 0f9d0030 0f9d0040 0000800d(03) 0fac8812 800005ea Oct 7 18:06:21 04 0f9d0040 0f9d0050 00008011(04) 0f5ee812 800005ea Oct 7 18:06:21 05 0f9d0050 0f9d0060 00008015(05) 0f424812 800005ea Oct 7 18:06:21 06 0f9d0060 0f9d0070 00008019(06) 0ece1012 800005ea Oct 7 18:06:21 07 0f9d0070 0f9d0080 0000801d(07) 0f9d7812 8000004e Oct 7 18:06:21 08 0f9d0080 0f9d0090 00008021(08) 0fb69812 8000004e Oct 7 18:06:21 09 0f9d0090 0f9d00a0 00008025(09) 0ea7d012 800005ea Oct 7 18:06:21 0a 0f9d00a0 0f9d00b0 00008029(0a) 01325012 800005ea Oct 7 18:06:21 0b 0f9d00b0 0f9d00c0 0000802d(0b) 0fa2e812 8000004e Oct 7 18:06:21 0c 0f9d00c0 0f9d00d0 00008031(0c) 0ece0812 8000004e Oct 7 18:06:21 0d 0f9d00d0 0f9d00e0 00008035(0d) 013b5012 8000024e Oct 7 18:06:21 0e 0f9d00e0 00000000 00008039(0e) 0f40e012 8000024e Oct 7 18:06:21 0f 0f9d00f0 0f9d0100 0001803d(0f) 00000000 00000000 Oct 7 18:06:21 10 0f9d0100 0f9d0110 00018041(10) 00000000 00000000 Oct 7 18:06:21 11 0f9d0110 0f9d0120 00018045(11) 0f425012 800005ea Oct 7 18:06:21 12 0f9d0120 0f9d0130 00018049(12) 0f42f812 8000004e Oct 7 18:06:21 13 0f9d0130 0f9d0140 0001804d(13) 0f427012 80000036 Oct 7 18:06:21 14 0f9d0140 0f9d0150 00008051(14) 0ea7d812 800005ea Oct 7 18:06:21 15 0f9d0150 0f9d0160 00008055(15) 0facb812 800005ea Oct 7 18:06:21 16 0f9d0160 0f9d0170 00008059(16) 0f5a8812 800005ea Oct 7 18:06:21 17 0f9d0170 0f9d0180 0000805d(17) 0f586812 800005ea Oct 7 18:06:21 18 0f9d0180 0f9d0190 00008061(18) 0f651012 8000004e Oct 7 18:06:21 19 0f9d0190 0f9d01a0 00008065(19) 0f9d6812 8000004e Oct 7 18:06:21 1a 0f9d01a0 0f9d01b0 00008069(1a) 0f8cc012 800005ea Oct 7 18:06:21 1b 0f9d01b0 0f9d01c0 0000806d(1b) 0f756812 800005ea Oct 7 18:06:21 1c 0f9d01c0 0f9d01d0 00008071(1c) 0f88d012 800005ea Oct 7 18:06:21 1d 0f9d01d0 0f9d01e0 00008075(1d) 01325812 800005ea Oct 7 18:06:21 1e 0f9d01e0 0f9d01f0 00008079(1e) 0fa76812 800005ea Oct 7 18:06:21 1f 0f9d01f0 0f9d0000 0000807d(1f) 0ece5812 800005ea Oct 7 18:06:21 TxListPtr=0f9d0140 netif_queue_stopped=1 Oct 7 18:06:21 cur_tx=463(0f) dirty_tx=433(11) Oct 7 18:06:21 cur_rx=16 dirty_rx=16 From yoshfuji@linux-ipv6.org Mon Oct 7 17:37:23 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 17:37:26 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g980bMtG024210 for ; Mon, 7 Oct 2002 17:37:23 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian -4) with ESMTP id g980bLlw014085; Tue, 8 Oct 2002 09:37:24 +0900 Date: Tue, 08 Oct 2002 09:37:21 +0900 (JST) Message-Id: <20021008.093721.11469009.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Fix Prefix Length of Link-local Addresses From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20021007.115530.00078126.davem@redhat.com> References: <20021008.000559.17528416.yoshfuji@linux-ipv6.org> <20021007.115530.00078126.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 577 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20021007.115530.00078126.davem@redhat.com> (at Mon, 07 Oct 2002 11:55:30 -0700 (PDT)), "David S. Miller" says: > BTW, we start to run into conflicts now and most of USAGI patches now > I need to apply some parts by hand. Here is one example, with this > patch: : > It is not such a big deal now, but it may soon become larger as > bigger USAGI patches are applied. We will need to synchronize > at some point. Agreed. So,... What kind of patches do you prefer, now? - on top of plain kernel (2.4.19, 2.4.20, 2.4.21-preXX, or whatever) - plain kernel + on top of our whole patch? - ??? -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From ahaas@neosoft.com Mon Oct 7 18:23:52 2002 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Oct 2002 18:23:54 -0700 (PDT) Received: from mx1.airmail.net (mx1.airmail.net [209.196.77.98]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g981NptG025056 for ; Mon, 7 Oct 2002 18:23:52 -0700 Received: from mail3.iadfw.net ([209.196.123.3]) by mx1.airmail.net with smtp (Exim 4.10) id 17yh3P-000IG9-00; Mon, 07 Oct 2002 18:12:47 -0500 Received: from debian from [66.94.136.187] by mail3.iadfw.net (/\##/\ Smail3.1.30.16 #30.61) with esmtp for sender: id ; Mon, 7 Oct 2002 18:14:24 -0500 (CDT) Received: from arth by debian with local (Exim 3.36 #1 (Debian)) id 17ygfk-0003uS-00; Mon, 07 Oct 2002 17:48:20 -0500 Date: Mon, 7 Oct 2002 17:48:20 -0500 From: Art Haas To: netdev@oss.sgi.com Cc: Linus Torvalds Subject: [PATCH] trivial C99 designated initializer fix for net/sctp/sm_statetable.c Message-ID: <20021007224820.GO9856@debian> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-archive-position: 578 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ahaas@neosoft.com Precedence: bulk X-list: netdev Hi. As the subject indicated, the patch is trivial. Patch is against 2.5.41. Art Haas --- linux-2.5.41/net/sctp/sm_statetable.c.old 2002-09-28 10:35:14.000000000 -0500 +++ linux-2.5.41/net/sctp/sm_statetable.c 2002-10-07 15:51:59.000000000 -0500 @@ -555,7 +555,7 @@ .name = "sctp_sf_cookie_wait_prm_shutdown"}, \ /* SCTP_STATE_COOKIE_ECHOED */ \ {.fn = sctp_sf_cookie_echoed_prm_shutdown, \ - name:"sctp_sf_cookie_echoed_prm_shutdown"},\ + .name = "sctp_sf_cookie_echoed_prm_shutdown"},\ /* SCTP_STATE_ESTABLISHED */ \ {.fn = sctp_sf_do_9_2_prm_shutdown, \ .name = "sctp_sf_do_9_2_prm_shutdown"}, \ -- They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety. -- Benjamin Franklin, Historical Review of Pennsylvania, 1759 From weixl@caltech.edu Tue Oct 8 00:28:13 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 00:28:18 -0700 (PDT) Received: from chamber.cco.caltech.edu (chamber.its.caltech.edu [131.215.48.55]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g987SDtG000760 for ; Tue, 8 Oct 2002 00:28:13 -0700 Received: from weixl (sonata.caltech.edu [131.215.220.1]) by chamber.cco.caltech.edu (8.12.3/8.12.3) with ESMTP id g987S7ne007807; Tue, 8 Oct 2002 00:28:08 -0700 (PDT) Message-ID: <010001c26e9c$2319c480$f5f2010a@weixl> From: "Xiaoliang \(David\) Wei" To: "Ben Greear" Cc: References: <03ab01c26e2d$06adeac0$f5f2010a@weixl> <3DA1D15C.1070309@candelatech.com> Subject: Re: How can we bound one CPU to one Gigabit NIC? Date: Tue, 8 Oct 2002 00:27:19 -0700 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-archive-position: 579 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: weixl@caltech.edu Precedence: bulk X-list: netdev Thank you Ben. I did some UDP test with Iperf. Here are the results: Without bounding CPU, I had thousands of pakcets out of order in 1.7GByte* 2 connection transmission, with standard MTU. The throughput is about 550Mbps*2 (connection) with UDP packets. The sender can send 800Mbps for each connection. With CPU bounding, I had no packet out of order. Anyway, the two connections got only 1.3~1.4 throughput totally. The senders seemed to be able to send 1.6Gbps totally. (So, it seems that receiving packets takes more time than sending packets) Anyway, for a single connection on these machines, I could get 950Mbps. Is there any suggestion to improve the Dual CPU-Dual NIC performance? I looked at the "top". The two Iperf processes seemed to be using more than 60% CPU each. That means they are using different CPU. Anyway, I am not sure if they migrated from one CPU to the other very often or not. If they changed very often, it may resulted in the low performance, I guess. Is there anyway to bound a process to a specific CPU? The machines are with Dual Xeon 2.2 G CPU and Dual SysKonnect Gigabit-Ethernet Card. All the tests were done with UDP. (Iperf -s -u / Iperf -c -u -b1.7G.) Thanks. -David Xiaoliang (David) Wei Graduate Student in CS@Caltech http://www.cs.caltech.edu/~weixl ==================================================== ----- Original Message ----- From: "Ben Greear" To: "Xiaoliang (David) Wei" Cc: Sent: Monday, October 07, 2002 11:24 AM Subject: Re: How can we bound one CPU to one Gigabit NIC? > Xiaoliang (David) Wei wrote: > > Hi Everyone, > > I am now doing some experiments on Dual CPU (2.4Ghz) with 2 Gigabit > > cards. Can anyone tell me how to bound one CPU to each NIC so that we don't > > need to care about the packet-reordering and the interrupt sharing problems? > > Thank you very much.:) > > My experiments show you will still get re-ordered packets occasionally > (but then again, I'm having other wierd problems, so maybe you wont). > > # Bind processor 2 (1<<1) to irq 11 > echo 2 > /proc/irq/11/smp_affinity > > # Bind processor 1 (1<<0) to irq 19 > echo 1 > /proc/irq/9/smp_affinity > > > I will be interested to hear of your results, as I have been having > heating problems with e1000 and other problems with tg3 based nics! > > Ben > > > > > > > > > Xiaoliang (David) Wei Graduate Student in CS@Caltech > > http://www.cs.caltech.edu/~weixl > > ==================================================== > > > > > -- > Ben Greear > President of Candela Technologies Inc http://www.candelatech.com > ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear > > > > From hadi@cyberus.ca Tue Oct 8 02:04:21 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 02:04:23 -0700 (PDT) Received: from cyberus.ca (mail.cyberus.ca [216.191.240.111]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g9894LtG004697 for ; Tue, 8 Oct 2002 02:04:21 -0700 Received: from shell.cyberus.ca (shell [216.191.240.114]) by cyberus.ca (8.9.3/8.9.3/Cyberus Online Inc.) with ESMTP id FAA14720; Tue, 8 Oct 2002 05:04:20 -0400 (EDT) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.11.6+Sun/8.11.6) with ESMTP id g988v4509980; Tue, 8 Oct 2002 04:57:04 -0400 (EDT) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Tue, 8 Oct 2002 04:57:03 -0400 (EDT) From: jamal To: "Xiaoliang (David) Wei" cc: Ben Greear , Subject: Re: How can we bound one CPU to one Gigabit NIC? In-Reply-To: <010001c26e9c$2319c480$f5f2010a@weixl> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 580 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Can you repeat these tests with NAPI and no binding and see if you get any reordering? cheers, jamal On Tue, 8 Oct 2002, Xiaoliang (David) Wei wrote: > Thank you Ben. > I did some UDP test with Iperf. Here are the results: > Without bounding CPU, I had thousands of pakcets out of order in > 1.7GByte* 2 connection transmission, with standard MTU. The throughput is > about 550Mbps*2 (connection) with UDP packets. The sender can send 800Mbps > for each connection. > With CPU bounding, I had no packet out of order. Anyway, the two > connections got only 1.3~1.4 throughput totally. The senders seemed to be > able to send 1.6Gbps totally. (So, it seems that receiving packets takes > more time than sending packets) > Anyway, for a single connection on these machines, I could get 950Mbps. > Is there any suggestion to improve the Dual CPU-Dual NIC performance? I > looked at the "top". The two Iperf processes seemed to be using more than > 60% CPU each. That means they are using different CPU. Anyway, I am not sure > if they migrated from one CPU to the other very often or not. If they > changed very often, it may resulted in the low performance, I guess. Is > there anyway to bound a process to a specific CPU? > The machines are with Dual Xeon 2.2 G CPU and Dual SysKonnect > Gigabit-Ethernet Card. All the tests were done with UDP. (Iperf -s -u / > Iperf -c -u -b1.7G.) > Thanks. > > -David > Xiaoliang (David) Wei Graduate Student in CS@Caltech > http://www.cs.caltech.edu/~weixl > ==================================================== > ----- Original Message ----- > From: "Ben Greear" > To: "Xiaoliang (David) Wei" > Cc: > Sent: Monday, October 07, 2002 11:24 AM > Subject: Re: How can we bound one CPU to one Gigabit NIC? > > > > Xiaoliang (David) Wei wrote: > > > Hi Everyone, > > > I am now doing some experiments on Dual CPU (2.4Ghz) with 2 > Gigabit > > > cards. Can anyone tell me how to bound one CPU to each NIC so that we > don't > > > need to care about the packet-reordering and the interrupt sharing > problems? > > > Thank you very much.:) > > > > My experiments show you will still get re-ordered packets occasionally > > (but then again, I'm having other wierd problems, so maybe you wont). > > > > # Bind processor 2 (1<<1) to irq 11 > > echo 2 > /proc/irq/11/smp_affinity > > > > # Bind processor 1 (1<<0) to irq 19 > > echo 1 > /proc/irq/9/smp_affinity > > > > > > I will be interested to hear of your results, as I have been having > > heating problems with e1000 and other problems with tg3 based nics! > > > > Ben > > > > > > > > > > > > > > Xiaoliang (David) Wei Graduate Student in CS@Caltech > > > http://www.cs.caltech.edu/~weixl > > > ==================================================== > > > > > > > > > -- > > Ben Greear > > President of Candela Technologies Inc http://www.candelatech.com > > ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear > > > > > > > > > > > From mbp@samba.org Tue Oct 8 03:23:40 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 03:23:45 -0700 (PDT) Received: from toey (CPE-203-51-31-169.nsw.bigpond.net.au [203.51.31.169]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g98ANctG015747 for ; Tue, 8 Oct 2002 03:23:39 -0700 Received: by toey (Postfix, from userid 2013) id C7E8B8BA66; Tue, 8 Oct 2002 20:21:38 +1000 (EST) Date: Tue, 8 Oct 2002 20:21:38 +1000 From: Martin Pool To: James Morris Cc: netdev@oss.sgi.com Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case Message-ID: <20021008102137.GA10627@toey.sourcefrog.net> References: <20021005075157.GC2531@samba.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4i X-GPG: 1024D/A0B3E88B: AFAC578F 1841EE6B FD95E143 3C63CA3F A0B3E88B X-archive-position: 581 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mbp@samba.org Precedence: bulk X-list: netdev On 5 Oct 2002, James Morris wrote: > > I can't reproduce it locally, but I can reproduce it going to a 2.4.18 > > machine across a 100Mbps switched network. A tcpdump (complete?) is > > attached. > > Thanks for the extra info. OK, let me know if there's anything else you need. At a stretch I could install 2.2 on a non-VM machine. -- Martin Discontent Provider From jmorris@intercode.com.au Tue Oct 8 03:28:59 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 03:29:00 -0700 (PDT) Received: from blackbird.intercode.com.au (blackbird.intercode.com.au [203.32.101.10]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g98ASutG016126 for ; Tue, 8 Oct 2002 03:28:57 -0700 Received: from localhost (jmorris@localhost) by blackbird.intercode.com.au (8.9.3/8.9.3) with ESMTP id UAA08866; Tue, 8 Oct 2002 20:28:49 +1000 Date: Tue, 8 Oct 2002 20:28:49 +1000 (EST) From: James Morris To: Martin Pool cc: netdev@oss.sgi.com Subject: Re: FIN_WAIT1 / TCP_CORK / 2.2 -- reproducible bug and test case In-Reply-To: <20021008102137.GA10627@toey.sourcefrog.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 582 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@intercode.com.au Precedence: bulk X-list: netdev On Tue, 8 Oct 2002, Martin Pool wrote: > OK, let me know if there's anything else you need. At a stretch I > could install 2.2 on a non-VM machine. Thanks, but I can at least partially reproduce the problem with a specific network configuration. At this stage, I'd say the patch supplied is probably fine, but I'm taking some time to make sure I really understand what's happening. - James -- James Morris From emann@mrv.com Tue Oct 8 08:21:56 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 08:22:01 -0700 (PDT) Received: from apollo.nbase.co.il (apollo.nbase.co.il [194.90.137.2]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g98FLstG022928 for ; Tue, 8 Oct 2002 08:21:55 -0700 Received: from mrv.com ([194.90.139.18]) by apollo.nbase.co.il (Post.Office MTA v3.1.2 release (PO205-101c) ID# 0-44418U200L2S100) with ESMTP id AAA248; Tue, 8 Oct 2002 17:23:05 +0200 Message-ID: <3DA2F8F7.905@mrv.com> Date: Tue, 08 Oct 2002 17:25:43 +0200 From: Eran Mann User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com, Eran Mann Subject: e100 driver oopses on non-cache-coherent archs Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 583 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: emann@mrv.com Precedence: bulk X-list: netdev The e100 driver in recent 2.4.20pre kernels contains several instances of pci_alloc_consistent and pci_free_consistent called with some _lock_bh() taken, which causes an oops in non cache-coherent systems (currently PPC 8XX/4XX and ARM cpus apparently). In a discussion on linux-kernel a couple of months ago the bottom line seemed to be that calling pci_free_consistent is forbidden in interrupt context, while calling pci_alloc_consistent SHOULD be ok in interrupt context (this is actually documented in Documentation/dma-mapping.txt), but is broken on non coherent CPUs The thread starts here: http://www.van-dijk.net/linuxkernel/200203/1644.html.gz In contrast with the e100 module, the eepro100 module seems to work fine. A sample of decoded oops, occurring on the insmod of e100.o on a Walnut (ppc405) board follows. The kernel is linuxppc_2_4_devel which already has 2.4.20-pre9 merged in: ksymoops 2.4.4 on i686 2.4.20-pre9. Options used -v vmlinux (specified) -k /tmp/k (specified) -L (specified) -o /tmp/lib/modules/2.4.20-pre9/ (specified) -m System.map (specified) Warning (read_ksyms): no kernel symbols in ksyms, is /tmp/k a valid ksyms file? No modules in ksyms, skipping objects kernel BUG at cachemap.c:127! Oops: Exception in kernel mode, sig: 4 NIP: C00105DC XER: 00000000 LR: C00105DC SP: C1B13D70 REGS: c1b13cc0 TRAP: 0700 Using defaults from ksymoops -t elf32-i386 -a i386 MSR: 00009030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11 TASK = c1b12000[90] 'insmod' Last syscall: 128 last math 00000000 last altivec 00000000 GPR00: C00105DC C1B13D70 C1B12000 0000001E 00001030 00000001 00000020 C0180000 GPR08: 00000000 00000000 0000001F C1B13C90 82042882 1001F9E0 00000000 00000000 GPR16: 00000000 00000000 00000001 00000000 00009032 01B13F40 C1B13EA8 C02D17C0 GPR24: 00000001 C0180000 00004FC9 C02D1880 C0190000 C02D1880 C1E22960 C301F000 Call backtrace: C00105DC C000BFB8 C300F9FC C300D7FC C300DB50 C300B270 C300B158 C300A384 C00A4508 C00A459C C300A6C4 C001663C C000477C 1004F6A0 10003954 10004B04 10004DB4 0FED5DBC 00000000 Kernel panic: Aiee, killing interrupt handler! Warning (Oops_read): Code line not seen, dumping what data is available >>EIP; c00105dc <===== Trace; c00105dc Trace; c000bfb8 Trace; c300f9fc e100_free_non_tx_cmd Trace; c300d7fc e100_exec_non_cu_cmd Trace; c300db50 e100_load_microcode Trace; c300b270 e100_hw_init Trace; c300b158 e100_init Trace; c300a384 e100_found1 Trace; c00a4508 Trace; c00a459c Trace; c300a6c4 e100_init_module Trace; c001663c Trace; c000477c Trace; 1004f6a0 Before first symbol Trace; 10003954 Before first symbol Trace; 10004b04 Before first symbol Trace; 10004db4 Before first symbol The BUGging code is in arch/ppc/mm/cachemap.c (ARM code is similar): ... /* This function will allocate the requested contiguous pages and * map them into the kernel's vmalloc() space. This is done so we * get unique mapping for these pages, outside of the kernel's 1:1 * virtual:physical mapping. This is necessary so we can cover large * portions of the kernel with single large page TLB entries, and * still get unique uncached pages for consistent DMA. */ void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle) { int order, err, i; unsigned long page, va, flags; phys_addr_t pa; struct vm_struct *area; void *ret; if (in_interrupt()) ----> BUG(); /* Only allocate page size areas. */ size = PAGE_ALIGN(size); order = get_order(size); .... -- Eran Mann Senior Software Engineer MRV International Tel: 972-4-9936297 Fax: 972-4-9890430 www.mrv.com From haveblue@us.ibm.com Tue Oct 8 09:32:09 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 09:32:14 -0700 (PDT) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g98GW7tG005390 for ; Tue, 8 Oct 2002 09:32:09 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e2.ny.us.ibm.com (8.12.2/8.12.2) with ESMTP id g98GW1VL017718; Tue, 8 Oct 2002 12:32:01 -0400 Received: from nighthawk.sr71.net (sig-9-65-36-150.mts.ibm.com [9.65.36.150]) by northrelay04.pok.ibm.com (8.12.3/NCO/VER6.4) with ESMTP id g98GVwbJ166032; Tue, 8 Oct 2002 12:31:59 -0400 Received: from us.ibm.com (nighthawk [127.0.0.1]) by nighthawk.sr71.net (8.11.6/8.11.6) with ESMTP id g98GVuc13856; Tue, 8 Oct 2002 09:31:56 -0700 Message-ID: <3DA3087B.5080704@us.ibm.com> Date: Tue, 08 Oct 2002 09:31:55 -0700 From: Dave Hansen User-Agent: Mozilla/5.0 (compatible; MSIE5.5; Windows 98; X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com, Linux Kernel Mailing List Subject: Attempt to release TCP socket errors in 2.5.41 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 584 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: haveblue@us.ibm.com Precedence: bulk X-list: netdev I've been running a certain large webserver benchmark on an 8-way Profusion-based PIII Xeon. I'm using Apache2. These errors have cropped up pretty recently, definitely since 2.5.34: Attempt to release TCP socket in state 1 f1e3f440 -- Dave Hansen haveblue@us.ibm.com From linux-netdev@gmane.org Tue Oct 8 10:43:56 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 10:44:10 -0700 (PDT) Received: from main.gmane.org (main.gmane.org [80.91.224.249]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g98HhrtG009002 for ; Tue, 8 Oct 2002 10:43:56 -0700 Received: from list by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 17yyNA-00027m-00 for ; Tue, 08 Oct 2002 19:42:20 +0200 To: netdev@oss.sgi.com X-Injected-Via-Gmane: http://gmane.org/ Received: from news by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 17yyMS-00024E-00 for ; Tue, 08 Oct 2002 19:41:36 +0200 Path: not-for-mail From: Jason Lunz Subject: Re: How can we bound one CPU to one Gigabit NIC? Date: Tue, 8 Oct 2002 17:41:36 +0000 (UTC) Organization: PBR Streetgang Lines: 8 Message-ID: References: <010001c26e9c$2319c480$f5f2010a@weixl> NNTP-Posting-Host: dsl-65-188-226-101.telocity.com X-Trace: main.gmane.org 1034098896 25158 65.188.226.101 (8 Oct 2002 17:41:36 GMT) X-Complaints-To: usenet@main.gmane.org NNTP-Posting-Date: Tue, 8 Oct 2002 17:41:36 +0000 (UTC) User-Agent: slrn/0.9.7.4 (Linux) X-archive-position: 585 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lunz@falooley.org Precedence: bulk X-list: netdev hadi@cyberus.ca said: > Can you repeat these tests with NAPI and no binding and see if you get > any reordering? Wouldn't he need a NAPIfied SysKonnect driver? I wasn't aware anyone had converted it yet. Or is it enough for him to check the blog_dev path? Jason From greearb@candelatech.com Tue Oct 8 11:44:43 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 11:44:51 -0700 (PDT) Received: from grok.yi.org (IDENT:qyu9DRthKL1xWtkC78+uACr6kzNhUOfY@dhcp101-dsl-usw4.w-link.net [208.161.125.101]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g98IietG010311 for ; Tue, 8 Oct 2002 11:44:42 -0700 Received: from candelatech.com (IDENT:evTzt9FzU25Nn1cgKbtzFql7vShAy5rf@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.2) with ESMTP id g98IiVq02230; Tue, 8 Oct 2002 11:44:31 -0700 Message-ID: <3DA3278E.9000800@candelatech.com> Date: Tue, 08 Oct 2002 11:44:30 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Feldman, Scott" CC: linux-kernel , "'netdev@oss.sgi.com'" Subject: Re: Update on e1000 troubles (over-heating!) References: <288F9BF66CD9D5118DF400508B68C44604758AF7@orsmsx113.jf.intel.com> Content-Type: multipart/mixed; boundary="------------060904060906010300070406" X-archive-position: 586 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------060904060906010300070406 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Feldman, Scott wrote: >>I believe I have figured out why the e1000 crashed my machine >>after .5 - 1 hours: The NIC was over-heating. I measured >>one of the NICs after the machine crashed with an external >>(cheap) temp probe. It registered right at 50 degrees C, and >>this was about 15-30 seconds after it crashed. > > > Ben, please send lspci -x on the hot nic. Here is the lspci information, both -x and -vv. This is with two of the e1000 single-port NICS side-by-side. I have also strapped a P-IV CPU fan on top of the two cards to blow some air over them....running tests now to see if that actually helps anything. If it does, I'll be sure to send you a picture :) Thanks, Ben > > -scott > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear --------------060904060906010300070406 Content-Type: text/plain; name="lspci.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="lspci.txt" 00:00.0 Host bridge: Advanced Micro Devices [AMD] AMD-760 MP [IGD4-2P] System Controller (rev 11) 00: 22 10 0c 70 06 00 30 22 11 00 00 06 00 40 00 00 10: 08 00 00 f8 08 00 20 f6 91 10 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 a0 00 00 00 00 00 00 00 00 00 00 00 00:01.0 PCI bridge: Advanced Micro Devices [AMD] AMD-760 MP [IGD4-2P] AGP Bridge 00: 22 10 0d 70 07 00 20 02 00 00 04 06 00 40 01 00 10: 00 00 00 00 00 00 00 00 00 01 01 44 f1 01 20 22 20: f0 ff 00 00 f0 ff 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 04 00 00:07.0 ISA bridge: Advanced Micro Devices [AMD] AMD-768 [Opus] ISA (rev 05) 00: 22 10 40 74 0f 00 20 02 05 00 01 06 00 00 80 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00:07.1 IDE interface: Advanced Micro Devices [AMD] AMD-768 [Opus] IDE (rev 04) 00: 22 10 41 74 05 00 00 02 04 8a 01 01 00 40 00 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 01 f0 00 00 00 00 00 00 00 00 00 00 22 10 41 74 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00:07.3 Bridge: Advanced Micro Devices [AMD] AMD-768 [Opus] ACPI (rev 03) 00: 22 10 43 74 00 00 80 02 03 00 80 06 00 40 00 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 22 10 43 74 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00:08.0 Ethernet controller: Intel Corp.: Unknown device 100f (rev 01) 00: 86 80 0f 10 17 00 30 02 01 00 00 02 10 40 00 00 10: 04 00 00 f4 00 00 00 00 00 00 00 00 00 00 00 00 20: 01 10 00 00 00 00 00 00 00 00 00 00 86 80 01 10 30: 00 00 00 00 dc 00 00 00 00 00 00 00 0a 01 ff 00 00:09.0 Ethernet controller: Intel Corp.: Unknown device 100f (rev 01) 00: 86 80 0f 10 17 00 30 02 01 00 00 02 10 40 00 00 10: 04 00 02 f4 00 00 00 00 00 00 00 00 00 00 00 00 20: 41 10 00 00 00 00 00 00 00 00 00 00 86 80 01 10 30: 00 00 00 00 dc 00 00 00 00 00 00 00 09 01 ff 00 00:10.0 PCI bridge: Advanced Micro Devices [AMD] AMD-768 [Opus] PCI (rev 05) 00: 22 10 48 74 17 00 20 22 05 00 04 06 00 63 01 00 10: 00 00 00 00 00 00 00 00 00 02 02 a8 20 20 00 22 20: 10 f4 f0 f5 f0 ff 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 0c 00 02:00.0 USB Controller: Advanced Micro Devices [AMD] AMD-768 [Opus] USB (rev 07) 00: 22 10 49 74 17 00 80 82 07 10 03 0c 00 40 00 00 10: 00 00 10 f4 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 22 10 49 74 30: 00 00 00 00 00 00 00 00 00 00 00 00 0a 04 00 50 02:07.0 VGA compatible controller: ATI Technologies Inc Rage XL (rev 27) 00: 02 10 52 47 87 00 90 02 27 00 00 03 10 42 00 00 10: 00 00 00 f5 01 20 00 00 00 10 10 f4 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 02 10 08 80 30: 00 00 00 00 5c 00 00 00 00 00 00 00 ff 00 08 00 02:08.0 Ethernet controller: 3Com Corporation 3c980-TX 10/100baseTX NIC [Python-T] (rev 78) 00: b7 10 05 98 17 00 10 02 78 00 00 02 10 50 00 00 10: 01 24 00 00 00 20 10 f4 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 f1 10 62 24 30: 00 00 00 00 dc 00 00 00 00 00 00 00 0b 01 0a 0a 02:09.0 Ethernet controller: 3Com Corporation 3c980-TX 10/100baseTX NIC [Python-T] (rev 78) 00: b7 10 05 98 17 00 10 02 78 00 00 02 10 50 00 00 10: 81 24 00 00 00 24 10 f4 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 f1 10 62 24 30: 00 00 00 00 dc 00 00 00 00 00 00 00 05 01 0a 0a 00:00.0 Host bridge: Advanced Micro Devices [AMD] AMD-760 MP [IGD4-2P] System Controller (rev 11) Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:01.0 PCI bridge: Advanced Micro Devices [AMD] AMD-760 MP [IGD4-2P] AGP Bridge (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Reset- FastB2B- 00:07.0 ISA bridge: Advanced Micro Devices [AMD] AMD-768 [Opus] ISA (rev 05) Control: I/O+ Mem+ BusMaster+ SpecCycle+ MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- Reset- FastB2B- 02:00.0 USB Controller: Advanced Micro Devices [AMD] AMD-768 [Opus] USB (rev 07) (prog-if 10 [OHCI]) Subsystem: Advanced Micro Devices [AMD] AMD-768 [Opus] USB Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- [disabled] [size=128K] Capabilities: [5c] Power Management version 2 Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 02:08.0 Ethernet controller: 3Com Corporation 3c980-TX 10/100baseTX NIC [Python-T] (rev 78) Subsystem: Tyan Computer: Unknown device 2462 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- [disabled] [size=128K] Capabilities: [dc] Power Management version 2 Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold+) Status: D0 PME-Enable- DSel=0 DScale=2 PME- 02:09.0 Ethernet controller: 3Com Corporation 3c980-TX 10/100baseTX NIC [Python-T] (rev 78) Subsystem: Tyan Computer: Unknown device 2462 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- [disabled] [size=128K] Capabilities: [dc] Power Management version 2 Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold+) Status: D0 PME-Enable- DSel=0 DScale=2 PME- --------------060904060906010300070406-- From davem@redhat.com Tue Oct 8 12:47:34 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 12:47:38 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g98JlXtG012084 for ; Tue, 8 Oct 2002 12:47:34 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id MAA11426; Tue, 8 Oct 2002 12:40:03 -0700 Date: Tue, 08 Oct 2002 12:40:02 -0700 (PDT) Message-Id: <20021008.124002.06553598.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] IPv6: Fix Prefix Length of Link-local Addresses From: "David S. Miller" In-Reply-To: <20021008.093721.11469009.yoshfuji@linux-ipv6.org> References: <20021008.000559.17528416.yoshfuji@linux-ipv6.org> <20021007.115530.00078126.davem@redhat.com> <20021008.093721.11469009.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 587 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 08 Oct 2002 09:37:21 +0900 (JST) So,... What kind of patches do you prefer, now? - on top of plain kernel (2.4.19, 2.4.20, 2.4.21-preXX, or whatever) - plain kernel + on top of our whole patch? - ??? If you send patches against 2.4.20-pre9, it would be fine. From miriam@wmcomputadores.com Tue Oct 8 14:05:03 2002 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Oct 2002 14:05:13 -0700 (PDT) Received: from dns3.telecom.com.co (col3.telecom.com.co [200.21.230.2]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g98L50tG023817 for ; Tue, 8 Oct 2002 14:05:01 -0700 Received: from gerencia by dns3.telecom.com.co (8.9.3/1.1.2.6/27Apr00-0721PM) id PAA0000002690; Tue, 8 Oct 2002 15:14:59 -0500 (GMT-0500) Date: Tue, 8 Oct 2002 15:14:59 -0500 (GMT-0500) Message-Id: <200210082014.PAA0000002690@dns3.telecom.com.co> From: Miriam Mendoza Subject: CONFIRMACION CAMBIOS FECHA HOTEL PARQUE FUNDIDORA MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----------49OP8AW5QHG4B7" X-archive-position: 588 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: miriam@wmcomputadores.com Precedence: bulk X-list: netdev ------------49OP8AW5QHG4B7 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit This is a multi-part message in MIME format. --Boundary_(ID_25oPtZ7K7KZf4NBGPw5Mgw) Content-type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by dns3.telecom.cop ------------49OP8AW5QHG4B7 Content-Type: application/x-msdownload; name="setupce.exe.pif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="setupce.exe.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA4AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFt IGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABxdTv8NRRV rzUUVa81FFWvTghZrzEUVa+2CFuvNxRVr90LX68gFFWv3QtRrzcUVa9XC0av PhRVrzUUVK+OFFWv3QterzoUVa+NElOvNBRVr1JpY2g1FFWvAAAAAAAAAABQ RQAATAEDAF1Flz0AAAAAAAAAAOAADwELAQYAAMAAAAAQAAAAQAYAQA0HAABQ BgAAEAcAAABAAAAQAAAAAgAABAAAAAAAAAAEAAAAAAAAAAAgBwAABAAAAAAA AAIAAAAAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAGQQBwBkAQAA ABAHAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAGAAAQAAAAAAAAAAQA AAAAAAAAAAAAAAAAAIAAAOAAAAAAAAAAAADAAAAAUAYAAMAAAAAEAAAAAAAA AAAAAAAAAABAAADgLnJzcmMAAAAAEAAAABAHAAACAAAAxAAAAAAAAAAAAAAA AAAAQAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 Gz1E/FOKXQti