Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 12 additions & 15 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,20 @@ jobs:
name: Test (OTP ${{ matrix.otp }} / Elixir ${{ matrix.elixir }})
strategy:
matrix:
elixir: ["1.18", "1.17", "1.16", "1.15", "1.14"]
otp: ["27", "26", "25", "24"]
elixir: ["1.19", "1.18", "1.17", "1.16", "1.15"]
otp: ["28", "27", "26", "25", "24"]
exclude:
- { otp: "25", elixir: "1.18" }
- { otp: "24", elixir: "1.19" }
- { otp: "24", elixir: "1.18" }
- { otp: "24", elixir: "1.17" }
- { otp: "25", elixir: "1.19" }
- { otp: "27", elixir: "1.16" }
- { otp: "22", elixir: "1.16" }
- { otp: "27", elixir: "1.15" }
- { otp: "27", elixir: "1.14" }
- { otp: "26", elixir: "1.14" }
- { otp: "28", elixir: "1.17" }
- { otp: "28", elixir: "1.16" }
- { otp: "28", elixir: "1.15" }
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
Expand All @@ -38,19 +39,15 @@ jobs:
lint:
runs-on: ubuntu-latest
name: Linting
strategy:
matrix:
elixir: ["1.18"]
otp: ["27"]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: erlef/setup-beam@v1
id: beam
with:
otp-version: ${{ matrix.otp }}
elixir-version: ${{ matrix.elixir }}
version-file: .tool-versions
version-type: strict
- name: PLT cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
key: |
${{ runner.os }}-${{ steps.beam.outputs.elixir-version }}-${{ steps.beam.outputs.otp-version }}-plt
Expand Down
2 changes: 2 additions & 0 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
erlang 28.3
elixir 1.19.4-otp-28
12 changes: 6 additions & 6 deletions lib/bgp/message/open.ex
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ defmodule BGP.Message.OPEN do
def decode(
<<version::8, asn::16, hold_time::16, bgp_id::binary-size(4), _non_ext_params_length::8,
255::8, length::16, params::binary-size(length)>>,
session
%Session{} = session
) do
decode_open(
version,
asn,
hold_time,
bgp_id,
params,
%Session{session | extended_optional_parameters: true}
%{session | extended_optional_parameters: true}
)
end

Expand Down Expand Up @@ -103,20 +103,20 @@ defmodule BGP.Message.OPEN do

defp decode_parameters(
<<2::8, length::16, parameter::binary-size(length), rest::binary>>,
msg,
%__MODULE__{} = msg,
%Session{extended_optional_parameters: true} = session
) do
{capabilities, session} = Capabilities.decode(parameter, session)
decode_parameters(rest, %__MODULE__{msg | capabilities: capabilities}, session)
decode_parameters(rest, %{msg | capabilities: capabilities}, session)
end

defp decode_parameters(
<<2::8, length::8, parameter::binary-size(length), rest::binary>>,
msg,
%__MODULE__{} = msg,
session
) do
{capabilities, session} = Capabilities.decode(parameter, session)
decode_parameters(rest, %__MODULE__{msg | capabilities: capabilities}, session)
decode_parameters(rest, %{msg | capabilities: capabilities}, session)
end

@impl Encoder
Expand Down
31 changes: 18 additions & 13 deletions lib/bgp/message/open/capabilities.ex
Original file line number Diff line number Diff line change
Expand Up @@ -47,48 +47,53 @@ defmodule BGP.Message.OPEN.Capabilities do
decode_capabilities(rest, capabilities, session)
end

defp decode_capability(1, <<afi::16, _reserved::8, safi::8>>, capabilities, session) do
defp decode_capability(
1,
<<afi::16, _reserved::8, safi::8>>,
%__MODULE__{} = capabilities,
session
) do
with {:ok, afi} <- AFN.decode_afi(afi),
{:ok, safi} <- AFN.decode_safi(safi) do
{%__MODULE__{capabilities | multi_protocol: {afi, safi}}, session}
{%{capabilities | multi_protocol: {afi, safi}}, session}
else
:error ->
raise NOTIFICATION, code: :open_message
end
end

defp decode_capability(2, <<>>, capabilities, session),
do: {%__MODULE__{capabilities | route_refresh: true}, session}
defp decode_capability(2, <<>>, %__MODULE__{} = capabilities, session),
do: {%{capabilities | route_refresh: true}, session}

defp decode_capability(6, <<>>, capabilities, session),
do: {%__MODULE__{capabilities | extended_message: true}, session}
defp decode_capability(6, <<>>, %__MODULE__{} = capabilities, session),
do: {%{capabilities | extended_message: true}, session}

defp decode_capability(
64,
<<restarted::1, _reserved::3, time::12, afs::binary>>,
capabilities,
%__MODULE__{} = capabilities,
session
),
do:
{%__MODULE__{
{%{
capabilities
| graceful_restart: {restarted == 1, time, decode_afs(afs, [])}
}, session}

defp decode_capability(65, <<asn::32>>, capabilities, session) do
defp decode_capability(65, <<asn::32>>, %__MODULE__{} = capabilities, %Session{} = session) do
unless asn >= 1 and asn <= @asn_four_octets_max do
raise NOTIFICATION,
code: :open_message,
subcode: :bad_peer_as,
data: <<asn::size(32)>>
end

{%__MODULE__{capabilities | four_octets_asn: true},
%Session{session | four_octets: true, ibgp: asn == session.asn}}
{%{capabilities | four_octets_asn: true},
%{session | four_octets: true, ibgp: asn == session.asn}}
end

defp decode_capability(70, <<>>, capabilities, session),
do: {%__MODULE__{capabilities | enanched_route_refresh: true}, session}
defp decode_capability(70, <<>>, %__MODULE__{} = capabilities, session),
do: {%{capabilities | enanched_route_refresh: true}, session}

defp decode_capability(_code, _data, _capabilities, _session) do
raise NOTIFICATION, code: :open_message
Expand Down