module Pio::UdpHeader

UDP Header Format.

Public Class Methods

included(klass) click to toggle source
# File lib/pio/udp_header.rb, line 20
def self.included(klass)
  def klass.udp_header
    uint16 :udp_source_port
    uint16 :udp_destination_port
    uint16 :udp_length, initial_value: :calculate_udp_length
    uint16 :udp_checksum, initial_value: :calculate_udp_checksum
  end
end

Private Instance Methods

calculate_udp_checksum() click to toggle source
# File lib/pio/udp_header.rb, line 35
def calculate_udp_checksum
  sum = [*pseudo_udp_header.unpack('n*'),
         udp_source_port,
         udp_destination_port,
         udp_length,
         *udp_payload_multiple_of_2octets.unpack('n*')].inject(:+)
  ~((sum & 0xffff) + (sum >> 16)) & 0xffff
end
calculate_udp_length() click to toggle source
# File lib/pio/udp_header.rb, line 31
def calculate_udp_length
  8 + udp_payload_binary.length
end
pseudo_udp_header() click to toggle source
# File lib/pio/udp_header.rb, line 48
def pseudo_udp_header
  PseudoUdpHeader.new(source_ip_address: source_ip_address,
                      destination_ip_address: destination_ip_address,
                      udp_length: udp_length).to_binary_s
end
udp_payload_binary() click to toggle source
# File lib/pio/udp_header.rb, line 44
def udp_payload_binary
  binary_after :udp_checksum
end
udp_payload_multiple_of_2octets() click to toggle source
# File lib/pio/udp_header.rb, line 54
def udp_payload_multiple_of_2octets
  udp_payload_binary + '\x00' * (udp_payload_binary.length.even? ? 0 : 1)
end