netmodel.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:8k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991,1993-1994 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the Computer Systems
  16.  *    Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#) $Header: /cvsroot/nsnam/nam-1/netmodel.h,v 1.43 2003/01/28 03:22:38 buchheim Exp $ (LBL)
  34.  */
  35. #ifndef nam_netmodel_h
  36. #define nam_netmodel_h
  37. #define NO_ANGLE 10
  38. // The ratio of node radius and mean edge length in the topology
  39. const float NODE_EDGE_RATIO = 0.15; 
  40. const int WIRELESS_SCALE = 66666;
  41. class Edge;
  42. class Node;
  43. class Lan;
  44. class Route;
  45. class Agent;
  46. struct TraceEvent;
  47. class Queue;
  48. class Animation;
  49. class View;
  50. class NetView;
  51. class PSView;
  52. class TestView;
  53. class Paint;
  54. class Packet;
  55. class Group;
  56. class Tag;
  57. struct BBox;
  58. class EditView;
  59. #include "trace.h"
  60. #include "monitor.h"
  61. /*
  62.  * The underlying model for a NetView.  We factor this state out of the
  63.  * NetView since we might have multiple displays of the same network
  64.  * (i.e., zoomed windows), as opposed to multiple interpretations 
  65.  * (i.e, strip charts).
  66.  */
  67. class NetModel : public TraceHandler {
  68. public:
  69.   NetModel(const char *animator);
  70.   virtual ~NetModel();
  71.   void render(View*);
  72.   void render(PSView*);
  73.   void render(TestView*);
  74.   void update(double, Animation*);
  75.   // Only redraw the part within a rectangle. 
  76.   // Follows Tk_CanvasEventuallyRedraw
  77.   virtual void render(EditView*, BBox &bb);
  78.   /* TraceHandler hooks */
  79.   virtual void update(double);
  80.   void reset(double);
  81.   void handle(const TraceEvent&, double now, int direction);
  82.   virtual void BoundingBox(BBox&);
  83.   void addView(NetView*);
  84.   //Animation* inside(double now, float px, float py) const;
  85.   Animation* inside(float px, float py) const;
  86.   int add_monitor(Animation *a);
  87.   void delete_monitor(Monitor *m);
  88.   void delete_monitor(Animation *a);
  89.   void delete_monitor(int monnum);
  90.   void check_monitors(Animation *a);
  91.   int monitor(double now, int monitor, char *result, int len);
  92.   Packet *newPacket(PacketAttr &pkt, Edge *e, double time);
  93.   void color_subtrees();
  94.   void set_wireless();
  95.   void selectPkt(int , int , int );
  96.   
  97.   int save_layout(const char *filename);
  98.   // Tagging methods
  99.   int tagCmd(View *v, int argc, char **argv,
  100.   char *newTag, char *cmdName);
  101.   Animation* findClosest(float dx, float dy, double halo);
  102.   void tagObject(Tag *tag, Animation *);
  103.   int tagArea(BBox &bb, Tag *tag, int bEnclosed);
  104.   int deleteTagCmd(char *tagName, char *tagDel);
  105.   int add_tag(Tag *tag);
  106.   void delete_tag(const char *tn);
  107.   Tag* lookupTag(const char *tn);
  108.   inline double now() { return now_; }
  109.   // If editing is enabled, these functions must be public
  110.   virtual void moveNode(Node *n);
  111.   virtual void recalc() {}
  112.   void remove_view(View *v);
  113.   void add_drop(const TraceEvent &, double now, int direction);
  114.   // Create Nodes and Edges(One Way Links) and insert them into this 
  115.   // NetModel's list of drawables
  116. //  Node * addNode(int argc, const char *const *argv);
  117.   Node * addNode(const TraceEvent &e);
  118.   Edge * addEdge(int argc, const char *const *argv);
  119.   Edge * addEdge(int src_id, int dst_id, const TraceEvent &e);
  120.   Node* lookupNode(int nn) const;
  121.   Edge * lookupEdge(int source, int destination) const;
  122.   
  123.   virtual void placeAgent(Agent* a, Node* src) const;
  124.   void hideAgentLinks();
  125.   virtual void relayout(){};
  126. protected:
  127.   virtual void scale_estimate();
  128.   int traverseNodeConnections(Node* n);
  129.   void move(double& x, double& y, double angle, double d) const;
  130.   virtual void placeEverything();
  131.   void placeEdgeByAngle(Edge* e, Node* src) const;
  132.   virtual void placeEdge(Edge* e, Node* src) const;
  133.   int addr2id(int addr) const;
  134.   int addAddress(int id, int addr) const;
  135.   void removeNode(Node *n);
  136.   Agent* lookupAgent(int id) const;
  137.   Lan* lookupLan(int nn) const;
  138.   Packet *lookupPacket(int src, int dst, int id) const;
  139.   int command(int argc, const char*const* argv);
  140. #define EDGE_HASH_SIZE 256
  141.   inline int ehash(int src, int dst) const {
  142.     return (src ^ (dst << 4)) & (EDGE_HASH_SIZE-1);
  143.   }
  144.   struct EdgeHashNode {
  145.     EdgeHashNode* next;
  146.     int src;
  147.     int dst;
  148.     Edge* edge;
  149.     Queue* queue;
  150.   };
  151.   Tcl_HashTable *addrHash_;
  152.   EdgeHashNode * lookupEdgeHashNode(int source, int destination) const;
  153.   void enterEdge(Edge* e);
  154.   void removeEdge(Edge* e);
  155.   void saveState(double);
  156.   Animation *drawables_;  // List of objects to draw
  157.   Animation *animations_; // List of objects to draw
  158.   Queue *queues_;
  159.   View* views_;
  160.   Node* nodes_;
  161.   Lan* lans_;
  162.   double now_;
  163.   double wirelessNodeSize_;
  164.   double packet_size_;  // Initially set to 2.5
  165.                         // Which is half of the default node size of 10.0
  166.                         // default node size is defined in parser.cc
  167.                         
  168.   double nymin_, nymax_, node_size_, node_sizefac_; /*XXX*/
  169.   int mon_count_;
  170.   Monitor *monitors_;
  171.   EdgeHashNode* hashtab_[EDGE_HASH_SIZE];
  172.   int nclass_;    // no. of classes (colors)
  173.   int wireless_ ;         // in a wireless network ?
  174.   int resetf_ ;
  175.   int* paint_;
  176.   int* oldpaint_;
  177.   int paintMask_;    // Mask to convert flow id to color id
  178.   //selected filter value
  179.   char selectedTraffic_[PTYPELEN] ;
  180.   int selectedSrc_ ;
  181.   int selectedDst_ ;
  182.   int selectedFid_ ;
  183.   char hideTraffic_[PTYPELEN] ;
  184.   int hideSrc_ ;
  185.   int hideDst_ ;
  186.   int hideFid_ ;
  187.   char colorTraffic_[PTYPELEN] ;
  188.   int colorSrc_ ;
  189.   int colorDst_ ;
  190.   int colorFid_ ;
  191.   int showData_ ;
  192.   int showRouting_ ;
  193.   int showMac_ ;
  194.   int selectedColor_ ;
  195.   // Map group address to group id
  196.   Tcl_HashTable *grpHash_;
  197.   int nGroup_;
  198.   int add_group(Group *grp);
  199.   Group* lookupGroup(unsigned int addr);
  200.   // Map tag name (string) to tag id
  201.   Tcl_HashTable *tagHash_;
  202.   int nTag_;
  203.   // Map object class name to class id
  204.   Tcl_HashTable *objnameHash_;
  205.   int registerObjName(const char*, int);
  206.   int lookupObjname(const char *);
  207.   Animation* lookupTagOrID(const char *);
  208.   virtual void relayoutNode(Node *n) {}
  209. private:
  210.   TraceEvent traceevent_;  // Used for parsing node creation events which   
  211.   ParseTable parsetable_;  // come from netModel.tcl.  I wanted to use
  212.                              // the parsetable from Trace.h but cannot 
  213.                              // figure out how to access it. Data from
  214.                              // parsed lines is put into trace_event_.
  215.   double bcast_duration_;  // how long broadcast packets are visible
  216.   double bcast_radius_;    // radius of broadcast packets
  217. };
  218. #endif