Class: Dnsruby::Header

Inherits:
Object
  • Object
show all
Defined in:
lib/Dnsruby/message.rb

Overview

The header portion of a DNS packet

RFC 1035 Section 4.1.1

Constant Summary collapse

MAX_ID =
65535

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Header

Returns a new instance of Header.



723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
# File 'lib/Dnsruby/message.rb', line 723

def initialize(*args)
  if (args.length == 0)
    @id = rand(MAX_ID)
    @qr = false
    @opcode=OpCode.Query
    @aa = false
    @ad=false
    @tc = false
    @rd = false # recursion desired
    @ra = false # recursion available
    @cd=false
    @rcode=RCode.NoError
    @qdcount = 0
    @nscount = 0
    @ancount = 0
    @arcount = 0
  elsif (args.length == 1)
    decode(args[0])
  end
end

Instance Attribute Details

#aaObject

Authoritative answer flag



675
676
677
# File 'lib/Dnsruby/message.rb', line 675

def aa
  @aa
end

#adObject

The Authenticated Data flag Relevant in DNSSEC context. (The AD bit is only set on answers where signatures have been cryptographically verified or the server is authoritative for the data and is allowed to set the bit by policy.)



691
692
693
# File 'lib/Dnsruby/message.rb', line 691

def ad
  @ad
end

#ancountObject Also known as: prcount

The number of records in the answer section of the message



719
720
721
# File 'lib/Dnsruby/message.rb', line 719

def ancount
  @ancount
end

#arcountObject Also known as: adcount

The number of records in the additional record section og the message



721
722
723
# File 'lib/Dnsruby/message.rb', line 721

def arcount
  @arcount
end

#cdObject

The Checking Disabled flag



684
685
686
# File 'lib/Dnsruby/message.rb', line 684

def cd
  @cd
end

#idObject

The header ID



669
670
671
# File 'lib/Dnsruby/message.rb', line 669

def id
  @id
end

#nscountObject Also known as: upcount

The number of records in the authoriy section of the message



717
718
719
# File 'lib/Dnsruby/message.rb', line 717

def nscount
  @nscount
end

#opcodeObject

The header opcode



712
713
714
# File 'lib/Dnsruby/message.rb', line 712

def opcode
  @opcode
end

#qdcountObject Also known as: zocount

The number of records in the question section of the message



715
716
717
# File 'lib/Dnsruby/message.rb', line 715

def qdcount
  @qdcount
end

#qrObject

The query response flag



672
673
674
# File 'lib/Dnsruby/message.rb', line 672

def qr
  @qr
end

#raObject

Recursion available flag



697
698
699
# File 'lib/Dnsruby/message.rb', line 697

def ra
  @ra
end

#rdObject

Recursion Desired flag



681
682
683
# File 'lib/Dnsruby/message.rb', line 681

def rd
  @rd
end

#tcObject

Truncated flag



678
679
680
# File 'lib/Dnsruby/message.rb', line 678

def tc
  @tc
end

Class Method Details

.decrement_arcount_encoded(bytes) ⇒ Object



783
784
785
786
787
788
789
790
791
792
793
794
# File 'lib/Dnsruby/message.rb', line 783

def Header.decrement_arcount_encoded(bytes)
  header = Header.new
  header_end = 0
  MessageDecoder.new(bytes) {|msg|
    header.decode(msg)
    header_end = msg.index
  }
  header.arcount = header.arcount - 1
  bytes[0,header_end]=MessageEncoder.new {|msg|
    header.encode(msg)}.to_s
  return bytes
end

.new_from_data(data) ⇒ Object



752
753
754
755
756
757
# File 'lib/Dnsruby/message.rb', line 752

def Header.new_from_data(data)
  header = Header.new
  MessageDecoder.new(data) {|msg|
    header.decode(msg)}
  return header
end

Instance Method Details

#==(other) ⇒ Object



796
797
798
799
800
801
802
803
804
805
806
# File 'lib/Dnsruby/message.rb', line 796

