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