Skip to content

Commit

Permalink
Add RARP codec
Browse files Browse the repository at this point in the history
  • Loading branch information
shun159 committed Nov 8, 2017
1 parent 6d5e47f commit 625165e
Show file tree
Hide file tree
Showing 9 changed files with 137 additions and 5 deletions.
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Originally part of epcap:
Header = #ether{} | #arp{} | #null{} | #linux_cooked{} |
#ipv4{} | #ipv6{} | #tcp{} | #udp{} | #sctp{} | #icmp{} |
#icmp6{} | #igmp{} | #gre{} | #llc{} | #vrrp{} | #'802.1q'{} |
#lldp{} | #mpls{}
#lldp{} | #mpls{} | #rarp{}
Payload = binary()

Convert network protocols from binary data to a list of Erlang
Expand All @@ -41,7 +41,7 @@ Originally part of epcap:
Header = #ether{} | #arp{} | #null{} | #linux_cooked{} |
#ipv4{} | #ipv6{} | #tcp{} | #udp{} | #sctp{} | #icmp{} |
#icmp6{} | #igmp{} | #gre{} | #llc{} | #vrrp{} | #'802.1q'{} |
#lldp{} | #mpls{}
#lldp{} | #mpls{} | #rarp{}
SoFar = Headers | []
Payload = binary()

