public static InterfaceDescriptionBlock Parse(BaseBlock baseBlock, Action <Exception> ActionOnException)
        {
            CustomContract.Requires <ArgumentNullException>(baseBlock != null, "BaseBlock cannot be null");
            CustomContract.Requires <ArgumentNullException>(baseBlock.Body != null, "BaseBlock.Body cannot be null");
            CustomContract.Requires <ArgumentException>(baseBlock.BlockType == BaseBlock.Types.InterfaceDescription, "Invalid packet type");

            long positionInStream = baseBlock.PositionInStream;

            using (Stream stream = new MemoryStream(baseBlock.Body))
            {
                using (BinaryReader binaryReader = new BinaryReader(stream))
                {
                    UInt16 linktype = binaryReader.ReadUInt16().ReverseByteOrder(baseBlock.ReverseByteOrder);
                    if (!Enum.IsDefined(typeof(LinkTypes), linktype))
                    {
                        throw new ArgumentException(string.Format("[InterfaceDescriptionBlock.ctor] invalid LinkTypes: {0}, block begin on position {1} ", linktype, positionInStream));
                    }
                    LinkTypes linkType = (LinkTypes)linktype;
                    binaryReader.ReadUInt16();  // Reserved field.
                    int snapLength = binaryReader.ReadInt32().ReverseByteOrder(baseBlock.ReverseByteOrder);
                    InterfaceDescriptionOption Options        = InterfaceDescriptionOption.Parse(binaryReader, baseBlock.ReverseByteOrder, ActionOnException);
                    InterfaceDescriptionBlock  interfaceBlock = new InterfaceDescriptionBlock(linkType, snapLength, Options, positionInStream);
                    return(interfaceBlock);
                }
            }
        }
        public static EnhancedPacketBlock Parse(BaseBlock baseBlock, Action <Exception> ActionOnException)
        {
            CustomContract.Requires <ArgumentNullException>(baseBlock != null, "BaseBlock cannot be null");
            CustomContract.Requires <ArgumentNullException>(baseBlock.Body != null, "BaseBlock.Body cannot be null");
            CustomContract.Requires <ArgumentException>(baseBlock.BlockType == BaseBlock.Types.EnhancedPacket, "Invalid packet type");

            long positionInStream = baseBlock.PositionInStream;

            using (Stream stream = new MemoryStream(baseBlock.Body))
            {
                using (BinaryReader binaryReader = new BinaryReader(stream))
                {
                    int    interfaceID     = binaryReader.ReadInt32().ReverseByteOrder(baseBlock.ReverseByteOrder);
                    byte[] timestamp       = binaryReader.ReadBytes(8);
                    var    timestampHelper = new TimestampHelper(timestamp, baseBlock.ReverseByteOrder);
                    int    capturedLength  = binaryReader.ReadInt32().ReverseByteOrder(baseBlock.ReverseByteOrder);
                    int    packetLength    = binaryReader.ReadInt32().ReverseByteOrder(baseBlock.ReverseByteOrder);
                    byte[] data            = binaryReader.ReadBytes(capturedLength);
                    if (data.Length < capturedLength)
                    {
                        throw new EndOfStreamException("Unable to read beyond the end of the stream");
                    }
                    int remainderLength = (int)capturedLength % BaseBlock.AlignmentBoundary;
                    if (remainderLength > 0)
                    {
                        int paddingLength = BaseBlock.AlignmentBoundary - remainderLength;
                        binaryReader.ReadBytes(paddingLength);
                    }
                    var option        = EnhancedPacketOption.Parse(binaryReader, baseBlock.ReverseByteOrder, ActionOnException);
                    var enhancedBlock = new EnhancedPacketBlock(interfaceID, timestampHelper, packetLength, data, option, positionInStream);

                    return(enhancedBlock);
                }
            }
        }
