RSVP.h

Go to the documentation of this file.
00001 //
00002 // (C) 2005 Vojtech Janota
00003 //
00004 // This library is free software, you can redistribute it
00005 // and/or modify
00006 // it under  the terms of the GNU Lesser General Public License
00007 // as published by the Free Software Foundation;
00008 // either version 2 of the License, or any later version.
00009 // The library is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00012 // See the GNU Lesser General Public License for more details.
00013 //
00014 
00015 #ifndef __INET_RSVP_H
00016 #define __INET_RSVP_H
00017 
00018 #include <vector>
00019 #include <omnetpp.h>
00020 
00021 #include "IScriptable.h"
00022 #include "IntServ.h"
00023 #include "RSVPPathMsg.h"
00024 #include "RSVPResvMsg.h"
00025 #include "RSVPHelloMsg.h"
00026 #include "SignallingMsg_m.h"
00027 #include "IRSVPClassifier.h"
00028 #include "NotificationBoard.h"
00029 
00030 class SimpleClassifier;
00031 class IRoutingTable;
00032 class IInterfaceTable;
00033 class TED;
00034 class LIBTable;
00035 
00036 
00040 class INET_API RSVP : public cSimpleModule, public IScriptable
00041 {
00042   protected:
00043 
00044     struct traffic_path_t
00045     {
00046         SenderTemplateObj_t sender;
00047         SenderTspecObj_t tspec;
00048 
00049         EroVector ERO;
00050         simtime_t max_delay;
00051 
00052         int owner;
00053         bool permanent;
00054         int color;
00055     };
00056 
00057     struct traffic_session_t
00058     {
00059         SessionObj_t sobj;
00060 
00061         std::vector<traffic_path_t> paths;
00062     };
00063 
00064     std::vector<traffic_session_t> traffic;
00065 
00069     struct PathStateBlock_t
00070     {
00071         // SESSION object structure
00072         SessionObj_t Session_Object;
00073 
00074         // SENDER_TEMPLATE structure
00075         SenderTemplateObj_t Sender_Template_Object;
00076 
00077         // SENDER_TSPEC structure
00078         SenderTspecObj_t Sender_Tspec_Object;
00079 
00080         // Previous Hop IP address from PHOP object
00081         IPAddress Previous_Hop_Address;
00082 
00083         // Logical Interface Handle from PHOP object
00084         //IPAddress LIH;
00085 
00086         // List of outgoing Interfaces for this (sender, destination) single entry for unicast case
00087         IPAddress OutInterface;
00088 
00089         // this must be part of PSB to allow refreshing
00090         EroVector ERO;
00091 
00092         // PSB unique identifier
00093         int id;
00094 
00095         // XXX nam colors
00096         int color;
00097 
00098         // timer/timeout routines
00099         PsbTimerMsg *timerMsg;
00100         PsbTimeoutMsg *timeoutMsg;
00101 
00102         // handler module
00103         int handler;
00104     };
00105 
00106     typedef std::vector<PathStateBlock_t> PSBVector;
00107 
00111     struct ResvStateBlock_t
00112     {
00113         // SESSION object structure
00114         SessionObj_t Session_Object;
00115 
00116         // Next Hop IP address from PHOP object
00117         IPAddress Next_Hop_Address;
00118 
00119         // Outgoing Interface on which reservation is to be made or has been made
00120         IPAddress OI;
00121 
00122         // Flows description
00123         FlowDescriptorVector FlowDescriptor;
00124 
00125         // input labels we have currently installed in the database
00126         std::vector<int> inLabelVector;
00127 
00128         //we always use shared explicit
00129         //int style;
00130 
00131         // FLOWSPEC structure
00132         FlowSpecObj_t Flowspec_Object;
00133 
00134         // RSB unique identifier
00135         int id;
00136 
00137         // timer/timeout routines
00138         RsbRefreshTimerMsg *refreshTimerMsg;
00139         RsbCommitTimerMsg *commitTimerMsg;
00140         RsbTimeoutMsg *timeoutMsg;
00141     };
00142 
00143     typedef std::vector<ResvStateBlock_t> RSBVector;
00144 
00148     struct HelloState_t
00149     {
00150         IPAddress peer;
00151 
00152         int srcInstance;
00153         int dstInstance;
00154 
00155         HelloTimerMsg *timer;
00156         HelloTimeoutMsg *timeout;
00157 
00158         // next hello message sent should include following flags
00159         bool request;
00160         bool ack;
00161 
00162         // up/down status of this peer (true if we're getting regular hellos)
00163         bool ok;
00164     };
00165 
00166     typedef std::vector<HelloState_t> HelloVector;
00167 
00168     simtime_t helloInterval;
00169     simtime_t helloTimeout;
00170     simtime_t retryInterval;
00171 
00172   protected:
00173     TED *tedmod;
00174     IRoutingTable *rt;
00175     IInterfaceTable *ift;
00176     LIBTable *lt;
00177     NotificationBoard *nb;
00178 
00179     IRSVPClassifier *rpct;
00180 
00181     int maxPsbId;
00182     int maxRsbId;
00183 
00184     int maxSrcInstance;
00185 
00186     IPAddress routerId;
00187 
00188     PSBVector PSBList;
00189     RSBVector RSBList;
00190     HelloVector HelloList;
00191 
00192   protected:
00193     virtual void processSignallingMessage(SignallingMsg *msg);
00194     virtual void processPSB_TIMER(PsbTimerMsg *msg);
00195     virtual void processPSB_TIMEOUT(PsbTimeoutMsg* msg);
00196     virtual void processRSB_REFRESH_TIMER(RsbRefreshTimerMsg *msg);
00197     virtual void processRSB_COMMIT_TIMER(RsbCommitTimerMsg *msg);
00198     virtual void processRSB_TIMEOUT(RsbTimeoutMsg* msg);
00199     virtual void processHELLO_TIMER(HelloTimerMsg* msg);
00200     virtual void processHELLO_TIMEOUT(HelloTimeoutMsg* msg);
00201     virtual void processPATH_NOTIFY(PathNotifyMsg* msg);
00202     virtual void processRSVPMessage(RSVPMessage* msg);
00203     virtual void processHelloMsg(RSVPHelloMsg* msg);
00204     virtual void processPathMsg(RSVPPathMsg* msg);
00205     virtual void processResvMsg(RSVPResvMsg* msg);
00206     virtual void processPathTearMsg(RSVPPathTear* msg);
00207     virtual void processPathErrMsg(RSVPPathError* msg);
00208 
00209     virtual PathStateBlock_t* createPSB(RSVPPathMsg *msg);
00210     virtual PathStateBlock_t* createIngressPSB(const traffic_session_t& session, const traffic_path_t& path);
00211     virtual void removePSB(PathStateBlock_t *psb);
00212     virtual ResvStateBlock_t* createRSB(RSVPResvMsg *msg);
00213     virtual ResvStateBlock_t* createEgressRSB(PathStateBlock_t *psb);
00214     virtual void updateRSB(ResvStateBlock_t* rsb, RSVPResvMsg *msg);
00215     virtual void removeRSB(ResvStateBlock_t *rsb);
00216     virtual void removeRsbFilter(ResvStateBlock_t *rsb, unsigned int index);
00217 
00218     virtual void refreshPath(PathStateBlock_t *psbEle);
00219     virtual void refreshResv(ResvStateBlock_t *rsbEle);
00220     virtual void refreshResv(ResvStateBlock_t *rsbEle, IPAddress PHOP);
00221     virtual void commitResv(ResvStateBlock_t *rsb);
00222 
00223     virtual void scheduleRefreshTimer(PathStateBlock_t *psbEle, simtime_t delay);
00224     virtual void scheduleTimeout(PathStateBlock_t *psbEle);
00225     virtual void scheduleRefreshTimer(ResvStateBlock_t *rsbEle, simtime_t delay);
00226     virtual void scheduleCommitTimer(ResvStateBlock_t *rsbEle);
00227     virtual void scheduleTimeout(ResvStateBlock_t *rsbEle);
00228 
00229     virtual void sendPathErrorMessage(PathStateBlock_t *psb, int errCode);
00230     virtual void sendPathErrorMessage(SessionObj_t session, SenderTemplateObj_t sender, SenderTspecObj_t tspec, IPAddress nextHop, int errCode);
00231     virtual void sendPathTearMessage(IPAddress peerIP, const SessionObj_t& session, const SenderTemplateObj_t& sender, IPAddress LIH, IPAddress NHOP, bool force);
00232     virtual void sendPathNotify(int handler, const SessionObj_t& session, const SenderTemplateObj_t& sender, int status, simtime_t delay);
00233 
00234     virtual void setupHello();
00235     virtual void startHello(IPAddress peer, simtime_t delay);
00236 
00237     virtual void recoveryEvent(IPAddress peer);
00238 
00239     virtual bool allocateResource(IPAddress OI, const SessionObj_t& session, double bandwidth);
00240     virtual void preempt(IPAddress OI, int priority, double bandwidth);
00241     virtual bool doCACCheck(const SessionObj_t& session, const SenderTspecObj_t& tspec, IPAddress OI);
00242     virtual void announceLinkChange(int tedlinkindex);
00243 
00244     virtual void sendToIP(cMessage *msg, IPAddress destAddr);
00245 
00246     virtual bool evalNextHopInterface(IPAddress destAddr, const EroVector& ERO, IPAddress& OI);
00247 
00248     virtual PathStateBlock_t* findPSB(const SessionObj_t& session, const SenderTemplateObj_t& sender);
00249     virtual ResvStateBlock_t* findRSB(const SessionObj_t& session, const SenderTemplateObj_t& sender, unsigned int& index);
00250 
00251     virtual PathStateBlock_t* findPsbById(int id);
00252     virtual ResvStateBlock_t* findRsbById(int id);
00253 
00254     std::vector<traffic_session_t>::iterator findSession(const SessionObj_t& session);
00255     std::vector<traffic_path_t>::iterator findPath(traffic_session_t *session, const SenderTemplateObj_t &sender);
00256 
00257     virtual HelloState_t* findHello(IPAddress peer);
00258 
00259     virtual void print(RSVPPathMsg *p);
00260     virtual void print(RSVPResvMsg *r);
00261 
00262     virtual void readTrafficFromXML(const cXMLElement *traffic);
00263     virtual void readTrafficSessionFromXML(const cXMLElement *session);
00264     virtual EroVector readTrafficRouteFromXML(const cXMLElement *route);
00265 
00266     virtual void createPath(const SessionObj_t& session, const SenderTemplateObj_t& sender);
00267 
00268     virtual void pathProblem(PathStateBlock_t *psb);
00269 
00270     virtual void addSession(const cXMLElement& node);
00271     virtual void delSession(const cXMLElement& node);
00272 
00273   protected:
00274 
00275     friend class SimpleClassifier;
00276 
00277     virtual int getInLabel(const SessionObj_t& session, const SenderTemplateObj_t& sender);
00278 
00279   public:
00280     RSVP();
00281     virtual ~RSVP();
00282 
00283   protected:
00284     virtual int numInitStages() const  {return 5;}
00285     virtual void initialize(int stage);
00286     virtual void handleMessage(cMessage *msg);
00287 
00288     // IScriptable implementation
00289     virtual void processCommand(const cXMLElement& node);
00290 
00291 };
00292 
00293 bool operator==(const SessionObj_t& a, const SessionObj_t& b);
00294 bool operator!=(const SessionObj_t& a, const SessionObj_t& b);
00295 
00296 bool operator==(const FilterSpecObj_t& a, const FilterSpecObj_t& b);
00297 bool operator!=(const FilterSpecObj_t& a, const FilterSpecObj_t& b);
00298 
00299 bool operator==(const SenderTemplateObj_t& a, const SenderTemplateObj_t& b);
00300 bool operator!=(const SenderTemplateObj_t& a, const SenderTemplateObj_t& b);
00301 
00302 std::ostream& operator<<(std::ostream& os, const SessionObj_t& a);
00303 std::ostream& operator<<(std::ostream& os, const SenderTemplateObj_t& a);
00304 std::ostream& operator<<(std::ostream& os, const FlowSpecObj_t& a);
00305 
00306 #endif
00307 
00308