lib/pio/open_flow13/packet_out.rb
# 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