1c325962bSMike Silbersack /*- 251369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 351369649SPedro F. Giffuni * 4c325962bSMike Silbersack * Copyright (c) 1982, 1986, 1993, 1994, 1995 5c325962bSMike Silbersack * The Regents of the University of California. All rights reserved. 6c325962bSMike Silbersack * 7c325962bSMike Silbersack * Redistribution and use in source and binary forms, with or without 8c325962bSMike Silbersack * modification, are permitted provided that the following conditions 9c325962bSMike Silbersack * are met: 10c325962bSMike Silbersack * 1. Redistributions of source code must retain the above copyright 11c325962bSMike Silbersack * notice, this list of conditions and the following disclaimer. 12c325962bSMike Silbersack * 2. Redistributions in binary form must reproduce the above copyright 13c325962bSMike Silbersack * notice, this list of conditions and the following disclaimer in the 14c325962bSMike Silbersack * documentation and/or other materials provided with the distribution. 15fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 16c325962bSMike Silbersack * may be used to endorse or promote products derived from this software 17c325962bSMike Silbersack * without specific prior written permission. 18c325962bSMike Silbersack * 19c325962bSMike Silbersack * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20c325962bSMike Silbersack * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21c325962bSMike Silbersack * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22c325962bSMike Silbersack * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23c325962bSMike Silbersack * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24c325962bSMike Silbersack * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25c325962bSMike Silbersack * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26c325962bSMike Silbersack * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27c325962bSMike Silbersack * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28c325962bSMike Silbersack * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29c325962bSMike Silbersack * SUCH DAMAGE. 30c325962bSMike Silbersack */ 31c325962bSMike Silbersack 32c325962bSMike Silbersack #ifndef _NETINET_TCP_SYNCACHE_H_ 33c325962bSMike Silbersack #define _NETINET_TCP_SYNCACHE_H_ 34c325962bSMike Silbersack #ifdef _KERNEL 35c325962bSMike Silbersack 36c325962bSMike Silbersack void syncache_init(void); 37bc29160dSMarko Zec #ifdef VIMAGE 38bc29160dSMarko Zec void syncache_destroy(void); 39bc29160dSMarko Zec #endif 409e644c23SMichael Tuexen void syncache_unreach(struct in_conninfo *, tcp_seq, uint16_t); 41c325962bSMike Silbersack int syncache_expand(struct in_conninfo *, struct tcpopt *, 429e644c23SMichael Tuexen struct tcphdr *, struct socket **, struct mbuf *, uint16_t); 438d5719aaSGleb Smirnoff struct socket * syncache_add(struct in_conninfo *, struct tcpopt *, 448d5719aaSGleb Smirnoff struct tcphdr *, struct inpcb *, struct socket *, struct mbuf *, 459e644c23SMichael Tuexen void *, void *, uint8_t, uint16_t); 469e644c23SMichael Tuexen void syncache_chkrst(struct in_conninfo *, struct tcphdr *, struct mbuf *, 479e644c23SMichael Tuexen uint16_t); 489e644c23SMichael Tuexen void syncache_badack(struct in_conninfo *, uint16_t); 49032677ceSGleb Smirnoff int syncache_pcblist(struct sysctl_req *); 50c325962bSMike Silbersack 51e0306e8bSJulian Elischer struct syncache { 52e0306e8bSJulian Elischer TAILQ_ENTRY(syncache) sc_hash; 53e0306e8bSJulian Elischer struct in_conninfo sc_inc; /* addresses */ 54e0306e8bSJulian Elischer int sc_rxttime; /* retransmit time */ 55e0306e8bSJulian Elischer u_int16_t sc_rxmits; /* retransmit counter */ 569e644c23SMichael Tuexen u_int16_t sc_port; /* remote UDP encaps port */ 57e0306e8bSJulian Elischer u_int32_t sc_tsreflect; /* timestamp to reflect */ 58e0306e8bSJulian Elischer u_int32_t sc_tsoff; /* ts offset w/ syncookies */ 59e0306e8bSJulian Elischer u_int32_t sc_flowlabel; /* IPv6 flowlabel */ 60e0306e8bSJulian Elischer tcp_seq sc_irs; /* seq from peer */ 61e0306e8bSJulian Elischer tcp_seq sc_iss; /* our ISS */ 62e0306e8bSJulian Elischer struct mbuf *sc_ipopts; /* source route */ 63e0306e8bSJulian Elischer u_int16_t sc_peer_mss; /* peer's MSS */ 64e0306e8bSJulian Elischer u_int16_t sc_wnd; /* advertised window */ 65cf8a49abSMichael Tuexen u_int8_t sc_ip_ttl; /* TTL / Hop Limit */ 66cf8a49abSMichael Tuexen u_int8_t sc_ip_tos; /* TOS / Traffic Class */ 67e0306e8bSJulian Elischer u_int8_t sc_requested_s_scale:4, 68e0306e8bSJulian Elischer sc_requested_r_scale:4; 69e0306e8bSJulian Elischer u_int16_t sc_flags; 70*1c6bb4c5SMichael Tuexen #if defined(TCP_OFFLOAD) 7109fe6320SNavdeep Parhar struct toedev *sc_tod; /* entry added by this TOE */ 7209fe6320SNavdeep Parhar void *sc_todctx; /* TOE driver context */ 73e0306e8bSJulian Elischer #endif 74e0306e8bSJulian Elischer struct label *sc_label; /* MAC label reference */ 75e0306e8bSJulian Elischer struct ucred *sc_cred; /* cred cache for jail checks */ 76281a0fd4SPatrick Kelsey void *sc_tfo_cookie; /* for TCP Fast Open response */ 77a5f44cd7SBjoern A. Zeeb void *sc_pspare; /* TCP_SIGNATURE */ 78d9a36286SBjoern A. Zeeb u_int32_t sc_spare[2]; /* UTO */ 79e0306e8bSJulian Elischer }; 80e0306e8bSJulian Elischer 815d045651SRobert Watson /* 825d045651SRobert Watson * Flags for the sc_flags field. 835d045651SRobert Watson */ 845d045651SRobert Watson #define SCF_NOOPT 0x01 /* no TCP options */ 855d045651SRobert Watson #define SCF_WINSCALE 0x02 /* negotiated window scaling */ 865d045651SRobert Watson #define SCF_TIMESTAMP 0x04 /* negotiated timestamps */ 875d045651SRobert Watson /* MSS is implicit */ 885d045651SRobert Watson #define SCF_UNREACH 0x10 /* icmp unreachable received */ 895d045651SRobert Watson #define SCF_SIGNATURE 0x20 /* send MD5 digests */ 905d045651SRobert Watson #define SCF_SACK 0x80 /* send SACK option */ 913f169c54SRichard Scheffenegger #define SCF_ECN_MASK 0x700 /* ECN codepoint mask */ 925d045651SRobert Watson #define SCF_ECN 0x100 /* send ECN setup packet */ 933f169c54SRichard Scheffenegger #define SCF_ACE_N 0x400 /* send ACE non-ECT setup */ 943f169c54SRichard Scheffenegger #define SCF_ACE_0 0x500 /* send ACE ECT0 setup */ 953f169c54SRichard Scheffenegger #define SCF_ACE_1 0x600 /* send ACE ECT1 setup */ 963f169c54SRichard Scheffenegger #define SCF_ACE_CE 0x700 /* send ACE CE setup */ 975d045651SRobert Watson 98e0306e8bSJulian Elischer struct syncache_head { 99e0306e8bSJulian Elischer struct mtx sch_mtx; 100e0306e8bSJulian Elischer TAILQ_HEAD(sch_head, syncache) sch_bucket; 101e0306e8bSJulian Elischer struct callout sch_timer; 102e0306e8bSJulian Elischer int sch_nextc; 103e0306e8bSJulian Elischer u_int sch_length; 10481d392a0SAndre Oppermann struct tcp_syncache *sch_sc; 105190d9abcSMichael Tuexen time_t sch_last_overflow; 10681d392a0SAndre Oppermann }; 10781d392a0SAndre Oppermann 10881d392a0SAndre Oppermann #define SYNCOOKIE_SECRET_SIZE 16 10981d392a0SAndre Oppermann #define SYNCOOKIE_LIFETIME 15 /* seconds */ 11081d392a0SAndre Oppermann 11181d392a0SAndre Oppermann struct syncookie_secret { 11281d392a0SAndre Oppermann volatile u_int oddeven; 11381d392a0SAndre Oppermann uint8_t key[2][SYNCOOKIE_SECRET_SIZE]; 11481d392a0SAndre Oppermann struct callout reseed; 11581d392a0SAndre Oppermann u_int lifetime; 116e0306e8bSJulian Elischer }; 117e0306e8bSJulian Elischer 1180b18fb07SJonathan T. Looney #define TCP_SYNCACHE_PAUSE_TIME SYNCOOKIE_LIFETIME 1190b18fb07SJonathan T. Looney #define TCP_SYNCACHE_MAX_BACKOFF 6 /* 16 minutes */ 1200b18fb07SJonathan T. Looney 121e0306e8bSJulian Elischer struct tcp_syncache { 122e0306e8bSJulian Elischer struct syncache_head *hashbase; 123e0306e8bSJulian Elischer uma_zone_t zone; 124e0306e8bSJulian Elischer u_int hashsize; 125e0306e8bSJulian Elischer u_int hashmask; 126e0306e8bSJulian Elischer u_int bucket_limit; 127e0306e8bSJulian Elischer u_int cache_limit; 128e0306e8bSJulian Elischer u_int rexmt_limit; 129388909a1SGleb Smirnoff uint32_t hash_secret; 130b3bc746cSMichael Tuexen #ifdef VIMAGE 13110c98295SAndre Oppermann struct vnet *vnet; 132b3bc746cSMichael Tuexen #endif 13381d392a0SAndre Oppermann struct syncookie_secret secret; 1340b18fb07SJonathan T. Looney struct mtx pause_mtx; 1350b18fb07SJonathan T. Looney struct callout pause_co; 1360b18fb07SJonathan T. Looney time_t pause_until; 1370b18fb07SJonathan T. Looney uint8_t pause_backoff; 1380b18fb07SJonathan T. Looney volatile bool paused; 139cb8d7c44SGleb Smirnoff bool see_other; 14081d392a0SAndre Oppermann }; 14181d392a0SAndre Oppermann 14281d392a0SAndre Oppermann /* Internal use for the syncookie functions. */ 14381d392a0SAndre Oppermann union syncookie { 14481d392a0SAndre Oppermann uint8_t cookie; 14581d392a0SAndre Oppermann struct { 14681d392a0SAndre Oppermann uint8_t odd_even:1, 14781d392a0SAndre Oppermann sack_ok:1, 14881d392a0SAndre Oppermann wscale_idx:3, 14981d392a0SAndre Oppermann mss_idx:3; 15081d392a0SAndre Oppermann } flags; 151e0306e8bSJulian Elischer }; 152e0306e8bSJulian Elischer 153c325962bSMike Silbersack #endif /* _KERNEL */ 154e0306e8bSJulian Elischer #endif /* !_NETINET_TCP_SYNCACHE_H_ */ 155