From: Daniel Kabs <daniel.kabs@mobotix.com>
To: David Miller <davem@davemloft.net>
Cc: linux-kernel@vger.kernel.org
Subject: Re: Problem with unix sockets: SOCK_DGRAM ignores MSG_TRUNC
Date: Tue, 6 Feb 2007 13:55:39 +0100 [thread overview]
Message-ID: <200702061355.39660.daniel.kabs@mobotix.com> (raw)
In-Reply-To: <20070204.165235.26305735.davem@davemloft.net>
On Monday 05 February 2007 01:52, David Miller wrote:
> > Thus I used recv() with flags MSG_TRUNC|MSG_PEEK in order to detect
> > message truncation due to insufficient buffer size.
>
> What part of "Only valid for packet sockets" from the manual page
> escapes you? :-))
> It's a feature which only was meant to be valid for AF_PACKET sockets.
Thanks for pointing that out. I thought, "packet sockets" means
"datagram-oriented socket". Obviously it means PF_PACKET instead. It's
hard to learn programming IPC by only reading man pages :-)
> What UDP is doing is different, it's returning the full packet length
> when the packet is larger then the given buffer size, but it does this
> irregardless of whether you set MSG_TRUNC in the recvmsg() passed-in
> flags. UDP itself sets the MSG_TRUNC flag when it detects this
> situation.
Please correct me gently if I am wrong: According to the kernel source
code, this behaviour was introduced with patch-2.6.8:
http://www.kernel.org/diff/diffview.cgi?file=/pub/linux/kernel/v2.6/patch-2.6.8.gz;z=4325
linux/net/ipv4/udp.c
+
err = copied;
+ if (flags & MSG_TRUNC)
+ err = skb->len - sizeof(struct udphdr);
I think local sockets (PF_UNIX) implement a different semantics: According
to unix_dgram_recvmsg() in linux/net/unix/af_unix.c, in case of
truncation the buffer size is returned and not the full packet length.
In my opinion this implementation of local sockets (PF_UNIX) is not
following the wording of the man page man 2 recv: "These calls return
the number of bytes received". Am I getting something wrong here?
Why not improve consistency and make unix_dgram_recvmsg() return the full
packet length? So it would behave as UDP does. What do you think about
adding the following code to linux/net/unix/af_unix.c:
err = size;
+ if (flags & MSG_TRUNC)
+ err = skb->len;
Cheers
Daniel
next prev parent reply other threads:[~2007-02-06 13:12 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-29 11:59 Problem with unix sockets: SOCK_DGRAM ignores MSG_TRUNC Daniel Kabs
2007-02-05 0:52 ` David Miller
2007-02-06 12:55 ` Daniel Kabs [this message]
2007-02-06 20:11 ` David Schwartz
2007-02-07 8:58 ` Daniel Kabs
2007-02-07 9:31 ` Daniel Kabs
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200702061355.39660.daniel.kabs@mobotix.com \
--to=daniel.kabs@mobotix.com \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.