1784088dfSchristos /* 2784088dfSchristos * Copyright (c) 2015 The TCPDUMP project 3784088dfSchristos * All rights reserved. 4784088dfSchristos * 5784088dfSchristos * Redistribution and use in source and binary forms, with or without 6784088dfSchristos * modification, are permitted provided that the following conditions 7784088dfSchristos * are met: 8784088dfSchristos * 1. Redistributions of source code must retain the above copyright 9784088dfSchristos * notice, this list of conditions and the following disclaimer. 10784088dfSchristos * 2. Redistributions in binary form must reproduce the above copyright 11784088dfSchristos * notice, this list of conditions and the following disclaimer in the 12784088dfSchristos * documentation and/or other materials provided with the distribution. 13784088dfSchristos * 14784088dfSchristos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 15784088dfSchristos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16784088dfSchristos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 17784088dfSchristos * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 18784088dfSchristos * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 19784088dfSchristos * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20784088dfSchristos * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21784088dfSchristos * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22784088dfSchristos * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23784088dfSchristos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24784088dfSchristos * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25784088dfSchristos * POSSIBILITY OF SUCH DAMAGE. 26784088dfSchristos */ 27784088dfSchristos 28784088dfSchristos #ifndef netdissect_timeval_operations_h 29784088dfSchristos #define netdissect_timeval_operations_h 30784088dfSchristos 31784088dfSchristos /* Operations on timevals. */ 32784088dfSchristos 33*d881c474Schristos #define ND_MICRO_PER_SEC 1000000 34*d881c474Schristos #define ND_NANO_PER_SEC 1000000000 35784088dfSchristos 36784088dfSchristos #define netdissect_timevalclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) 37784088dfSchristos 38784088dfSchristos #define netdissect_timevalisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) 39784088dfSchristos 40784088dfSchristos #define netdissect_timevalcmp(tvp, uvp, cmp) \ 41784088dfSchristos (((tvp)->tv_sec == (uvp)->tv_sec) ? \ 42784088dfSchristos ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ 43784088dfSchristos ((tvp)->tv_sec cmp (uvp)->tv_sec)) 44784088dfSchristos 45784088dfSchristos #define netdissect_timevaladd(tvp, uvp, vvp, nano_prec) \ 46784088dfSchristos do { \ 47784088dfSchristos (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 48784088dfSchristos (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 49784088dfSchristos if (nano_prec) { \ 50*d881c474Schristos if ((vvp)->tv_usec >= ND_NANO_PER_SEC) { \ 51784088dfSchristos (vvp)->tv_sec++; \ 52*d881c474Schristos (vvp)->tv_usec -= ND_NANO_PER_SEC; \ 53784088dfSchristos } \ 54784088dfSchristos } else { \ 55*d881c474Schristos if ((vvp)->tv_usec >= ND_MICRO_PER_SEC) { \ 56784088dfSchristos (vvp)->tv_sec++; \ 57*d881c474Schristos (vvp)->tv_usec -= ND_MICRO_PER_SEC; \ 58784088dfSchristos } \ 59784088dfSchristos } \ 60784088dfSchristos } while (0) 61784088dfSchristos 62784088dfSchristos #define netdissect_timevalsub(tvp, uvp, vvp, nano_prec) \ 63784088dfSchristos do { \ 64784088dfSchristos (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 65784088dfSchristos (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 66784088dfSchristos if ((vvp)->tv_usec < 0) { \ 67784088dfSchristos (vvp)->tv_sec--; \ 68*d881c474Schristos (vvp)->tv_usec += (nano_prec ? ND_NANO_PER_SEC : \ 69*d881c474Schristos ND_MICRO_PER_SEC); \ 70784088dfSchristos } \ 71784088dfSchristos } while (0) 72784088dfSchristos 73784088dfSchristos #endif /* netdissect_timeval_operations_h */ 74