Class: PacketGen::Header::UDP

Inherits:
Base show all
Defined in:
lib/packetgen/header/udp.rb

Overview

A UDP header consists of:

Create a UDP header

# standalone
udp = PacketGen::Header::UDP.new
# in a packet
pkt = PAcketGen.gen('IP').eadd('UDP')
# access to IP header
pkt.udp    # => PacketGen::Header::UDP

UDP attributes

udp.sport = 65432
udp.dport = 53
udp.length = 43
udp.checksum = 0xffff
udp.body.read 'this is a UDP body'

Author:

  • Sylvain Daubert

Constant Summary collapse

IP_PROTOCOL =

IP protocol number for UDP

17

Instance Attribute Summary collapse

Attributes inherited from Base

#packet

Instance Method Summary collapse

Methods inherited from Base

bind_header, #header_id, inherited, #ip_header, known_headers, #parse?, #protocol_name

Methods inherited from Types::Fields

#[], #[]=, define_bit_fields_on, define_field, define_field_after, define_field_before, #fields, #force_binary, inherited, #inspect, #read, #sz, #to_h, #to_s

Constructor Details

#initialize(options = {}) ⇒ UDP

Call {Base#initialize), and automagically compute length if :body option is set.



64
65
66
67
# File 'lib/packetgen/header/udp.rb', line 64

def initialize(options={})
  super
  self.length += self[:body].sz if self[:body].sz > 0
end

Instance Attribute Details

#bodyTypes::String, Header::Base



55
# File 'lib/packetgen/header/udp.rb', line 55

define_field :body, Types::String

#checksumInteger

16-bit UDP checksum

Returns:

  • (Integer)


52
# File 'lib/packetgen/header/udp.rb', line 52

define_field :checksum, Types::Int16

#dportInteger Also known as: destination_port

16-bit UDP destination port

Returns:

  • (Integer)


44
# File 'lib/packetgen/header/udp.rb', line 44

define_field :dport, Types::Int16

#lengthInteger

16-bit UDP length

Returns:

  • (Integer)


48
# File 'lib/packetgen/header/udp.rb', line 48

define_field :length, Types::Int16, default: 8

#sportInteger Also known as: source_port

16-bit UDP source port

Returns:

  • (Integer)


40
# File 'lib/packetgen/header/udp.rb', line 40

define_field :sport, Types::Int16

Instance Method Details

#calc_checksumInteger

Compute checksum and set checksum field

Returns:

  • (Integer)


71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/packetgen/header/udp.rb', line 71

def calc_checksum
  ip = ip_header(self)
  sum = ip.pseudo_header_checksum
  sum += IP_PROTOCOL
  sum += length
  sum += sport
  sum += dport
  sum += length
  payload = body.to_s
  payload << "\x00" unless payload.size % 2 == 0
  payload.unpack('n*').each { |x| sum += x }

  while sum > 0xffff do
    sum = (sum & 0xffff) + (sum >> 16)
  end
  sum = ~sum & 0xffff
  self[:checksum].value = (sum == 0) ? 0xffff : sum
end

#calc_lengthInteger

Compute length and set length field

Returns:

  • (Integer)


92
93
94
# File 'lib/packetgen/header/udp.rb', line 92

def calc_length
  self[:length].value = self.sz
end