* Re: [Bugme-new] [Bug 9888] New: tun device without protocol info header fails under IPv6 [not found] <bug-9888-10286@http.bugzilla.kernel.org/> @ 2008-02-04 22:53 ` Andrew Morton 2008-02-08 4:58 ` Max Krasnyansky 0 siblings, 1 reply; 2+ messages in thread From: Andrew Morton @ 2008-02-04 22:53 UTC (permalink / raw) To: steve.zabele; +Cc: bugme-daemon, netdev, maxk On Mon, 4 Feb 2008 13:46:13 -0800 (PST) bugme-daemon@bugzilla.kernel.org wrote: > http://bugzilla.kernel.org/show_bug.cgi?id=9888 > > Summary: tun device without protocol info header fails under IPv6 > Product: Networking > Version: 2.5 > KernelVersion: >=2.6.23 > Platform: All > OS/Version: Linux > Tree: Mainline > Status: NEW > Severity: low > Priority: P1 > Component: IPV6 > AssignedTo: yoshfuji@linux-ipv6.org > ReportedBy: steve.zabele@baesystems.com > > > Latest working kernel version: None known -- appears to be a historic bug > Earliest failing kernel version: All > Distribution: > Hardware Environment: > Software Environment: > Problem Description: > > Steps to reproduce: > > Open a tun device as type TUN, set the TUN_NO_PI flag, and try sending an IPv6 > packet. The packet appears at the interface under tcpdumps, but propagates no > further. This is because the default protocol info used for tun devices where > the TUN_NO_PI flag is set assumes IPv4 as can be seen by the initialization at > the top of the tun_get_user function in drivers/net/tun.c file given by > > struct tun_pi pi = { 0, __constant_htons(ETH_P_IP) }; > > This can easily be fixed by adding a quick check at the top of tun_get_user. > Basically the code that used to read > > if (!(tun->flags & TUN_NO_PI)) { > if ((len -= sizeof(pi)) > count) > return -EINVAL; > > if(memcpy_fromiovec((void *)&pi, iv, sizeof(pi))) > return -EFAULT; > } > > when changed to read > > if (!(tun->flags & TUN_NO_PI)) { > if ((len -= sizeof(pi)) > count) > return -EINVAL; > > if(memcpy_fromiovec((void *)&pi, iv, sizeof(pi))) > return -EFAULT; > } > else { > /* Fixup default pi if IPv6 rather than IPv4 */ > if (((tun->flags & TUN_TYPE_MASK) == TUN_TUN_DEV) && > (*(char *)(iv->iov_base) == 0x60)) { > pi.proto = __constant_htons(ETH_P_IPV6); > } > } > > fixes the problem. > > How do we get this in as part of the maintained codebase?? > Please email a tested patch prepared as described in Documentation/SubmittingPatches Documentation/SubmitChecklist http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt to Maxim Krasnyansky <maxk@qualcomm.com> "David S. Miller" <davem@davemloft.net> Andrew Morton <akpm@linux-foundation.org> netdev@vger.kernel.org thanks. ^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Bugme-new] [Bug 9888] New: tun device without protocol info header fails under IPv6 2008-02-04 22:53 ` [Bugme-new] [Bug 9888] New: tun device without protocol info header fails under IPv6 Andrew Morton @ 2008-02-08 4:58 ` Max Krasnyansky 0 siblings, 0 replies; 2+ messages in thread From: Max Krasnyansky @ 2008-02-08 4:58 UTC (permalink / raw) To: Andrew Morton; +Cc: steve.zabele, bugme-daemon, netdev Andrew Morton wrote: > On Mon, 4 Feb 2008 13:46:13 -0800 (PST) > bugme-daemon@bugzilla.kernel.org wrote: >> >> Open a tun device as type TUN, set the TUN_NO_PI flag, and try sending an IPv6 >> packet. The packet appears at the interface under tcpdumps, but propagates no >> further. This is because the default protocol info used for tun devices where >> the TUN_NO_PI flag is set assumes IPv4 as can be seen by the initialization at >> the top of the tun_get_user function in drivers/net/tun.c file given by >> >> struct tun_pi pi = { 0, __constant_htons(ETH_P_IP) }; >> >> This can easily be fixed by adding a quick check at the top of tun_get_user. >> Basically the code that used to read >> >> if (!(tun->flags & TUN_NO_PI)) { >> if ((len -= sizeof(pi)) > count) >> return -EINVAL; >> >> if(memcpy_fromiovec((void *)&pi, iv, sizeof(pi))) >> return -EFAULT; >> } >> >> when changed to read >> >> if (!(tun->flags & TUN_NO_PI)) { >> if ((len -= sizeof(pi)) > count) >> return -EINVAL; >> >> if(memcpy_fromiovec((void *)&pi, iv, sizeof(pi))) >> return -EFAULT; >> } >> else { >> /* Fixup default pi if IPv6 rather than IPv4 */ >> if (((tun->flags & TUN_TYPE_MASK) == TUN_TUN_DEV) && >> (*(char *)(iv->iov_base) == 0x60)) { >> pi.proto = __constant_htons(ETH_P_IPV6); >> } >> } >> >> fixes the problem. >> >> How do we get this in as part of the maintained codebase?? >> > > Please email a tested patch prepared as described in > > Documentation/SubmittingPatches > Documentation/SubmitChecklist > http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt > > to > > Maxim Krasnyansky <maxk@qualcomm.com> > "David S. Miller" <davem@davemloft.net> > Andrew Morton <akpm@linux-foundation.org> > netdev@vger.kernel.org btw I'd be ok with this fix. But I guess the questions is why not use struct tun_pi in the apps instead ? Max ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-02-08 5:33 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <bug-9888-10286@http.bugzilla.kernel.org/>
2008-02-04 22:53 ` [Bugme-new] [Bug 9888] New: tun device without protocol info header fails under IPv6 Andrew Morton
2008-02-08 4:58 ` Max Krasnyansky
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).