aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.c
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2014-06-25 21:41:41 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-27 15:50:56 -0400
commitac0074ee70ddb32f62d918b31cb20e3c947c75a1 (patch)
tree27c0e82b319ecbcbd23c1c3039b4b0e0d5a9ec1c /net/tipc/msg.c
parentec8a2e5621db2da24badb3969eda7fd359e1869f (diff)
tipc: clean up connection protocol reception function
We simplify the code for receiving connection probes, leveraging the recently introduced tipc_msg_reverse() function. We also stick to the principle of sending a possible response message directly from the calling (tipc_sk_rcv or backlog_rcv) functions, hence making the call chain shallower and easier to follow. We make one small protocol change here, allowed according to the spec. If a protocol message arrives from a remote socket that is not the one we are connected to, we are currently generating a connection abort message and send it to the source. This behavior is unnecessary, and might even be a security risk, so instead we now choose to only ignore the message. The consequnce for the sender is that he will need longer time to discover his mistake (until the next timeout), but this is an extreme corner case, and may happen anyway under other circumstances, so we deem this change acceptable. 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.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index 7bfc4422bf2c..6ec958401f78 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -348,13 +348,17 @@ bool tipc_msg_reverse(struct sk_buff *buf, u32 *dnode, int err)
348 struct tipc_msg ohdr; 348 struct tipc_msg ohdr;
349 uint rdsz = min_t(uint, msg_data_sz(msg), MAX_FORWARD_SIZE); 349 uint rdsz = min_t(uint, msg_data_sz(msg), MAX_FORWARD_SIZE);
350 350
351 if (skb_linearize(buf) || !msg_isdata(msg)) 351 if (skb_linearize(buf))
352 goto exit;
353 if (msg_dest_droppable(msg))
352 goto exit; 354 goto exit;
353 if (msg_dest_droppable(msg) || msg_errcode(msg)) 355 if (msg_errcode(msg))
354 goto exit; 356 goto exit;
355 357
356 memcpy(&ohdr, msg, msg_hdr_sz(msg)); 358 memcpy(&ohdr, msg, msg_hdr_sz(msg));
357 msg_set_importance(msg, min_t(uint, ++imp, TIPC_CRITICAL_IMPORTANCE)); 359 imp = min_t(uint, imp + 1, TIPC_CRITICAL_IMPORTANCE);
360 if (msg_isdata(msg))
361 msg_set_importance(msg, imp);
358 msg_set_errcode(msg, err); 362 msg_set_errcode(msg, err);
359 msg_set_origport(msg, msg_destport(&ohdr)); 363 msg_set_origport(msg, msg_destport(&ohdr));
360 msg_set_destport(msg, msg_origport(&ohdr)); 364 msg_set_destport(msg, msg_origport(&ohdr));