Expand Down Expand Up @@ -70,12 +70,13 @@ types.
igmp(Packet) -> {#igmp{}, Payload} | binary()
mpls(Packet) -> {#mpls{}, Next, Payload}
lldp(Packet) -> {#lldp{}, Payload}
rarp(Packet) -> {#rarp{}, Payload}

Types Packet = Header | binary()
Header = #ether{} | #null{} | #linux_cooked{} | #arp{} |
#ipv4{} | #ipv6{} | #tcp{} | #sctp{} | #udp{} |
#icmp{} | #icmp6{} | #igmp{} | #gre{} | #llc{} |
#vrrp{} | #'802.1q'{} | #lldp{} | #mpls{}
#vrrp{} | #'802.1q'{} | #lldp{} | #mpls{} | #rarp{}
Next = ipv4 | ipv6


Expand Down
1 change: 1 addition & 0 deletions include/pkt.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
-include("pkt_llc.hrl").
-include("pkt_802_1q.hrl").
-include("pkt_arp.hrl").
-include("pkt_rarp.hrl").
-include("pkt_lldp.hrl").
-include("pkt_mpls.hrl").

Expand Down
2 changes: 0 additions & 2 deletions include/pkt_arp.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@

-define(ARPOP_REQUEST, 1). % ARP request
-define(ARPOP_REPLY, 2). % ARP reply
-define(ARPOP_RREQUEST, 3). % RARP request
-define(ARPOP_RREPLY, 4). % RARP reply
-define(ARPOP_InREQUEST, 8). % InARP request
-define(ARPOP_InREPLY, 9). % InARP reply
-define(ARPOP_NAK, 10). % (ATM)ARP NAK
Expand Down
1 change: 1 addition & 0 deletions include/pkt_ether.hrl
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
%% From http://en.wikipedia.org/wiki/EtherType
-define(ETH_P_IP, 16#0800).
-define(ETH_P_ARP, 16#0806).
-define(ETH_P_RARP, 16#8035).
-define(ETH_P_IPV6, 16#86DD).
-define(ETH_P_802_1Q, 16#8100).
-define(ETH_P_802_1QinQ, 16#88a8).
Expand Down
20 changes: 20 additions & 0 deletions include/pkt_rarp.hrl
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-ifndef(ARPHRD_ETHER).
-define(ARPHRD_ETHER, 1).
-endif.

-define(ARPOP_RREQUEST, 3). % RARP request
-define(ARPOP_RREPLY, 4). % RARP reply

-record(rarp, {
hrd = ?ARPHRD_ETHER :: pkt:uint16_t(),
pro = ?ETH_P_IP :: pkt:uint16_t(),
hln = 6 :: pkt:uint8_t(),
pln = 4 :: pkt:uint8_t(),
op = ?ARPOP_RREPLY :: pkt:uint16_t(),

sha = <<0,0,0,0,0,0>> :: <<_:48>>,
sip = {127,0,0,1} :: pkt:in_addr(),

tha = <<0,0,0,0,0,0>> :: <<_:48>>,
tip = {127,0,0,1} :: pkt:in_addr()
}).
9 changes: 9 additions & 0 deletions src/pkt.erl
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
'802.1q'/1,
llc/1,
arp/1,
rarp/1,
lldp/1,
null/1,
gre/1,
Expand Down Expand Up @@ -165,6 +166,9 @@ decapsulate_next({gre, Data}, Headers) ->
decapsulate_next({arp, Data}, Headers) ->
{Header, Payload} = arp(Data),
lists:reverse([Payload, Header|Headers]);
decapsulate_next({rarp, Data}, Headers) ->
{Header, Payload} = rarp(Data),
lists:reverse([Payload, Header|Headers]);
decapsulate_next({lldp, Data}, Headers) ->
{Header, Payload} = lldp(Data),
lists:reverse([Payload, Header|Headers]);
Expand Down Expand Up @@ -257,6 +261,7 @@ decode_next({ipv6_none, Data}, Headers) ->

decode_next({Proto, Data}, Headers) when
Proto =:= arp;
Proto =:= rarp;
Proto =:= icmp;
Proto =:= icmp6;
Proto =:= igmp;
Expand Down Expand Up @@ -309,6 +314,10 @@ mpls(N) ->
arp(N) ->
pkt_arp:codec(N).

%% RARP
rarp(N) ->
pkt_rarp:codec(N).

%% LLDP
lldp(N) ->
pkt_lldp:codec(N).
Expand Down
1 change: 1 addition & 0 deletions src/pkt_ether.erl
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
type(?ETH_P_IP) -> ipv4;
type(?ETH_P_IPV6) -> ipv6;
type(?ETH_P_ARP) -> arp;
type(?ETH_P_RARP) -> rarp;
type(?ETH_P_LLDP) -> lldp;
%% IEEE 802.3 Ethernet
type(EtherType) when EtherType < 16#05DC -> llc;
Expand Down
67 changes: 67 additions & 0 deletions src/pkt_rarp.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
%% Copyright (c) 2009-2017, Michael Santos <[email protected]>
%% All rights reserved.
%%
%% Redistribution and use in source and binary forms, with or without
%% modification, are permitted provided that the following conditions
%% are met:
%%
%% Redistributions of source code must retain the above copyright
%% notice, this list of conditions and the following disclaimer.
%%
%% Redistributions in binary form must reproduce the above copyright
%% notice, this list of conditions and the following disclaimer in the
%% documentation and/or other materials provided with the distribution.
%%
%% Neither the name of the author nor the names of its contributors
%% may be used to endorse or promote products derived from this software
%% without specific prior written permission.
%%
%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
%% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
%% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
%% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
%% COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
%% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
%% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
%% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
%% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
%% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
%% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
%% POSSIBILITY OF SUCH DAMAGE.
-module(pkt_rarp).

-include("pkt_ether.hrl").
-include("pkt_rarp.hrl").

-export([codec/1]).

codec(<<Hrd:16, Pro:16,
Hln:8, Pln:8, Op:16,
Sha:6/bytes,
SA1:8, SA2:8, SA3:8, SA4:8,
Tha:6/bytes,
DA1:8, DA2:8, DA3:8, DA4:8,
Payload/binary>>
) ->
{#rarp{
hrd = Hrd, pro = Pro,
hln = Hln, pln = Pln, op = Op,
sha = Sha,
sip = {SA1,SA2,SA3,SA4},
tha = Tha,
tip = {DA1,DA2,DA3,DA4}
}, Payload};
codec(#rarp{
hrd = Hrd, pro = Pro,
hln = Hln, pln = Pln, op = Op,
sha = Sha,
sip = {SA1,SA2,SA3,SA4},
tha = Tha,
tip = {DA1,DA2,DA3,DA4}
}) ->
<<Hrd:16, Pro:16,
Hln:8, Pln:8, Op:16,
Sha:6/bytes,
SA1:8, SA2:8, SA3:8, SA4:8,
Tha:6/bytes,
DA1:8, DA2:8, DA3:8, DA4:8>>.
34 changes: 34 additions & 0 deletions test/pkt_rarp_tests.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
-module(pkt_rarp_tests).

-include_lib("pkt/include/pkt.hrl").
-include_lib("eunit/include/eunit.hrl").

codec_test_() ->
[
decode(),
encode()
].

packet() ->
<<16#ff, 16#ff, 16#ff, 16#ff, 16#ff, 16#ff, 16#00, 16#23,
16#20, 16#a8, 16#84, 16#c2, 16#80, 16#35, 16#00, 16#01,
16#08, 16#00, 16#06, 16#04, 16#00, 16#03, 16#00, 16#23,
16#20, 16#a8, 16#84, 16#c2, 16#00, 16#00, 16#00, 16#00,
16#00, 16#23, 16#20, 16#a8, 16#84, 16#c2, 16#00, 16#00,
16#00, 16#00>>.

decode() ->
[_Ether, RArp, <<>>] = pkt:decapsulate(packet()),
?_assertEqual(
{rarp,1,2048,6,4,3,
<<0,35,32,168,132,194>>,
{0,0,0,0},
<<0,35,32,168,132,194>>,
{0,0,0,0}},
RArp
).

encode() ->
<<_Ether:14/bytes, Packet/bytes>> = packet(),
{Header, Payload} = pkt:rarp(Packet),
?_assertEqual(Packet, <<(pkt:rarp(Header))/binary, Payload/binary>>).

0 comments on commit 625165e

Please sign in to comment.