internal static void WriteHeader(byte[] buffer, int offset, byte recursionControl, byte flags, GreVersion version, EthernetType protocolType, bool checksumPresent, uint?key, uint?sequenceNumber, uint?acknowledgmentSequenceNumber, ReadOnlyCollection <GreSourceRouteEntry> routing, ushort?routingOffset, bool strictSourceRoute) { buffer.Write(offset + Offset.ChecksumPresent, (byte)((checksumPresent ? Mask.ChecksumPresent : 0) | (routing != null ? Mask.RoutingPresent : 0) | (key != null ? Mask.KeyPresent : 0) | (sequenceNumber != null ? Mask.SequenceNumberPresent : 0) | (strictSourceRoute ? Mask.StrictSourceRoute : 0) | (recursionControl & Mask.RecursionControl))); buffer.Write(offset + Offset.FutureUseBits, (byte)((acknowledgmentSequenceNumber != null ? Mask.AcknowledgmentSequenceNumberPresent : 0) | ((flags << Shift.FutureUseBits) & Mask.FutureUseBits) | ((byte)version & Mask.Version))); buffer.Write(offset + Offset.ProtocolType, (ushort)protocolType, Endianity.Big); offset += Offset.Checksum; if (checksumPresent || routing != null) { offset += sizeof(ushort); if (routingOffset != null) { buffer.Write(offset, routingOffset.Value, Endianity.Big); } offset += sizeof(ushort); } if (key != null) { buffer.Write(ref offset, key.Value, Endianity.Big); } if (sequenceNumber != null) { buffer.Write(ref offset, sequenceNumber.Value, Endianity.Big); } if (acknowledgmentSequenceNumber != null) { buffer.Write(ref offset, acknowledgmentSequenceNumber.Value, Endianity.Big); } if (routing != null) { foreach (GreSourceRouteEntry entry in routing) { entry.Write(buffer, ref offset); } buffer.Write(ref offset, (uint)0, Endianity.Big); } }
public static GreLayer NextGreLayer(this Random random) { GreVersion version = random.NextEnum <GreVersion>(); bool isChecksum = random.NextBool(); GreSourceRouteEntry[] routing = null; ushort? routingOffset = null; bool strictSourceRoute = false; EthernetType protocolType = random.NextEnum(EthernetType.None); uint? key = random.NextBool() ? (uint?)random.NextUInt() : null; if (version == GreVersion.Gre) { if (random.NextBool()) { strictSourceRoute = random.NextBool(); routing = new GreSourceRouteEntry[random.Next(5)]; GreSourceRouteEntryAddressFamily family; if (random.NextBool()) { family = random.NextEnum(GreSourceRouteEntryAddressFamily.None); } else { family = (GreSourceRouteEntryAddressFamily)random.NextUShort(); } for (int i = 0; i != routing.Length; ++i) { switch (family) { case GreSourceRouteEntryAddressFamily.AsSourceRoute: { ushort[] asNumbers = ((Func <ushort>)(() => random.NextUShort())).GenerateArray(random.NextInt(1, 5)); routing[i] = new GreSourceRouteEntryAs(asNumbers.AsReadOnly(), random.Next(asNumbers.Length + 1)); break; } case GreSourceRouteEntryAddressFamily.IpSourceRoute: { IpV4Address[] ips = ((Func <IpV4Address>)(() => random.NextIpV4Address())).GenerateArray(random.NextInt(1, 5)); routing[i] = new GreSourceRouteEntryIp(ips.AsReadOnly(), random.Next(ips.Length + 1)); break; } default: { int dataLength = random.NextInt(1, 100); routing[i] = new GreSourceRouteEntryUnknown(family, random.NextDatagram(dataLength), random.Next(dataLength + 1)); break; } } } routingOffset = 0; if (routing.Any()) { int routingIndex = random.Next(routing.Length); for (int i = 0; i != routingIndex; ++i) { routingOffset += (ushort)routing[i].Length; } } } } else { protocolType = EthernetType.PointToPointProtocol; isChecksum = false; key = random.NextUInt(); } return(new GreLayer { Version = version, ProtocolType = protocolType, ChecksumPresent = isChecksum, Checksum = isChecksum && random.NextBool() ? (ushort?)random.NextUShort() : null, Key = key, SequenceNumber = random.NextBool() ? (uint?)random.NextUInt() : null, AcknowledgmentSequenceNumber = version == GreVersion.EnhancedGre && random.NextBool() ? (uint?)random.NextUInt() : null, RecursionControl = random.NextByte(8), // Flags = random.NextByte(32), Routing = routing == null ? null : routing.AsReadOnly(), RoutingOffset = routingOffset, StrictSourceRoute = strictSourceRoute, }); }
internal static void WriteHeader(byte[] buffer, int offset, byte recursionControl, byte flags, GreVersion version, EthernetType protocolType, bool checksumPresent, uint? key, uint? sequenceNumber, uint? acknowledgmentSequenceNumber, ReadOnlyCollection<GreSourceRouteEntry> routing, ushort? routingOffset, bool strictSourceRoute) { buffer.Write(offset + Offset.ChecksumPresent, (byte)((checksumPresent ? Mask.ChecksumPresent : 0) | (routing != null ? Mask.RoutingPresent : 0) | (key != null ? Mask.KeyPresent : 0) | (sequenceNumber != null ? Mask.SequenceNumberPresent : 0) | (strictSourceRoute ? Mask.StrictSourceRoute : 0) | (recursionControl & Mask.RecursionControl))); buffer.Write(offset + Offset.FutureUseBits, (byte)((acknowledgmentSequenceNumber != null ? Mask.AcknowledgmentSequenceNumberPresent : 0) | ((flags << Shift.FutureUseBits) & Mask.FutureUseBits) | ((byte)version & Mask.Version))); buffer.Write(offset + Offset.ProtocolType, (ushort)protocolType, Endianity.Big); offset += Offset.Checksum; if (checksumPresent || routing != null) { offset += sizeof(ushort); if (routingOffset != null) buffer.Write(offset, routingOffset.Value, Endianity.Big); offset += sizeof(ushort); } if (key != null) buffer.Write(ref offset, key.Value, Endianity.Big); if (sequenceNumber != null) buffer.Write(ref offset, sequenceNumber.Value, Endianity.Big); if (acknowledgmentSequenceNumber != null) buffer.Write(ref offset, acknowledgmentSequenceNumber.Value, Endianity.Big); if (routing != null) { foreach (GreSourceRouteEntry entry in routing) entry.Write(buffer, ref offset); buffer.Write(ref offset, (uint)0, Endianity.Big); } }
internal static void WriteHeader(byte[] buffer, int offset, byte recursionControl, byte flags, GreVersion version, EthernetType protocolType, bool checksumPresent, uint?key, uint?sequenceNumber, uint?acknowledgmentSequenceNumber, ReadOnlyCollection <GreSourceRouteEntry> routing, ushort?routingOffset, bool strictSourceRoute) { ByteArrayExtensions.Write(buffer, offset, (byte)((checksumPresent ? 128 : 0) | (routing != null ? 64 : 0) | (key.HasValue ? 32 : 0) | (sequenceNumber.HasValue ? 16 : 0) | (strictSourceRoute ? 8 : 0) | (int)recursionControl & 7)); ByteArrayExtensions.Write(buffer, offset + 1, (byte)((GreVersion)((acknowledgmentSequenceNumber.HasValue ? 128 : 0) | (int)flags << 3 & 120) | version & (GreVersion)7)); ByteArrayExtensions.Write(buffer, offset + 2, (ushort)protocolType, Endianity.Big); offset += 4; if (checksumPresent || routing != null) { offset += 2; ushort?nullable = routingOffset; if ((nullable.HasValue ? new int?((int)nullable.GetValueOrDefault()) : new int?()).HasValue) { ByteArrayExtensions.Write(buffer, offset, routingOffset.Value, Endianity.Big); } offset += 2; } if (key.HasValue) { ByteArrayExtensions.Write(buffer, ref offset, key.Value, Endianity.Big); } if (sequenceNumber.HasValue) { ByteArrayExtensions.Write(buffer, ref offset, sequenceNumber.Value, Endianity.Big); } if (acknowledgmentSequenceNumber.HasValue) { ByteArrayExtensions.Write(buffer, ref offset, acknowledgmentSequenceNumber.Value, Endianity.Big); } if (routing == null) { return; } foreach (GreSourceRouteEntry sourceRouteEntry in routing) { sourceRouteEntry.Write(buffer, ref offset); } ByteArrayExtensions.Write(buffer, ref offset, 0U, Endianity.Big); }