[Click] minor bug report with NetBSD

Eddie Kohler kohler at cs.ucla.edu
Wed Jun 21 02:46:18 EDT 2006


Hi Vivek,

I never got a patch from you for NetBSD KernelTun.  Any news?

Eddie


Vivek raghunathan wrote:
> Eddie,
> 
> Thanks for the help with the kerneltun/tap code. Your re-write will
> probably fix the ARP issues with the kerneltap driver in the Linux
> code.
> 
> I'll take care of the NetBSD porting and send in a patch by tomorrow:
> 
> 1. I had already patched the kerneltap.cc code to accept all kinds of
> Ethernet packets (instead of just IP) by re-writing KernelTap::push()
> to use ethertype = ((const click_ether *) p->data())->ether_type.
> Those are similar to your changes to kerneltun.cc, and work in NetBSD
> just fine.
> 
> 2. The NetBSD tap driver is different from the NetBSD tun driver in
> subtle ways: (From the man page) an open() call on /dev/tunN, will
> also create a network interface with the same unit number of that
> device if it doesn't exists yet. On the other hand, with the NetBSD
> tap, you need to use the cloning device /dev/tap to create an
> interface, and then use the TAPGIFNAME ioctl to fetch the name of the
> device that's been created. Thus, the code in KernelTap::alloc_tun()
> needs to be hacked a bit.
> 
> 3. Also, AFAIK, the ifconfig/ioctl interface in NetBSD doesn't
> (always) allow Ethernet addresses to be set. Fortunately, the tap
> device has a sysctl interface to set the hardware address.
> 
> 4. Finally, as we discussed earlier, the Ethernet frames spit out by
> the NetBSD tap driver don't have a 4 byte af_family field.
> 
> I've patched the kerneltap.cc code to handle all these cases. It works
> on my NetBSD setup -  let me do a little more testing before I send in
> the patch.
> 
> Vivek
> 
> 
> 
> 
> Vivek
> 
> 
> 
> On 5/24/06, Eddie Kohler <kohler at cs.ucla.edu> wrote:
>> Hi Vivek,
>>
>> I've updated the KernelTap and KernelTun code to actually work 
>> (verified on
>> Linux and FreeBSD), and unified the KernelTap and KernelTun code 
>> paths.  Have
>> a look at elements/userlevel/kerneltun.cc.  Hopefully it will be 
>> easier to
>> make this work on NetBSD.  (Or maybe, gosh, it'll work out of the box.)
>>
>> Eddie
>>
>>
>> Vivek raghunathan wrote:
>> > Eddie and all,
>> >
>> > Another question regarding the KernelTap. It seems like you cannot
>> > push ARP packets to it, because the code in push(int, Packet *) infers
>> > the Ethernet protocol field from the version information in the IP
>> > header of the packet (IPv4/IPv6) and prepends it to the packet before
>> > writing it to the tap device. It seems like the reason you do this is
>> > that the universal tun/tap driver in Linux expects this field
>> > prepended to the Ethernet frames written from userspace.
>> >
>> > Since this information is also in the Ethernet header, why can't we
>> > extract it from there? That would make the tap virtual Ethernet device
>> > agnostic to which higher layer protocol it is transporting. Or am I
>> > missing something fundamental here?
>> >
>> > Vivek
>> >
>> >
>> >
>> >
>> >
>> > On 5/20/06, Vivek raghunathan <vivek.raghunathan at gmail.com> wrote:
>> >> Eddie,
>> >>
>> >> I am currently interning at BBN with the Internetworking Research
>> >> group there. It seems like the KernelTap and KernelTun devices need to
>> >> be patched for NetBSD support ... I'll send you the patch as soon as
>> >> we are done.
>> >>
>> >> Vivek
>> >>
>> >>
>> >> On 5/19/06, Eddie Kohler <kohler at cs.ucla.edu> wrote:
>> >> > Hi Vivek,
>> >> >
>> >> > It looks like KernelTun needs to be altered to work on NetBSD.  If
>> >> you look at
>> >> > the source, in elements/userlevel/kerneltun.{cc,hh}, you'll see that
>> >> there are
>> >> > several cases built in to the code, for Apple, FreeBSD, Linux
>> >> (ethertap and
>> >> > universal tun), OpenBSD.  Would you like to provide us with a patch
>> >> for NetBSD
>> >> > support??  We'd love it...
>> >> >
>> >> > E
>> >> >
>> >> >
>> >> > Vivek raghunathan wrote:
>> >> > > Eddie,
>> >> > >
>> >> > > SIOCSIFMTU is supported. NetBSD's tun device has a max mtu of
>> >> TUNMTU =
>> >> > > 1500.
>> >> > >
>> >> > > Another minor bug in the userlevel/kerneltun.cc file: it seems 
>> like
>> >> > > NetBSD does not preprend a 4 byte address family field in front of
>> >> the
>> >> > > IP header. Thus, in elements/kerneltun.cc:348 or so, the af 
>> field is
>> >> > > in fact the first 4 bytes of the IP header, resulting in  (af !=
>> >> > > AF_INET && af != AF_INET6) codepath being entered and userspace 
>> does
>> >> > > not receive the packets.
>> >> > >
>> >> > > Vivek
>> >> > >
>> >> > >
>> >> > > On 5/17/06, Eddie Kohler <kohler at cs.ucla.edu> wrote:
>> >> > >> Hi Vivek,
>> >> > >>
>> >> > >> So the point of SIOCSIFMTU is to set the MTU.  Are you saying the
>> >> > >> NetBSD's tun
>> >> > >> device CANNOT have an MTU larger than 1500?  Or that the 
>> SIOCSIFMTU
>> >> > >> ioctl is
>> >> > >> not supported?
>> >> > >>
>> >> > >> Eddie
>> >> > >>
>> >> > >>
>> >> > >> Vivek raghunathan wrote:
>> >> > >> > The mail was partially sent.
>> >> > >> >
>> >> > >> > With NetBSD, the conf/test-tun.click script doesn't work.
>> >> > >> >
>> >> > >> > bash-3.1$ sudo userlevel/click conf/test-tun.click
>> >> > >> > conf/test-tun.click:19: While initializing 'tun :: KernelTun':
>> >> > >> >   SIOCSIFMTU failed: Invalid argument
>> >> > >> > Router could not be initialized!
>> >> > >> >
>> >> > >> > Reason:
>> >> > >> > minor bug in userlevel/kerneltun.cc:
>> >> > >> >>     268 ifr.ifr_mtu = _mtu_out;
>> >> > >> >>     269     if (ioctl(s, SIOCSIFMTU, &ifr) != 0)
>> >> > >> >>     270         return errh->error("SIOCSIFMTU failed: %s",
>> >> > >> strerror(errno));
>> >> > >> >
>> >> > >> > NetBSD's tun device has a default MTU of 1500. _mtu_out is set
>> >> to 2048
>> >> > >> > by default, and NetBSD returns EINVAL on the ioctl.
>> >> > >> >
>> >> > >> > Fix:
>> >> > >> > set DEFAULT_MTU to <= 1500
>> >> > >> >
>> >> > >> > -Vivek
>> >> > >> >
>> >> > >> >
>> >> > >> > On 5/17/06, Vivek raghunathan <vivek.raghunathan at gmail.com> 
>> wrote:
>> >> > >> >> bug in userlevel/kerneltun.cc:
>> >> > >> >> 268 ifr.ifr_mtu = _mtu_out;
>> >> > >> >>     269     if (ioctl(s, SIOCSIFMTU, &ifr) != 0)
>> >> > >> >>     270         return errh->error("SIOCSIFMTU failed: %s",
>> >> > >> strerror(errno));
>> >> > >> >>
>> >> > >> >>
>> >> > >> >>
>> >> > >> >>
>> >> > >> >> --
>> >> > >> >>
>> >> > >> >> *************************************
>> >> > >> >> Vivek Raghunathan,
>> >> > >> >> PhD student,
>> >> > >> >> University of Illinois, Urbana-Champaign
>> >> > >> >>
>> >> > >> >> Contact Details:
>> >> > >> >> 1012 W. Clark St #31,
>> >> > >> >> Urbana IL 61801
>> >> > >> >>
>> >> > >> >> ph: 217-766-1868 (cell)
>> >> > >> >>     217-333-7541 (off)
>> >> > >> >>
>> >> > >> >
>> >> > >> >
>> >> > >>
>> >> > >
>> >> > >
>> >> >
>> >>
>> >>
>> >> --
>> >>
>> >> *************************************
>> >> Vivek Raghunathan,
>> >> PhD student,
>> >> University of Illinois, Urbana-Champaign
>> >>
>> >> Contact Details:
>> >> 1012 W. Clark St #31,
>> >> Urbana IL 61801
>> >>
>> >> ph: 217-766-1868 (cell)
>> >>     217-333-7541 (off)
>> >>
>> >
>> >
>>
> 
> 


More information about the click mailing list