aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_router.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_router.erl')
-rw-r--r--src/ejabberd_router.erl52
1 files changed, 48 insertions, 4 deletions
diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl
index 1e38dba29..8aa337c4c 100644
--- a/src/ejabberd_router.erl
+++ b/src/ejabberd_router.erl
@@ -38,7 +38,8 @@
unregister_route/1,
unregister_routes/1,
dirty_get_all_routes/0,
- dirty_get_all_domains/0
+ dirty_get_all_domains/0,
+ make_id/0
]).
-export([start_link/0]).
@@ -53,6 +54,9 @@
-record(route, {domain, pid, local_hint}).
-record(state, {}).
+%% "rr" stands for Record-Route.
+-define(ROUTE_PREFIX, "rr-").
+
%%====================================================================
%% API
%%====================================================================
@@ -65,7 +69,7 @@ start_link() ->
route(From, To, Packet) ->
- case catch do_route(From, To, Packet) of
+ case catch route_check_id(From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p~nwhen processing: ~p",
[Reason, {From, To, Packet}]);
@@ -192,6 +196,8 @@ dirty_get_all_routes() ->
dirty_get_all_domains() ->
lists:usort(mnesia:dirty_all_keys(route)).
+make_id() ->
+ ?ROUTE_PREFIX ++ randoms:get_string() ++ "-" ++ ejabberd_cluster:node_id().
%%====================================================================
%% gen_server callbacks
@@ -309,6 +315,32 @@ code_change(_OldVsn, State, _Extra) ->
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
+route_check_id(From, To, {xmlelement, "iq", Attrs, _} = Packet) ->
+ case xml:get_attr_s("id", Attrs) of
+ ?ROUTE_PREFIX ++ Rest ->
+ Type = xml:get_attr_s("type", Attrs),
+ if Type == "error"; Type == "result" ->
+ case string:tokens(Rest, "-") of
+ [_, NodeID] ->
+ case ejabberd_cluster:get_node_by_id(NodeID) of
+ Node when Node == node() ->
+ do_route(From, To, Packet);
+ Node ->
+ {ejabberd_router, Node} !
+ {route, From, To, Packet}
+ end;
+ _ ->
+ do_route(From, To, Packet)
+ end;
+ true ->
+ do_route(From, To, Packet)
+ end;
+ _ ->
+ do_route(From, To, Packet)
+ end;
+route_check_id(From, To, Packet) ->
+ do_route(From, To, Packet).
+
do_route(OrigFrom, OrigTo, OrigPacket) ->
?DEBUG("route~n\tfrom ~p~n\tto ~p~n\tpacket ~p~n",
[OrigFrom, OrigTo, OrigPacket]),
@@ -346,9 +378,21 @@ do_route(OrigFrom, OrigTo, OrigPacket) ->
jlib:jid_tolower(From));
bare_destination ->
jlib:jid_remove_resource(
- jlib:jid_tolower(To))
+ jlib:jid_tolower(To));
+ broadcast ->
+ broadcast
end,
case get_component_number(LDstDomain) of
+ _ when Value == broadcast ->
+ lists:foreach(
+ fun(R) ->
+ Pid = R#route.pid,
+ if is_pid(Pid) ->
+ Pid ! {route, From, To, Packet};
+ true ->
+ drop
+ end
+ end, Rs);
undefined ->
case [R || R <- Rs, node(R#route.pid) == node()] of
[] ->
@@ -383,6 +427,7 @@ do_route(OrigFrom, OrigTo, OrigPacket) ->
end
end;
drop ->
+ ?DEBUG("packet dropped~n", []),
ok
end.
@@ -413,4 +458,3 @@ update_tables() ->
false ->
ok
end.
-