aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.c
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2014-06-25 21:41:36 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-27 15:50:55 -0400
commit5a379074a7dd6d288ec9e6472769ba0e0c54dd85 (patch)
tree53ef118e4b5276de35a522202bcb739138ba4e83 /net/tipc/msg.c
parent8db1bae30b7cd3c3abc05f467d0f7c69b33b80e9 (diff)
tipc: introduce message evaluation function
When a message arrives in a node and finds no destination socket, we may need to drop it, reject it, or forward it after a secondary destination lookup. The latter two cases currently results in a code path that is perceived as complex, because it follows a deep call chain via obscure functions such as net_route_named_msg() and net_route_msg(). We now introduce a function, tipc_msg_eval(), that takes the decision about whether such a message should be rejected or forwarded, but leaves it to the caller to actually perform the indicated action. If the decision is 'reject', it is still the task of the recently introduced function tipc_msg_reverse() to take the final decision about whether the message is rejectable or not. In the latter case it drops the message. As a result of this change, we can finally eliminate the function net_route_named_msg(), and hence become independent of net_route_msg(). Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Erik Hugne <erik.hugne@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r--net/tipc/msg.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index 6070dd0ec634..7bfc4422bf2c 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -36,6 +36,8 @@
36 36
37#include "core.h" 37#include "core.h"
38#include "msg.h" 38#include "msg.h"
39#include "addr.h"
40#include "name_table.h"
39 41
40#define MAX_FORWARD_SIZE 1024 42#define MAX_FORWARD_SIZE 1024
41 43
@@ -370,3 +372,39 @@ exit:
370 kfree_skb(buf); 372 kfree_skb(buf);
371 return false; 373 return false;
372} 374}
375
376/**
377 * tipc_msg_eval: determine fate of message that found no destination
378 * @buf: the buffer containing the message.
379 * @dnode: return value: next-hop node, if message to be forwarded
380 * @err: error code to use, if message to be rejected
381 *
382 * Does not consume buffer
383 * Returns 0 (TIPC_OK) if message ok and we can try again, -TIPC error
384 * code if message to be rejected
385 */
386int tipc_msg_eval(struct sk_buff *buf, u32 *dnode)
387{
388 struct tipc_msg *msg = buf_msg(buf);
389 u32 dport;
390
391 if (msg_type(msg) != TIPC_NAMED_MSG)
392 return -TIPC_ERR_NO_PORT;
393 if (skb_linearize(buf))
394 return -TIPC_ERR_NO_NAME;
395 if (msg_data_sz(msg) > MAX_FORWARD_SIZE)
396 return -TIPC_ERR_NO_NAME;
397 if (msg_reroute_cnt(msg) > 0)
398 return -TIPC_ERR_NO_NAME;
399
400 *dnode = addr_domain(msg_lookup_scope(msg));
401 dport = tipc_nametbl_translate(msg_nametype(msg),
402 msg_nameinst(msg),
403 dnode);
404 if (!dport)
405 return -TIPC_ERR_NO_NAME;
406 msg_incr_reroute_cnt(msg);
407 msg_set_destnode(msg, *dnode);
408 msg_set_destport(msg, dport);
409 return TIPC_OK;
410}