aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.c
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-07-22 10:11:20 -0400
committerDavid S. Miller <davem@davemloft.net>2015-07-26 19:31:50 -0400
commitcda3696d3d26eb798c94de0dab5bd66ddb5627cb (patch)
treea76895b3294564437b327e95dd1742daebbd56a9 /net/tipc/msg.c
parentbcd3ffd4f6d7c994c93be2ab8598fdfb2952a1f1 (diff)
tipc: clean up socket layer message reception
When a message is received in a socket, one of the call chains tipc_sk_rcv()->tipc_sk_enqueue()->filter_rcv()(->tipc_sk_proto_rcv()) or tipc_sk_backlog_rcv()->filter_rcv()(->tipc_sk_proto_rcv()) are followed. At each of these levels we may encounter situations where the message may need to be rejected, or a new message produced for transfer back to the sender. Despite recent improvements, the current code for doing this is perceived as awkward and hard to follow. Leveraging the two previous commits in this series, we now introduce a more uniform handling of such situations. We let each of the functions in the chain itself produce/reverse the message to be returned to the sender, but also perform the actual forwarding. This simplifies the necessary logics within each function. Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r--net/tipc/msg.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index b6cc58ec7346..562c926a51cc 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -520,17 +520,15 @@ exit:
520/** 520/**
521 * tipc_msg_lookup_dest(): try to find new destination for named message 521 * tipc_msg_lookup_dest(): try to find new destination for named message
522 * @skb: the buffer containing the message. 522 * @skb: the buffer containing the message.
523 * @dnode: return value: next-hop node, if destination found 523 * @err: error code to be used by caller if lookup fails
524 * @err: return value: error code to use, if message to be rejected
525 * Does not consume buffer 524 * Does not consume buffer
526 * Returns true if a destination is found, false otherwise 525 * Returns true if a destination is found, false otherwise
527 */ 526 */
528bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, 527bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
529 u32 *dnode, int *err)
530{ 528{
531 struct tipc_msg *msg = buf_msg(skb); 529 struct tipc_msg *msg = buf_msg(skb);
532 u32 dport; 530 u32 dport, dnode;
533 u32 own_addr = tipc_own_addr(net); 531 u32 onode = tipc_own_addr(net);
534 532
535 if (!msg_isdata(msg)) 533 if (!msg_isdata(msg))
536 return false; 534 return false;
@@ -543,15 +541,15 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb,
543 return false; 541 return false;
544 if (msg_reroute_cnt(msg)) 542 if (msg_reroute_cnt(msg))
545 return false; 543 return false;
546 *dnode = addr_domain(net, msg_lookup_scope(msg)); 544 dnode = addr_domain(net, msg_lookup_scope(msg));
547 dport = tipc_nametbl_translate(net, msg_nametype(msg), 545 dport = tipc_nametbl_translate(net, msg_nametype(msg),
548 msg_nameinst(msg), dnode); 546 msg_nameinst(msg), &dnode);
549 if (!dport) 547 if (!dport)
550 return false; 548 return false;
551 msg_incr_reroute_cnt(msg); 549 msg_incr_reroute_cnt(msg);
552 if (*dnode != own_addr) 550 if (dnode != onode)
553 msg_set_prevnode(msg, own_addr); 551 msg_set_prevnode(msg, onode);
554 msg_set_destnode(msg, *dnode); 552 msg_set_destnode(msg, dnode);
555 msg_set_destport(msg, dport); 553 msg_set_destport(msg, dport);
556 *err = TIPC_OK; 554 *err = TIPC_OK;
557 return true; 555 return true;