/*
* iflist.h
* Copyright (C) 2000 by the University of Southern California
* $Id: iflist.h,v 1.5 2005/08/25 18:58:04 johnh Exp $
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
*
* The copyright of this module includes the following
* linking-with-specific-other-licenses addition:
*
* In addition, as a special exception, the copyright holders of
* this module give you permission to combine (via static or
* dynamic linking) this module with free software programs or
* libraries that are released under the GNU LGPL and with code
* included in the standard release of ns-2 under the Apache 2.0
* license or under otherwise-compatible licenses with advertising
* requirements (or modified versions of such code, with unchanged
* license). You may copy and distribute such a system following the
* terms of the GNU GPL for this module and the licenses of the
* other code concerned, provided that you include the source code of
* that other code when and as the GNU GPL requires distribution of
* source code.
*
* Note that people who make modified versions of this module
* are not obligated to grant this special exception for their
* modified versions; it is their choice whether to do so. The GNU
* General Public License gives permission to release a modified
* version without this exception; this exception also makes it
* possible to release a modified version which carries forward this
* exception.
*
*/
/**********************************************************/
/* iflist.h : Chalermek Intanagonwiwat (USC/ISI) 06/25/99 */
/**********************************************************/
#ifndef ns_iflist_h
#define ns_iflist_h
#include <stdio.h>
#include "config.h"
#define INTF_INSERT(x,y) x->InsertFront((Agent_List **)&x, (Agent_List *)y)
#define INTF_REMOVE(x,y) y->Remove(x,y)
#define INTF_FIND(x,y) x->Find((Agent_List **)&x, y)
#define INTF_FREEALL(x) x->FreeAll((Agent_List **)&x)
#define INTF_UNION(x,y) x->Union((Agent_List **)&x, (Agent_List *)y)
#define AGENT_NEXT(x) x->next
#define FROM_NEXT(x) (From_List *)(x->next)
#define OUT_NEXT(x) (Out_List *)(x->next)
#define IN_NEXT(x) (In_List *)(x->next)
#define AGT_ADDR(x) x->agent_addr
#define NODE_ADDR(x) x->agent_addr.addr_
#define PORT(x) x->agent_addr.port_
#define RANK(x) ((From_List *)x)->rank
#define IS_SINK(x) ((From_List *)x)->is_sink
#define GRADIENT(x) ((Out_List *)x)->gradient
#define GRAD_TMOUT(x) ((Out_List *)x)->timeout
#define FROM_SLOT(x) ((Out_List *)x)->from
#define TO_SLOT(x) ((Out_List *)x)->to
#define NUM_DATA_SEND(x) ((Out_List *)x)->num_data_send
#define NUM_NEG_RECV(x) ((Out_List *)x)->num_neg_recv
#define NUM_POS_RECV(x) ((Out_List *)x)->num_pos_recv
#define NUM_POS_SEND(x) ((In_List *)x)->num_pos_send
#define NUM_NEG_SEND(x) ((In_List *)x)->num_neg_send
#define LAST_TS_NEW_SUB(x) ((In_List *)x)->last_ts_new_sub
#define NEW_SUB_RECV(x) ((In_List *)x)->new_sub_recv
#define NEW_ORG_RECV(x) ((In_List *)x)->new_org_recv
#define OLD_ORG_RECV(x) ((In_List *)x)->old_org_recv
#define TOTAL_NEW_SUB_RECV(x) ((In_List *)x)->total_new_sub_recv
#define TOTAL_NEW_ORG_RECV(x) ((In_List *)x)->total_new_org_recv
#define TOTAL_OLD_ORG_RECV(x) ((In_List *)x)->total_old_org_recv
#define TOTAL_RECV(x) ((In_List *)x)->total_received
#define PREV_RECV(x) ((In_List *)x)->prev_received
#define NUM_LOSS(x) ((In_List *)x)->num_loss
#define AVG_DELAY(x) ((In_List *)x)->avg_delay
#define VAR_DELAY(x) ((In_List *)x)->var_delay
#define WHERE_TO_GO(x) x->WhereToGo()
#define FIND_MAX_IN(x) x->FindMaxIn()
#define CAL_RANGE(x) x->CalRange()
#define NORMALIZE(x) x->NormalizeGradient()
class Agent_List;
class PrvCurPtr {
public:
Agent_List **prv;
Agent_List *cur;
};
class Agent_List {
public:
ns_addr_t agent_addr;
Agent_List *next;
Agent_List() {
next = NULL;
agent_addr.addr_=0;
agent_addr.port_=0;
}
virtual ~Agent_List () {}
void InsertFront(Agent_List **, Agent_List *);
void Remove(Agent_List **, Agent_List *);
PrvCurPtr Find(Agent_List **, ns_addr_t);
void FreeAll(Agent_List **);
void Union(Agent_List **, Agent_List *);
virtual void print();
};
class From_List : public Agent_List {
public:
int rank;
bool is_sink;
From_List() : Agent_List() { rank = 0; is_sink = false; }
virtual ~From_List () {}
};
class Out_List : public From_List {
public:
float gradient;
double timeout;
double from;
double to;
int num_data_send;
int num_neg_recv;
int num_pos_recv;
Out_List() : From_List() { gradient = 0; from=0.0; to=0.0; num_data_send=0;
timeout = 0.0; num_neg_recv = 0; num_pos_recv=0;}
virtual ~Out_List () {}
Out_List *WhereToGo();
void CalRange();
void NormalizeGradient();
};
class In_List : public Agent_List {
public:
double avg_delay;
double var_delay;
int total_received;
int prev_received;
int num_loss;
int num_neg_send;
int num_pos_send;
int total_new_org_recv;
int total_old_org_recv;
int total_new_sub_recv;
int new_org_recv; // for simple mode. New original sample counter.
int old_org_recv; // for simple mode. Old original sample counter.
int new_sub_recv; // for simple mode. New subsample counter.
double last_ts_new_sub; // Last timestamp in receiving a new subsample.
In_List() : Agent_List() {
avg_delay =0;
var_delay =0;
total_received=0;
prev_received =0;
num_loss =0;
num_neg_send = 0;
num_pos_send = 0;
total_new_org_recv=0;
total_old_org_recv=0;
total_new_sub_recv=0;
new_org_recv=0;
old_org_recv=0;
new_sub_recv=0;
last_ts_new_sub = -1.0;
}
virtual ~In_List () {}
In_List *FindMaxIn();
};
#endif
/* Example
void main () {
From_List *start, *cur;
start=NULL;
cur = new From_List;
cur->agent_addr.addr_ =1;
cur->agent_addr.port_ =1;
INTF_INSERT(start,cur);
cur = new From_List;
cur->agent_addr.addr_ = 3;
cur->agent_addr.port_ = 3;
INTF_INSERT(start,cur);
cur = new From_List;
cur->agent_addr.addr_ = 5;
cur->agent_addr.port_ = 5;
INTF_INSERT(start,cur);
start->print();
PrvCurPtr RetVal;
ns_addr_t fnd_addr;
fnd_addr.addr_ = 1;
fnd_addr.port_ = 1;
RetVal= INTF_FIND(start, fnd_addr);
INTF_REMOVE(RetVal.prv, RetVal.cur);
start->print();
}
*/
syntax highlighted by Code2HTML, v. 0.9.1