|
INET Framework for OMNeT++/OMNEST
|
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_ */