Beispiel #1
0
        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);
        }
Beispiel #3
0
 private void MapIgmpData(IgmpDatagram datagram)
 {
     this.Protocol = PacketProtocol.Igmp;
     throw new NotImplementedException("Igmp");
 }