diff options
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/addr.c | 7 | ||||
-rw-r--r-- | net/tipc/addr.h | 1 | ||||
-rw-r--r-- | net/tipc/msg.c | 7 |
3 files changed, 14 insertions, 1 deletions
diff --git a/net/tipc/addr.c b/net/tipc/addr.c index 48fd3b5a73fb..ba7daa864d44 100644 --- a/net/tipc/addr.c +++ b/net/tipc/addr.c | |||
@@ -38,6 +38,13 @@ | |||
38 | #include "addr.h" | 38 | #include "addr.h" |
39 | #include "core.h" | 39 | #include "core.h" |
40 | 40 | ||
41 | u32 tipc_own_addr(struct net *net) | ||
42 | { | ||
43 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
44 | |||
45 | return tn->own_addr; | ||
46 | } | ||
47 | |||
41 | /** | 48 | /** |
42 | * in_own_cluster - test for cluster inclusion; <0.0.0> always matches | 49 | * in_own_cluster - test for cluster inclusion; <0.0.0> always matches |
43 | */ | 50 | */ |
diff --git a/net/tipc/addr.h b/net/tipc/addr.h index c700c2d28e09..7ba6d5c8ae40 100644 --- a/net/tipc/addr.h +++ b/net/tipc/addr.h | |||
@@ -55,6 +55,7 @@ static inline u32 tipc_cluster_mask(u32 addr) | |||
55 | return addr & TIPC_CLUSTER_MASK; | 55 | return addr & TIPC_CLUSTER_MASK; |
56 | } | 56 | } |
57 | 57 | ||
58 | u32 tipc_own_addr(struct net *net); | ||
58 | int in_own_cluster(struct net *net, u32 addr); | 59 | int in_own_cluster(struct net *net, u32 addr); |
59 | int in_own_cluster_exact(struct net *net, u32 addr); | 60 | int in_own_cluster_exact(struct net *net, u32 addr); |
60 | int in_own_node(struct net *net, u32 addr); | 61 | int in_own_node(struct net *net, u32 addr); |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 0c6dad8180a0..3bb499c61918 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -511,15 +511,18 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, | |||
511 | { | 511 | { |
512 | struct tipc_msg *msg = buf_msg(skb); | 512 | struct tipc_msg *msg = buf_msg(skb); |
513 | u32 dport; | 513 | u32 dport; |
514 | u32 own_addr = tipc_own_addr(net); | ||
514 | 515 | ||
515 | if (!msg_isdata(msg)) | 516 | if (!msg_isdata(msg)) |
516 | return false; | 517 | return false; |
517 | if (!msg_named(msg)) | 518 | if (!msg_named(msg)) |
518 | return false; | 519 | return false; |
520 | if (msg_errcode(msg)) | ||
521 | return false; | ||
519 | *err = -TIPC_ERR_NO_NAME; | 522 | *err = -TIPC_ERR_NO_NAME; |
520 | if (skb_linearize(skb)) | 523 | if (skb_linearize(skb)) |
521 | return false; | 524 | return false; |
522 | if (msg_reroute_cnt(msg) > 0) | 525 | if (msg_reroute_cnt(msg)) |
523 | return false; | 526 | return false; |
524 | *dnode = addr_domain(net, msg_lookup_scope(msg)); | 527 | *dnode = addr_domain(net, msg_lookup_scope(msg)); |
525 | dport = tipc_nametbl_translate(net, msg_nametype(msg), | 528 | dport = tipc_nametbl_translate(net, msg_nametype(msg), |
@@ -527,6 +530,8 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, | |||
527 | if (!dport) | 530 | if (!dport) |
528 | return false; | 531 | return false; |
529 | msg_incr_reroute_cnt(msg); | 532 | msg_incr_reroute_cnt(msg); |
533 | if (*dnode != own_addr) | ||
534 | msg_set_prevnode(msg, own_addr); | ||
530 | msg_set_destnode(msg, *dnode); | 535 | msg_set_destnode(msg, *dnode); |
531 | msg_set_destport(msg, dport); | 536 | msg_set_destport(msg, dport); |
532 | *err = TIPC_OK; | 537 | *err = TIPC_OK; |