diff options
Diffstat (limited to 'net/tipc/socket.c')
| -rw-r--r-- | net/tipc/socket.c | 32 | 
1 files changed, 18 insertions, 14 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 41688da233ab..6552f986774c 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -1364,8 +1364,8 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)  	struct tipc_msg *hdr = &tsk->phdr;  	struct tipc_name_seq *seq;  	struct sk_buff_head pkts; -	u32 dport, dnode = 0; -	u32 type, inst; +	u32 dport = 0, dnode = 0; +	u32 type = 0, inst = 0;  	int mtu, rc;  	if (unlikely(dlen > TIPC_MAX_USER_MSG_SIZE)) @@ -1418,23 +1418,11 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)  		type = dest->addr.name.name.type;  		inst = dest->addr.name.name.instance;  		dnode = dest->addr.name.domain; -		msg_set_type(hdr, TIPC_NAMED_MSG); -		msg_set_hdr_sz(hdr, NAMED_H_SIZE); -		msg_set_nametype(hdr, type); -		msg_set_nameinst(hdr, inst); -		msg_set_lookup_scope(hdr, tipc_node2scope(dnode));  		dport = tipc_nametbl_translate(net, type, inst, &dnode); -		msg_set_destnode(hdr, dnode); -		msg_set_destport(hdr, dport);  		if (unlikely(!dport && !dnode))  			return -EHOSTUNREACH;  	} else if (dest->addrtype == TIPC_ADDR_ID) {  		dnode = dest->addr.id.node; -		msg_set_type(hdr, TIPC_DIRECT_MSG); -		msg_set_lookup_scope(hdr, 0); -		msg_set_destnode(hdr, dnode); -		msg_set_destport(hdr, dest->addr.id.ref); -		msg_set_hdr_sz(hdr, BASIC_H_SIZE);  	} else {  		return -EINVAL;  	} @@ -1445,6 +1433,22 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)  	if (unlikely(rc))  		return rc; +	if (dest->addrtype == TIPC_ADDR_NAME) { +		msg_set_type(hdr, TIPC_NAMED_MSG); +		msg_set_hdr_sz(hdr, NAMED_H_SIZE); +		msg_set_nametype(hdr, type); +		msg_set_nameinst(hdr, inst); +		msg_set_lookup_scope(hdr, tipc_node2scope(dnode)); +		msg_set_destnode(hdr, dnode); +		msg_set_destport(hdr, dport); +	} else { /* TIPC_ADDR_ID */ +		msg_set_type(hdr, TIPC_DIRECT_MSG); +		msg_set_lookup_scope(hdr, 0); +		msg_set_destnode(hdr, dnode); +		msg_set_destport(hdr, dest->addr.id.ref); +		msg_set_hdr_sz(hdr, BASIC_H_SIZE); +	} +  	__skb_queue_head_init(&pkts);  	mtu = tipc_node_get_mtu(net, dnode, tsk->portid, false);  	rc = tipc_msg_build(hdr, m, 0, dlen, mtu, &pkts);  | 
