Sha256: 9476d06770ade95ef342f1547a550478522b0543d3a2df7dbb175a081d11453d

Contents?: true

Size: 1.06 KB

Versions: 3

Compression:

Stored size: 1.06 KB

Contents

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

      mac_address :destination_mac
      mac_address :source_mac
      uint16 :ether_type
    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_header = EtherTypeParser.read(raw_data)
      case ethernet_header.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
        fail 'Failed to parse packet_in data.'
      end
    end
    # rubocop:enable MethodLength
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
pio-0.23.1 lib/pio/parser.rb
pio-0.23.0 lib/pio/parser.rb
pio-0.22.0 lib/pio/parser.rb