Esempio n. 1
0
        /// <summary>
        /// Returns a <see cref="System.String"/> representation of the specified
        /// <see cref="AK.Net.Dns.DnsOpCode"/>.
        /// </summary>
        /// <param name="value">The operation code.</param>
        /// <returns>A <see cref="System.String"/> representation of the specified
        /// <see cref="AK.Net.Dns.DnsOpCode"/>.</returns>
        public static string ToString(DnsOpCode value)
        {
            switch (value)
            {
            case DnsOpCode.Query:
                return("QUERY");

            case DnsOpCode.IQuery:
                return("IQUERY");

            case DnsOpCode.Status:
                return("STATUS");

            case DnsOpCode.Notify:
                return("NOTIFY");

            case DnsOpCode.Update:
                return("UPDATE");

            default:
#if DEBUG
                throw Guard.ArgumentOutOfRange("value");
#else
                return(value.ToString().ToUpperInvariant());
#endif
            }
        }
Esempio n. 2
0
        public DatagramDnsQuery(EndPoint sender, EndPoint recipient, int id, DnsOpCode opCode) : base(id, opCode)
        {
            if (recipient == null && sender == null)
            {
                throw new ArgumentNullException("recipient and sender");
            }

            Sender    = sender;
            Recipient = recipient;
        }
Esempio n. 3
0
        public DnsHeader(Byte[] bytes, UInt32 offset)
        {
            id = (UInt16)((bytes[offset] << 8) |
                          (bytes[offset + 1]));


            thirdByte  = bytes[offset + 2];
            fourthByte = bytes[offset + 3];

            isResponseFlag = (bytes[offset + 2] & 0x80) != 0;

            opCode = (DnsOpCode)((bytes[offset + 2] >> 3) & 0xF);

            rCode = (DnsRCode)(bytes[offset + 3] & 0xF);

            qdCount = (UInt16)((bytes[offset + 4] << 8) |
                               (bytes[offset + 5]));
            anCount = (UInt16)((bytes[offset + 6] << 8) |
                               (bytes[offset + 7]));
            nsCount = (UInt16)((bytes[offset + 8] << 8) |
                               (bytes[offset + 9]));
            arCount = (UInt16)((bytes[offset + 10] << 8) |
                               (bytes[offset + 11]));
        }
Esempio n. 4
0
 public DefaultDnsResponse(int id, DnsOpCode opCode, DnsResponseCode code)
     : base(id, opCode)
 {
     Code = code ?? throw new ArgumentNullException(nameof(code));
 }
Esempio n. 5
0
 public DefaultDnsResponse(int id, DnsOpCode opCode)
     : this(id, opCode, DnsResponseCode.NOERROR)
 {
 }
Esempio n. 6
0
 public DatagramDnsResponse(EndPoint sender, EndPoint recipient, int id, DnsOpCode opCode, DnsResponseCode responseCode)
     : base(id, opCode, responseCode)
 {
     Sender    = sender ?? throw new ArgumentNullException(nameof(sender));
     Recipient = recipient ?? throw new ArgumentNullException(nameof(recipient));
 }
Esempio n. 7
0
 public DatagramDnsResponse(EndPoint sender, EndPoint recipient, int id, DnsOpCode opCode)
     : this(sender, recipient, id, opCode, DnsResponseCode.NOERROR)
 {
 }
Esempio n. 8
0
 public DnsRequestHeader(int id, DnsOpCode queryKind)
     : this(id, true, queryKind)
 {
 }
Esempio n. 9
0
 public DnsRequestHeader(int id, bool useRecursion, DnsOpCode queryKind)
 {
     Id           = id;
     OpCode       = queryKind;
     UseRecursion = useRecursion;
 }
