/*
 *  Copyright (c) 2018, Sam Kumar <samkumar@cs.berkeley.edu>
 *  Copyright (c) 2018, University of California, Berkeley
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *  1. Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *  3. Neither the name of the copyright holder nor the
 *     names of its contributors may be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * samkumar: I created this file to store many of the constants shared by the
 * various files in the FreeBSD protocol logic. The original variables were
 * often virtualized ("V_"-prefixed) variables. I've changed the definitions to
 * be enumerations rather than globals, to save some memory. These variables
 * often serve to enable, disable, or configure certain TCP-related features.
 */

#ifndef TCPLP_TCP_CONST_H_
#define TCPLP_TCP_CONST_H_

#include "../tcplp.h"

#include "tcp_var.h"
#include "tcp_timer.h"

/*
 * samkumar: these are TCPlp-specific constants that I added. They were not
 * present in the FreeBSD-derived code.
 */

#define FRAMES_PER_SEG 5
#define FRAMECAP_6LOWPAN (122 - 11 - 5)
#define IP6HDR_SIZE (2 + 1 + 1 + 16 + 16) // IPHC header (2) + Next header (1) + Hop count (1) + Dest. addr (16) + Src. addr (16)
#define MSS_6LOWPAN ((FRAMES_PER_SEG * FRAMECAP_6LOWPAN) - IP6HDR_SIZE - sizeof(struct tcphdr))

/*
 * samkumar: The remaining constants were present in the original FreeBSD code,
 * but I set their values.
 */

#define hz 1000 // number of ticks per second, assuming millisecond ticks

enum tcp_input_consts {
	tcp_keepcnt = TCPTV_KEEPCNT,
	tcp_fast_finwait2_recycle = 0,
	tcprexmtthresh = 3,
	V_drop_synfin = 0,
	V_tcp_do_ecn = 1,
	V_tcp_ecn_maxretries = 3,
	V_tcp_do_rfc3042 = 1,
	V_path_mtu_discovery = 0,
	V_tcp_delack_enabled = 1,
	V_tcp_initcwnd_segments = 0,
	V_tcp_do_rfc3390 = 0,
	V_tcp_abc_l_var = 2 // this is what was in the original tcp_input.c
};

enum tcp_subr_consts {
	tcp_delacktime = TCPTV_DELACK,
	tcp_keepinit = TCPTV_KEEP_INIT,
	tcp_keepidle = TCPTV_KEEP_IDLE,
	tcp_keepintvl = TCPTV_KEEPINTVL,
	tcp_maxpersistidle = TCPTV_KEEP_IDLE,
	tcp_msl = TCPTV_MSL,
	tcp_rexmit_slop = TCPTV_CPU_VAR,
	tcp_finwait2_timeout = TCPTV_FINWAIT2_TIMEOUT,

	V_tcp_do_rfc1323 = 1,
	V_tcp_v6mssdflt = MSS_6LOWPAN,
	/* Normally, this is used to prevent DoS attacks by sending tiny MSS values in the options. */
	V_tcp_minmss = TCP_MAXOLEN + 1, // Must have enough space for TCP options, and one more byte for data. Default is 216.
	V_tcp_do_sack = 1
};

enum tcp_timer_consts {
//	V_tcp_v6pmtud_blackhole_mss = FRAMECAP_6LOWPAN - sizeof(struct ip6_hdr) - sizeof(struct tcphdr), // Doesn't matter unless blackhole_detect is 1.
	tcp_rexmit_drop_options = 0, // drop options after a few retransmits
	always_keepalive = 1,
};

/*
 * Force a time value to be in a certain range.
 */
#define	TCPT_RANGESET(tv, value, tvmin, tvmax) do { \
	(tv) = (value) + tcp_rexmit_slop; \
	if ((uint64_t)(tv) < (uint64_t)(tvmin)) \
		(tv) = (tvmin); \
	if ((uint64_t)(tv) > (uint64_t)(tvmax)) \
		(tv) = (tvmax); \
} while(0)

#endif
