Ethernet over Kernel Sockets



Hello all!

As you know, some network cards doesn't have a 'eth' interface under linux.
Because of that I'm developing a net_device based driver which doesn't transmit and receive directly through a real network card but through UDP kernel sockets.
That means:
If my net_device->hard_start_xmit function gets an packet to transmit (in interrupt context), there will be a work struct queued into a workqueue and the packet will be processed by the workqueue later on (in process context).
On the receiver side I have a kernel thread which blocks on sock_recvmsg() and if there comes a UDP message, then it will be processed and a sk_buff will be passed to the kernel.
The current state is that all works stable but I've bad transmission rates and bad ping times.

For example I've to systems and each has one Gigabit-Ethernet card:
System 1: ifconfig eth0 192.168.0.1
System 2: ifconfig eth0 192.168.0.2

If I load my driver then I get an additional eth interface (for example):
System 1: ifconfig eth1 192.168.1.1
System 2: ifconfig eth1 192.168.1.2

So the eth1 interfaces are based on sockets which use the eth0 (Gigabit) interfaces for the communication.
Now, if I measure the transmission between 192.168.0.1 and 192.168.0.2 then I get transmission rates that are normal for Gigabit-Ethernet (~25µsec (PingPong) and ~900Mbit/s).
If I measure the transmission through the eth1 interfaces between 192.168.1.1 and 192.168.1.2 then I only get ~1msec (PingPong) and only about ~400Mbit/s.

The interesting thing is, that I always get PingPongs of 1ms (= one jiffie). Although if I measure with 100MBit- or other non-Ethernet cards.
Maybe it's because I run the socket_recvmsg() function in a kernel thread which blocks on the function and must wait to be executed by the scheduler.

Now I don't know how I could solve this problem:
How can I force the kernel to process a received message immediately when it comes in through an UDP kernel socket?

I hope that someone of you can help me....
The source code you can find here:
http://net.razik.de/ethos.tar.gz

Regards and Many Thanks for any help!
Lukas
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: Ethernet over Kernel Sockets
    ... some network cards doesn't have a 'eth' ... the eth0 interfaces for the communication. ... if I measure the transmission between 192.168.0.1 ... only get ~1msec (PingPong) and only about ~400Mbit/s. ...
    (Linux-Kernel)
  • [ANNOUNCE] Linux-2.4.32-hf32.4
    ... Roughly based on a patch by ... Before transmission, any socket buffer shorter than the ethernet ... Initial work and description from Olaf Kirch for kernel 2.6: ...
    (Linux-Kernel)
  • Re: Need UNIX clarification
    ... the Tru64 UNIX kernel is multi-threaded. ... applications running in user space, SMP systems, and a way to allow ... The contents of the transmission may also be subject to ...
    (comp.os.vms)
  • Re: Reqst for Information: Loopback device programming
    ... >> transmission is done in kernel space rather than userspace. ... I don't think it is unless network is very fast indeed .. ...
    (comp.os.linux.development.system)
  • Re: generic strncpy - off-by-one error
    ... >definition of strncpy(). ... Iwas just looking at it from the kernel code context. ... of the information contained in this transmission is strictly prohibited. ... send the line "unsubscribe linux-kernel" in ...
    (Linux-Kernel)