diff options
Diffstat (limited to 'net/tipc/msg.c')
| -rw-r--r-- | net/tipc/msg.c | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index e9263280a2d4..3f0a25345a7c 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c @@ -707,8 +707,11 @@ bool tipc_msg_skb_clone(struct sk_buff_head *msg, struct sk_buff_head *cpy)  bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)  {  	struct tipc_msg *msg = buf_msg(skb); -	u32 dport, dnode; -	u32 onode = tipc_own_addr(net); +	u32 scope = msg_lookup_scope(msg); +	u32 self = tipc_own_addr(net); +	u32 inst = msg_nameinst(msg); +	struct tipc_socket_addr sk; +	struct tipc_uaddr ua;  	if (!msg_isdata(msg))  		return false; @@ -722,16 +725,16 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)  	msg = buf_msg(skb);  	if (msg_reroute_cnt(msg))  		return false; -	dnode = tipc_scope2node(net, msg_lookup_scope(msg)); -	dport = tipc_nametbl_translate(net, msg_nametype(msg), -				       msg_nameinst(msg), &dnode); -	if (!dport) +	tipc_uaddr(&ua, TIPC_SERVICE_RANGE, scope, +		   msg_nametype(msg), inst, inst); +	sk.node = tipc_scope2node(net, scope); +	if (!tipc_nametbl_lookup_anycast(net, &ua, &sk))  		return false;  	msg_incr_reroute_cnt(msg); -	if (dnode != onode) -		msg_set_prevnode(msg, onode); -	msg_set_destnode(msg, dnode); -	msg_set_destport(msg, dport); +	if (sk.node != self) +		msg_set_prevnode(msg, self); +	msg_set_destnode(msg, sk.node); +	msg_set_destport(msg, sk.ref);  	*err = TIPC_OK;  	return true;  |