On Mon, Aug 14, 2017 at 3:15 PM, Thiago Macieira <thiago.macie...@intel.com> wrote: > On Monday, 14 August 2017 12:03:16 PDT Willem de Bruijn wrote: >> On Mon, Aug 14, 2017 at 2:58 PM, Thiago Macieira >> >> <thiago.macie...@intel.com> wrote: >> > On Monday, 14 August 2017 11:46:42 PDT Willem de Bruijn wrote: >> >> > By the way, what were the usecases for the peek offset feature? >> >> >> >> The idea was to be able to peek at application headers of upper >> >> layer protocols and multiplex messages among threads. It proved >> >> so complex even for UDP that we did not attempt the same feature >> >> for TCP. Also, KCM implements demultiplexing using eBPF today. >> > >> > Interesting, but how would userspace coordinate like that? Suppose >> > multiple >> > threads are woken up by a datagram being received >> >> This assumes a separate listener thread and worker threadpool. > > The listener thread still needs to synchronise with the worker that got > activated and wait for it to recv from the socket before the listener thread > can go back to poll(). > > If we are really talking about threads in the same process, it might be easier > for the listener to just read the datagram anyway and pass it on to the > worker. That way, it can proceed immediately to the next datagram and not have > to wait for the possibly slow worker. > > If it is a separate process, then I don't see another way and this might be > necessary. > > By the way, what does recv with MSG_PEEK | MSG_TRUNC return? Is it the full > datagram's size or is it the size minus the peek offset?
udp_recvmsg returns ulen if the flag is passed. if (flags & MSG_TRUNC) err = ulen; This is computed earlier in the function as udp payload length and not modified after. ulen = udp_skb_len(skb);