Example #1
0
        internal static bool TryReadEntry(byte[] buffer, ref int offset, int length, out GreSourceRouteEntry entry)
        {
            entry = (GreSourceRouteEntry)null;
            if (length < 4)
            {
                return(false);
            }
            GreSourceRouteEntryAddressFamily addressFamily = (GreSourceRouteEntryAddressFamily)ByteArrayExtensions.ReadUShort(buffer, offset, Endianity.Big);
            byte num1 = buffer[offset + 3];

            if ((int)num1 == 0)
            {
                return(addressFamily == GreSourceRouteEntryAddressFamily.None);
            }
            if (4 + (int)num1 > length)
            {
                return(false);
            }
            byte num2 = buffer[offset + 2];

            if ((int)num2 > (int)num1 || !GreSourceRouteEntry.TryReadEntry(buffer, offset + 4, (int)num1, addressFamily, (int)num2, out entry))
            {
                return(false);
            }
            offset += entry.Length;
            return(true);
        }
        internal static bool TryReadEntry(byte[] buffer, ref int offset, int length, out GreSourceRouteEntry entry)
        {
            entry = null;
            if (length < HeaderLength)
            {
                return(false);
            }

            // Address Family
            GreSourceRouteEntryAddressFamily addressFamily = (GreSourceRouteEntryAddressFamily)buffer.ReadUShort(offset + Offset.AddressFamily, Endianity.Big);

            // SRE Length
            byte sreLength = buffer[offset + Offset.SreLength];

            if (sreLength == 0)
            {
                return(addressFamily == GreSourceRouteEntryAddressFamily.None);
            }

            if (HeaderLength + sreLength > length)
            {
                return(false);
            }

            // SRE Offset
            byte sreOffset = buffer[offset + Offset.SreOffset];

            if (sreOffset > sreLength)
            {
                return(false);
            }

            // Entry
            if (!TryReadEntry(buffer, offset + HeaderLength, sreLength, addressFamily, sreOffset, out entry))
            {
                return(false);
            }

            // Change offset
            offset += entry.Length;
            return(true);
        }
 /// <summary>
 /// Initializes using an address family, data, and offset to the first octet of the active entry in Source Route Entry to be examined.
 /// </summary>
 /// <param name="addressFamily">The Address Family field contains a two octet value which indicates the syntax and semantics of the Routing Information field.</param>
 /// <param name="data">The data of the entry source route.</param>
 /// <param name="offset">The SRE Offset field indicates the octet offset from the start of the Routing Information field to the first octet of the active entry in Source Route Entry to be examined.</param>
 public GreSourceRouteEntryUnknown(GreSourceRouteEntryAddressFamily addressFamily, Datagram data, int offset)
 {
     _addressFamily = addressFamily;
     _data = data;
     _offset = offset;
 }
 /// <summary>
 /// Initializes using an address family, data, and offset to the first octet of the active entry in Source Route Entry to be examined.
 /// </summary>
 /// <param name="addressFamily">The Address Family field contains a two octet value which indicates the syntax and semantics of the Routing Information field.</param>
 /// <param name="data">The data of the entry source route.</param>
 /// <param name="offset">The SRE Offset field indicates the octet offset from the start of the Routing Information field to the first octet of the active entry in Source Route Entry to be examined.</param>
 public GreSourceRouteEntryUnknown(GreSourceRouteEntryAddressFamily addressFamily, Datagram data, int offset)
 {
     _addressFamily = addressFamily;
     _data          = data;
     _offset        = offset;
 }
Example #5
0
        private static bool TryReadEntry(byte[] buffer, int payloadOffset, int payloadLength, GreSourceRouteEntryAddressFamily addressFamily, int offsetInPayload, out GreSourceRouteEntry entry)
        {
            entry = (GreSourceRouteEntry)null;
            switch (addressFamily)
            {
            case GreSourceRouteEntryAddressFamily.IpSourceRoute:
                if (offsetInPayload % 4 != 0 || payloadLength % 4 != 0)
                {
                    return(false);
                }
                int           length1   = payloadLength / 4;
                IpV4Address[] addresses = new IpV4Address[length1];
                for (int index = 0; index != length1; ++index)
                {
                    addresses[index] = ByteArrayExtensions.ReadIpV4Address(buffer, payloadOffset + index * 4, Endianity.Big);
                }
                entry = (GreSourceRouteEntry) new GreSourceRouteEntryIp(addresses, offsetInPayload / 4);
                return(true);

            case GreSourceRouteEntryAddressFamily.AsSourceRoute:
                if (offsetInPayload % 2 != 0 || payloadLength % 2 != 0)
                {
                    return(false);
                }
                int      length2   = payloadLength / 2;
                ushort[] asNumbers = new ushort[length2];
                for (int index = 0; index != length2; ++index)
                {
                    asNumbers[index] = ByteArrayExtensions.ReadUShort(buffer, payloadOffset + index * 2, Endianity.Big);
                }
                entry = (GreSourceRouteEntry) new GreSourceRouteEntryAs(asNumbers, offsetInPayload / 2);
                return(true);

            default:
                Datagram data = new Datagram(buffer, payloadOffset, payloadLength);
                entry = (GreSourceRouteEntry) new GreSourceRouteEntryUnknown(addressFamily, data, offsetInPayload);
                return(true);
            }
        }
        private static bool TryReadEntry(byte[] buffer, int payloadOffset, int payloadLength, GreSourceRouteEntryAddressFamily addressFamily, int offsetInPayload, out GreSourceRouteEntry entry)
        {
            entry = null;
            switch (addressFamily)
            {
            case GreSourceRouteEntryAddressFamily.IpSourceRoute:
                if (offsetInPayload % IpV4Address.SizeOf != 0 || payloadLength % IpV4Address.SizeOf != 0)
                {
                    return(false);
                }

                int           numAddresses = payloadLength / IpV4Address.SizeOf;
                IpV4Address[] addresses    = new IpV4Address[numAddresses];
                for (int i = 0; i != numAddresses; ++i)
                {
                    addresses[i] = buffer.ReadIpV4Address(payloadOffset + i * IpV4Address.SizeOf, Endianity.Big);
                }

                entry = new GreSourceRouteEntryIp(addresses, offsetInPayload / IpV4Address.SizeOf);
                return(true);

            case GreSourceRouteEntryAddressFamily.AsSourceRoute:
                if (offsetInPayload % sizeof(ushort) != 0 || payloadLength % sizeof(ushort) != 0)
                {
                    return(false);
                }

                int      numAsNumbers = payloadLength / sizeof(ushort);
                ushort[] asNumbers    = new ushort[numAsNumbers];
                for (int i = 0; i != numAsNumbers; ++i)
                {
                    asNumbers[i] = buffer.ReadUShort(payloadOffset + i * sizeof(ushort), Endianity.Big);
                }

                entry = new GreSourceRouteEntryAs(asNumbers, offsetInPayload / sizeof(ushort));
                return(true);

            default:
                Datagram data = new Datagram(buffer, payloadOffset, payloadLength);
                entry = new GreSourceRouteEntryUnknown(addressFamily, data, offsetInPayload);
                return(true);
            }
        }