Beispiel #3
0
        public static SectionHeaderBlock Parse(BaseBlock baseBlock, Action <Exception> ActionOnException)
        {
            CustomContract.Requires <ArgumentNullException>(baseBlock != null, "BaseBlock cannot be null");
            CustomContract.Requires <ArgumentNullException>(baseBlock.Body != null, "BaseBlock.Body cannot be null");
            CustomContract.Requires <ArgumentException>(baseBlock.BlockType == BaseBlock.Types.SectionHeader, "Invalid packet type");

            long positionInStream = baseBlock.PositionInStream;

            using (Stream stream = new MemoryStream(baseBlock.Body))
            {
                using (BinaryReader binaryReader = new BinaryReader(stream))
                {
                    uint tempMagicNumber = binaryReader.ReadUInt32().ReverseByteOrder(baseBlock.ReverseByteOrder);

                    if (!Enum.IsDefined(typeof(MagicNumbers), tempMagicNumber))
                    {
                        throw new ArgumentException(string.Format("[SectionHeaderBlock.Parse] Unrecognized pcapNG magic number: {0}", tempMagicNumber.ToString("x")));
                    }

                    MagicNumbers        magicNumber   = (MagicNumbers)tempMagicNumber;
                    ushort              majorVersion  = binaryReader.ReadUInt16().ReverseByteOrder(baseBlock.ReverseByteOrder);
                    ushort              minorVersion  = binaryReader.ReadUInt16().ReverseByteOrder(baseBlock.ReverseByteOrder);
                    long                sectionLength = binaryReader.ReadInt64().ReverseByteOrder(baseBlock.ReverseByteOrder);
                    SectionHeaderOption options       = SectionHeaderOption.Parse(binaryReader, baseBlock.ReverseByteOrder, ActionOnException);
                    SectionHeaderBlock  headerBlock   = new SectionHeaderBlock(magicNumber, majorVersion, minorVersion, sectionLength, options, positionInStream);
                    return(headerBlock);
                }
            }
        }
        protected override BaseBlock ConvertToBaseBlock(bool reverseByteOrder, Action <Exception> ActionOnException)
        {
            List <byte> body = new List <byte>();

            body.AddRange(NameResolutionRecords.ConvertToByte(reverseByteOrder, ActionOnException));
            body.AddRange(Options.ConvertToByte(reverseByteOrder, ActionOnException));
            BaseBlock baseBlock = new BaseBlock(this.BlockType, body.ToArray(), reverseByteOrder, 0);

            return(baseBlock);
        }
Beispiel #5
0
        protected override BaseBlock ConvertToBaseBlock(bool reverseByteOrder, Action <Exception> ActionOnException)
        {
            List <byte> body = new List <byte>();

            body.AddRange(BitConverter.GetBytes(InterfaceID.ReverseByteOrder(reverseByteOrder)));
            body.AddRange(Timestamp.ConvertToByte(reverseByteOrder));
            body.AddRange(Options.ConvertToByte(reverseByteOrder, ActionOnException));
            BaseBlock baseBlock = new BaseBlock(this.BlockType, body.ToArray(), reverseByteOrder, 0);

            return(baseBlock);
        }
        protected override BaseBlock ConvertToBaseBlock(bool reverseByteOrder, Action <Exception> ActionOnException)
        {
            List <byte> body = new List <byte>();

            body.AddRange(BitConverter.GetBytes(((UInt16)LinkType).ReverseByteOrder(reverseByteOrder)));
            body.Add(0);
            body.Add(0);
            body.AddRange(BitConverter.GetBytes(SnapLength.ReverseByteOrder(reverseByteOrder)));
            body.AddRange(Options.ConvertToByte(reverseByteOrder, ActionOnException));
            BaseBlock baseBlock = new BaseBlock(this.BlockType, body.ToArray(), reverseByteOrder, 0);

            return(baseBlock);
        }
Beispiel #7
0
        protected override BaseBlock ConvertToBaseBlock(bool reverseByteOrder, Action <Exception> ActionOnException)
        {
            List <byte> body = new List <byte>();

            body.AddRange(BitConverter.GetBytes(((uint)MagicNumber).ReverseByteOrder(reverseByteOrder)));
            body.AddRange(BitConverter.GetBytes(MajorVersion.ReverseByteOrder(reverseByteOrder)));
            body.AddRange(BitConverter.GetBytes(MinorVersion.ReverseByteOrder(reverseByteOrder)));
            body.AddRange(BitConverter.GetBytes(SectionLength.ReverseByteOrder(reverseByteOrder)));
            body.AddRange(Options.ConvertToByte(reverseByteOrder, ActionOnException));
            BaseBlock baseBlock = new BaseBlock(this.BlockType, body.ToArray(), reverseByteOrder, 0);

            return(baseBlock);
        }
