diff options
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 3a5be1d7e572..c8f6177dd5a2 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -1443,13 +1443,15 @@ int tipc_node_xmit(struct net *net, struct sk_buff_head *list,  	int rc;  	if (in_own_node(net, dnode)) { +		tipc_loopback_trace(net, list); +		spin_lock_init(&list->lock);  		tipc_sk_rcv(net, list);  		return 0;  	}  	n = tipc_node_find(net, dnode);  	if (unlikely(!n)) { -		skb_queue_purge(list); +		__skb_queue_purge(list);  		return -EHOSTUNREACH;  	} @@ -1458,7 +1460,7 @@ int tipc_node_xmit(struct net *net, struct sk_buff_head *list,  	if (unlikely(bearer_id == INVALID_BEARER_ID)) {  		tipc_node_read_unlock(n);  		tipc_node_put(n); -		skb_queue_purge(list); +		__skb_queue_purge(list);  		return -EHOSTUNREACH;  	} @@ -1490,7 +1492,7 @@ int tipc_node_xmit_skb(struct net *net, struct sk_buff *skb, u32 dnode,  {  	struct sk_buff_head head; -	skb_queue_head_init(&head); +	__skb_queue_head_init(&head);  	__skb_queue_tail(&head, skb);  	tipc_node_xmit(net, &head, dnode, selector);  	return 0; @@ -1649,7 +1651,6 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  	int usr = msg_user(hdr);  	int mtyp = msg_type(hdr);  	u16 oseqno = msg_seqno(hdr); -	u16 iseqno = msg_seqno(msg_inner_hdr(hdr));  	u16 exp_pkts = msg_msgcnt(hdr);  	u16 rcv_nxt, syncpt, dlv_nxt, inputq_len;  	int state = n->state; @@ -1748,7 +1749,10 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  	/* Initiate synch mode if applicable */  	if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG) && (oseqno == 1)) { -		syncpt = iseqno + exp_pkts - 1; +		if (n->capabilities & TIPC_TUNNEL_ENHANCED) +			syncpt = msg_syncpt(hdr); +		else +			syncpt = msg_seqno(msg_inner_hdr(hdr)) + exp_pkts - 1;  		if (!tipc_link_is_up(l))  			__tipc_node_link_up(n, bearer_id, xmitq);  		if (n->state == SELF_UP_PEER_UP) {  |