Esempio n. 10
0
        internal static void Write(byte[] buffer, int offset,
                                   ushort id, bool isResponse, DnsOpCode opCode, bool isAuthoritiveAnswer, bool isTruncated,
                                   bool isRecursionDesired, bool isRecursionAvailable, bool futureUse, bool isAuthenticData, bool isCheckingDisabled,
                                   DnsResponseCode responseCode, IList <DnsQueryResourceRecord> queries, IList <DnsDataResourceRecord> answers,
                                   IList <DnsDataResourceRecord> authorities, IList <DnsDataResourceRecord> additionals,
                                   DnsDomainNameCompressionMode domainNameCompressionMode)
        {
            buffer.Write(offset + Offset.Id, id, Endianity.Big);
            byte flags0 = 0;

            if (isResponse)
            {
                flags0 |= Mask.IsResponse;
            }
            flags0 |= (byte)((((byte)opCode) << Shift.OpCode) & Mask.OpCode);
            if (isAuthoritiveAnswer)
            {
                flags0 |= Mask.IsAuthoritiveAnswer;
            }
            if (isTruncated)
            {
                flags0 |= Mask.IsTruncated;
            }
            if (isRecursionDesired)
            {
                flags0 |= Mask.IsRecusionDesired;
            }
            buffer.Write(offset + Offset.IsResponse, flags0);
            byte flags1 = 0;

            if (isRecursionAvailable)
            {
                flags1 |= Mask.IsRecursionAvailable;
            }
            if (futureUse)
            {
                flags1 |= Mask.FutureUse;
            }
            if (isAuthenticData)
            {
                flags1 |= Mask.IsAuthenticData;
            }
            if (isCheckingDisabled)
            {
                flags1 |= Mask.IsCheckingDisabled;
            }
            flags1 |= (byte)((ushort)responseCode & Mask.ResponseCode);
            buffer.Write(offset + Offset.IsRecusionAvailable, flags1);
            DnsDomainNameCompressionData compressionData = new DnsDomainNameCompressionData(domainNameCompressionMode);
            int recordOffset = HeaderLength;

            if (queries != null)
            {
                buffer.Write(offset + Offset.QueryCount, (ushort)queries.Count, Endianity.Big);
                foreach (DnsQueryResourceRecord record in queries)
                {
                    recordOffset += record.Write(buffer, offset, compressionData, recordOffset);
                }
            }
            if (answers != null)
            {
                buffer.Write(offset + Offset.AnswerCount, (ushort)answers.Count, Endianity.Big);
                foreach (DnsDataResourceRecord record in answers)
                {
                    recordOffset += record.Write(buffer, offset, compressionData, recordOffset);
                }
            }
            if (authorities != null)
            {
                buffer.Write(offset + Offset.AuthorityCount, (ushort)authorities.Count, Endianity.Big);
                foreach (DnsDataResourceRecord record in authorities)
                {
                    recordOffset += record.Write(buffer, offset, compressionData, recordOffset);
                }
            }
            if (additionals != null)
            {
                buffer.Write(offset + Offset.AdditionalCount, (ushort)additionals.Count, Endianity.Big);
                foreach (DnsDataResourceRecord record in additionals)
                {
                    recordOffset += record.Write(buffer, offset, compressionData, recordOffset);
                }
            }
        }
Esempio n. 11
0
 /// <summary>
 /// Writes a <see cref="AK.Net.Dns.DnsOpCode"/> to the underlying stream.
 /// </summary>
 /// <param name="value">The value to write.</param>
 /// <exception cref="System.ObjectDisposedException">
 /// Thrown when the writer has been disposed of.
 /// </exception>
 public void WriteOpCode(DnsOpCode value)
 {
     WriteUInt16((ushort)value);
 }
Esempio n. 12
0
 protected AbstractDnsMessage(int id, DnsOpCode opcode)
 {
     Id     = id;
     OpCode = opcode;
     leak   = leakDetector.Track(this);
 }
Esempio n. 13
0
 public DefaultDnsQuery(int id, DnsOpCode opCode) : base(id, opCode)
 {
 }
