tres/lib/openflow/utils.ex
Eishun Kondoh 7635272fbd Formatted
2018-01-30 22:47:31 +09:00

77 lines
1.6 KiB
Elixir

defmodule Openflow.Utils do
import Bitwise
def int_to_flags(acc, int, [{type, flagint} | rest]) when (int &&& flagint) == flagint do
int_to_flags([type | acc], int, rest)
end
def int_to_flags(acc, int, [_h | rest]) do
int_to_flags(acc, int, rest)
end
def int_to_flags(acc, _int, []), do: Enum.reverse(acc)
def flags_to_int(acc, [], _enum), do: acc
def flags_to_int(acc0, [flag | rest], enum) do
acc = acc0 ||| Keyword.get(enum, flag, 0)
flags_to_int(acc, rest, enum)
end
def to_hex_string(binary), do: datapath_id(binary)
def padding(length, padding) do
case padding - rem(length, padding) do
^padding -> 0
pad_len -> pad_len
end
end
def pad_length(length, width) do
rem(width - rem(length, width), width)
end
def decode_string(binary) do
String.trim_trailing(binary, <<0>>)
end
def encode_string(binary, length) do
String.pad_trailing(binary, length, <<0>>)
end
def get_enum(int, type) when is_integer(int) do
try do
Openflow.Enums.to_atom(int, type)
catch
:bad_enum -> int
end
end
def get_enum(int, type) do
try do
Openflow.Enums.to_int(int, type)
catch
:bad_enum -> int
end
end
# private functions
defp datapath_id(binary) do
binary
|> split_to_hex_string
|> Enum.join("")
|> String.downcase()
end
defp split_to_hex_string(binary) do
for <<int <- binary>>, do: integer_to_hex(int)
end
defp integer_to_hex(int) do
case Integer.to_string(int, 16) do
<<d>> -> <<48, d>>
dd -> dd
end
end
end