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()); } } }