[NET]: Adding SO_TIMESTAMPNS / SCM_TIMESTAMPNS support
Now that network timestamps use ktime_t infrastructure, we can add a new SOL_SOCKET sockopt SO_TIMESTAMPNS. This command is similar to SO_TIMESTAMP, but permits transmission of a 'timespec struct' instead of a 'timeval struct' control message. (nanosecond resolution instead of microsecond) Control message is labelled SCM_TIMESTAMPNS instead of SCM_TIMESTAMP A socket cannot mix SO_TIMESTAMP and SO_TIMESTAMPNS : the two modes are mutually exclusive. sock_recv_timestamp() became too big to be fully inlined so I added a __sock_recv_timestamp() helper function. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> CC: linux-arch@vger.kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
c7a3c5da35
commit
92f37fd2ee
@@ -521,11 +521,18 @@ set_rcvbuf:
|
||||
break;
|
||||
|
||||
case SO_TIMESTAMP:
|
||||
case SO_TIMESTAMPNS:
|
||||
if (valbool) {
|
||||
if (optname == SO_TIMESTAMP)
|
||||
sock_reset_flag(sk, SOCK_RCVTSTAMPNS);
|
||||
else
|
||||
sock_set_flag(sk, SOCK_RCVTSTAMPNS);
|
||||
sock_set_flag(sk, SOCK_RCVTSTAMP);
|
||||
sock_enable_timestamp(sk);
|
||||
} else
|
||||
} else {
|
||||
sock_reset_flag(sk, SOCK_RCVTSTAMP);
|
||||
sock_reset_flag(sk, SOCK_RCVTSTAMPNS);
|
||||
}
|
||||
break;
|
||||
|
||||
case SO_RCVLOWAT:
|
||||
@@ -715,7 +722,12 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
|
||||
case SO_TIMESTAMP:
|
||||
v.val = sock_flag(sk, SOCK_RCVTSTAMP);
|
||||
v.val = sock_flag(sk, SOCK_RCVTSTAMP) &&
|
||||
!sock_flag(sk, SOCK_RCVTSTAMPNS);
|
||||
break;
|
||||
|
||||
case SO_TIMESTAMPNS:
|
||||
v.val = sock_flag(sk, SOCK_RCVTSTAMPNS);
|
||||
break;
|
||||
|
||||
case SO_RCVTIMEO:
|
||||
|
Reference in New Issue
Block a user