示例#1
0
        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);
            }
        }
示例#2
0
        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,
            });
        }
示例#3
0
        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);
 }