|
INET Framework for OMNeT++/OMNEST
|
#include <Igmpv3.h>
|
| enum | RouterState { IGMPV3_RS_INITIAL,
IGMPV3_RS_QUERIER,
IGMPV3_RS_NON_QUERIER
} |
| |
| enum | RouterGroupState { IGMPV3_RGS_NO_MEMBERS_PRESENT,
IGMPV3_RGS_MEMBERS_PRESENT,
IGMPV3_RGS_CHECKING_MEMBERSHIP
} |
| |
| enum | HostGroupState { IGMPV3_HGS_NON_MEMBER,
IGMPV3_HGS_DELAYING_MEMBER,
IGMPV3_HGS_IDLE_MEMBER
} |
| |
| enum | FilterMode { IGMPV3_FM_INCLUDE,
IGMPV3_FM_EXCLUDE
} |
| |
| enum | ReportType {
IGMPV3_RT_IS_IN = 1,
IGMPV3_RT_IS_EX = 2,
IGMPV3_RT_TO_IN = 3,
IGMPV3_RT_TO_EX = 4,
IGMPV3_RT_ALLOW = 5,
IGMPV3_RT_BLOCK = 6
} |
| |
| enum | IgmpTimerKind {
IGMPV3_R_GENERAL_QUERY_TIMER,
IGMPV3_R_GROUP_TIMER,
IGMPV3_R_SOURCE_TIMER,
IGMPV3_H_GENERAL_QUERY_TIMER,
IGMPV3_H_GROUP_TIMER
} |
| |
| typedef std::map< Ipv4Address, HostGroupData * > | GroupToHostDataMap |
| |
| typedef std::map< Ipv4Address, SourceRecord * > | SourceToSourceRecordMap |
| |
| typedef std::map< Ipv4Address, RouterGroupData * > | GroupToRouterDataMap |
| |
| typedef std::map< int, HostInterfaceData * > | InterfaceToHostDataMap |
| |
| typedef std::map< int, RouterInterfaceData * > | InterfaceToRouterDataMap |
| |
|
| virtual int | numInitStages () const override |
| |
| virtual void | initialize (int stage) override |
| |
| virtual void | handleMessage (cMessage *msg) override |
| |
| virtual void | receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override |
| |
| virtual | ~Igmpv3 () |
| |
| void | addWatches () |
| |
| virtual HostInterfaceData * | createHostInterfaceData (NetworkInterface *ie) |
| |
| virtual RouterInterfaceData * | createRouterInterfaceData (NetworkInterface *ie) |
| |
| virtual HostInterfaceData * | getHostInterfaceData (NetworkInterface *ie) |
| |
| virtual RouterInterfaceData * | getRouterInterfaceData (NetworkInterface *ie) |
| |
| virtual void | deleteHostInterfaceData (int interfaceId) |
| |
| virtual void | deleteRouterInterfaceData (int interfaceId) |
| |
| virtual void | configureInterface (NetworkInterface *ie) |
| |
| virtual void | startTimer (cMessage *timer, double interval) |
| |
| virtual void | sendGeneralQuery (RouterInterfaceData *interface, double maxRespTime) |
| |
| virtual void | sendGroupSpecificQuery (RouterGroupData *group) |
| |
| virtual void | sendGroupAndSourceSpecificQuery (RouterGroupData *group, const Ipv4AddressVector &sources) |
| |
| virtual void | sendGroupReport (NetworkInterface *ie, const std::vector< GroupRecord > &records) |
| |
| virtual void | sendQueryToIP (Packet *msg, NetworkInterface *ie, Ipv4Address dest) |
| |
| virtual void | sendReportToIP (Packet *msg, NetworkInterface *ie, Ipv4Address dest) |
| |
| virtual void | processHostGeneralQueryTimer (cMessage *msg) |
| |
| virtual void | processHostGroupQueryTimer (cMessage *msg) |
| |
| virtual void | processRouterGeneralQueryTimer (cMessage *msg) |
| |
| virtual void | processRouterGroupTimer (cMessage *msg) |
| | Function for switching EXCLUDE filter mode back to INCLUDE If at least one source timer is still runing, it will switch to Include mode. More...
|
| |
| virtual void | processRouterSourceTimer (cMessage *msg) |
| | Function for checking expired source timers if group is in INCLUDE filter mode. More...
|
| |
| virtual void | processIgmpMessage (Packet *msg) |
| |
| virtual void | processQuery (Packet *msg) |
| |
| virtual void | processReport (Packet *msg) |
| |
| virtual void | multicastSourceListChanged (NetworkInterface *ie, Ipv4Address group, const Ipv4MulticastSourceList &sourceList) |
| | This function is sending report message if interface state was changed. More...
|
| |
◆ GroupToHostDataMap
◆ GroupToRouterDataMap
◆ InterfaceToHostDataMap
◆ InterfaceToRouterDataMap
◆ SourceToSourceRecordMap
◆ FilterMode
| Enumerator |
|---|
| IGMPV3_FM_INCLUDE | |
| IGMPV3_FM_EXCLUDE | |
◆ HostGroupState
| Enumerator |
|---|
| IGMPV3_HGS_NON_MEMBER | |
| IGMPV3_HGS_DELAYING_MEMBER | |
| IGMPV3_HGS_IDLE_MEMBER | |
◆ IgmpTimerKind
| Enumerator |
|---|
| IGMPV3_R_GENERAL_QUERY_TIMER | |
| IGMPV3_R_GROUP_TIMER | |
| IGMPV3_R_SOURCE_TIMER | |
| IGMPV3_H_GENERAL_QUERY_TIMER | |
| IGMPV3_H_GROUP_TIMER | |
◆ ReportType
| Enumerator |
|---|
| IGMPV3_RT_IS_IN | |
| IGMPV3_RT_IS_EX | |
| IGMPV3_RT_TO_IN | |
| IGMPV3_RT_TO_EX | |
| IGMPV3_RT_ALLOW | |
| IGMPV3_RT_BLOCK | |
◆ RouterGroupState
| Enumerator |
|---|
| IGMPV3_RGS_NO_MEMBERS_PRESENT | |
| IGMPV3_RGS_MEMBERS_PRESENT | |
| IGMPV3_RGS_CHECKING_MEMBERSHIP | |
◆ RouterState
| Enumerator |
|---|
| IGMPV3_RS_INITIAL | |
| IGMPV3_RS_QUERIER | |
| IGMPV3_RS_NON_QUERIER | |
◆ ~Igmpv3()
| inet::Igmpv3::~Igmpv3 |
( |
| ) |
|
|
protectedvirtual |
◆ addWatches()
| void inet::Igmpv3::addWatches |
( |
| ) |
|
|
protected |
◆ codeTime()
| uint8_t inet::Igmpv3::codeTime |
( |
uint16_t |
timevalue | ) |
|
|
static |
1377 code = (uint8_t)time;
1378 else if (time >= (0x1f << 10))
1383 while (time > 0x1f) {
1389 code = 0x80 | ((exp << 4) & 0x70) | (time & 0x0f);
◆ configureInterface()
253 if (
enabled &&
rt->isMulticastForwardingEnabled()) {
255 EV_INFO <<
"Sending General Query on interface '" << ie->getInterfaceName() <<
"', and scheduling next Query to '"
◆ createHostInterfaceData()
◆ createRouterInterfaceData()
◆ decodeTime()
| uint16_t inet::Igmpv3::decodeTime |
( |
uint8_t |
code | ) |
|
|
static |
Function for computing the time value in seconds from an encoded value.
Codes in the [1,127] interval are the number of 1/10 seconds, codes above 127 are contain a 3-bit exponent and a four bit mantissa and represents the (mantissa + 16) * 2^(3+exp) number of 1/10 seconds.
1365 unsigned mantis = code & 0x0f;
1366 unsigned exp = (code >> 4) & 0x07;
1367 time = (mantis | 0x10) << (exp + 3);
Referenced by inet::IgmpProtocolPrinter::print().
◆ deleteHostInterfaceData()
| void inet::Igmpv3::deleteHostInterfaceData |
( |
int |
interfaceId | ) |
|
|
protectedvirtual |
267 auto interfaceIt =
hostData.find(interfaceId);
268 if (interfaceIt !=
hostData.end()) {
269 HostInterfaceData *
interface = interfaceIt->second;
◆ deleteRouterInterfaceData()
| void inet::Igmpv3::deleteRouterInterfaceData |
( |
int |
interfaceId | ) |
|
|
protectedvirtual |
277 auto interfaceIt =
routerData.find(interfaceId);
279 RouterInterfaceData *
interface = interfaceIt->second;
◆ getFilterModeString()
◆ getHostGroupStateString()
1422 return "NON_MEMBER";
1424 return "DELAYING_MEMBER";
1426 return "IDLE_MEMBER";
◆ getHostInterfaceData()
1079 int interfaceId = ie->getInterfaceId();
1080 auto it =
hostData.find(interfaceId);
◆ getRouterGroupStateString()
1410 return "NO_MEMBERS_PRESENT";
1412 return "MEMBERS_PRESENT";
1414 return "CHECKING_MEMBERSHIP";
◆ getRouterInterfaceData()
1062 int interfaceId = ie->getInterfaceId();
◆ getRouterStateString()
1402 return "NON_QUERIER";
◆ handleMessage()
| void inet::Igmpv3::handleMessage |
( |
cMessage * |
msg | ) |
|
|
overrideprotectedvirtual |
288 if (!msg->isSelfMessage()) {
289 EV <<
"Igmpv3 disabled, dropping packet.\n";
295 if (msg->isSelfMessage()) {
296 switch (msg->getKind()) {
◆ initialize()
| void inet::Igmpv3::initialize |
( |
int |
stage | ) |
|
|
overrideprotectedvirtual |
66 ift.reference(
this,
"interfaceTableModule",
true);
67 rt.reference(
this,
"routingTableModule",
true);
81 const char *crcModeString = par(
"crcMode");
90 for (
int i = 0; i <
ift->getNumInterfaces(); ++i) {
91 NetworkInterface *ie =
ift->getInterface(i);
92 if (ie->isMulticast()) {
94 if (
auto ipv4interfaceData = ie->findProtocolDataForUpdate<Ipv4InterfaceData>()) {
95 int n = ipv4interfaceData->getNumOfJoinedMulticastGroups();
96 for (
int j = 0; j < n; j++) {
97 auto groupAddress = ipv4interfaceData->getJoinedMulticastGroup(j);
98 const auto& sourceList = ipv4interfaceData->getJoinedMulticastSources(j);
110 if (
enabled &&
rt->isMulticastForwardingEnabled()) {
111 for (
int i = 0; i <
ift->getNumInterfaces(); ++i) {
112 NetworkInterface *ie =
ift->getInterface(i);
113 if (ie->isMulticast())
◆ insertCrc() [1/2]
| void inet::Igmpv3::insertCrc |
( |
const Ptr< IgmpMessage > & |
igmpMsg, |
|
|
Packet * |
payload |
|
) |
| |
|
inline |
◆ insertCrc() [2/2]
1447 igmpMsg->setCrc(0xC00D);
1451 igmpMsg->setCrc(0xBAAD);
1455 igmpMsg->setCrc(0x0000);
1456 MemoryOutputStream igmpStream;
1458 if (packet->getDataLength() >
b(0))
1461 igmpMsg->setCrc(crc);
1465 throw cRuntimeError(
"Unknown CRC mode");
◆ multicastSourceListChanged()
This function is sending report message if interface state was changed.
See RFC 3376 5.1.
175 ASSERT(isSorted(sourceList.sources));
177 if (!
enabled || group.isLinkLocalMulticast())
181 HostGroupData *groupData = interfaceData->getOrCreateGroupData(group);
185 EV_DETAIL_C(
"test") <<
"State of group '" << group <<
"' on interface '" << ie->getInterfaceName() <<
"' has changed:\n";
186 EV_DETAIL_C(
"test") <<
" Old state: " << groupData->getStateInfo() <<
".\n";
187 EV_DETAIL_C(
"test") <<
" New state: " << (filter ==
IGMPV3_FM_INCLUDE ?
"INCLUDE" :
"EXCLUDE") << sourceList.sources <<
".\n";
190 if (!(groupData->filter == filter) || !(groupData->sourceAddressList == sourceList.sources)) {
193 EV_DETAIL <<
"Sending ALLOW/BLOCK report.\n";
194 vector<GroupRecord> records(2);
195 records[0].setGroupAddress(group);
197 records[0].setSourceList(
set_complement(sourceList.sources, groupData->sourceAddressList));
198 records[1].setGroupAddress(group);
200 records[1].setSourceList(
set_complement(groupData->sourceAddressList, sourceList.sources));
201 records.erase(remove_if(records.begin(), records.end(), isEmptyRecord), records.end());
202 if (!records.empty())
207 EV_DETAIL <<
"Sending ALLOW/BLOCK report.\n";
208 vector<GroupRecord> records(2);
209 records[0].setGroupAddress(group);
211 records[0].setSourceList(
set_complement(groupData->sourceAddressList, sourceList.sources));
212 records[1].setGroupAddress(group);
214 records[1].setSourceList(
set_complement(sourceList.sources, groupData->sourceAddressList));
215 records.erase(remove_if(records.begin(), records.end(), isEmptyRecord), records.end());
216 if (!records.empty())
221 EV_DETAIL <<
"Sending TO_EX report.\n";
222 vector<GroupRecord> records(1);
223 records[0].setGroupAddress(group);
225 records[0].setSourceList(sourceList.sources);
230 EV_DETAIL <<
"Sending TO_IN report.\n";
231 vector<GroupRecord> records(1);
232 records[0].setGroupAddress(group);
234 records[0].setSourceList(sourceList.sources);
239 groupData->filter = filter;
240 groupData->sourceAddressList = sourceList.sources;
241 sort(groupData->sourceAddressList.begin(), groupData->sourceAddressList.end());
◆ numInitStages()
| virtual int inet::Igmpv3::numInitStages |
( |
| ) |
const |
|
inlineoverrideprotectedvirtual |
◆ processHostGeneralQueryTimer()
| void inet::Igmpv3::processHostGeneralQueryTimer |
( |
cMessage * |
msg | ) |
|
|
protectedvirtual |
412 HostInterfaceData *interfaceData = (HostInterfaceData *)msg->getContextPointer();
413 NetworkInterface *ie = interfaceData->ie;
416 EV_INFO <<
"Response timer to a General Query on interface '" << ie->getInterfaceName() <<
"' has expired.\n";
419 Packet *outPacket =
new Packet(
"Igmpv3 report");
420 const auto& report = makeShared<Igmpv3Report>();
421 unsigned int byteLength = 8;
424 report->setGroupRecordArraySize(interfaceData->groups.size());
432 for (
auto& elem : interfaceData->groups) {
440 gr.setGroupAddress(elem.second->groupAddr);
441 gr.setSourceList(elem.second->sourceAddressList);
442 report->setGroupRecord(counter++, gr);
443 byteLength += 8 + gr.getSourceList().size() * 4;
445 report->setChunkLength(
B(byteLength));
448 EV_INFO <<
"Sending response to a General Query on interface '" << ie->getInterfaceName() <<
"'.\n";
450 outPacket->insertAtFront(report);
455 EV_INFO <<
"There are no multicast listeners, no response is sent to a General Query on interface '" << ie->getInterfaceName() <<
"'.\n";
◆ processHostGroupQueryTimer()
| void inet::Igmpv3::processHostGroupQueryTimer |
( |
cMessage * |
msg | ) |
|
|
protectedvirtual |
463 HostGroupData *group = (HostGroupData *)msg->getContextPointer();
464 NetworkInterface *ie = group->parent->ie;
466 vector<GroupRecord> records(1);
469 if (group->queriedSources.empty()) {
471 EV_INFO <<
"Response timer for a Group-Specific Query for group '" << group->groupAddr <<
"' on interface '" << ie->getInterfaceName() <<
"'\n";
473 records[0].setGroupAddress(group->groupAddr);
475 records[0].setSourceList(group->sourceAddressList);
480 EV_INFO <<
"Response timer for a Group-and-Source-Specific Query for group '" << group->groupAddr <<
"' on interface '" << ie->getInterfaceName() <<
"'\n";
482 records[0].setGroupAddress(group->groupAddr);
489 group->queriedSources.clear();
◆ processIgmpMessage()
| void inet::Igmpv3::processIgmpMessage |
( |
Packet * |
msg | ) |
|
|
protectedvirtual |
503 EV_WARN <<
"incoming IGMP packet has wrong CRC, dropped\n";
505 PacketDropDetails details;
512 const auto& msg = packet->peekAtFront<IgmpMessage>();
513 switch (msg->getType()) {
524 throw cRuntimeError(
"Igmpv3: Unhandled message type (%dq)", msg->getType());
◆ processQuery()
| void inet::Igmpv3::processQuery |
( |
Packet * |
msg | ) |
|
|
protectedvirtual |
531 NetworkInterface *ie =
ift->getInterfaceById(packet->getTag<InterfaceInd>()->getInterfaceId());
532 const auto& msg = packet->peekAtFront<Igmpv3Query>();
533 assert(msg !=
nullptr);
535 Ipv4Address groupAddr = msg->getGroupAddress();
537 double maxRespTime = 0.1 *
decodeTime(msg->getMaxRespTimeCode());
539 ASSERT(ie->isMulticast());
541 EV_INFO <<
"Received Igmpv3 query on interface '" << ie->getInterfaceName() <<
"' for group '" << groupAddr <<
"'.\n";
547 double delay = uniform(0.0, maxRespTime);
550 if (interfaceData->generalQueryTimer->isScheduled() && interfaceData->generalQueryTimer->getArrivalTime() < simTime() + delay) {
554 EV_DETAIL <<
"There is a pending response to a previous General Query, no further response is scheduled.\n";
556 else if (groupAddr.isUnspecified() && queriedSources.empty()) {
561 EV_DETAIL <<
"Received a General Query, scheduling report with delay=" << delay <<
".\n";
562 startTimer(interfaceData->generalQueryTimer, delay);
564 else if (!groupAddr.isUnspecified()) {
565 HostGroupData *groupData = interfaceData->getOrCreateGroupData(groupAddr);
567 if (!groupData->timer->isScheduled()) {
574 EV_DETAIL <<
"Received Group" << (queriedSources.empty() ?
"" :
"-and-Source") <<
"-Specific Query, "
575 <<
"scheduling report with delay=" << delay <<
".\n";
577 sort(queriedSources.begin(), queriedSources.end());
578 groupData->queriedSources = queriedSources;
581 else if (queriedSources.empty()) {
589 EV_DETAIL <<
"Received Group-Specific Query, scheduling report with delay="
590 <<
min(delay, SIMTIME_DBL(groupData->timer->getArrivalTime() - simTime())) <<
".\n";
592 sort(queriedSources.begin(), queriedSources.end());
593 groupData->queriedSources = queriedSources;
594 if (groupData->timer->getArrivalTime() > simTime() + delay)
605 EV_DETAIL <<
"Received Group-and-Source-Specific Query, combining sources with the sources of pending report, "
606 <<
"and scheduling a new report with delay="
607 <<
min(delay, SIMTIME_DBL(groupData->timer->getArrivalTime() - simTime())) <<
".\n";
609 if (groupData->timer->getArrivalTime() > simTime() + delay) {
610 sort(queriedSources.begin(), queriedSources.end());
611 groupData->queriedSources =
set_union(groupData->queriedSources, queriedSources);
618 if (
rt->isMulticastForwardingEnabled()) {
621 if (packet->getTag<
L3AddressInd>()->getSrcAddress().toIpv4() < ie->getProtocolData<Ipv4InterfaceData>()->getIPAddress()) {
627 RouterGroupData *groupData = routerInterfaceData->getOrCreateGroupData(groupAddr);
629 double maxResponseTime = maxRespTime;
◆ processReport()
| void inet::Igmpv3::processReport |
( |
Packet * |
msg | ) |
|
|
protectedvirtual |
640 const auto& msg = packet->peekAtFront<Igmpv3Report>();
641 assert(msg !=
nullptr);
642 NetworkInterface *ie =
ift->getInterfaceById(packet->getTag<InterfaceInd>()->getInterfaceId());
644 ASSERT(ie->isMulticast());
646 EV_INFO <<
"Received Igmpv3 Membership Report on interface '" << ie->getInterfaceName() <<
"'.\n";
650 if (
rt->isMulticastForwardingEnabled()) {
653 for (
unsigned int i = 0; i < msg->getGroupRecordArraySize(); i++) {
654 GroupRecord gr = msg->getGroupRecord(i);
655 EV_DETAIL <<
"Found a record for group '" << gr.getGroupAddress() <<
"'.\n";
658 sort(gr.getSourceListForUpdate().begin(), gr.getSourceListForUpdate().end());
661 RouterGroupData *groupData = interfaceData->getOrCreateGroupData(gr.getGroupAddress());
663 Ipv4MulticastSourceList oldSourceList;
664 groupData->collectForwardedSources(oldSourceList);
666 EV_DETAIL <<
"Router State is " << groupData->getStateInfo() <<
".\n";
670 EV_DETAIL <<
"Received IS_IN" << receivedSources <<
" report.\n";
673 for (
auto& receivedSource : receivedSources) {
675 SourceRecord *record = groupData->getOrCreateSourceRecord(receivedSource);
680 EV_DETAIL <<
"Received IS_EX" << receivedSources <<
" report.\n";
688 for (
auto it = groupData->sources.begin(); it != groupData->sources.end(); ++it) {
689 if (!
contains(receivedSources, it->first)) {
690 EV_DETAIL <<
"Deleting source record of '" << it->first <<
"'.\n";
691 groupData->deleteSourceRecord(it->first);
697 for (
auto& receivedSource : receivedSources) {
698 if (!groupData->hasSourceRecord(receivedSource)) {
699 SourceRecord *record = groupData->createSourceRecord(receivedSource);
701 EV_DETAIL <<
"Setting source timer of '" << receivedSource <<
"' to '" << timerValue <<
"'.\n";
711 EV_DETAIL <<
"Received ALLOW" << receivedSources <<
" report.\n";
715 for (
auto& receivedSource : receivedSources) {
717 SourceRecord *record = groupData->getOrCreateSourceRecord(receivedSource);
722 EV_DETAIL <<
"Received BLOCK" << receivedSources <<
" report.\n";
727 for (
auto& elem : groupData->sources)
728 sourcesA.push_back(elem.first);
731 if (!aIntersectB.empty()) {
732 EV_INFO <<
"Sending Group-and-Source-Specific Query for group '" << groupData->groupAddr
733 <<
"' on interface '" << ie->getInterfaceName() <<
"'.\n";
739 for (
auto it = groupData->sources.begin(); it != groupData->sources.end(); ++it) {
740 if (!groupData->hasSourceRecord(it->first)) {
741 SourceRecord *record = groupData->createSourceRecord(it->first);
742 double grouptimertime = groupData->timer->getArrivalTime().dbl() - simTime().dbl();
743 EV_DETAIL <<
"Setting source timer of '" << it->first <<
"' to '" << grouptimertime <<
"'.\n";
744 startTimer(record->sourceTimer, grouptimertime);
749 for (
auto& elem : groupData->sources) {
750 if (!elem.second->sourceTimer->isScheduled()) {
751 ySources.push_back(elem.first);
755 if (!aMinusY.empty()) {
756 EV_INFO <<
"Sending Group-and-Source-Specific Query for group '" << groupData->groupAddr
757 <<
"' on interface '" << ie->getInterfaceName() <<
"'.\n";
763 EV_DETAIL <<
"Received TO_IN" << receivedSources <<
" report.\n";
767 for (
auto& receivedSource : receivedSources) {
769 SourceRecord *record = groupData->getOrCreateSourceRecord(receivedSource);
774 for (
auto& elem : groupData->sources)
775 sourcesA.push_back(elem.first);
777 if (!aMinusB.empty()) {
778 EV_INFO <<
"Sending Group-and-Source-Specific Query for group '" << groupData->groupAddr
779 <<
"' on interface '" << ie->getInterfaceName() <<
"'.\n";
786 for (
auto& elem : groupData->sources) {
787 if (elem.second->sourceTimer->isScheduled())
788 sourcesX.push_back(elem.first);
792 for (
auto& receivedSource : receivedSources) {
794 SourceRecord *record = groupData->getOrCreateSourceRecord(receivedSource);
800 if (!xMinusA.empty()) {
801 EV_INFO <<
"Sending Group-and-Source-Specific Query for group '" << groupData->groupAddr
802 <<
"' on interface '" << ie->getInterfaceName() <<
"'.\n";
807 EV_INFO <<
"Sending Group-Specific Query for group '" << groupData->groupAddr
808 <<
"' on interface '" << ie->getInterfaceName() <<
"'.\n";
813 EV_DETAIL <<
"Received TO_EX" << receivedSources <<
" report.\n";
825 for (
auto& elem : groupData->sources)
826 sourcesA.push_back(elem.first);
829 for (
auto& receivedSource : receivedSources) {
830 if (!groupData->hasSourceRecord(receivedSource)) {
831 EV_DETAIL <<
"Setting source timer of '" << receivedSource <<
"' to '0'.\n";
832 groupData->createSourceRecord(receivedSource);
837 for (
auto& elem : sourcesA) {
838 if (!
contains(receivedSources, elem)) {
839 EV_DETAIL <<
"Deleting source record of '" << elem <<
"'.\n";
840 groupData->deleteSourceRecord(elem);
846 if (!aIntersectB.empty()) {
847 EV_INFO <<
"Sending Group-Specific Query for group '" << groupData->groupAddr
848 <<
"' on interface '" << ie->getInterfaceName() <<
"'.\n";
859 for (
auto& elem : groupData->sources) {
860 if (!elem.second->sourceTimer->isScheduled())
861 sourcesY.push_back(elem.first);
865 for (
auto it = groupData->sources.begin(); it != groupData->sources.end();) {
866 auto rec = it->first;
868 if (!
contains(receivedSources, it->first)) {
869 EV_DETAIL <<
"Deleting source record of '" << rec <<
"'.\n";
870 groupData->deleteSourceRecord(rec);
875 for (
auto& receivedSource : receivedSources) {
876 if (!groupData->hasSourceRecord(receivedSource)) {
878 SourceRecord *record = groupData->createSourceRecord(receivedSource);
885 if (!aMinusY.empty()) {
886 EV_INFO <<
"Sending Group-Specific Query for group '" << groupData->groupAddr
887 <<
"' on interface '" << ie->getInterfaceName() <<
"'.\n";
893 EV_DETAIL <<
"New Router State is " << groupData->getStateInfo() <<
".\n";
896 Ipv4MulticastSourceList newSourceList;
897 groupData->collectForwardedSources(newSourceList);
899 if (newSourceList != oldSourceList) {
900 ie->getProtocolDataForUpdate<Ipv4InterfaceData>()->setMulticastListeners(groupData->groupAddr, newSourceList.filterMode, newSourceList.sources);
◆ processRouterGeneralQueryTimer()
| void inet::Igmpv3::processRouterGeneralQueryTimer |
( |
cMessage * |
msg | ) |
|
|
protectedvirtual |
330 RouterInterfaceData *interfaceData = (RouterInterfaceData *)msg->getContextPointer();
331 NetworkInterface *ie = interfaceData->ie;
333 EV_INFO <<
"General Query timer expired on interface='" << ie->getInterfaceName() <<
"'.\n";
336 EV_INFO <<
"Sending General Query on interface '" << ie->getInterfaceName() <<
"', and scheduling next Query to '"
◆ processRouterGroupTimer()
| void inet::Igmpv3::processRouterGroupTimer |
( |
cMessage * |
msg | ) |
|
|
protectedvirtual |
Function for switching EXCLUDE filter mode back to INCLUDE If at least one source timer is still runing, it will switch to Include mode.
Else if no source timer is running, group record is deleted.
351 RouterGroupData *groupData = (RouterGroupData *)msg->getContextPointer();
352 NetworkInterface *ie = groupData->parent->ie;
354 EV_INFO <<
"Group Timer for group '" << groupData->groupAddr <<
"' on interface '" << ie->getInterfaceName() <<
"' has expired.\n";
355 EV_DETAIL <<
"Router State is " << groupData->getStateInfo() <<
".\n";
358 bool timerRunning =
false;
359 for (
auto it = groupData->sources.begin(); it != groupData->sources.end(); ++it) {
360 if (!it->second->sourceTimer->isScheduled()) {
361 EV_DETAIL <<
"Deleting source record of '" << it->first <<
"'.\n";
362 groupData->deleteSourceRecord(it->first);
370 EV_DETAIL <<
"Deleting multicast listener for group '" << groupData->groupAddr <<
"' from the interface table.\n";
371 ie->getProtocolDataForUpdate<Ipv4InterfaceData>()->removeMulticastListener(groupData->groupAddr);
372 groupData->parent->deleteGroupData(groupData->groupAddr);
374 EV_DETAIL <<
"New Router State is <deleted>.\n";
379 EV_DETAIL <<
"New Router State is " << groupData->getStateInfo() <<
".\n";
◆ processRouterSourceTimer()
| void inet::Igmpv3::processRouterSourceTimer |
( |
cMessage * |
msg | ) |
|
|
protectedvirtual |
Function for checking expired source timers if group is in INCLUDE filter mode.
387 SourceRecord *sourceRecord = (SourceRecord *)msg->getContextPointer();
388 RouterGroupData *groupData = sourceRecord->parent;
389 NetworkInterface *ie = groupData->parent->ie;
391 EV_INFO <<
"Source timer for group '" << groupData->groupAddr <<
"' and source '" << sourceRecord->sourceAddr
392 <<
"' on interface '" << ie->getInterfaceName() <<
"' has expired.\n";
396 groupData->deleteSourceRecord(sourceRecord->sourceAddr);
398 for (
auto& elem : groupData->sources) {
399 if (elem.second->sourceTimer->isScheduled()) {
404 ie->getProtocolDataForUpdate<Ipv4InterfaceData>()->removeMulticastListener(groupData->groupAddr);
405 groupData->parent->deleteGroupData(groupData->groupAddr);
◆ receiveSignal()
| void inet::Igmpv3::receiveSignal |
( |
cComponent * |
source, |
|
|
simsignal_t |
signalID, |
|
|
cObject * |
obj, |
|
|
cObject * |
details |
|
) |
| |
|
overrideprotectedvirtual |
143 Enter_Method(
"%s", cComponent::getSignalName(signalID));
145 NetworkInterface *ie;
147 const Ipv4MulticastGroupSourceInfo *info;
150 info = check_and_cast<const Ipv4MulticastGroupSourceInfo *>(obj);
154 ie =
const_cast<NetworkInterface *
>(check_and_cast<const NetworkInterface *>(obj));
155 if (ie->isMulticast())
159 ie =
const_cast<NetworkInterface *
>(check_and_cast<const NetworkInterface *>(obj));
160 if (ie->isMulticast()) {
161 interfaceId = ie->getInterfaceId();
◆ sendGeneralQuery()
913 Packet *packet =
new Packet(
"Igmpv3 query");
914 const auto& msg = makeShared<Igmpv3Query>();
916 msg->setMaxRespTimeCode(
codeTime((uint16_t)(maxRespTime * 10.0)));
917 msg->setChunkLength(
B(12));
919 packet->insertAtFront(msg);
◆ sendGroupAndSourceSpecificQuery()
983 ASSERT(!sources.empty());
985 RouterInterfaceData *interfaceData = groupData->parent;
988 Packet *packet =
new Packet(
"Igmpv3 query");
989 const auto& msg = makeShared<Igmpv3Query>();
991 msg->setGroupAddress(groupData->groupAddr);
993 msg->setSourceList(sources);
994 msg->setChunkLength(
B(12 + (4 * sources.size())));
996 packet->insertAtFront(msg);
997 sendQueryToIP(packet, interfaceData->ie, groupData->groupAddr);
◆ sendGroupReport()
961 EV <<
"Igmpv3: sending Membership Report on iface=" << ie->getInterfaceName() <<
"\n";
962 Packet *packet =
new Packet(
"Igmpv3 report");
963 const auto& msg = makeShared<Igmpv3Report>();
964 unsigned int byteLength = 8;
966 msg->setGroupRecordArraySize(records.size());
967 for (
size_t i = 0; i < records.size(); ++i) {
968 Ipv4Address group = records[i].getGroupAddress();
969 ASSERT(group.isMulticast() && !group.isLinkLocalMulticast());
970 msg->setGroupRecord(i, records[i]);
971 byteLength += 8 + records[i].getSourceList().size() * 4;
973 msg->setChunkLength(
B(byteLength));
975 packet->insertAtFront(msg);
◆ sendGroupSpecificQuery()
934 RouterInterfaceData *interfaceData = groupData->parent;
935 bool suppressFlag = groupData->timer->isScheduled() && groupData->timer->getArrivalTime() > simTime() +
lastMemberQueryTime;
941 Packet *packet =
new Packet(
"Igmpv3 query");
942 const auto& msg = makeShared<Igmpv3Query>();
944 msg->setGroupAddress(groupData->groupAddr);
946 msg->setSuppressRouterProc(suppressFlag);
947 msg->setChunkLength(
B(12));
949 packet->insertAtFront(msg);
950 sendQueryToIP(packet, interfaceData->ie, groupData->groupAddr);
◆ sendQueryToIP()
1025 ASSERT(ie->isMulticast());
1028 msg->addTagIfAbsent<DispatchProtocolInd>()->setProtocol(&
Protocol::igmp);
1030 msg->addTagIfAbsent<
InterfaceReq>()->setInterfaceId(ie->getInterfaceId());
1031 msg->addTagIfAbsent<L3AddressReq>()->setDestAddress(dest);
1032 msg->addTagIfAbsent<
HopLimitReq>()->setHopLimit(1);
1035 auto raOption =
new Ipv4OptionRouterAlert();
1036 msg->addTag<Ipv4OptionsReq>()->appendOption(raOption);
1038 msg->addTag<
DscpReq>()->setDifferentiatedServicesCodePoint(0xc0 >> 2);
◆ sendReportToIP()
1006 ASSERT(ie->isMulticast());
1009 msg->addTagIfAbsent<DispatchProtocolInd>()->setProtocol(&
Protocol::igmp);
1011 msg->addTagIfAbsent<
InterfaceReq>()->setInterfaceId(ie->getInterfaceId());
1012 msg->addTagIfAbsent<L3AddressReq>()->setDestAddress(dest);
1013 msg->addTagIfAbsent<
HopLimitReq>()->setHopLimit(1);
1016 auto raOption =
new Ipv4OptionRouterAlert();
1017 msg->addTag<Ipv4OptionsReq>()->appendOption(raOption);
◆ set_complement()
1323 ASSERT(isSorted(first));
1324 ASSERT(isSorted(second));
1328 auto it = set_difference(first.begin(), first.end(), second.begin(), second.end(), complement.begin());
1329 complement.resize(it - complement.begin());
◆ set_intersection()
1335 ASSERT(isSorted(first));
1336 ASSERT(isSorted(second));
1340 auto it = std::set_intersection(first.begin(), first.end(), second.begin(), second.end(), intersection.begin());
1341 intersection.resize(it - intersection.begin());
1342 return intersection;
◆ set_union()
1347 ASSERT(isSorted(first));
1348 ASSERT(isSorted(second));
1352 auto it = std::set_union(first.begin(), first.end(), second.begin(), second.end(), result.begin());
1353 result.resize(it - result.begin());
◆ startTimer()
| void inet::Igmpv3::startTimer |
( |
cMessage * |
timer, |
|
|
double |
interval |
|
) |
| |
|
protectedvirtual |
495 rescheduleAfter(interval, timer);
◆ verifyCrc()
| bool inet::Igmpv3::verifyCrc |
( |
const Packet * |
packet | ) |
|
1472 switch (igmpMsg->getCrcMode()) {
1475 return igmpMsg->isCorrect();
1484 return crc == 0 && igmpMsg->isCorrect();
1487 throw cRuntimeError(
"Unknown CRC mode");
◆ crcMode
◆ enabled
| bool inet::Igmpv3::enabled |
|
protected |
◆ groupMembershipInterval
| double inet::Igmpv3::groupMembershipInterval |
|
protected |
◆ hostData
◆ ift
◆ lastMemberQueryCount
| int inet::Igmpv3::lastMemberQueryCount |
|
protected |
◆ lastMemberQueryInterval
| double inet::Igmpv3::lastMemberQueryInterval |
|
protected |
◆ lastMemberQueryTime
| double inet::Igmpv3::lastMemberQueryTime |
|
protected |
◆ numGeneralQueriesRecv
| int inet::Igmpv3::numGeneralQueriesRecv = 0 |
|
protected |
◆ numGeneralQueriesSent
| int inet::Igmpv3::numGeneralQueriesSent = 0 |
|
protected |
◆ numGroupAndSourceSpecificQueriesRecv
| int inet::Igmpv3::numGroupAndSourceSpecificQueriesRecv = 0 |
|
protected |
◆ numGroupAndSourceSpecificQueriesSent
| int inet::Igmpv3::numGroupAndSourceSpecificQueriesSent = 0 |
|
protected |
◆ numGroups
| int inet::Igmpv3::numGroups = 0 |
|
protected |
◆ numGroupSpecificQueriesRecv
| int inet::Igmpv3::numGroupSpecificQueriesRecv = 0 |
|
protected |
◆ numGroupSpecificQueriesSent
| int inet::Igmpv3::numGroupSpecificQueriesSent = 0 |
|
protected |
◆ numHostGroups
| int inet::Igmpv3::numHostGroups = 0 |
|
protected |
◆ numQueriesRecv
| int inet::Igmpv3::numQueriesRecv = 0 |
|
protected |
◆ numQueriesSent
| int inet::Igmpv3::numQueriesSent = 0 |
|
protected |
◆ numReportsRecv
| int inet::Igmpv3::numReportsRecv = 0 |
|
protected |
◆ numReportsSent
| int inet::Igmpv3::numReportsSent = 0 |
|
protected |
◆ numRouterGroups
| int inet::Igmpv3::numRouterGroups = 0 |
|
protected |
◆ otherQuerierPresentInterval
| double inet::Igmpv3::otherQuerierPresentInterval |
|
protected |
◆ queryInterval
| double inet::Igmpv3::queryInterval |
|
protected |
◆ queryResponseInterval
| double inet::Igmpv3::queryResponseInterval |
|
protected |
◆ robustness
| int inet::Igmpv3::robustness |
|
protected |
◆ routerData
◆ rt
◆ startupQueryCount
| int inet::Igmpv3::startupQueryCount |
|
protected |
◆ startupQueryInterval
| double inet::Igmpv3::startupQueryInterval |
|
protected |
◆ unsolicitedReportInterval
| double inet::Igmpv3::unsolicitedReportInterval |
|
protected |
The documentation for this class was generated from the following files:
virtual void sendGeneralQuery(RouterInterfaceData *interface, double maxRespTime)
Definition: Igmpv3.cc:910
static void insertCrc(CrcMode crcMode, const Ptr< IgmpMessage > &igmpMsg, Packet *payload)
Definition: Igmpv3.cc:1441
int numGroupAndSourceSpecificQueriesRecv
Definition: Igmpv3.h:224
@ IGMPV3_RS_INITIAL
Definition: Igmpv3.h:36
@ IGMPV3_RT_IS_EX
Definition: Igmpv3.h:60
static Ipv4AddressVector set_union(const Ipv4AddressVector &first, const Ipv4AddressVector &second)
Definition: Igmpv3.cc:1345
int numRouterGroups
Definition: Igmpv3.h:214
@ IGMPV3_HGS_DELAYING_MEMBER
Definition: Igmpv3.h:49
virtual void processReport(Packet *msg)
Definition: Igmpv3.cc:638
virtual void deleteRouterInterfaceData(int interfaceId)
Definition: Igmpv3.cc:275
@ IGMPV3_H_GENERAL_QUERY_TIMER
Definition: Igmpv3.h:71
void addWatches()
Definition: Igmpv3.cc:120
virtual void sendGroupSpecificQuery(RouterGroupData *group)
Definition: Igmpv3.cc:932
virtual RouterInterfaceData * createRouterInterfaceData(NetworkInterface *ie)
Definition: Igmpv3.cc:1072
void sort(std::vector< T > &v)
Definition: stlutils.h:129
virtual void startTimer(cMessage *timer, double interval)
Definition: Igmpv3.cc:492
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DscpReq
Definition: IUdp-gates.txt:25
int numGeneralQueriesSent
Definition: Igmpv3.h:219
ModuleRefByPar< IInterfaceTable > ift
Definition: Igmpv3.h:193
virtual void processRouterGeneralQueryTimer(cMessage *msg)
Definition: Igmpv3.cc:328
int numReportsSent
Definition: Igmpv3.h:225
@ INCORRECTLY_RECEIVED
Definition: Simsignals_m.h:71
static const Protocol ipv4
Definition: Protocol.h:93
int startupQueryCount
Definition: Igmpv3.h:202
@ IGMPV3_RGS_NO_MEMBERS_PRESENT
Definition: Igmpv3.h:42
@ IGMPV3_HGS_IDLE_MEMBER
Definition: Igmpv3.h:50
@ IGMPV3_MEMBERSHIP_REPORT
Definition: IgmpMessage_m.h:75
virtual void processIgmpMessage(Packet *msg)
Definition: Igmpv3.cc:500
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SctpAssociation.h:261
double unsolicitedReportInterval
Definition: Igmpv3.h:206
@ IGMPV3_R_SOURCE_TIMER
Definition: Igmpv3.h:70
cModule * getContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:40
FilterMode
Definition: Igmpv3.h:53
@ CRC_COMPUTED
Definition: CrcMode_m.h:59
removed InterfaceReq
Definition: IUdp-gates.txt:11
static void serialize(MemoryOutputStream &stream, const Ptr< const Chunk > &chunk, b offset=b(0), b length=b(-1))
Serializes a chunk into the given stream.
Definition: Chunk.cc:175
@ IGMPV3_RT_ALLOW
Definition: Igmpv3.h:63
CrcMode crcMode
Definition: Igmpv3.h:209
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
simsignal_t ipv4MulticastChangeSignal
Definition: Simsignals.cc:51
static Ipv4AddressVector set_intersection(const Ipv4AddressVector &first, const Ipv4AddressVector &second)
Definition: Igmpv3.cc:1333
@ IGMP_MEMBERSHIP_QUERY
Definition: IgmpMessage_m.h:71
double lastMemberQueryInterval
Definition: Igmpv3.h:203
CrcMode parseCrcMode(const char *crcModeString, bool allowDisable)
Definition: CrcMode.cc:14
static Ipv4AddressVector set_complement(const Ipv4AddressVector &first, const Ipv4AddressVector &second)
Definition: Igmpv3.cc:1321
static const Ipv4Address ALL_IGMPV3_ROUTERS_MCAST
224.0.0.22 All IGMPv3 routers
Definition: Ipv4Address.h:101
@ IGMPV3_RGS_MEMBERS_PRESENT
Definition: Igmpv3.h:43
InterfaceToRouterDataMap routerData
Definition: Igmpv3.h:233
simsignal_t packetDroppedSignal
Definition: Simsignals.cc:85
std::vector< Ipv4Address > Ipv4AddressVector
Definition: Ipv4Address_m.h:46
virtual void multicastSourceListChanged(NetworkInterface *ie, Ipv4Address group, const Ipv4MulticastSourceList &sourceList)
This function is sending report message if interface state was changed.
Definition: Igmpv3.cc:172
int numReportsRecv
Definition: Igmpv3.h:226
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
int lastMemberQueryCount
Definition: Igmpv3.h:204
double groupMembershipInterval
Definition: Igmpv3.h:199
double otherQuerierPresentInterval
Definition: Igmpv3.h:200
virtual void deleteHostInterfaceData(int interfaceId)
Definition: Igmpv3.cc:265
simsignal_t interfaceDeletedSignal
Definition: Simsignals.cc:31
virtual void processQuery(Packet *msg)
Definition: Igmpv3.cc:529
intscale< b, 1, 8 > B
Definition: Units.h:1168
InterfaceToHostDataMap hostData
Definition: Igmpv3.h:232
static uint8_t codeTime(uint16_t timevalue)
Definition: Igmpv3.cc:1373
int numGroupSpecificQueriesSent
Definition: Igmpv3.h:221
int numHostGroups
Definition: Igmpv3.h:213
virtual void processRouterSourceTimer(cMessage *msg)
Function for checking expired source timers if group is in INCLUDE filter mode.
Definition: Igmpv3.cc:385
@ IGMPV3_RT_TO_EX
Definition: Igmpv3.h:62
static uint16_t decodeTime(uint8_t code)
Function for computing the time value in seconds from an encoded value.
Definition: Igmpv3.cc:1359
virtual void sendReportToIP(Packet *msg, NetworkInterface *ie, Ipv4Address dest)
Definition: Igmpv3.cc:1004
if(cwndVector) cwndVector -> record(state->snd_cwnd)
virtual void processRouterGroupTimer(cMessage *msg)
Function for switching EXCLUDE filter mode back to INCLUDE If at least one source timer is still runi...
Definition: Igmpv3.cc:349
bool contains(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:65
@ IGMPV3_FM_INCLUDE
Definition: Igmpv3.h:54
removed HopLimitReq
Definition: IUdp-gates.txt:11
@ IGMPV3_HGS_NON_MEMBER
Definition: Igmpv3.h:48
virtual void processHostGroupQueryTimer(cMessage *msg)
Definition: Igmpv3.cc:461
virtual void configureInterface(NetworkInterface *ie)
Definition: Igmpv3.cc:251
RouterState
Definition: Igmpv3.h:35
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
@ IGMPV3_R_GROUP_TIMER
Definition: Igmpv3.h:69
int numGeneralQueriesRecv
Definition: Igmpv3.h:220
double queryInterval
Definition: Igmpv3.h:197
@ IGMPV3_RS_QUERIER
Definition: Igmpv3.h:37
@ IGMPV3_H_GROUP_TIMER
Definition: Igmpv3.h:72
virtual HostInterfaceData * createHostInterfaceData(NetworkInterface *ie)
Definition: Igmpv3.cc:1089
value< int64_t, units::b > b
Definition: Units.h:1241
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
@ PF_ALLOW_INCORRECT
Definition: Chunk.h:281
ModuleRefByPar< IRoutingTable > rt
Definition: Igmpv3.h:192
static const Protocol igmp
Definition: Protocol.h:91
static uint16_t checksum(const void *addr, unsigned int count)
Definition: TcpIpChecksum.h:33
@ IGMPV3_RS_NON_QUERIER
Definition: Igmpv3.h:38
@ CRC_DECLARED_CORRECT
Definition: CrcMode_m.h:57
@ CRC_DECLARED_INCORRECT
Definition: CrcMode_m.h:58
@ IGMPV3_RT_TO_IN
Definition: Igmpv3.h:61
@ IGMPV3_RT_IS_IN
Definition: Igmpv3.h:59
double queryResponseInterval
Definition: Igmpv3.h:198
int numGroupAndSourceSpecificQueriesSent
Definition: Igmpv3.h:223
#define Enter_Method(...)
Definition: SelfDoc.h:71
virtual HostInterfaceData * getHostInterfaceData(NetworkInterface *ie)
Definition: Igmpv3.cc:1077
int numGroupSpecificQueriesRecv
Definition: Igmpv3.h:222
int numQueriesRecv
Definition: Igmpv3.h:218
int robustness
Definition: Igmpv3.h:196
int numGroups
Definition: Igmpv3.h:212
virtual void sendGroupReport(NetworkInterface *ie, const std::vector< GroupRecord > &records)
Definition: Igmpv3.cc:959
static const Ipv4Address ALL_HOSTS_MCAST
224.0.0.1 All hosts on a subnet
Definition: Ipv4Address.h:96
double startupQueryInterval
Definition: Igmpv3.h:201
virtual void sendGroupAndSourceSpecificQuery(RouterGroupData *group, const Ipv4AddressVector &sources)
Definition: Igmpv3.cc:981
@ IGMPV3_FM_EXCLUDE
Definition: Igmpv3.h:55
@ IGMPV3_RGS_CHECKING_MEMBERSHIP
Definition: Igmpv3.h:44
simsignal_t interfaceCreatedSignal
Definition: Simsignals.cc:30
@ MCAST_INCLUDE_SOURCES
Definition: NetworkInterface.h:33
@ IGMPV3_RT_BLOCK
Definition: Igmpv3.h:64
void registerProtocol(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a protocol primitive (PDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:83
virtual RouterInterfaceData * getRouterInterfaceData(NetworkInterface *ie)
Definition: Igmpv3.cc:1060
virtual void sendQueryToIP(Packet *msg, NetworkInterface *ie, Ipv4Address dest)
Definition: Igmpv3.cc:1023
bool enabled
Definition: Igmpv3.h:195
INET_API InitStage INITSTAGE_NETWORK_LAYER_PROTOCOLS
Initialization of network layer protocols over IP.
int numQueriesSent
Definition: Igmpv3.h:217
bool verifyCrc(const Packet *packet)
Definition: Igmpv3.cc:1469
@ IGMPV3_R_GENERAL_QUERY_TIMER
Definition: Igmpv3.h:68
double lastMemberQueryTime
Definition: Igmpv3.h:205
virtual void processHostGeneralQueryTimer(cMessage *msg)
Definition: Igmpv3.cc:410