public void getPostMasterの確認() { //setUp string expected = "root.aaa.com."; RrSoa sut = new RrSoa("aaa.com.", 0, "ns.aaa.com.", expected, 1, 2, 3, 4, 5); //exercise string actual = sut.PostMaster; //verify Assert.That(actual, Is.EqualTo(expected)); }
public void getRefreshの確認() { //setUp var expected = 300u; RrSoa sut = new RrSoa("aaa.com.", 0, "ns.aaa.com.", "postmaster.", 1, expected, 3, 4, 5); //exercise uint actual = sut.Refresh; //verify Assert.That(actual, Is.EqualTo(expected)); }
public void getNameServerの確認() { //setUp string expected = "ns.aaa.com."; RrSoa sut = new RrSoa("aaa.com", 0, expected, "post.master.", 1, 2, 3, 4, 5); //exercise string actual = sut.NameServer; //verify Assert.That(actual, Is.EqualTo(expected)); }
public void getMinimumの確認() { //setUp uint expected = 300u; var sut = new RrSoa("aaa.com", 0, "ns.aaa.com.", "postmaster.", 1, 2, 3, 4, expected); //exercise uint actual = sut.Minimum; //verify Assert.That(actual, Is.EqualTo(expected)); }
public void getExpireの確認() { //setUp uint expected = 500u; RrSoa sut = new RrSoa("aaa.com", 0, "ns.aaa.com.", "postmaster.", 1, 2, 3, expected, 5); //exercise uint actual = sut.Expire; //verify Assert.That(actual, Is.EqualTo(expected)); }
//パケット解釈のためのコンストラクタ public PacketDns(byte[] buffer) { Init(); //ヘッダの解釈 _dnsHeader = new PacketDnsHeader(buffer, 0); var offset = _dnsHeader.Length(); // オペコード 0:標準 1:逆 2:サーバ状態 //var c = (short)(Util.htons(_headerDns.Flags) & 0x7800); //var opcode = (ushort)(c >> 11); var flags = _dnsHeader.Flags; var opcode = flags & 0x7800; if (opcode != 0){ // 標準問い合せ以外は対応していない throw new IOException(string.Format("OPCODE not 0 [CPCODE={0}]", opcode)); } //**************************************** //質問/回答/権限/追加フィールド取得 //**************************************** for (var rr = 0; rr < 4; rr++){ //ushort max = Util.htons(_headerDns.Count[rr]);//対象フィールドのデータ数 var max = _dnsHeader.GetCount(rr); if (rr == 0 && max != 1){ //質問エントリーが1でないパケットは処理できません。 throw new IOException(string.Format("QD Entry !=0 [count={0}]", max)); } for (var n = 0; n < max; n++){ //名前の取得 //offsetの移動 名前のサイズが一定ではないので、そのサイズ分だけ進める var u0 = new UnCompress(buffer, offset); offset = u0.OffSet; var name = u0.HostName; //名前以降のリソースレコードを取得 var packetRr = new PacketRr(buffer, offset); var dnsType = packetRr.DnsType; if (rr == 0){ //質問フィールド[QD]の場合は、TTL, DLEN , DATAは無い _ar[rr].Add(new RrQuery(name, dnsType)); //offsetの移動 名前以降の分だけ進める offset += 4; continue; } var ttl = packetRr.Ttl; var dlen = packetRr.DLen; var data = packetRr.Data; //TypeによってはNameが含まれている場合があるが、Nameは圧縮されている可能性があるので、 //いったん、string 戻してから、改めてリソース用に組み直したDataを作成する OneRr oneRr = null; if (dnsType == DnsType.A){ oneRr = new RrA(name, ttl, data); } else if (dnsType == DnsType.Aaaa){ oneRr = new RrAaaa(name, ttl, data); } else if (dnsType == DnsType.Cname || dnsType == DnsType.Ptr || dnsType == DnsType.Ns){ var u1 = new UnCompress(buffer, offset + 10); switch (dnsType){ case DnsType.Cname: oneRr = new RrCname(name, ttl, u1.HostName); break; case DnsType.Ptr: oneRr = new RrPtr(name, ttl, u1.HostName); break; case DnsType.Ns: oneRr = new RrNs(name, ttl, u1.HostName); break; default: Util.RuntimeException(string.Format("DnsPacket() not implement dnsType={0}", dnsType)); break; } } else if (dnsType == DnsType.Mx){ var preference = Conv.GetUShort(buffer, offset + 10); var u2 = new UnCompress(buffer, offset + 12); oneRr = new RrMx(name, ttl, preference, u2.HostName); } else if (dnsType == DnsType.Soa){ var u3 = new UnCompress(buffer, offset + 10); var u4 = new UnCompress(buffer, u3.OffSet); var p = u4.OffSet; var serial = Conv.GetUInt(buffer, p); p += 4; var refresh = Conv.GetUInt(buffer, p); p += 4; var retry = Conv.GetUInt(buffer, p); p += 4; var expire = Conv.GetUInt(buffer, p); p += 4; var minimum = Conv.GetUInt(buffer, p); oneRr = new RrSoa(name, ttl, u3.HostName, u4.HostName, serial, refresh, retry, expire, minimum); } if (oneRr != null){ //A NS MX SOA PTR CNAMEの6種類以外は、処理(追加)しない _ar[rr].Add(oneRr); } offset += 10 + dlen; } //ヘッダ内のRRレコードのエントリー数を設定する _dnsHeader.SetCount(rr, (ushort) _ar[rr].Count); } }
//パケット解釈のためのコンストラクタ public PacketDns(byte[] buffer) { Init(); //ヘッダの解釈 _dnsHeader = new PacketDnsHeader(buffer, 0); var offset = _dnsHeader.Length(); // オペコード 0:標準 1:逆 2:サーバ状態 //var c = (short)(Util.htons(_headerDns.Flags) & 0x7800); //var opcode = (ushort)(c >> 11); var flags = _dnsHeader.Flags; var opcode = flags & 0x7800; if (opcode != 0) { // 標準問い合せ以外は対応していない throw new IOException(string.Format("OPCODE not 0 [CPCODE={0}]", opcode)); } //**************************************** //質問/回答/権限/追加フィールド取得 //**************************************** for (var rr = 0; rr < 4; rr++) { //ushort max = Util.htons(_headerDns.Count[rr]);//対象フィールドのデータ数 var max = _dnsHeader.GetCount(rr); if (rr == 0 && max != 1) { //質問エントリーが1でないパケットは処理できません。 throw new IOException(string.Format("QD Entry !=0 [count={0}]", max)); } for (var n = 0; n < max; n++) { //名前の取得 //offsetの移動 名前のサイズが一定ではないので、そのサイズ分だけ進める var u0 = new UnCompress(buffer, offset); offset = u0.OffSet; var name = u0.HostName; //名前以降のリソースレコードを取得 var packetRr = new PacketRr(buffer, offset); var dnsType = packetRr.DnsType; if (rr == 0) { //質問フィールド[QD]の場合は、TTL, DLEN , DATAは無い _ar[rr].Add(new RrQuery(name, dnsType)); //offsetの移動 名前以降の分だけ進める offset += 4; continue; } var ttl = packetRr.Ttl; var dlen = packetRr.DLen; var data = packetRr.Data; //TypeによってはNameが含まれている場合があるが、Nameは圧縮されている可能性があるので、 //いったん、string 戻してから、改めてリソース用に組み直したDataを作成する OneRr oneRr = null; if (dnsType == DnsType.A) { oneRr = new RrA(name, ttl, data); } else if (dnsType == DnsType.Aaaa) { oneRr = new RrAaaa(name, ttl, data); } else if (dnsType == DnsType.Cname || dnsType == DnsType.Ptr || dnsType == DnsType.Ns) { var u1 = new UnCompress(buffer, offset + 10); switch (dnsType) { case DnsType.Cname: oneRr = new RrCname(name, ttl, u1.HostName); break; case DnsType.Ptr: oneRr = new RrPtr(name, ttl, u1.HostName); break; case DnsType.Ns: oneRr = new RrNs(name, ttl, u1.HostName); break; default: Util.RuntimeException(string.Format("DnsPacket() not implement dnsType={0}", dnsType)); break; } } else if (dnsType == DnsType.Mx) { var preference = Conv.GetUShort(buffer, offset + 10); var u2 = new UnCompress(buffer, offset + 12); oneRr = new RrMx(name, ttl, preference, u2.HostName); } else if (dnsType == DnsType.Soa) { var u3 = new UnCompress(buffer, offset + 10); var u4 = new UnCompress(buffer, u3.OffSet); var p = u4.OffSet; var serial = Conv.GetUInt(buffer, p); p += 4; var refresh = Conv.GetUInt(buffer, p); p += 4; var retry = Conv.GetUInt(buffer, p); p += 4; var expire = Conv.GetUInt(buffer, p); p += 4; var minimum = Conv.GetUInt(buffer, p); oneRr = new RrSoa(name, ttl, u3.HostName, u4.HostName, serial, refresh, retry, expire, minimum); } if (oneRr != null) { //A NS MX SOA PTR CNAMEの6種類以外は、処理(追加)しない _ar[rr].Add(oneRr); } offset += 10 + dlen; } //ヘッダ内のRRレコードのエントリー数を設定する _dnsHeader.SetCount(rr, (ushort)_ar[rr].Count); } }
public void getRetryの確認() { //setUp uint expected = 400u; var sut = new RrSoa("aaa.com.", 0, "ns.aaa.com.", "postmaster.", 1, 2, expected, 4, 5); //exercise uint actual = sut.Retry; //verify Assert.That(actual, Is.EqualTo(expected)); }
public void バイナリ初期化との比較() { //setUp var sut = new RrSoa("aaa.com", 10, "1", "2", 1, 2, 3, 4, 5); var expected = (new RrSoa("aaa.com", 10, new byte[] { 1, 49, 0, 1, 50, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5 })).ToString(); //exercise var actual = sut.ToString(); //verify Assert.That(actual, Is.EqualTo(expected)); }
public void ToStringの確認() { //setUp var expected = "Soa aaa.com. TTL=0 ns.aaa.com. postmaster. 00000001 00000002 00000003 00000004 00000005"; var sut = new RrSoa("aaa.com.", 0, "ns.aaa.com.", "postmaster.", 1, 2, 3, 4, 5); //exercise var actual = sut.ToString(); //verify Assert.That(actual, Is.EqualTo(expected)); }