Msg File src/inet/networklayer/ipv4/IgmpMessage.msg
Name | Type | Description |
---|---|---|
IgmpTimerKind | enum | (no description) |
IgmpType | enum | (no description) |
IgmpMessage | class | (no description) |
IgmpQuery | class | (no description) |
Igmpv1Query | class | (no description) |
Igmpv1Report | class | (no description) |
Igmpv2Query | class |
FIXME Igmpv1Query and Igmpv2Query differs only value of code field. |
Igmpv2Report | class | (no description) |
Igmpv2Leave | class | (no description) |
Igmpv3Query | class |
Igmpv3Query extends Igmpv2Query, because Igmpv2 routers must accept Igmpv3Query packets. |
GroupRecordType | enum | (no description) |
GroupRecord | class | (no description) |
Igmpv3Report | class | (no description) |
Source code
// // Copyright (C) 2011 CoCo Communications // Copyright (C) 2012 OpenSim Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later // import inet.common.INETDefs; import inet.common.packet.chunk.Chunk; import inet.networklayer.contract.ipv4.Ipv4Address; import inet.transportlayer.common.CrcMode; namespace inet; enum IgmpTimerKind { IGMP_QUERY_TIMER = 1001; IGMP_HOSTGROUP_TIMER = 1002; IGMP_LEAVE_TIMER = 1003; IGMP_REXMT_TIMER = 1004; }; enum IgmpType { IGMP_MEMBERSHIP_QUERY = 0x11; IGMPV1_MEMBERSHIP_REPORT = 0x12; IGMPV2_MEMBERSHIP_REPORT = 0x16; IGMPV2_LEAVE_GROUP = 0x17; IGMPV3_MEMBERSHIP_REPORT = 0x22; } class IgmpMessage extends FieldsChunk { IgmpType type; // 1 byte uint16_t crc = 0; // 2 bytes, The checksum is the 16-bit one's complement of the one's complement sum of the whole IGMP message (the entire IP payload). CrcMode crcMode = CRC_MODE_UNDEFINED; // 0 bytes, inet only } class IgmpQuery extends IgmpMessage { type = IGMP_MEMBERSHIP_QUERY; Ipv4Address groupAddress; } class Igmpv1Query extends IgmpQuery { chunkLength = B(8); uint8_t unused = 0; } class Igmpv1Report extends IgmpMessage { chunkLength = B(8); type = IGMPV1_MEMBERSHIP_REPORT; uint8_t unused = 0; Ipv4Address groupAddress; } class Igmpv2Query extends IgmpQuery //FIXME Igmpv1Query and Igmpv2Query differs only value of code field. { chunkLength = B(8); uint8_t maxRespTimeCode; // stored in `code` in units of 1/10 second, 0.1-25.5s } class Igmpv2Report extends IgmpMessage { chunkLength = B(8); type = IGMPV2_MEMBERSHIP_REPORT; uint8_t maxRespTime = 0; Ipv4Address groupAddress; } class Igmpv2Leave extends IgmpMessage { chunkLength = B(8); type = IGMPV2_LEAVE_GROUP; uint8_t maxRespTime = 0; Ipv4Address groupAddress; } // // Igmpv3Query extends Igmpv2Query, because // Igmpv2 routers must accept Igmpv3Query packets. // // Note: in Igmpv3Query the maxResponseTime field is // renamed to maxResponseCode and it is interpreted // differently than in Igmpv2. class Igmpv3Query extends Igmpv2Query { chunkLength = B(12); // 12 + sourceListArraySize * 4 // maxRespTime stored in `code` in units of 1/10 second // 0-127: 0-12.7s // 128-255: 1eeemmmm : (mant | 0x10) << (exp + 3) uint8_t resv = 0; // 4 bit bool suppressRouterProc; // 1 bit, S flag uint8_t robustnessVariable; // 3 bit, QRV uint8_t queryIntervalCode; // 8 bit, QQIC, in seconds, format similar to macRespTime (0nnnnnnn or 1eeemmmm) Ipv4AddressVector sourceList; // 16 + n*32 bit } enum GroupRecordType { MODE_IS_INCLUDE = 1; MODE_IS_EXCLUDE = 2; CHANGE_TO_INCLUDE_MODE = 3; CHANGE_TO_EXCLUDE_MODE = 4; ALLOW_NEW_SOURCES = 5; BLOCK_OLD_SOURCE = 6; } class GroupRecord { @packetData; int recordType enum(GroupRecordType); Ipv4Address groupAddress; Ipv4AddressVector sourceList; uint32_t auxData[]; }; class Igmpv3Report extends IgmpMessage { type = IGMPV3_MEMBERSHIP_REPORT; uint8_t resv1 = 0; uint16_t resv2 = 0; GroupRecord groupRecord[]; }