Openflow parser

This commit is contained in:
Eishun Kondoh 2017-11-13 22:52:53 +09:00
parent 70b0d8919e
commit fc02a678de
338 changed files with 9081 additions and 0 deletions

View file

@ -0,0 +1,20 @@
defmodule Openflow.Instruction.ApplyActions do
defstruct(actions: [])
alias __MODULE__
def new(actions) do
%ApplyActions{actions: actions}
end
def to_binary(%ApplyActions{actions: actions}) do
actions_bin = Openflow.Action.to_binary(actions)
length = 8 + byte_size(actions_bin)
<<4::16, length::16, 0::size(4)-unit(8), actions_bin::bytes>>
end
def read(<<4::16, _length::16, _::size(4)-unit(8), actions_bin::bytes>>) do
actions = Openflow.Action.read(actions_bin)
%ApplyActions{actions: actions}
end
end

View file

@ -0,0 +1,19 @@
defmodule Openflow.Instruction.ClearActions do
defstruct([])
alias __MODULE__
def new do
%ClearActions{}
end
def to_binary(%ClearActions{}) do
actions_bin = ""
length = 8 + byte_size(actions_bin)
<<5::16, length::16, 0::size(4)-unit(8), actions_bin::bytes>>
end
def read(<<5::16, _length::16, _::size(4)-unit(8), _::bytes>>) do
%ClearActions{}
end
end

View file

@ -0,0 +1,18 @@
defmodule Openflow.Instruction.Experimenter do
defstruct(exp_id: 0, data: "")
alias __MODULE__
def new(exp_id, data) do
%Experimenter{exp_id: exp_id, data: data}
end
def to_binary(%Experimenter{exp_id: exp_id, data: data}) do
length = 8 + byte_size(data)
<<0xffff::16, length::16, exp_id::32, data::bytes>>
end
def read(<<0xffff::16, _::16, exp_id::32, data::bytes>>) do
%Experimenter{exp_id: exp_id, data: data}
end
end

View file

@ -0,0 +1,19 @@
defmodule Openflow.Instruction.GotoTable do
defstruct(table_id: 0)
alias __MODULE__
def new(table_id) do
%GotoTable{table_id: table_id}
end
def to_binary(%GotoTable{table_id: table_id}) do
table_id_int = Openflow.Utils.get_enum(table_id, :table_id)
<<1::16, 8::16, table_id_int::8, 0::size(3)-unit(8)>>
end
def read(<<1::16, 8::16, table_id_int::8, _::size(3)-unit(8)>>) do
table_id = Openflow.Utils.get_enum(table_id_int, :table_id)
%GotoTable{table_id: table_id}
end
end

View file

@ -0,0 +1,19 @@
defmodule Openflow.Instruction.Meter do
defstruct(meter_id: 0)
alias __MODULE__
def new(meter_id) do
%Meter{meter_id: meter_id}
end
def to_binary(%Meter{meter_id: meter_id}) do
meter_id_int = Openflow.Utils.get_enum(meter_id, :meter_id)
<<6::16, 8::16, meter_id_int::32>>
end
def read(<<6::16, _::16, meter_id_int::32>>) do
meter_id = Openflow.Utils.get_enum(meter_id_int, :meter_id)
%Meter{meter_id: meter_id}
end
end

View file

@ -0,0 +1,20 @@
defmodule Openflow.Instruction.WriteActions do
defstruct(actions: [])
alias __MODULE__
def new(actions) do
%WriteActions{actions: actions}
end
def to_binary(%WriteActions{actions: actions}) do
actions_bin = Openflow.Action.to_binary(actions)
length = 8 + byte_size(actions_bin)
<<3::16, length::16, 0::size(4)-unit(8), actions_bin::bytes>>
end
def read(<<3::16, _length::16, _::size(4)-unit(8), actions_bin::bytes>>) do
actions = Openflow.Action.read(actions_bin)
%WriteActions{actions: actions}
end
end

View file

@ -0,0 +1,19 @@
defmodule Openflow.Instruction.WriteMetadata do
defstruct(metadata: 0, metadata_mask: 0xffffffffffffffff)
alias __MODULE__
def new(options) do
metadata = Keyword.get(options, :metadata, 0)
metadata_mask = Keyword.get(options, :metadata_mask, 0xffffffffffffffff)
%WriteMetadata{metadata: metadata, metadata_mask: metadata_mask}
end
def to_binary(%WriteMetadata{metadata: metadata, metadata_mask: metadata_mask}) do
<<2::16, 24::16, 0::size(4)-unit(8), metadata::64, metadata_mask::64>>
end
def read(<<2::16, 24::16, _::size(4)-unit(8), metadata::64, metadata_mask::64>>) do
%WriteMetadata{metadata: metadata, metadata_mask: metadata_mask}
end
end