/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */ // // Copyright (c) 1999 by the University of Southern California // All rights reserved. // // Permission to use, copy, modify, and distribute this software and its // documentation in source and binary forms for non-commercial purposes // and without fee is hereby granted, provided that the above copyright // notice appear in all copies and that both the copyright notice and // this permission notice appear in supporting documentation. and that // any documentation, advertising materials, and other materials related // to such distribution and use acknowledge that the software was // developed by the University of Southern California, Information // Sciences Institute. The name of the University may not be used to // endorse or promote products derived from this software without // specific prior written permission. // // THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations about // the suitability of this software for any purpose. THIS SOFTWARE IS // PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // Other copyrights might apply to parts of this software and are so // noted when applicable. // // Incorporating Polly's web traffic module into the PagePool framework // // XXX This has nothing to do with the HttpApp classes. Because we are // only interested in traffic pattern here, we do not want to be bothered // with the burden of transmitting HTTP headers, etc. // // $Header: /nfs/jade/vint/CVSROOT/ns-2/webcache/webtraf.h,v 1.12 2002/03/21 23:21:11 ddutta Exp $ #ifndef ns_webtraf_h #define ns_webtraf_h #include "ranvar.h" #include "random.h" #include "timer-handler.h" #include "lib/bsd-list.h" #include "node.h" #include "tcp.h" #include "tcp-sink.h" #include "pagepool.h" //sale #include "rcp.h" #include "rcp-tap.h" //end sale const int WEBTRAF_DEFAULT_OBJ_PER_PAGE = 1; class WebTrafPool; class WebTrafSession : public TimerHandler { public: WebTrafSession(WebTrafPool *mgr, Node *src, int np, int id, int ftcp_, int recycle_p); virtual ~WebTrafSession(); // Queried by individual pages/objects inline RandomVariable*& interPage() { return rvInterPage_; } inline RandomVariable*& pageSize() { return rvPageSize_; } inline RandomVariable*& interObj() { return rvInterObj_; } inline RandomVariable*& objSize() { return rvObjSize_; } void donePage(void* ClntData); void launchReq(void* ClntData, int obj, int size); //sale void launchReqRcp(void* ClntData, int obj, int size); //end sale inline int id() const { return id_; } inline WebTrafPool* mgr() { return mgr_; } inline void set_interPageOption(int option) { interPageOption_ = option; } static int LASTPAGE_; //sale - it was private - I moved it here Node* src_; // One Web client (source of request) per session //end sale private: virtual void expire(Event *e = 0); virtual void handle(Event *e); RandomVariable *rvInterPage_, *rvPageSize_, *rvInterObj_, *rvObjSize_; WebTrafPool* mgr_; int nPage_, curPage_, donePage_; int id_, interPageOption_; // fulltcp support int fulltcp_; // Reuse of page level attributes support int recycle_page_; }; class WebTrafPool : public PagePool { public: WebTrafPool(); virtual ~WebTrafPool(); inline Node* picksrc() { int n = int(floor(Random::uniform(0, nClient_))); assert((n >= 0) && (n < nClient_)); return client_[n]; } inline Node* pickdst() { int n = int(floor(Random::uniform(0, nSrc_))); assert((n >= 0) && (n < nSrc_)); return server_[n]; } inline void doneSession(int idx) { assert((idx>=0) && (idxlh_first; if (e == NULL) return NULL; Agent *a = e->agt_; LIST_REMOVE(e, link); delete e; return a; } int nTcp_, nSink_; AgentList tcpPool_; /* TCP agent pool */ AgentList sinkPool_; /* TCP sink pool */ //sale int nActTcp_, nActRcp_; /* Number of active RCP and TCP flows */ int nRcp_, nRcpSink_; AgentList rcpPool_; /* RCP agent pool */ AgentList rcpsinkPool_; /* RCP sink pool */ //end sale // Helper methods inline int lookup_rv(RandomVariable*& rv, const char* name) { if (rv != NULL) Tcl::instance().evalf("delete %s", rv->name()); rv = (RandomVariable*)lookup_obj(name); return rv ? (TCL_OK) : (TCL_ERROR); } int debug_; // fulltcp support int fulltcp_; // Reuse of page level attributes support int recycle_page_; }; #endif // ns_webtraf_h