def ==(other)
  return @qr == other.qr &&
    @opcode == other.opcode &&
    @aa == other.aa &&
    @tc == other.tc &&
    @rd == other.rd &&
    @ra == other.ra &&
    @cd == other.cd &&
    @ad == other.ad &&
    @rcode == other.get_header_rcode
end

#dataObject



759
760
761
762
763
# File 'lib/Dnsruby/message.rb', line 759

def data
  return MessageEncoder.new {|msg|
    self.encode(msg)
  }.to_s
end

#decode(msg) ⇒ Object



845
846
847
848
849
850
851
852
853
854
855
856
857
# File 'lib/Dnsruby/message.rb', line 845

def decode(msg)
  @id, flag, @qdcount, @ancount, @nscount, @arcount =
    msg.get_unpack('nnnnnn')
  @qr = (((flag >> 15)&1)==1)?true:false
  @opcode = OpCode.new((flag >> 11) & 15)
  @aa = (((flag >> 10)&1)==1)?true:false
  @tc = (((flag >> 9)&1)==1)?true:false
  @rd = (((flag >> 8)&1)==1)?true:false
  @ra = (((flag >> 7)&1)==1)?true:false
  @ad = (((flag >> 5)&1)==1)?true:false
  @cd = (((flag >> 4)&1)==1)?true:false
  @rcode = RCode.new(flag & 15)
end

#encode(msg) ⇒ Object



765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
# File 'lib/Dnsruby/message.rb', line 765

def encode(msg)
  msg.put_pack('nnnnnn',
    @id,
    (@qr ? 1:0) << 15 |
    (@opcode.code & 15) << 11 |
    (@aa ? 1:0) << 10 |
    (@tc ? 1:0) << 9 |
    (@rd ? 1:0) << 8 |
    (@ra ? 1:0) << 7 |
    (@ad ? 1:0) << 5 |
    (@cd ? 1:0) << 4 |
    (@rcode.code & 15),
    @qdcount,
    @ancount,
    @nscount,
    @arcount)
end

#get_header_rcodeObject

This new get_header_rcode method is intended for use only by the Message class. This is because the Message OPT section may contain an extended rcode (see RFC 2671 section 4.6). Using the header rcode only ignores this extension, and is not recommended.



707
708
709
# File 'lib/Dnsruby/message.rb', line 707

def get_header_rcode
  @rcode
end

#rcode=(rcode) ⇒ Object



748
749
750
# File 'lib/Dnsruby/message.rb', line 748

def rcode=(rcode)
  @rcode = RCode.new(rcode)
end

#to_sObject



808
809
810
# File 'lib/Dnsruby/message.rb', line 808

def to_s
  to_s_with_rcode(@rcode)
end

#to_s_with_rcode(rcode) ⇒ Object



812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
# File 'lib/Dnsruby/message.rb', line 812

def to_s_with_rcode(rcode)
  retval = ";; id = #{@id}\n";
  
  if (@opcode == OpCode::Update)
    retval += ";; qr = #{@qr}    " +\
      "opcode = #{@opcode.string}    "+\
      "rcode = #{@rcode.string}\n";
    
    retval += ";; zocount = #{@qdcount}  "+\
      "prcount = #{@ancount}  " +\
      "upcount = #{@nscount}  "  +\
      "adcount = #{@arcount}\n";
  else
    retval += ";; qr = #{@qr}    "  +\
      "opcode = #{@opcode.string}    " +\
      "aa = #{@aa}    "  +\
      "tc = #{@tc}    " +\
      "rd = #{@rd}\n";
    
    retval += ";; ra = #{@ra}    " +\
      "ad = #{@ad}    "  +\
      "cd = #{@cd}    "  +\
      "rcode  = #{rcode.string}\n";
    
    retval += ";; qdcount = #{@qdcount}  " +\
      "ancount = #{@ancount}  " +\
      "nscount = #{@nscount}  " +\
      "arcount = #{@arcount}\n";
  end
  
  return retval;
end