Introduce the SO_BINTIME option which takes a high-resolution timestamp
at packet arrival. For benchmarking purposes SO_BINTIME is preferable to SO_TIMEVAL since it has higher resolution and lower overhead. Simultaneous use of the two options is possible and they will return consistent timestamps. This introduces an extra test and a function call for SO_TIMEVAL, but I have not been able to measure that.
This commit is contained in:
parent
f191a0bcf6
commit
be8a62e821
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=125264
@ -1357,6 +1357,7 @@ sosetopt(so, sopt)
|
||||
case SO_REUSEPORT:
|
||||
case SO_OOBINLINE:
|
||||
case SO_TIMESTAMP:
|
||||
case SO_BINTIME:
|
||||
case SO_NOSIGPIPE:
|
||||
error = sooptcopyin(sopt, &optval, sizeof optval,
|
||||
sizeof optval);
|
||||
@ -1555,6 +1556,7 @@ sogetopt(so, sopt)
|
||||
case SO_BROADCAST:
|
||||
case SO_OOBINLINE:
|
||||
case SO_TIMESTAMP:
|
||||
case SO_BINTIME:
|
||||
case SO_NOSIGPIPE:
|
||||
optval = so->so_options & sopt->sopt_name;
|
||||
integer:
|
||||
|
@ -2062,14 +2062,25 @@ ip_savecontrol(inp, mp, ip, m)
|
||||
register struct ip *ip;
|
||||
register struct mbuf *m;
|
||||
{
|
||||
if (inp->inp_socket->so_options & SO_TIMESTAMP) {
|
||||
struct timeval tv;
|
||||
if (inp->inp_socket->so_options & (SO_BINTIME | SO_TIMESTAMP)) {
|
||||
struct bintime bt;
|
||||
|
||||
microtime(&tv);
|
||||
*mp = sbcreatecontrol((caddr_t) &tv, sizeof(tv),
|
||||
SCM_TIMESTAMP, SOL_SOCKET);
|
||||
if (*mp)
|
||||
mp = &(*mp)->m_next;
|
||||
bintime(&bt);
|
||||
if (inp->inp_socket->so_options & SO_BINTIME) {
|
||||
*mp = sbcreatecontrol((caddr_t) &bt, sizeof(bt),
|
||||
SCM_BINTIME, SOL_SOCKET);
|
||||
if (*mp)
|
||||
mp = &(*mp)->m_next;
|
||||
}
|
||||
if (inp->inp_socket->so_options & SO_TIMESTAMP) {
|
||||
struct timeval tv;
|
||||
|
||||
bintime2timeval(&bt, &tv);
|
||||
*mp = sbcreatecontrol((caddr_t) &tv, sizeof(tv),
|
||||
SCM_TIMESTAMP, SOL_SOCKET);
|
||||
if (*mp)
|
||||
mp = &(*mp)->m_next;
|
||||
}
|
||||
}
|
||||
if (inp->inp_flags & INP_RECVDSTADDR) {
|
||||
*mp = sbcreatecontrol((caddr_t) &ip->ip_dst,
|
||||
|
@ -475,7 +475,7 @@ udp_append(last, ip, n, off)
|
||||
}
|
||||
#endif
|
||||
if (last->inp_flags & INP_CONTROLOPTS ||
|
||||
last->inp_socket->so_options & SO_TIMESTAMP) {
|
||||
last->inp_socket->so_options & (SO_TIMESTAMP | SO_BINTIME)) {
|
||||
#ifdef INET6
|
||||
if (last->inp_vflag & INP_IPV6) {
|
||||
int savedflags;
|
||||
|
@ -120,6 +120,7 @@ typedef __uid_t uid_t;
|
||||
#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */
|
||||
#define SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */
|
||||
#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */
|
||||
#define SO_BINTIME 0x2000 /* timestamp received dgram traffic */
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -462,6 +463,7 @@ struct cmsgcred {
|
||||
#if __BSD_VISIBLE
|
||||
#define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */
|
||||
#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */
|
||||
#define SCM_BINTIME 0x04 /* timestamp (struct bintime) */
|
||||
#endif
|
||||
|
||||
#if __BSD_VISIBLE
|
||||
|
Loading…
Reference in New Issue
Block a user