lib/pio/open_flow13/packet_out.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'active_support/core_ext/object/try'
require 'pio/open_flow'
require 'pio/open_flow/buffer_id'
require 'pio/open_flow13/actions'

module Pio
  module OpenFlow13
    # OpenFlow 1.3 PacketOut message parser and generator
    class PacketOut < OpenFlow::Message
      # Packet's input port or :controller
      class InPort < BinData::Primitive
        CONTROLLER = 0xfffffffd

        endian :big
        uint32 :in_port

        def get
          in_port == CONTROLLER ? :controller : in_port
        end

        def set(value)
          self.in_port = (value == :controller ? NO_CONTROLLER : value)
        end
      end

      open_flow_header(version: 4, type: 13,
                       length: lambda do
                         24 + actions_length + raw_data.length
                       end)
      buffer_id :buffer_id
      in_port :in_port
      uint16 :actions_length, initial_value: -> { actions.binary.length }
      string :padding, length: 6
      actions13 :actions, length: :actions_length
      string :raw_data, read_length: -> { length - 24 - actions_length }

      def data
        @data ||= Pio::Parser.read(raw_data)
      end

      def method_missing(method, *args)
        bindata_value = data.__send__(method, *args)
        bindata_value.try(:snapshot) || bindata_value
      end
    end
  end
end