// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
using System.Collections.Generic;
namespace Kaitai
{
///
/// (No support for Auth-Name + Add-Name for simplicity)
///
public partial class DnsPacket : KaitaiStruct
{
public static DnsPacket FromFile(string fileName)
{
return new DnsPacket(new KaitaiStream(fileName));
}
public enum ClassType
{
InClass = 1,
Cs = 2,
Ch = 3,
Hs = 4,
}
public enum TypeType
{
A = 1,
Ns = 2,
Md = 3,
Mf = 4,
Cname = 5,
Soa = 6,
Mb = 7,
Mg = 8,
Mr = 9,
Null = 10,
Wks = 11,
Ptr = 12,
Hinfo = 13,
Minfo = 14,
Mx = 15,
Txt = 16,
Aaaa = 28,
Srv = 33,
}
public DnsPacket(KaitaiStream p__io, KaitaiStruct p__parent = null, DnsPacket p__root = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root ?? this;
_read();
}
private void _read()
{
_transactionId = m_io.ReadU2be();
_flags = new PacketFlags(m_io, this, m_root);
if (Flags.IsOpcodeValid) {
_qdcount = m_io.ReadU2be();
}
if (Flags.IsOpcodeValid) {
_ancount = m_io.ReadU2be();
}
if (Flags.IsOpcodeValid) {
_nscount = m_io.ReadU2be();
}
if (Flags.IsOpcodeValid) {
_arcount = m_io.ReadU2be();
}
if (Flags.IsOpcodeValid) {
_queries = new List();
for (var i = 0; i < Qdcount; i++)
{
_queries.Add(new Query(m_io, this, m_root));
}
}
if (Flags.IsOpcodeValid) {
_answers = new List();
for (var i = 0; i < Ancount; i++)
{
_answers.Add(new Answer(m_io, this, m_root));
}
}
if (Flags.IsOpcodeValid) {
_authorities = new List();
for (var i = 0; i < Nscount; i++)
{
_authorities.Add(new Answer(m_io, this, m_root));
}
}
if (Flags.IsOpcodeValid) {
_additionals = new List();
for (var i = 0; i < Arcount; i++)
{
_additionals.Add(new Answer(m_io, this, m_root));
}
}
}
public partial class MxInfo : KaitaiStruct
{
public static MxInfo FromFile(string fileName)
{
return new MxInfo(new KaitaiStream(fileName));
}
public MxInfo(KaitaiStream p__io, DnsPacket.Answer p__parent = null, DnsPacket p__root = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
_read();
}
private void _read()
{
_preference = m_io.ReadU2be();
_mx = new DomainName(m_io, this, m_root);
}
private ushort _preference;
private DomainName _mx;
private DnsPacket m_root;
private DnsPacket.Answer m_parent;
public ushort Preference { get { return _preference; } }
public DomainName Mx { get { return _mx; } }
public DnsPacket M_Root { get { return m_root; } }
public DnsPacket.Answer M_Parent { get { return m_parent; } }
}
public partial class PointerStruct : KaitaiStruct
{
public static PointerStruct FromFile(string fileName)
{
return new PointerStruct(new KaitaiStream(fileName));
}
public PointerStruct(KaitaiStream p__io, DnsPacket.Label p__parent = null, DnsPacket p__root = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
f_contents = false;
_read();
}
private void _read()
{
_value = m_io.ReadU1();
}
private bool f_contents;
private DomainName _contents;
public DomainName Contents
{
get
{
if (f_contents)
return _contents;
KaitaiStream io = M_Root.M_Io;
long _pos = io.Pos;
io.Seek((Value + ((M_Parent.Length - 192) << 8)));
_contents = new DomainName(io, this, m_root);
io.Seek(_pos);
f_contents = true;
return _contents;
}
}
private byte _value;
private DnsPacket m_root;
private DnsPacket.Label m_parent;
///
/// Read one byte, then offset to that position, read one domain-name and return
///
public byte Value { get { return _value; } }
public DnsPacket M_Root { get { return m_root; } }
public DnsPacket.Label M_Parent { get { return m_parent; } }
}
public partial class Label : KaitaiStruct
{
public static Label FromFile(string fileName)
{
return new Label(new KaitaiStream(fileName));
}
public Label(KaitaiStream p__io, DnsPacket.DomainName p__parent = null, DnsPacket p__root = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
f_isPointer = false;
_read();
}
private void _read()
{
_length = m_io.ReadU1();
if (IsPointer) {
_pointer = new PointerStruct(m_io, this, m_root);
}
if (!(IsPointer)) {
_name = System.Text.Encoding.GetEncoding("utf-8").GetString(m_io.ReadBytes(Length));
}
}
private bool f_isPointer;
private bool _isPointer;
public bool IsPointer
{
get
{
if (f_isPointer)
return _isPointer;
_isPointer = (bool) (Length >= 192);
f_isPointer = true;
return _isPointer;
}
}
private byte _length;
private PointerStruct _pointer;
private string _name;
private DnsPacket m_root;
private DnsPacket.DomainName m_parent;
///
/// RFC1035 4.1.4: If the first two bits are raised it's a pointer-offset to a previously defined name
///
public byte Length { get { return _length; } }
public PointerStruct Pointer { get { return _pointer; } }
///
/// Otherwise its a string the length of the length value
///
public string Name { get { return _name; } }
public DnsPacket M_Root { get { return m_root; } }
public DnsPacket.DomainName M_Parent { get { return m_parent; } }
}
public partial class Query : KaitaiStruct
{
public static Query FromFile(string fileName)
{
return new Query(new KaitaiStream(fileName));
}
public Query(KaitaiStream p__io, DnsPacket p__parent = null, DnsPacket p__root = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
_read();
}
private void _read()
{
_name = new DomainName(m_io, this, m_root);
_type = ((DnsPacket.TypeType) m_io.ReadU2be());
_queryClass = ((DnsPacket.ClassType) m_io.ReadU2be());
}
private DomainName _name;
private TypeType _type;
private ClassType _queryClass;
private DnsPacket m_root;
private DnsPacket m_parent;
public DomainName Name { get { return _name; } }
public TypeType Type { get { return _type; } }
public ClassType QueryClass { get { return _queryClass; } }
public DnsPacket M_Root { get { return m_root; } }
public DnsPacket M_Parent { get { return m_parent; } }
}
public partial class DomainName : KaitaiStruct
{
public static DomainName FromFile(string fileName)
{
return new DomainName(new KaitaiStream(fileName));
}
public DomainName(KaitaiStream p__io, KaitaiStruct p__parent = null, DnsPacket p__root = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
_read();
}
private void _read()
{
_name = new List