Sha256: 9cfb74be688b7c159c72cc82ebb36dce4c7cf9c3e73faba8a20346a8aa948766
Contents?: true
Size: 1.42 KB
Versions: 1
Compression:
Stored size: 1.42 KB
Contents
require 'pio/payload' module Pio # UDP Header Format. module UdpHeader include Payload # Pseudo UDP header class PseudoUdpHeader < BinData::Record endian :big ip_address :ip_source_address ip_address :ip_destination_address uint8 :padding uint8 :ip_protocol, value: 17 uint16 :udp_length end 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 def calculate_udp_length 8 + udp_payload_binary.length end 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 def udp_payload_binary binary_after :udp_checksum end def pseudo_udp_header PseudoUdpHeader.new(ip_source_address: ip_source_address, ip_destination_address: ip_destination_address, udp_length: udp_length).to_binary_s end def udp_payload_multiple_of_2octets udp_payload_binary + '\x00' * (udp_payload_binary.length.even? ? 0 : 1) end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
pio-0.16.0 | lib/pio/udp_header.rb |