1

Implementing a netlink (rtnetlink) module I ran into a problem:

Like for UDP, a part of the message (packet) is lost when the receive buffer is not big enough (e.g. when the buffer is 1024 bytes and you received 1024 bytes).

So I wondered how to prepare the "correct" receive buffer. Initially I had the idea to MSG_PEEK just the nlmsghdr, then extract the message size from there, and next do the final receive. As security measure I allocated one byte more, just to be able to complain if the receive size used the full buffer.

Unfortunately it did!

Is there an algorithm that will work, not needing a ridiculously huge receive buffer?

Example:

nlmsg_len was 1276, so I tried to receive 1277 bytes, and I did.

So on the next attempt I blindly added 2000 bytes to the receive buffer, and the result was 2552 bytes long (1276 bytes longer than expected).

As said above I think I cannot "continue" to receive a longer message using multiple recvs, so I must receive all at once.

U. Windl
  • 3,480
  • 26
  • 54

0 Answers0