example code to work with epcap (erlang pcap)
This commit is contained in:
parent
2e50e402e1
commit
aed61bf02a
|
@ -0,0 +1,66 @@
|
||||||
|
% Test program for epcap (http://github.com/msantos/epcap)
|
||||||
|
%
|
||||||
|
-module(pcap_test).
|
||||||
|
-include("include/epcap_net.hrl").
|
||||||
|
-export([init/1]).
|
||||||
|
|
||||||
|
-define(SCTP_PPI_M3UA, 3).
|
||||||
|
|
||||||
|
-define(M3UA_MSG_CLASS_TRANSFER, 1).
|
||||||
|
-define(M3UA_MSG_TYPE_DATA, 1).
|
||||||
|
|
||||||
|
-record(loop_data, {udpSock, udpDstIP, udpDstPort}).
|
||||||
|
|
||||||
|
% handle a M3UA "prototol data" tag and send its contents off through UDP
|
||||||
|
handle_m3ua_tag(#loop_data{}=LD, ?M3UA_MSG_CLASS_TRANSFER, ?M3UA_MSG_TYPE_DATA,
|
||||||
|
528, Len, <<OPC:4/bytes, DPC:4/bytes, SI:1/bytes, NI:1/bytes,
|
||||||
|
MP:1/bytes, SLS:1/bytes, SCCP/binary>>) ->
|
||||||
|
io:write("Sending SCCP Message of ~p bytes via UDP: ~p~n", Len, SCCP),
|
||||||
|
gen_udp:send(LD#loop_data.udpSock, LD#loop_data.udpDstIP, LD#loop_data.udpDstPort, SCCP);
|
||||||
|
handle_m3ua_tag(#loop_data{}=_LD, Class, Type, Tag, Len, _Bin) ->
|
||||||
|
io:write("Unknown M3UA Tag ~p of Length ~p in Msg class ~p type ~p~n", [Tag, Len, Class, Type]).
|
||||||
|
|
||||||
|
% loop over M3UA parameters and call handle_m3ua_tag() for each of them
|
||||||
|
handle_m3ua_param(#loop_data{}=_LD, _Class, _Type, <<>>) ->
|
||||||
|
ok;
|
||||||
|
handle_m3ua_param(#loop_data{}=LD, Class, Type,
|
||||||
|
<<Tag:2/bytes, Len:2/bytes, Remainder/binary>>) ->
|
||||||
|
Payload = binary:part(Remainder, 0, Len-4),
|
||||||
|
Tail = binary:part(Remainder, Len-4, byte_size(Remainder)-(Len-4)),
|
||||||
|
handle_m3ua_tag(LD, Class, Type, Tag, Len, Payload),
|
||||||
|
handle_m3ua_param(LD, Class, Type, Tail).
|
||||||
|
|
||||||
|
handle_m3ua(LD, <<Release:1/bytes, _Reserved:1/bytes, MsgClass:1/bytes,
|
||||||
|
MsgType:1/bytes, _MsgLen:4/bytes, Remainder/binary>>) ->
|
||||||
|
handle_m3ua_param(LD, MsgClass, MsgType, Remainder).
|
||||||
|
|
||||||
|
handle_sctp_data_chunk(LD, #sctp_chunk_data{ppi=?SCTP_PPI_M3UA}=ChunkData) ->
|
||||||
|
handle_m3ua(LD, ChunkData#sctp_chunk_data.data).
|
||||||
|
|
||||||
|
handle_sctp_chunk(LD, #sctp_chunk{type=0}=Chunk) ->
|
||||||
|
DataChunk = Chunk#sctp_chunk.payload,
|
||||||
|
handle_sctp_data_chunk(LD, DataChunk);
|
||||||
|
handle_sctp_chunk(_LD, #sctp_chunk{type=Type}=_Chunk) ->
|
||||||
|
io:write("Ignoring SCTP chunk type ~p~n", [Type]).
|
||||||
|
|
||||||
|
handle_sctp_chunks(_LD, []) ->
|
||||||
|
ok;
|
||||||
|
handle_sctp_chunks(LD, [Chunk|List]) ->
|
||||||
|
handle_sctp_chunk(LD, Chunk),
|
||||||
|
handle_sctp_chunks(LD, List).
|
||||||
|
|
||||||
|
handle_packet(LD, #ether{}=_Ether, _IP, #sctp{}=Hdr) ->
|
||||||
|
handle_sctp_chunks(LD, Hdr#sctp.chunks).
|
||||||
|
|
||||||
|
init(Filename) ->
|
||||||
|
epcap:start([{file, Filename},{filter,""}]),
|
||||||
|
{ok, Socket} = gen_udp:open(0),
|
||||||
|
loop(#loop_data{udpSock=Socket, udpDstIP="127.0.0.1", udpDstPort=4242}).
|
||||||
|
|
||||||
|
loop(#loop_data{}=LD) ->
|
||||||
|
receive
|
||||||
|
[{pkthdr, _}, {packet, Packet}] ->
|
||||||
|
[Ether, IP, Hdr, _Payload] = epcap_net:decapsulate(Packet),
|
||||||
|
handle_packet(LD, Ether, IP, Hdr),
|
||||||
|
loop(LD)
|
||||||
|
end.
|
Reference in New Issue