00001 /* 00002 * Copyright (c) 2006 Regents of the SIGNET lab, University of Padova. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the University of Padova (SIGNET lab) nor the 00014 * names of its contributors may be used to endorse or promote products 00015 * derived from this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00018 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00019 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00020 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 00021 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00022 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00023 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 00024 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 00025 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 00026 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 00027 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00036 #ifndef _ROUTINGMETRIC_ 00037 #define _ROUTINGMETRIC_ 00038 00039 #include <packet.h> 00040 00041 enum Reachability 00042 { 00043 REACHABLE, 00044 UNREACHABLE, 00045 MAYBE 00046 }; 00047 00048 class Metric; 00049 00050 #define METRIC_ALLOC_PARAM_PER_TIME 1 00051 00052 class MetricList 00053 { 00054 public: 00055 MetricList(); 00056 virtual ~MetricList(); 00057 void addMetric(Metric *m); 00058 void empty(); 00059 int length(); 00060 Metric *getMetric(int i); 00061 Metric *getMetric(const char *name); 00062 protected: 00063 void addNewMetric(Metric *m); 00064 int find(const char *name); 00065 Metric **list_; 00066 int listLength_; 00067 int metricCount_; 00068 }; 00069 00070 class Metric : public TclObject 00071 { 00072 public: 00073 Metric(const char* name); 00074 virtual ~Metric(); 00075 virtual double value(Packet *p) = 0; 00076 const char *getName(); 00077 //virtual Metric *copy() = 0; 00094 virtual int command(int argc, const char*const* argv); 00095 void insertParam(MetricList *m); 00096 void clearParam(); 00097 private: 00098 const char *name_; 00099 MetricList list_; 00100 }; 00101 00102 #define ROUTEINFO_DEFAULT_REACHABILITY UNREACHABLE 00103 #define ROUTEINFO_ALLOC_CHILD_PER_TIME 1 00104 00111 class RouteInfo 00112 { 00113 public: 00114 RouteInfo(); 00115 virtual ~RouteInfo(); 00116 void addChild(RouteInfo *c); 00117 int getNChild(); 00118 RouteInfo *getChild(int i); 00119 void addFather(RouteInfo *f); 00120 RouteInfo *getFather(); 00121 void setModuleId(int id); 00122 int getModuleId(); 00123 void addMetric(Metric *m); 00124 Metric *getMetric(const char *m); 00125 Metric *getMetric(int i); 00126 int getNMetric(); 00127 Reachability reachability(); 00128 void setReachability(Reachability a); 00129 protected: 00130 RouteInfo *father_; 00131 RouteInfo **child_; 00132 int nChild_; 00133 int lengthChild_; 00140 Reachability reachability_; 00144 MetricList list_; 00145 int moduleId_; 00146 }; 00147 00148 00149 00150 #endif 00151 00152