Skip to contentSkip to conversation

New: (tun dev) Impossible to deassert IFF_ONE_QUEUE or IFF_NO_PI

Bugme-new Andrew Morton 2 participants 2 messages Jan 24, 2008 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]/

#1 lore raw
Quoted 31 lines · On Wed, 23 Jan 2008 13:13:13 -0800 (PST) [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=9806

           Summary: (tun dev) Impossible to deassert IFF_ONE_QUEUE or
                    IFF_NO_PI
           Product: Drivers
           Version: 2.5
     KernelVersion: 2.6.23
          Platform: All
        OS/Version: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Network
        AssignedTo: [email protected]
        ReportedBy: [email protected]

Problem Description:

The TUN/TAP driver only permits one-way transitions of IFF_NO_PI or IFF_ONE_QUEUE during the lifetime of a tap/tun interface. Note that tun_set_iff contains

541 if (ifr->ifr_flags & IFF_NO_PI)
542 tun->flags |= TUN_NO_PI;
543
544 if (ifr->ifr_flags & IFF_ONE_QUEUE)
545 tun->flags |= TUN_ONE_QUEUE;

Quoted 9 lines

This is easily fixed by adding else branches which clear these bits.

Steps to reproduce:

This is easily reproduced by setting an interface persistant using tunctl then attempting to open it as IFF_TAP or IFF_TUN, without asserting the IFF_NO_PI flag. The ioctl() will succeed and the ifr.flags word is not modified, but the interface remains in IFF_NO_PI mode (as it was set by tunctl).

Thanks. Could you please submit the patch via email? Send it to
all recipients of this email.

#2 lore raw
Quoted 4 lines · Andrew Morton
Quoted 2 lines · On Wed, 23 Jan 2008 13:13:13 -0800 (PST) [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=9806

Thanks. Could you please submit the patch via email? Send it to
all recipients of this email.

Attached.
--nwf;

tun.c renamed from tun.c.orig +4 -0
@@ -540,9 +540,13 @@
 
 	if (ifr->ifr_flags & IFF_NO_PI)
 		tun->flags |= TUN_NO_PI;
+	else
+		tun->flags &= ~TUN_NO_PI;
 
 	if (ifr->ifr_flags & IFF_ONE_QUEUE)
 		tun->flags |= TUN_ONE_QUEUE;
+	else
+		tun->flags &= ~TUN_ONE_QUEUE;
 
 	file->private_data = tun;
 	tun->attached = 1;