Elad Lahav <elahav@xxxxxxxxxxxx> writes:
The attached patch contains an implementation of sendgroup(), a system
call that allows a UDP packet to be transmitted efficiently to
multiple recipients. Use cases for this system call include
live-streaming and multi-player online games.
The basic idea is that the caller maintains a group - a list of IP
addresses and UDP ports - and calls sendgroup() with the group list
and a common payload. Optionally, the call allows for per-recipient
data to be prepended or appended to the shared block. The data is
copied once in the kernel into an allocated page, and the
per-recipient socket buffers point to that page. Savings come from
avoiding both the multiple calls and the multiple copies of the data
required with regular socket operations.
My guess it's more the copies than the calls? It sounds like
you want sendfile() for UDP. I think that would be a cleaner solution
than such a specific hack for your application. It would
have the advantage of saving the first copy too and be truly zero copy on capable NICs.
Or perhaps simple send to a local multicast group and let
some netfilter module turn that into regular UDP.