1*3340d773SGleb Smirnoff /* 2*3340d773SGleb Smirnoff * Copyright (c) 2015 The TCPDUMP project 3*3340d773SGleb Smirnoff * All rights reserved. 4*3340d773SGleb Smirnoff * 5*3340d773SGleb Smirnoff * Redistribution and use in source and binary forms, with or without 6*3340d773SGleb Smirnoff * modification, are permitted provided that the following conditions 7*3340d773SGleb Smirnoff * are met: 8*3340d773SGleb Smirnoff * 1. Redistributions of source code must retain the above copyright 9*3340d773SGleb Smirnoff * notice, this list of conditions and the following disclaimer. 10*3340d773SGleb Smirnoff * 2. Redistributions in binary form must reproduce the above copyright 11*3340d773SGleb Smirnoff * notice, this list of conditions and the following disclaimer in the 12*3340d773SGleb Smirnoff * documentation and/or other materials provided with the distribution. 13*3340d773SGleb Smirnoff * 14*3340d773SGleb Smirnoff * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 15*3340d773SGleb Smirnoff * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16*3340d773SGleb Smirnoff * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 17*3340d773SGleb Smirnoff * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 18*3340d773SGleb Smirnoff * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 19*3340d773SGleb Smirnoff * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20*3340d773SGleb Smirnoff * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21*3340d773SGleb Smirnoff * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22*3340d773SGleb Smirnoff * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*3340d773SGleb Smirnoff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24*3340d773SGleb Smirnoff * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25*3340d773SGleb Smirnoff * POSSIBILITY OF SUCH DAMAGE. 26*3340d773SGleb Smirnoff */ 27*3340d773SGleb Smirnoff 28*3340d773SGleb Smirnoff #ifndef netdissect_timeval_operations_h 29*3340d773SGleb Smirnoff #define netdissect_timeval_operations_h 30*3340d773SGleb Smirnoff 31*3340d773SGleb Smirnoff /* Operations on timevals. */ 32*3340d773SGleb Smirnoff 33*3340d773SGleb Smirnoff #ifndef _MICRO_PER_SEC 34*3340d773SGleb Smirnoff #define _MICRO_PER_SEC 1000000 35*3340d773SGleb Smirnoff #endif 36*3340d773SGleb Smirnoff 37*3340d773SGleb Smirnoff #ifndef _NANO_PER_SEC 38*3340d773SGleb Smirnoff #define _NANO_PER_SEC 1000000000 39*3340d773SGleb Smirnoff #endif 40*3340d773SGleb Smirnoff 41*3340d773SGleb Smirnoff #define netdissect_timevalclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) 42*3340d773SGleb Smirnoff 43*3340d773SGleb Smirnoff #define netdissect_timevalisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) 44*3340d773SGleb Smirnoff 45*3340d773SGleb Smirnoff #define netdissect_timevalcmp(tvp, uvp, cmp) \ 46*3340d773SGleb Smirnoff (((tvp)->tv_sec == (uvp)->tv_sec) ? \ 47*3340d773SGleb Smirnoff ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ 48*3340d773SGleb Smirnoff ((tvp)->tv_sec cmp (uvp)->tv_sec)) 49*3340d773SGleb Smirnoff 50*3340d773SGleb Smirnoff #define netdissect_timevaladd(tvp, uvp, vvp, nano_prec) \ 51*3340d773SGleb Smirnoff do { \ 52*3340d773SGleb Smirnoff (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 53*3340d773SGleb Smirnoff (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 54*3340d773SGleb Smirnoff if (nano_prec) { \ 55*3340d773SGleb Smirnoff if ((vvp)->tv_usec >= _NANO_PER_SEC) { \ 56*3340d773SGleb Smirnoff (vvp)->tv_sec++; \ 57*3340d773SGleb Smirnoff (vvp)->tv_usec -= _NANO_PER_SEC; \ 58*3340d773SGleb Smirnoff } \ 59*3340d773SGleb Smirnoff } else { \ 60*3340d773SGleb Smirnoff if ((vvp)->tv_usec >= _MICRO_PER_SEC) { \ 61*3340d773SGleb Smirnoff (vvp)->tv_sec++; \ 62*3340d773SGleb Smirnoff (vvp)->tv_usec -= _MICRO_PER_SEC; \ 63*3340d773SGleb Smirnoff } \ 64*3340d773SGleb Smirnoff } \ 65*3340d773SGleb Smirnoff } while (0) 66*3340d773SGleb Smirnoff 67*3340d773SGleb Smirnoff #define netdissect_timevalsub(tvp, uvp, vvp, nano_prec) \ 68*3340d773SGleb Smirnoff do { \ 69*3340d773SGleb Smirnoff (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 70*3340d773SGleb Smirnoff (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 71*3340d773SGleb Smirnoff if ((vvp)->tv_usec < 0) { \ 72*3340d773SGleb Smirnoff (vvp)->tv_sec--; \ 73*3340d773SGleb Smirnoff (vvp)->tv_usec += (nano_prec ? _NANO_PER_SEC : \ 74*3340d773SGleb Smirnoff _MICRO_PER_SEC); \ 75*3340d773SGleb Smirnoff } \ 76*3340d773SGleb Smirnoff } while (0) 77*3340d773SGleb Smirnoff 78*3340d773SGleb Smirnoff #endif /* netdissect_timeval_operations_h */ 79