INET Framework for OMNeT++/OMNEST
IGMP.h
Go to the documentation of this file.
00001 // IGMP.cc
00002 // Petr Matelesko
00003 // 5. 5. 2010
00004 
00005 #ifndef __IGMP_H_
00006 #define __IGMP_H_
00007 
00008 #include <vector>
00009 #include <string.h>
00010 #include <omnetpp.h>
00011 #include "INETDefs.h"
00012 #include "IPAddress.h"
00013 #include "IPDatagram.h"
00014 #include "IPControlInfo.h"
00015 #include "IGMPMessage_m.h"
00016 #include "IGMPTimer_m.h"
00017 #include "IInterfaceTable.h"
00018 #include "InterfaceTableAccess.h"
00019 
00020 class IPv4InterfaceData;
00021 
00025 struct IGMPGroupMembership
00026 {
00027     IPAddress multicastGroup;           // adresa mulicastove skupiny
00028     IPAddress lastReporter;             // adresa Last Reporter
00029     // ukazatele na casovace
00030     IGMPTimer *groupMembership;
00031     IGMPTimer *lastMember;
00032 };
00033 
00037 struct IGMPInterface
00038 {
00039     int intID;                          // ID rozhrani
00040     InterfaceEntry *ie;                 // ukazatel na popis rozhrani InterfaceEntry
00041     bool querier;                       // querier x non-querier
00042     IPAddress ipQuerier;                // IP adresa Querier routeru
00043     
00044     std::vector<IGMPGroupMembership>    groupMembershipTable;
00045 
00046     /* ukazatele na casovace */
00047     IGMPTimer *initGeneralQuery;
00048     IGMPTimer *generalQuery;
00049     IGMPTimer *otherQuerierPresent;
00050 };
00051 
00052 class IGMP : public cSimpleModule
00053 {
00054   private:
00055 
00056     std::vector<IGMPInterface>  igmpIft;        
00059     int ROBUSTNESS_VARIABLE;            // default: 2
00060     int QUERY_INTERVAL;                 // default: 125 s
00061     int QUERY_RESPONSE_INTERVAL;        // default: 100 = 10 s
00062     int QUERY_RESPONSE_INTERVAL_SEC;
00063     int LAST_MEMBER_QUERY_INTERVAL;     // default: 10 = 1 s
00064     int LAST_MEMBER_QUERY_INTERVAL_SEC;
00065     int LAST_MEMBER_QUERY_COUNT;
00066     int LAST_MEMBER_QUERIER_INETERVAL;
00067     int GROUP_MEMBERSHIP_INTERVAL;
00068     int OTHER_QUERIER_PRESENT_INTERVAL;
00069 
00070     // Startup Query Count
00071     // Pocet poslanych zprav General Query pri inicializaci routeru
00072     int STARTUP_QUERY_COUNT;
00073     
00074     // Startup Query Interval
00075     // Interval mezi zpravami General Query pri inicializaci routeru
00076     int STARTUP_QUERY_INTERVAL;
00077 
00078     // tabulka rozhrani
00079     IInterfaceTable *ift;
00080     int getIGMPInterfaceByID(int interfaceID);
00081 
00082 
00083     // modul je soucasti modulu routeru
00084     bool isRouter();
00085     IPAddress getQuerierAddress(IPAddress thisRouterAddress, IPAddress otherRouterAddress);
00086 
00087     // metody pro praci s casovaci
00088     IGMPTimer * startInterfaceTimer(int timerType, IGMPInterface * igmpInterface);
00089     IGMPTimer * startGroupMembershipTimer(IGMPInterface * igmpInterface, IPAddress groupAddress, IPAddress lastReporter, int interval);
00090     IGMPTimer * startLastMemberTimer(IGMPInterface * igmpInterface, IPAddress groupAddress);
00091     void processIGMPTimer(IGMPTimer *timer);
00092 
00093     
00094     // tvorba IGMP paketu
00095     IGMPMessage * createPacket(int type, int maxRespTime, IPAddress groupAddress);
00096 
00097     // vytvoreni a posilani IGMP zprav
00098     void sendMembershipGeneralQuery(int interfaceID);
00099     void sendMembershipGroupSpecificQuery(IPAddress groupAddress, int interfaceID);
00100     void sendMembershipReportV2(IPAddress groupAddress, int interfaceID);
00101     void sendLeaveGroup(IPAddress groupAddress, int interfaceID);
00102 
00103     // prijem a zpracovani IGMP zprav
00104     void processIGMPMessage(IGMPMessage *igmpmsg);
00105     void processMembershipQuery(IGMPMessage *msg);
00106     void processMembershipReportV2(IGMPMessage *report);
00107     void processLeaveGroup(IGMPMessage *msg);
00108 
00109     // sprava clenstvi v multicastovych skupinach na rozhrani
00110     void addGroupToInterface(const int interfaceID, const IPAddress groupAddress);
00111     void removeGroupFromInterface(const int interfaceID, const IPAddress groupAddress);
00112     int getGroupMembershipPosition(IPAddress groupAddress, IGMPInterface * igmpInterface);
00113 
00114   
00115   protected:
00116     virtual int numInitStages() const  {return 5;}
00117     virtual void initialize(int stage);
00118     virtual void handleMessage(cMessage *msg);
00119 };
00120 
00121 
00122 #endif /* __IGMP_H_ */