[patch] ip.7 IP_RECVTTL error fixed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi everyone,

I need to get the TTL of UDP datagrams from userspace, so I set the
IP_RECVTTL socket option.  And as promised by ip.7, I then get IP_TTL
messages from recvfrom.  However, unlike what the manpage promises, the TTL
field gets passed as a 32 bit integer.

The following userspace code works:

  uint32_t ttl32;
  for (cmsg = CMSG_FIRSTHDR(msgh); cmsg != NULL; cmsg = CMSG_NXTHDR(msgh,cmsg)) {
    if ((cmsg->cmsg_level == IPPROTO_IP) && (cmsg->cmsg_type == IP_TTL) && 
        CMSG_LEN(sizeof(ttl32)) == cmsg->cmsg_len) {

      memcpy(&ttl32, CMSG_DATA(cmsg), sizeof(ttl32));
      *ttl=ttl32;
      return true;
    }
    else
      cerr<<"Saw something else "<<(cmsg->cmsg_type == IP_TTL) <<", "<<(int)cmsg->cmsg_level<<", "<<cmsg->cmsg_len<<", "<<CMSG_LEN(1)<<endl;
  }

The 'else' field was used to figure out I go the length wrong.

Patch:

diff --git a/man7/ip.7 b/man7/ip.7
index 02dd47f2a..d664eddb1 100644
--- a/man7/ip.7
+++ b/man7/ip.7
@@ -874,7 +874,7 @@ Expects a boolean integer flag.
 When this flag is set, pass a
 .B IP_TTL
 control message with the time-to-live
-field of the received packet as a byte.
+field of the received packet as a 32 bit integer.
 Not supported for
 .B SOCK_STREAM
 sockets.




[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux