private void ValidateExtensionHeaderUnnamedField(IpV6ExtensionHeader header, XElement headerField, ref int optionsIndex)
        {
            IpV6ExtensionHeaderOptions headerOptions = header as IpV6ExtensionHeaderOptions;

            string[] headerFieldShowParts = headerField.Show().Split(':');
            string   headerFieldShowName  = headerFieldShowParts[0];
            string   headerFieldShowValue = headerFieldShowParts[1];

            switch (headerFieldShowName)
            {
            case "Next header":
                headerField.AssertValue((byte)header.NextHeader.Value);
                break;

            case "Length":
                if (header.IsValid)
                {
                    Assert.IsTrue(headerFieldShowValue.EndsWith(" (" + header.Length + " bytes)"));
                }
                break;

            case "Router alert":
                IpV6OptionRouterAlert routerAlert = (IpV6OptionRouterAlert)headerOptions.Options[optionsIndex++];
                switch (headerFieldShowValue)
                {
                case " MLD (4 bytes)":
                    Assert.AreEqual(IpV6RouterAlertType.MulticastListenerDiscovery, routerAlert.RouterAlertType);
                    break;

                case " RSVP (4 bytes)":
                    Assert.AreEqual(IpV6RouterAlertType.Rsvp, routerAlert.RouterAlertType);
                    break;

                case " Unknown (4 bytes)":
                    MoreAssert.IsInRange((ushort)IpV6RouterAlertType.ActiveNetwork, (ushort)IpV6RouterAlertType.NextStepsInSignalingNatFirewallLayerProtocol, (ushort)routerAlert.RouterAlertType);
                    headerField.AssertValueInRange(0x05020002, 0x05020044);
                    break;

                default:
                    throw new InvalidOperationException("Invalid ipv6 header route Router alert value " + headerFieldShowValue);
                }
                break;

            case "Jumbo payload":
                IpV6OptionJumboPayload jumboPayload = (IpV6OptionJumboPayload)headerOptions.Options[optionsIndex++];
                Assert.AreEqual(" " + jumboPayload.JumboPayloadLength + " (6 bytes)", headerFieldShowValue);
                break;

            default:
                throw new InvalidOperationException("Invalid ipv6 header unnamed field show name " + headerFieldShowName);
            }
        }
        private void CompareOptions(XElement field, ref int optionsIndex, IpV6Datagram ipV6Datagram, IpV6ExtensionHeaderOptions header)
        {
            foreach (var headerField in field.Fields())
            {
                switch (headerField.Name())
                {
                case "ipv6.nxt":
                    headerField.AssertNoFields();
                    headerField.AssertShowDecimal((byte)header.NextHeader);
                    break;

                case "ipv6.opt.length":
                    headerField.AssertNoFields();
                    headerField.AssertShowDecimal((header.Length - 8) / 8);
                    break;

                case "ipv6.opt":
                    foreach (XElement headerSubfield in headerField.Fields())
                    {
                        IpV6Option option           = header.Options[optionsIndex];
                        var        optionCalipso    = option as IpV6OptionCalipso;
                        var        optionQuickStart = option as IpV6OptionQuickStart;
                        switch (headerSubfield.Name())
                        {
                        case "ipv6.opt.type":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal((byte)option.OptionType);
                            break;

                        case "ipv6.opt.length":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(option.Length - 2);
                            break;

                        case "ipv6.opt.tel":
                            headerSubfield.AssertNoFields();
                            IpV6OptionTunnelEncapsulationLimit optionTunnelEncapsulationLimit = (IpV6OptionTunnelEncapsulationLimit)option;
                            headerSubfield.AssertShowDecimal(optionTunnelEncapsulationLimit.TunnelEncapsulationLimit);
                            ++optionsIndex;
                            break;

                        case "ipv6.opt.rpl.flag":
                            IpV6OptionRoutingProtocolLowPowerAndLossyNetworks optionRoutingProtocolLowPowerAndLossyNetworks =
                                (IpV6OptionRoutingProtocolLowPowerAndLossyNetworks)option;
                            foreach (XElement optionSubfield in headerSubfield.Fields())
                            {
                                optionSubfield.AssertNoFields();
                                switch (optionSubfield.Name())
                                {
                                case "ipv6.opt.rpl.flag.o":
                                    optionSubfield.AssertShowDecimal(optionRoutingProtocolLowPowerAndLossyNetworks.Down);
                                    break;

                                case "ipv6.opt.rpl.flag.r":
                                    optionSubfield.AssertShowDecimal(optionRoutingProtocolLowPowerAndLossyNetworks.RankError);
                                    break;

                                case "ipv6.opt.rpl.flag.f":
                                    optionSubfield.AssertShowDecimal(optionRoutingProtocolLowPowerAndLossyNetworks.ForwardingError);
                                    break;

                                case "ipv6.opt.rpl.flag.rsv":
                                    optionSubfield.AssertShowDecimal(0);
                                    break;

                                case "ipv6.opt.rpl.instance_id":
                                    optionSubfield.AssertShowDecimal(
                                        optionRoutingProtocolLowPowerAndLossyNetworks.RoutingProtocolLowPowerAndLossyNetworksInstanceId);
                                    break;

                                case "ipv6.opt.rpl.sender_rank":
                                    optionSubfield.AssertShowDecimal(optionRoutingProtocolLowPowerAndLossyNetworks.SenderRank);
                                    break;

                                default:
                                    throw new InvalidOperationException("Invalid ipv6 option subfield " + optionSubfield.Name());
                                }
                            }
                            ++optionsIndex;
                            // TODO: change to break; after https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=10559 is fixed.
                            return;

                        case "ipv6.opt.calipso.doi":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal((uint)optionCalipso.DomainOfInterpretation);
                            break;

                        case "ipv6.opt.calipso.cmpt.length":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(optionCalipso.CompartmentLength);
                            break;

                        case "ipv6.opt.calipso.sens_level":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(optionCalipso.SensitivityLevel);
                            break;

                        case "ipv6.opt.calipso.checksum":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(optionCalipso.Checksum);
                            break;

                        case "ipv6.opt.calipso.cmpt_bitmap":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertValue(optionCalipso.CompartmentBitmap);
                            ++optionsIndex;
                            break;

                        case "ipv6.opt.router_alert":
                            headerSubfield.AssertNoFields();
                            var optionRouterAlert = (IpV6OptionRouterAlert)option;
                            headerSubfield.AssertShowDecimal((ushort)optionRouterAlert.RouterAlertType);
                            ++optionsIndex;
                            break;

                        case "ipv6.opt.padn":
                            headerSubfield.AssertNoFields();
                            var optionPadN = (IpV6OptionPadN)option;
                            headerSubfield.AssertValue(new byte[optionPadN.PaddingDataLength]);
                            ++optionsIndex;
                            break;

                        case "ipv6.opt.qs_func":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal((byte)optionQuickStart.QuickStartFunction);
                            break;

                        case "ipv6.opt.qs_rate":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(optionQuickStart.Rate);
                            break;

                        case "ipv6.opt.qs_ttl":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(optionQuickStart.Ttl);
                            break;

                        case "ipv6.opt.qs_ttl_diff":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal((256 + ipV6Datagram.HopLimit - optionQuickStart.Ttl) % 256);
                            break;

                        case "ipv6.opt.qs_unused":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(optionQuickStart.Ttl);
                            break;

                        case "ipv6.opt.qs_nonce":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(optionQuickStart.Nonce);
                            break;

                        case "ipv6.opt.qs_reserved":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(0);
                            ++optionsIndex;
                            break;

                        case "ipv6.opt.pad1":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShow("");
                            Assert.IsTrue(option is IpV6OptionPad1);
                            ++optionsIndex;
                            break;

                        case "ipv6.opt.jumbo":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShowDecimal(((IpV6OptionJumboPayload)option).JumboPayloadLength);
                            ++optionsIndex;
                            break;

                        case "ipv6.mipv6_home_address":
                            headerSubfield.AssertNoFields();
                            headerSubfield.AssertShow(((IpV6OptionHomeAddress)option).HomeAddress.GetWiresharkString());
                            ++optionsIndex;
                            break;

                        case "ipv6.opt.unknown":
                            headerSubfield.AssertNoFields();
                            Assert.IsTrue(new[]
                            {
                                IpV6OptionType.LineIdentification,
                                IpV6OptionType.IdentifierLocatorNetworkProtocolNonce,
                                IpV6OptionType.SimplifiedMulticastForwardingDuplicatePacketDetection,
                                IpV6OptionType.EndpointIdentification,
                            }.Contains(option.OptionType),
                                          option.OptionType.ToString());
                            ++optionsIndex;
                            break;

                        default:
                            throw new InvalidOperationException("Invalid ipv6 header subfield " + headerSubfield.Name());
                        }
                    }
                    break;

                default:
                    throw new InvalidOperationException("Invalid ipv6 options field " + headerField.Name());
                }
            }
        }