/* -*-	Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
/*
 * Copyright (c) 1991-2001 Regents of the University of California.
 * 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. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by the Computer Systems
 *	Engineering Group at Lawrence Berkeley Laboratory.
 * 4. Neither the name of the University nor of the Laboratory may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
 *
 * @(#) $Header: /mvalla/tcp-w-nr.h,v 1.0 2001/09/17 15:14:54 mvalla Exp mvalla $ (LBL)
 */

#ifndef tcp_f_h
#define tcp_f_h

#include "tcp.h"
#include "flags.h"
#include "scoreboard.h"
#include "scoreboard-rq.h"
#include "random.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#define TRUE 1
#define FALSE 0
#define RECOVER_DUPACK 1
#define RECOVER_TIMEOUT 2
#define RECOVER_QUENCH 3
/* these are bits for how to change the cwnd and ssthresh values */
#define CLOSE_FASTER	0x00000400

/* TCP Westwood New Reno */


class FusionTcpAgent : public TcpAgent {
public:
	FusionTcpAgent();
//	Sack1TcpAgent();
	virtual void recv(Packet *pkt, Handler*);
	virtual void dupack_action();
	virtual void timeout (int tno);
        
        virtual void opencwnd();
        virtual void recv_newack_helper(Packet*);

	virtual ~FusionTcpAgent();
	int is_sacked(hdr_tcp *tcph, int seqlo, int seqhi);
	void reset();
	virtual void partial_ack_action();
	virtual void send_much(int force, int reason, int maxburst);

	/* these where originally in class TcpAgent (file: tcp.h) */
	virtual void slowdown(int how);
	virtual void newack(Packet* pkt);
	
	virtual int  delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);

protected:
	double lastackno_;  /* Last ACK number */
	double lastackrx_;  /* Time last ACK was received */ 
	double fr_alpha_;   /* exponential averaging coefficient */
	int filter_type_;   /* exponential filter type */
	double tau_;        /* time constant used in filter 3 */
	double west_type_;
	double qest_;
	double total_time_;
	double total_size_;
	double fr_amin_;
	double fr_amax_;
	double fr_prev_;
	int interp_type_;
//used to overcome the effect of congestion on the ACK path
	double last_ts_;
	double last_echoed_ts_;
	double current_ts_;
	double current_echoed_ts_;
	int last_seq_;
	double last_cwnd_;
	int openadd_;
        
	double rtt_estimate;

   	double reno_cwnd;
  	int count;
   	
   	double RTTmax;
  	double Rmax;
   	double dwnd_;
        
 	double Dmin;
 	double Sfactor;

	// sack
	u_char timeout_;
	u_char fastrecov_;
	int pipe_;
	int partial_ack_;
	int next_pkt_;
	int firstpartial_;
	ScoreBoard* scb_;
	static const int SBSIZE=64;

	/* these where originally in class TcpAgent (file: tcp.h) */
 	int mss_;       	/* Maximum Segment Size - MGM+CC 31/08/2000 */
	double current_BE_;    /* Current Bandwidth estimation */
	double current_RE_;
	double last_BE_sample_;/* Last sample used to compute BWE */
	double last_RE_sample_;
	int unaccounted_;       /* unaccounted ACKs already received */
	double fr_a_;           /* bandwidth reduction factor */
	double min_rtt_estimate;/* smaller recorded RTT estimate */
	TracedInt myseqno_;     /* my own exportable copy of seqno */
	
	virtual void bwe_computation(Packet *pkt);
       	
       // virtual void recv_newack_helper(Packet*);
       // virtual void opencwnd();
};


#endif /* tcp_f_h */
