diff options
author | Ulf Wiger <ulf@feuerlabs.com> | 2016-01-12 08:17:30 -0800 |
---|---|---|
committer | Ulf Wiger <ulf@feuerlabs.com> | 2016-01-12 08:22:36 -0800 |
commit | 37dd6cef3e8abdee0829aabf121a2ca5dd35b14e (patch) | |
tree | b7174d0d66f2db6f9a0d724213ad19e427e22847 /components/dlink_bt | |
parent | 7922125aba23033945e3b55a4bf78ef8e84521d0 (diff) | |
download | rvi_core-37dd6cef3e8abdee0829aabf121a2ca5dd35b14e.tar.gz |
fragmentation tests
Diffstat (limited to 'components/dlink_bt')
-rw-r--r-- | components/dlink_bt/src/bt_connection.erl | 88 | ||||
-rw-r--r-- | components/dlink_bt/src/dlink_bt_rpc.erl | 8 |
2 files changed, 64 insertions, 32 deletions
diff --git a/components/dlink_bt/src/bt_connection.erl b/components/dlink_bt/src/bt_connection.erl index bcfa199..399e70d 100644 --- a/components/dlink_bt/src/bt_connection.erl +++ b/components/dlink_bt/src/bt_connection.erl @@ -29,6 +29,7 @@ -export([accept/6]). -export([send/2]). -export([send/3]). +-export([send_data/2]). -export([is_connection_up/1]). -export([is_connection_up/2]). -export([terminate_connection/1]). @@ -47,6 +48,8 @@ mode = bt, packet_mod = ?PACKET_MOD, packet_st = [], + decode_st = <<>>, + frag_opts = [], mod, func, args @@ -74,6 +77,8 @@ accept(Channel, ListenRef, Mode, Mod, Fun, Arg) -> send(Pid, Data) when is_pid(Pid) -> gen_server:cast(Pid, {send, Data}). +send(Pid, Data, Opts) when is_pid(Pid) -> + gen_server:cast(Pid, {send, Data, Opts}); send(Addr, Channel, Data) -> case bt_connection_manager:find_connection_by_address(Addr, Channel) of {ok, Pid} -> @@ -86,6 +91,9 @@ send(Addr, Channel, Data) -> end. +send_data(Pid, Data) -> + gen_server:cast(Pid, {send_data, Data}). + terminate_connection(Pid) when is_pid(Pid) -> gen_server:call(Pid, terminate_connection). @@ -137,6 +145,10 @@ init({connect, BTAddr, Channel, Mode, Mod, Fun, CS}) -> gen_server:cast(self(), connect), {ok, PktMod} = get_module_config(packet_mod, ?PACKET_MOD, CS), PktSt = PktMod:init(CS), + DefFragMod = dlink_data_msgpack, + DefFragSt = dlink_data_msgpack:init([]), + {ok, FragOpts} = get_module_config( + frag_opts, [{packet_mod, {DefFragMod, DefFragSt}}], CS), {ok, #st{ remote_addr = bt_addr(Mode, BTAddr), channel = Channel, @@ -144,9 +156,10 @@ init({connect, BTAddr, Channel, Mode, Mod, Fun, CS}) -> mode = Mode, mod = Mod, func = Fun, - args = CS, + args = rvi_common:set_value(role, client, CS), packet_mod = PktMod, - packet_st = PktSt + packet_st = PktSt, + frag_opts = FragOpts }}; @@ -182,7 +195,7 @@ init({accept, Channel, ListenRef, Mode, Mod, Fun, CS}) -> mode = Mode, mod = Mod, func = Fun, - args = CS, + args = rvi_common:set_value(role, server, CS), packet_mod = PktMod, packet_st = PktSt }}. @@ -271,13 +284,28 @@ handle_cast({send, Data}, #st{mode = Mode, ?debug("handle_cast(send): Sending: ~p", [Data]), {ok, Encoded, PSt1} = PMod:encode(Data, PSt), ?debug("Encoded = ~p", [Encoded]), - Res = case Mode of - bt -> rfcomm:send(Sock, Encoded); - tcp -> gen_tcp:send(Sock, Encoded) - end, + Res = do_send(Mode, Sock, Encoded), ?debug("send Res = ~p", [Res]), {noreply, St#st{packet_st = PSt1}}; +handle_cast({send, Data, Opts}, #st{mode = Mode, rfcomm_ref = Socket, + packet_mod = PMod, + packet_st = PSt, + frag_opts = FragOpts} = St) -> + ?debug("handle_cast({send, Data, ~p}, ...), FragOpts = ~p", + [Opts, FragOpts]), + {ok, Bin, PSt1} = PMod:encode(Data, PSt), + St1 = St#st{packet_st = PSt1}, + rvi_frag:send(Bin, Opts ++ FragOpts, ?MODULE, + fun() -> + do_send(Mode, Socket, Bin) + end), + {noreply, St1}; + +handle_cast({send_data, Data}, #st{mode = Mode, rfcomm_ref = Socket} = St) -> + do_send(Mode, Socket, Data), + {noreply, St}; + handle_cast(_Msg, State) -> ?warning("~p:handle_cast(): Unknown call: ~p", [ ?MODULE, _Msg]), {noreply, State}. @@ -315,25 +343,24 @@ handle_info({rfcomm, ARef, { accept, BTAddr, _ } }, handle_info({rfcomm, _ConnRef, {data, Data}}, #st { remote_addr = BTAddr, channel = Channel, - packet_mod = PMod, - packet_st = PSt, + decode_st = DSt, + frag_opts = FragOpts, mod = Mod, func = Fun } = State) -> ?debug("~p:handle_info(data): Data: ~p", [ ?MODULE, Data]), ?info("~p:handle_info(data): From: ~p:~p ", [ ?MODULE, BTAddr, Channel]), ?info("~p:handle_info(data): ~p:~p -> ~p:~p", [ ?MODULE, BTAddr, Channel, Mod, Fun]), - case PMod:decode(Data, fun(Elems) -> - handle_elements(Elems, State) - end, PSt) of - {ok, PSt1} -> - {noreply, State#st{packet_st = PSt1}}; + case dlink_data:decode(Data, fun(Elems) -> + got_msg(Elems, State) + end, DSt, ?MODULE, FragOpts) of + {ok, DSt1} -> + {noreply, State#st{decode_st = DSt1}}; {error, Reason} -> - ?error("decode failed: ~p", [Reason]), + ?error("decode failed: Reason = ~p", [Reason]), {stop, Reason, State} end; - handle_info({rfcomm, ConnRef, closed}, #st { remote_addr = BTAddr, channel = Channel, @@ -375,18 +402,21 @@ handle_info({tcp, Sock, Data}, #st{remote_addr = IP, channel = Port, rfcomm_ref = Sock, packet_mod = PMod, - packet_st = PSt} = St) -> - ?debug("handle_info(data): From: ~p:~p", [IP, Port]), - case PMod:decode(Data, fun(Elems) -> - handle_elements(Elems, St) - end, PSt) of - {ok, PSt1} -> + frag_opts = FragOpts, + decode_st = DSt} = St) -> + ?debug("handle_info(Data = ~p): From: ~p:~p", [Data, IP, Port]), + ?debug("PMod = ~p; DSt = ~p", [PMod, DSt]), + case dlink_data:decode(Data, fun(Elems) -> + got_msg(Elems, St) + end, DSt, ?MODULE, FragOpts) of + {ok, DSt1} -> inet:setopts(Sock, [{active, once}]), - {noreply, St#st{packet_st = PSt1}}; + {noreply, St#st{decode_st = DSt1}}; {error, Reason} -> ?error("decode failed, Reason = ~p", [Reason]), {stop, Reason, St} end; + handle_info({inet_async, _L, _Ref, {ok, Sock}} = Msg, #st{mod = Mod, func = Fun, args = Arg} = St) -> @@ -432,14 +462,16 @@ code_change(_OldVsn, State, _Extra) -> %%%=================================================================== %%% Internal functions %%%=================================================================== +do_send(tcp, Sock, Data) -> + gen_tcp:send(Sock, Data); +do_send(bt, Sock, Data) -> + rfcomm:send(Sock, Data). + get_module_config(Key, Default, CS) -> rvi_common:get_module_config(dlink_tcp, dlink_tcp_rpc, Key, Default, CS). -handle_elements(Elements, #st{remote_addr = BTAddr, - channel = Channel, - mod = Mod, - func = Fun, - args = Arg}) -> +got_msg(Elements, #st{remote_addr = BTAddr, channel = Channel, + mod = Mod, func = Fun, args = Arg}) -> ?debug("data complete; processed: ~p", [authorize_keys:abbrev(Elements)]), Mod:Fun(self(), BTAddr, Channel, data, Elements, Arg). diff --git a/components/dlink_bt/src/dlink_bt_rpc.erl b/components/dlink_bt/src/dlink_bt_rpc.erl index 75e7926..2fc6587 100644 --- a/components/dlink_bt/src/dlink_bt_rpc.erl +++ b/components/dlink_bt/src/dlink_bt_rpc.erl @@ -45,7 +45,7 @@ -define(CONNECTION_TABLE, rvi_dlink_bt_connections). -define(SERVICE_TABLE, rvi_dlink_bt_services). --define(DLINK_BT_VER, "1.0"). +-define(DLINK_BT_VER, <<"1.0">>). %% Multiple registrations of the same service, each with a different connection, %% is possible. @@ -579,7 +579,7 @@ handle_call({rvi, disconnect_data_link, [NetworkAddress] }, _From, St) -> { reply, [ Res ], St }; -handle_call({rvi, send_data, [ProtoMod, Service, Data, _DataLinkOpts]}, _From, St) -> +handle_call({rvi, send_data, [ProtoMod, Service, Data, DataLinkOpts]}, _From, St) -> %% Resolve connection pid from service case get_connections_by_service(Service) of @@ -595,7 +595,7 @@ handle_call({rvi, send_data, [ProtoMod, Service, Data, _DataLinkOpts]}, _From, S { ?DLINK_ARG_CMD, ?DLINK_CMD_RECEIVE }, { ?DLINK_ARG_MODULE, atom_to_binary(ProtoMod, latin1) }, { ?DLINK_ARG_DATA, Data } - ]), + ], DataLinkOpts), { reply, [ Res ], St} end; @@ -652,7 +652,7 @@ code_change(_OldVsn, St, _Extra) -> send_authorize(Pid, SetupChannel, CompSpec) -> {Address, Channel} = - case Mode = get_mode(CompSpec) of + case get_mode(CompSpec) of bt -> {ok,[{address, Addr}]} = bt_drv:local_info([address]), {bt_address_to_string(Addr), SetupChannel}; |