protected override bool CompareField(XElement field, Datagram datagram) { IgmpDatagram igmpDatagram = (IgmpDatagram)datagram; switch (field.Name()) { case "igmp.version": if (field.Show() == "0") { return(false); // TODO: support IGMP version 0. } field.AssertShowDecimal(igmpDatagram.Version); break; case "igmp.type": field.AssertShowHex((byte)igmpDatagram.MessageType); break; case "igmp.checksum": field.AssertShowHex(igmpDatagram.Checksum); break; case "igmp.maddr": field.AssertShow(igmpDatagram.GroupAddress.ToString()); break; case "igmp.max_resp": field.AssertShowDecimal((int)((igmpDatagram.MaxResponseTime.TotalSeconds + 0.05) * 10)); break; case "igmp.checksum_bad": field.AssertShowDecimal(!igmpDatagram.IsChecksumCorrect); break; case "igmp.num_grp_recs": field.AssertShowDecimal(igmpDatagram.NumberOfGroupRecords); break; case "": switch (igmpDatagram.MessageType) { case IgmpMessageType.MembershipReportVersion3: CompareIgmpGroupRecord(field, igmpDatagram.GroupRecords[_groupRecordIndex++]); break; case IgmpMessageType.MembershipQuery: CompareDatagram(field, null, igmpDatagram); break; case IgmpMessageType.MulticastTraceRouteResponse: // todo support IGMP traceroute http://www.ietf.org/proceedings/48/I-D/idmr-traceroute-ipm-07.txt. break; default: if (typeof(IgmpMessageType).GetEnumValues <IgmpMessageType>().Contains(igmpDatagram.MessageType)) { throw new InvalidOperationException("Invalid message type " + igmpDatagram.MessageType); } field.AssertValue(igmpDatagram.Skip(1)); // field.AssertShow(igmpDatagram.Skip(1)); break; } break; case "igmp.s": field.AssertShowDecimal(igmpDatagram.IsSuppressRouterSideProcessing); break; case "igmp.qrv": field.AssertShowDecimal(igmpDatagram.QueryRobustnessVariable); break; case "igmp.qqic": field.AssertShowDecimal(igmpDatagram.QueryIntervalCode); break; case "igmp.num_src": field.AssertShowDecimal(igmpDatagram.NumberOfSources); break; case "igmp.saddr": field.AssertShow(igmpDatagram.SourceAddresses[_sourceAddressIndex++].ToString()); break; case "igmp.identifier": // todo support IGMP version 0 and IGMP identifier. break; case "igmp.mtrace.max_hops": case "igmp.mtrace.saddr": case "igmp.mtrace.raddr": case "igmp.mtrace.rspaddr": case "igmp.mtrace.resp_ttl": case "igmp.mtrace.q_id": // todo support IGMP traceroute http://www.ietf.org/proceedings/48/I-D/idmr-traceroute-ipm-07.txt. Assert.AreEqual(IgmpMessageType.MulticastTraceRouteResponse, igmpDatagram.MessageType); break; default: throw new InvalidOperationException("Invalid igmp field " + field.Name()); } return(true); }
protected override bool CompareField(XElement field, Datagram datagram) { IgmpDatagram igmpDatagram = (IgmpDatagram)datagram; switch (field.Name()) { case "igmp.version": field.AssertShowDecimal(Math.Max(igmpDatagram.Version, 0)); break; case "igmp.type": field.AssertShowDecimal((byte)igmpDatagram.MessageType); break; case "igmp.checksum": field.AssertShowDecimal(igmpDatagram.Checksum); break; case "igmp.maddr": field.AssertShow(igmpDatagram.GroupAddress.ToString()); break; case "igmp.max_resp": field.AssertShowDecimal((int)((igmpDatagram.MaxResponseTime.TotalSeconds + 0.05) * 10)); break; case "igmp.checksum_bad": if (igmpDatagram.IsValid) { field.AssertShowDecimal(!igmpDatagram.IsChecksumCorrect); } break; case "igmp.num_grp_recs": field.AssertShowDecimal(igmpDatagram.NumberOfGroupRecords); break; case "": switch (igmpDatagram.MessageType) { case IgmpMessageType.MembershipReportVersion3: CompareIgmpGroupRecord(field, igmpDatagram.GroupRecords[_groupRecordIndex++]); break; case IgmpMessageType.MembershipQuery: return(CompareDatagram(field, null, igmpDatagram)); case IgmpMessageType.MulticastTraceRouteResponse: case IgmpMessageType.MulticastTraceRoute: // todo support IGMP traceroute http://www.ietf.org/proceedings/48/I-D/idmr-traceroute-ipm-07.txt. break; default: switch (field.Show()) { case "Data": if (field.Value().Length > 0) { // TODO: Change following https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=11582 field.AssertValue(field.Value().Length / 2 == igmpDatagram.Length - 21 ? igmpDatagram.Skip(21) : igmpDatagram.Skip(1)); } break; default: if (typeof(IgmpMessageType).GetEnumValues <IgmpMessageType>().Contains(igmpDatagram.MessageType)) { throw new InvalidOperationException("Invalid message type " + igmpDatagram.MessageType); } break; } break; } break; case "igmp.s": field.AssertShowDecimal(igmpDatagram.IsSuppressRouterSideProcessing); break; case "igmp.qrv": field.AssertShowDecimal(igmpDatagram.QueryRobustnessVariable); break; case "igmp.qqic": field.AssertShowDecimal(igmpDatagram.QueryIntervalCode); break; case "igmp.num_src": field.AssertShowDecimal(igmpDatagram.NumberOfSources); break; case "igmp.saddr": field.AssertShow(igmpDatagram.SourceAddresses[_sourceAddressIndex++].ToString()); break; case "igmp.identifier": field.AssertShowDecimal(igmpDatagram.Identifier); break; case "igmp.access_key": field.AssertValue(igmpDatagram.AccessKey); break; case "igmp.reply": field.AssertShowDecimal((byte)igmpDatagram.ReplyCode); break; case "igmp.reply.pending": field.AssertShowDecimal(igmpDatagram.RetryInThisManySeconds); break; case "igmp.group_type": field.AssertShowDecimal((byte)igmpDatagram.CreateGroupRequestCode); break; case "igmp.mtrace.max_hops": case "igmp.mtrace.saddr": case "igmp.mtrace.raddr": case "igmp.mtrace.rspaddr": case "igmp.mtrace.resp_ttl": case "igmp.mtrace.q_id": // todo support IGMP traceroute http://www.ietf.org/proceedings/48/I-D/idmr-traceroute-ipm-07.txt. Assert.IsTrue(new[] { IgmpMessageType.MulticastTraceRouteResponse, IgmpMessageType.MulticastTraceRoute }.Contains(igmpDatagram.MessageType)); break; default: throw new InvalidOperationException("Invalid igmp field " + field.Name()); } return(true); }
private void MapIgmpData(IgmpDatagram datagram) { this.Protocol = PacketProtocol.Igmp; throw new NotImplementedException("Igmp"); }