diff options
| author | Jon Maloy <jon.maloy@ericsson.com> | 2018-07-06 14:10:03 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-07-07 06:49:01 -0400 |
| commit | 2a57f182420174c7fd4b19db979a2d135231a963 (patch) | |
| tree | 2995b49645166b4f744bfc775079b00b6f6fdf78 /net/tipc/node.c | |
| parent | 0f62aeec0f05e579ea9fd5c09edda48bd8bed73a (diff) | |
tipc: fix wrong return value from function tipc_node_try_addr()
The function for checking if there is an node address conflict is
supposed to return a suggestion for a new address if it finds a
conflict, and zero otherwise. But in case the peer being checked
is previously unknown it does instead return a "suggestion" for
the checked address itself. This results in a DSC_TRIAL_FAIL_MSG
being sent unecessarily to the peer, and sometimes makes the trial
period starting over again.
Fixes: 25b0b9c4e835 ("tipc: handle collisions of 32-bit node address hash values")
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 6a44eb812baf..0453bd451ce8 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
| @@ -797,6 +797,7 @@ static u32 tipc_node_suggest_addr(struct net *net, u32 addr) | |||
| 797 | } | 797 | } |
| 798 | 798 | ||
| 799 | /* tipc_node_try_addr(): Check if addr can be used by peer, suggest other if not | 799 | /* tipc_node_try_addr(): Check if addr can be used by peer, suggest other if not |
| 800 | * Returns suggested address if any, otherwise 0 | ||
| 800 | */ | 801 | */ |
| 801 | u32 tipc_node_try_addr(struct net *net, u8 *id, u32 addr) | 802 | u32 tipc_node_try_addr(struct net *net, u8 *id, u32 addr) |
| 802 | { | 803 | { |
| @@ -819,12 +820,14 @@ u32 tipc_node_try_addr(struct net *net, u8 *id, u32 addr) | |||
| 819 | if (n) { | 820 | if (n) { |
| 820 | addr = n->addr; | 821 | addr = n->addr; |
| 821 | tipc_node_put(n); | 822 | tipc_node_put(n); |
| 823 | return addr; | ||
| 822 | } | 824 | } |
| 823 | /* Even this node may be in trial phase */ | 825 | |
| 826 | /* Even this node may be in conflict */ | ||
| 824 | if (tn->trial_addr == addr) | 827 | if (tn->trial_addr == addr) |
| 825 | return tipc_node_suggest_addr(net, addr); | 828 | return tipc_node_suggest_addr(net, addr); |
| 826 | 829 | ||
| 827 | return addr; | 830 | return 0; |
| 828 | } | 831 | } |
| 829 | 832 | ||
| 830 | void tipc_node_check_dest(struct net *net, u32 addr, | 833 | void tipc_node_check_dest(struct net *net, u32 addr, |
