EPCAP: return number of processed packets

This commit is contained in:
Harald Welte 2011-03-11 18:21:53 +01:00
parent 43d134c1f9
commit eba9e2527d
2 changed files with 17 additions and 10 deletions

View File

@ -27,29 +27,35 @@
-include_lib("eunit/include/eunit.hrl").
-include_lib("epcap/include/epcap_net.hrl").
-record(loop_data, {
args,
pkt_nr
}).
pcap_apply(File, Filter, Args) ->
epcap:start([{file, File}, {filter, Filter}]),
loop(Args).
loop(#loop_data{args = Args, pkt_nr = 1}).
loop(Args) ->
loop(L = #loop_data{args=Args, pkt_nr = PktNr}) ->
receive
[{pkthdr, {_,_,_,{datalink,Datalink}}}, {packet, Packet}] ->
Decaps = epcap_net:decapsulate_dlt(Datalink, Packet),
handle_pkt_cb(Decaps, Args),
loop(Args);
handle_pkt_cb(PktNr, Decaps, Args),
loop(L#loop_data{pkt_nr = PktNr+1});
{epcap, eof} ->
?debugFmt("EOF from PCAP~n", []),
epcap:stop();
Default ->
epcap:stop(),
{ok, PktNr-1};
_Default ->
?debugFmt("Unknown ~p from PCAP~n", [Default])
end.
handle_pkt_cb([Ether, IP, Hdr, Payload], Args) ->
handle_pkt_cb(PktNr, [Ether, IP, Hdr, Payload], Args) ->
?debugFmt("~p:~n ~p/~p~n", [IP, Hdr, Payload]),
case Hdr of
#sctp{chunks = Chunks} ->
handle_sctp_chunks(Chunks, [Ether, IP, Hdr], Args);
Path = [{epcap_pkt_nr, PktNr}, Ether, IP, Hdr],
handle_sctp_chunks(Chunks, Path, Args);
_ ->
ok
end.

View File

@ -36,7 +36,8 @@ pcap_parse_test() ->
File = "../priv/isup.pcap",
case file:read_file_info(File) of
{ok, _Info} ->
osmo_ss7_pcap:pcap_apply("../priv/isup.pcap", "", Args);
{ok, NrPkts} = osmo_ss7_pcap:pcap_apply("../priv/isup.pcap", "", Args),
?debugFmt("Parsed ~p PCAP packets~n", [NrPkts]);
{error, _Reason} ->
?debugFmt("Skipping PCAP based tests as no ~p could be found~n",
[File])