Beispiel #8
0
        public static AbstractBlock ReadNextBlock(BinaryReader binaryReader, bool bytesReorder, Action <Exception> ActionOnException)
        {
            CustomContract.Requires <ArgumentNullException>(binaryReader != null, "binaryReader cannot be null");
            try
            {
                BaseBlock     baseblock = new BaseBlock(binaryReader, bytesReorder);
                AbstractBlock block     = null;;
                switch (baseblock.BlockType)
                {
                case BaseBlock.Types.SectionHeader:
                    block = SectionHeaderBlock.Parse(baseblock, ActionOnException);
                    break;

                case BaseBlock.Types.InterfaceDescription:
                    block = InterfaceDescriptionBlock.Parse(baseblock, ActionOnException);
                    break;

                case BaseBlock.Types.Packet:
                    block = PacketBlock.Parse(baseblock, ActionOnException);
                    break;

                case BaseBlock.Types.SimplePacket:
                    block = SimplePacketBlock.Parse(baseblock, ActionOnException);
                    break;

                case BaseBlock.Types.NameResolution:
                    block = NameResolutionBlock.Parse(baseblock, ActionOnException);
                    break;

                case BaseBlock.Types.InterfaceStatistics:
                    block = InterfaceStatisticsBlock.Parse(baseblock, ActionOnException);
                    break;

                case BaseBlock.Types.EnhancedPacket:
                    block = EnhancedPacketBlock.Parse(baseblock, ActionOnException);
                    break;

                default:
                    break;
                }
                return(block);
            }
            catch (Exception exc)
            {
                ActionOnException(exc);
                return(null);
            }
        }
        protected override BaseBlock ConvertToBaseBlock(bool reverseByteOrder, Action <Exception> ActionOnException)
        {
            List <byte> body = new List <byte>();

            body.AddRange(BitConverter.GetBytes(Data.Length.ReverseByteOrder(reverseByteOrder)));
            body.AddRange(Data);
            int remainderLength = (BaseBlock.AlignmentBoundary - Data.Length % BaseBlock.AlignmentBoundary) % BaseBlock.AlignmentBoundary;

            for (int i = 0; i < remainderLength; i++)
            {
                body.Add(0);
            }
            BaseBlock baseBlock = new BaseBlock(this.BlockType, body.ToArray(), reverseByteOrder, 0);

            return(baseBlock);
        }
        public static NameResolutionBlock Parse(BaseBlock baseBlock, Action <Exception> ActionOnException)
        {
            CustomContract.Requires <ArgumentNullException>(baseBlock != null, "BaseBlock cannot be null");
            CustomContract.Requires <ArgumentNullException>(baseBlock.Body != null, "BaseBlock.Body cannot be null");
            CustomContract.Requires <ArgumentException>(baseBlock.BlockType == BaseBlock.Types.NameResolution, "Invalid packet type");

            long positionInStream = baseBlock.PositionInStream;

            using (Stream stream = new MemoryStream(baseBlock.Body))
            {
                using (BinaryReader binaryReader = new BinaryReader(stream))
                {
                    NameResolutionRecord nameResolutionRecords = NameResolutionRecord.Parse(binaryReader, baseBlock.ReverseByteOrder, ActionOnException);
                    NameResolutionOption options             = NameResolutionOption.Parse(binaryReader, baseBlock.ReverseByteOrder, ActionOnException);
                    NameResolutionBlock  nameResolutionBlock = new NameResolutionBlock(nameResolutionRecords, options, positionInStream);
                    return(nameResolutionBlock);
                }
            }
        }
Beispiel #11
0
        public byte[] ConvertToByte(bool reverseByteOrder, Action <Exception> ActionOnException)
        {
            BaseBlock baseBlock = ConvertToBaseBlock(reverseByteOrder, ActionOnException);

            return(baseBlock.ConvertToByte(reverseByteOrder));
        }