1/*-
  2 * SPDX-License-Identifier: BSD-3-Clause
  3 *
  4 * Copyright (c) 1982, 1986, 1993, 1995
  5 *	The Regents of the University of California.  All rights reserved.
  6 *
  7 * Redistribution and use in source and binary forms, with or without
  8 * modification, are permitted provided that the following conditions
  9 * are met:
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 * 2. Redistributions in binary form must reproduce the above copyright
 13 *    notice, this list of conditions and the following disclaimer in the
 14 *    documentation and/or other materials provided with the distribution.
 15 * 3. Neither the name of the University nor the names of its contributors
 16 *    may be used to endorse or promote products derived from this software
 17 *    without specific prior written permission.
 18 *
 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 29 * SUCH DAMAGE.
 30 *
 31 *	@(#)tcp_seq.h	8.3 (Berkeley) 6/21/95
 32 */
 33
 34#ifndef _NETINET_TCP_SEQ_H_
 35#define _NETINET_TCP_SEQ_H_
 36/*
 37 * TCP sequence numbers are 32 bit integers operated
 38 * on with modular arithmetic.  These macros can be
 39 * used to compare such integers.
 40 */
 41#define	SEQ_LT(a,b)	((int)((a)-(b)) < 0)
 42#define	SEQ_LEQ(a,b)	((int)((a)-(b)) <= 0)
 43#define	SEQ_GT(a,b)	((int)((a)-(b)) > 0)
 44#define	SEQ_GEQ(a,b)	((int)((a)-(b)) >= 0)
 45#define	SEQ_SUB(a,b)	((int)((a)-(b)))
 46
 47#define	SEQ_MIN(a, b)	((SEQ_LT(a, b)) ? (a) : (b))
 48#define	SEQ_MAX(a, b)	((SEQ_GT(a, b)) ? (a) : (b))
 49
 50#define	WIN_LT(a,b)	(ntohs(a) < ntohs(b))
 51#define	WIN_LEQ(a,b)	(ntohs(a) <= ntohs(b))
 52#define	WIN_GT(a,b)	(ntohs(a) > ntohs(b))
 53#define	WIN_GEQ(a,b)	(ntohs(a) >= ntohs(b))
 54
 55#define	WIN_MIN(a, b)	((WIN_LT(a, b)) ? (a) : (b))
 56#define	WIN_MAX(a, b)	((WIN_GT(a, b)) ? (a) : (b))
 57
 58/* for modulo comparisons of timestamps */
 59#define TSTMP_LT(a,b)	((int)((a)-(b)) < 0)
 60#define TSTMP_GT(a,b)	((int)((a)-(b)) > 0)
 61#define TSTMP_GEQ(a,b)	((int)((a)-(b)) >= 0)
 62
 63/*
 64 * Macros to initialize tcp sequence numbers for
 65 * send and receive from initial send and receive
 66 * sequence numbers.
 67 */
 68#define	tcp_rcvseqinit(tp) \
 69	(tp)->rcv_adv = (tp)->rcv_nxt = (tp)->irs + 1
 70
 71#define	tcp_sendseqinit(tp) \
 72	(tp)->snd_una = (tp)->snd_nxt = (tp)->snd_max = (tp)->snd_up = \
 73	    (tp)->snd_recover = (tp)->iss
 74
 75#ifdef _KERNEL
 76/*
 77 * Clock macros for RFC 1323 timestamps.
 78 */
 79#define	TCP_TS_TO_TICKS(_t)	((_t) * hz / 1000)
 80
 81/* Timestamp wrap-around time, 24 days. */
 82#define TCP_PAWS_IDLE	(24 * 24 * 60 * 60 * 1000)
 83
 84/*
 85 * tcp_ts_getticks() in ms, should be 1ms < x < 1000ms according to RFC 1323.
 86 * We always use 1ms granularity independent of hz.
 87 */
 88static __inline uint32_t
 89tcp_ts_getticks(void)
 90{
 91	struct timeval tv;
 92
 93	/*
 94	 * getmicrouptime() should be good enough for any 1-1000ms granularity.
 95	 * Do not use getmicrotime() here as it might break nfsroot/tcp.
 96	 */
 97	getmicrouptime(&tv);
 98	return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
 99}
100#endif /* _KERNEL */
101
102#endif /* _NETINET_TCP_SEQ_H_ */