Sha256: ba6244c6dc70270093ab42dd284e63a40d27f1901114a50dc28737fe45fa67fa

Contents?: true

Size: 1.1 KB

Versions: 5

Compression:

Stored size: 1.1 KB

Contents

require 'pio/ethernet_header'
require 'pio/ipv4_header'

module Pio
  # Raw data parser.
  class Parser
    # Ethernet header parser
    class EthernetFrame < BinData::Record
      endian :big

      mac_address :destination_mac
      mac_address :source_mac
      uint16 :ether_type
      rest :rest
    end

    # IPv4 packet parser
    class IPv4Packet < BinData::Record
      include EthernetHeader
      include IPv4Header

      endian :big

      ethernet_header ether_type: EtherType::IPV4
      ipv4_header

      uint16 :transport_source_port
      uint16 :transport_destination_port
      rest :rest
    end

    # rubocop:disable MethodLength
    def self.read(raw_data)
      ethernet_frame = EthernetFrame.read(raw_data)
      case ethernet_frame.ether_type
      when EthernetHeader::EtherType::IPV4, EthernetHeader::EtherType::VLAN
        IPv4Packet.read raw_data
      when EthernetHeader::EtherType::ARP
        Pio::Arp.read raw_data
      when EthernetHeader::EtherType::LLDP
        Pio::Lldp.read raw_data
      else
        ethernet_frame
      end
    end
    # rubocop:enable MethodLength
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
pio-0.30.0 lib/pio/parser.rb
pio-0.29.0 lib/pio/parser.rb
pio-0.28.1 lib/pio/parser.rb
pio-0.28.0 lib/pio/parser.rb
pio-0.27.2 lib/pio/parser.rb