Esempio n. 14
0
        internal static void Write(byte[] buffer, int offset, ushort id, bool isResponse,
                                   DnsOpCode opCode,
                                   bool isAuthoritiveAnswer, bool isTruncated, bool isRecursionDesired, bool isRecursionAvailable,
                                   bool futureUse, bool isAuthenticData, bool isCheckingDisabled,
                                   DnsResponseCode responseCode,
                                   IList <DnsQueryResourceRecord> queries, IList <DnsDataResourceRecord> answers,
                                   IList <DnsDataResourceRecord> authorities, IList <DnsDataResourceRecord> additionals,
                                   DnsDomainNameCompressionMode domainNameCompressionMode)
        {
            ByteArrayExtensions.Write(buffer, offset, id, Endianity.Big);
            byte num1 = (byte)0;

            if (isResponse)
            {
                num1 |= (byte)sbyte.MinValue;
            }
            byte num2 = (byte)((uint)num1 | (uint)(byte)((int)opCode << 3 & 120));

            if (isAuthoritiveAnswer)
            {
                num2 |= (byte)4;
            }
            if (isTruncated)
            {
                num2 |= (byte)2;
            }
            if (isRecursionDesired)
            {
                num2 |= (byte)1;
            }
            ByteArrayExtensions.Write(buffer, offset + 2, num2);
            byte num3 = (byte)0;

            if (isRecursionAvailable)
            {
                num3 |= (byte)sbyte.MinValue;
            }
            if (futureUse)
            {
                num3 |= (byte)64;
            }
            if (isAuthenticData)
            {
                num3 |= (byte)32;
            }
            if (isCheckingDisabled)
            {
                num3 |= (byte)16;
            }
            byte num4 = (byte)((uint)num3 | (uint)(byte)(responseCode & (DnsResponseCode)15));

            ByteArrayExtensions.Write(buffer, offset + 3, num4);
            DnsDomainNameCompressionData compressionData = new DnsDomainNameCompressionData(domainNameCompressionMode);
            int offsetInDns = 12;

            if (queries != null)
            {
                ByteArrayExtensions.Write(buffer, offset + 4, (ushort)queries.Count, Endianity.Big);
                foreach (DnsQueryResourceRecord queryResourceRecord in (IEnumerable <DnsQueryResourceRecord>)queries)
                {
                    offsetInDns += queryResourceRecord.Write(buffer, offset, compressionData, offsetInDns);
                }
            }
            if (answers != null)
            {
                ByteArrayExtensions.Write(buffer, offset + 6, (ushort)answers.Count, Endianity.Big);
                foreach (DnsDataResourceRecord dataResourceRecord in (IEnumerable <DnsDataResourceRecord>)answers)
                {
                    offsetInDns += dataResourceRecord.Write(buffer, offset, compressionData, offsetInDns);
                }
            }
            if (authorities != null)
            {
                ByteArrayExtensions.Write(buffer, offset + 8, (ushort)authorities.Count, Endianity.Big);
                foreach (DnsDataResourceRecord dataResourceRecord in (IEnumerable <DnsDataResourceRecord>)authorities)
                {
                    offsetInDns += dataResourceRecord.Write(buffer, offset, compressionData, offsetInDns);
                }
            }
            if (additionals == null)
            {
                return;
            }
            ByteArrayExtensions.Write(buffer, offset + 10, (ushort)additionals.Count, Endianity.Big);
            foreach (DnsDataResourceRecord dataResourceRecord in (IEnumerable <DnsDataResourceRecord>)additionals)
            {
                offsetInDns += dataResourceRecord.Write(buffer, offset, compressionData, offsetInDns);
            }
        }
Esempio n. 15
0
 public DnsRequestHeader(bool useRecursion, DnsOpCode queryKind)
 {
     Id           = GetNextUniqueId();
     OpCode       = queryKind;
     UseRecursion = useRecursion;
 }
Esempio n. 16
0
 public DnsRequestHeader(DnsOpCode queryKind)
     : this(true, queryKind)
 {
 }