13340d773SGleb Smirnoff /* 23340d773SGleb Smirnoff * Copyright (c) 2015 The TCPDUMP project 33340d773SGleb Smirnoff * All rights reserved. 43340d773SGleb Smirnoff * 53340d773SGleb Smirnoff * Redistribution and use in source and binary forms, with or without 63340d773SGleb Smirnoff * modification, are permitted provided that the following conditions 73340d773SGleb Smirnoff * are met: 83340d773SGleb Smirnoff * 1. Redistributions of source code must retain the above copyright 93340d773SGleb Smirnoff * notice, this list of conditions and the following disclaimer. 103340d773SGleb Smirnoff * 2. Redistributions in binary form must reproduce the above copyright 113340d773SGleb Smirnoff * notice, this list of conditions and the following disclaimer in the 123340d773SGleb Smirnoff * documentation and/or other materials provided with the distribution. 133340d773SGleb Smirnoff * 143340d773SGleb Smirnoff * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 153340d773SGleb Smirnoff * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 163340d773SGleb Smirnoff * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 173340d773SGleb Smirnoff * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 183340d773SGleb Smirnoff * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 193340d773SGleb Smirnoff * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 203340d773SGleb Smirnoff * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 213340d773SGleb Smirnoff * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 223340d773SGleb Smirnoff * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 233340d773SGleb Smirnoff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 243340d773SGleb Smirnoff * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 253340d773SGleb Smirnoff * POSSIBILITY OF SUCH DAMAGE. 263340d773SGleb Smirnoff */ 273340d773SGleb Smirnoff 283340d773SGleb Smirnoff #ifndef netdissect_timeval_operations_h 293340d773SGleb Smirnoff #define netdissect_timeval_operations_h 303340d773SGleb Smirnoff 313340d773SGleb Smirnoff /* Operations on timevals. */ 323340d773SGleb Smirnoff 33*ee67461eSJoseph Mingrone #define ND_MICRO_PER_SEC 1000000 34*ee67461eSJoseph Mingrone #define ND_NANO_PER_SEC 1000000000 353340d773SGleb Smirnoff 363340d773SGleb Smirnoff #define netdissect_timevalclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) 373340d773SGleb Smirnoff 383340d773SGleb Smirnoff #define netdissect_timevalisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) 393340d773SGleb Smirnoff 403340d773SGleb Smirnoff #define netdissect_timevalcmp(tvp, uvp, cmp) \ 413340d773SGleb Smirnoff (((tvp)->tv_sec == (uvp)->tv_sec) ? \ 423340d773SGleb Smirnoff ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ 433340d773SGleb Smirnoff ((tvp)->tv_sec cmp (uvp)->tv_sec)) 443340d773SGleb Smirnoff 453340d773SGleb Smirnoff #define netdissect_timevaladd(tvp, uvp, vvp, nano_prec) \ 463340d773SGleb Smirnoff do { \ 473340d773SGleb Smirnoff (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 483340d773SGleb Smirnoff (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 493340d773SGleb Smirnoff if (nano_prec) { \ 50*ee67461eSJoseph Mingrone if ((vvp)->tv_usec >= ND_NANO_PER_SEC) { \ 513340d773SGleb Smirnoff (vvp)->tv_sec++; \ 52*ee67461eSJoseph Mingrone (vvp)->tv_usec -= ND_NANO_PER_SEC; \ 533340d773SGleb Smirnoff } \ 543340d773SGleb Smirnoff } else { \ 55*ee67461eSJoseph Mingrone if ((vvp)->tv_usec >= ND_MICRO_PER_SEC) { \ 563340d773SGleb Smirnoff (vvp)->tv_sec++; \ 57*ee67461eSJoseph Mingrone (vvp)->tv_usec -= ND_MICRO_PER_SEC; \ 583340d773SGleb Smirnoff } \ 593340d773SGleb Smirnoff } \ 603340d773SGleb Smirnoff } while (0) 613340d773SGleb Smirnoff 623340d773SGleb Smirnoff #define netdissect_timevalsub(tvp, uvp, vvp, nano_prec) \ 633340d773SGleb Smirnoff do { \ 643340d773SGleb Smirnoff (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 653340d773SGleb Smirnoff (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 663340d773SGleb Smirnoff if ((vvp)->tv_usec < 0) { \ 673340d773SGleb Smirnoff (vvp)->tv_sec--; \ 68*ee67461eSJoseph Mingrone (vvp)->tv_usec += (nano_prec ? ND_NANO_PER_SEC : \ 69*ee67461eSJoseph Mingrone ND_MICRO_PER_SEC); \ 703340d773SGleb Smirnoff } \ 713340d773SGleb Smirnoff } while (0) 723340d773SGleb Smirnoff 733340d773SGleb Smirnoff #endif /* netdissect_timeval_operations_h */ 74