Module Name: src Committed By: minskim Date: Thu Jul 16 04:09:51 UTC 2009
Modified Files: src/share/man/man4: ip.4 src/sys/netinet: in.h in_pcb.h ip_input.c ip_output.c Log Message: Add the IP_RECVTTL option support. If the IP_RECVTTL option is enabled on a SOCK_DGRAM socket, the recvmsg(2) call will return the TTL of the received datagram. The msg_control field in the msghdr structure points to a buffer that contains a cmsghdr structure followed by the TTL value. Modeled after FreeBSD implementation. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/share/man/man4/ip.4 cvs rdiff -u -r1.83 -r1.84 src/sys/netinet/in.h cvs rdiff -u -r1.45 -r1.46 src/sys/netinet/in_pcb.h cvs rdiff -u -r1.281 -r1.282 src/sys/netinet/ip_input.c cvs rdiff -u -r1.203 -r1.204 src/sys/netinet/ip_output.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/share/man/man4/ip.4 diff -u src/share/man/man4/ip.4:1.23 src/share/man/man4/ip.4:1.24 --- src/share/man/man4/ip.4:1.23 Tue Sep 23 14:58:05 2008 +++ src/share/man/man4/ip.4 Thu Jul 16 04:09:51 2009 @@ -1,4 +1,4 @@ -.\" $NetBSD: ip.4,v 1.23 2008/09/23 14:58:05 briggs Exp $ +.\" $NetBSD: ip.4,v 1.24 2009/07/16 04:09:51 minskim Exp $ .\" .\" Copyright (c) 1983, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)ip.4 8.2 (Berkeley) 11/30/93 .\" -.Dd September 23, 2008 +.Dd July 16, 2009 .Dt IP 4 .Os .Sh NAME @@ -165,6 +165,26 @@ cmsg_level = IPPROTO_IP cmsg_type = IP_RECVIF .Ed +.Pp +If the +.Dv IP_RECVTTL +option is enabled on a +.Dv SOCK_DGRAM +socket, the +.Xr recvmsg 2 +call will return the +.Tn TTL +of the received datagram. +The msg_control field in the msghdr structure points to a buffer +that contains a cmsghdr structure followed by the +.Tn TTL +value. +The cmsghdr fields have the following values: +.Bd -literal +cmsg_len = sizeof(uint8_t) +cmsg_level = IPPROTO_IP +cmsg_type = IP_RECVTTL +.Ed .Ss MULTICAST OPTIONS .Tn IP multicasting is supported only on Index: src/sys/netinet/in.h diff -u src/sys/netinet/in.h:1.83 src/sys/netinet/in.h:1.84 --- src/sys/netinet/in.h:1.83 Fri Jan 25 21:12:14 2008 +++ src/sys/netinet/in.h Thu Jul 16 04:09:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: in.h,v 1.83 2008/01/25 21:12:14 joerg Exp $ */ +/* $NetBSD: in.h,v 1.84 2009/07/16 04:09:51 minskim Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993 @@ -282,6 +282,7 @@ #if 1 /*IPSEC*/ #define IP_IPSEC_POLICY 22 /* struct; get/set security policy */ #endif +#define IP_RECVTTL 23 /* bool; receive IP TTL w/dgram */ /* * Defaults and limits for options Index: src/sys/netinet/in_pcb.h diff -u src/sys/netinet/in_pcb.h:1.45 src/sys/netinet/in_pcb.h:1.46 --- src/sys/netinet/in_pcb.h:1.45 Sun Dec 16 18:39:57 2007 +++ src/sys/netinet/in_pcb.h Thu Jul 16 04:09:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: in_pcb.h,v 1.45 2007/12/16 18:39:57 elad Exp $ */ +/* $NetBSD: in_pcb.h,v 1.46 2009/07/16 04:09:51 minskim Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -108,8 +108,6 @@ /* XXX should move to an UDP control block */ #define INP_ESPINUDP 0x100 /* ESP over UDP for NAT-T */ #define INP_ESPINUDP_NON_IKE 0x200 /* ESP over UDP for NAT-T */ -#define INP_CONTROLOPTS (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR|\ - INP_RECVIF) #define INP_ESPINUDP_ALL (INP_ESPINUDP|INP_ESPINUDP_NON_IKE) #define INP_NOHEADER 0x400 /* Kernel removes IP header * before feeding a packet @@ -118,6 +116,9 @@ * not supply an IP header. * Cancels INP_HDRINCL. */ +#define INP_RECVTTL 0x800 /* receive incoming IP TTL */ +#define INP_CONTROLOPTS (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR|\ + INP_RECVIF|INP_RECVTTL) #define sotoinpcb(so) ((struct inpcb *)(so)->so_pcb) Index: src/sys/netinet/ip_input.c diff -u src/sys/netinet/ip_input.c:1.281 src/sys/netinet/ip_input.c:1.282 --- src/sys/netinet/ip_input.c:1.281 Sat Apr 18 14:58:05 2009 +++ src/sys/netinet/ip_input.c Thu Jul 16 04:09:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_input.c,v 1.281 2009/04/18 14:58:05 tsutsui Exp $ */ +/* $NetBSD: ip_input.c,v 1.282 2009/07/16 04:09:51 minskim Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.281 2009/04/18 14:58:05 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.282 2009/07/16 04:09:51 minskim Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -2118,6 +2118,12 @@ if (*mp) mp = &(*mp)->m_next; } + if (inp->inp_flags & INP_RECVTTL) { + *mp = sbcreatecontrol((void *) &ip->ip_ttl, + sizeof(uint8_t), IP_RECVTTL, IPPROTO_IP); + if (*mp) + mp = &(*mp)->m_next; + } } /* Index: src/sys/netinet/ip_output.c diff -u src/sys/netinet/ip_output.c:1.203 src/sys/netinet/ip_output.c:1.204 --- src/sys/netinet/ip_output.c:1.203 Wed Jul 1 14:47:54 2009 +++ src/sys/netinet/ip_output.c Thu Jul 16 04:09:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_output.c,v 1.203 2009/07/01 14:47:54 martin Exp $ */ +/* $NetBSD: ip_output.c,v 1.204 2009/07/16 04:09:51 minskim Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.203 2009/07/01 14:47:54 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.204 2009/07/16 04:09:51 minskim Exp $"); #include "opt_pfil_hooks.h" #include "opt_inet.h" @@ -1227,6 +1227,7 @@ case IP_RECVRETOPTS: case IP_RECVDSTADDR: case IP_RECVIF: + case IP_RECVTTL: error = sockopt_getint(sopt, &optval); if (error) break; @@ -1260,6 +1261,10 @@ case IP_RECVIF: OPTSET(INP_RECVIF); break; + + case IP_RECVTTL: + OPTSET(INP_RECVTTL); + break; } break; #undef OPTSET @@ -1334,6 +1339,7 @@ case IP_RECVRETOPTS: case IP_RECVDSTADDR: case IP_RECVIF: + case IP_RECVTTL: case IP_ERRORMTU: switch (sopt->sopt_name) { case IP_TOS: @@ -1365,6 +1371,10 @@ case IP_RECVIF: optval = OPTBIT(INP_RECVIF); break; + + case IP_RECVTTL: + optval = OPTBIT(INP_RECVTTL); + break; } error = sockopt_setint(sopt, optval); break;