diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/bcast.c | 8 | ||||
| -rw-r--r-- | net/tipc/msg.c | 13 | ||||
| -rw-r--r-- | net/tipc/msg.h | 4 | ||||
| -rw-r--r-- | net/tipc/node.c | 6 | ||||
| -rw-r--r-- | net/tipc/udp_media.c | 5 | 
5 files changed, 25 insertions, 11 deletions
| diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 41042de3ae9b..eadba62afa85 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c @@ -42,7 +42,8 @@  #include "core.h"  #define	MAX_PKT_DEFAULT_MCAST	1500	/* bcast link max packet size (fixed) */ -#define	BCLINK_WIN_DEFAULT	20	/* bcast link window size (default) */ +#define	BCLINK_WIN_DEFAULT	50	/* bcast link window size (default) */ +#define	BCLINK_WIN_MIN	        32	/* bcast minimum link window size */  const char tipc_bclink_name[] = "broadcast-link"; @@ -908,9 +909,10 @@ int tipc_bclink_set_queue_limits(struct net *net, u32 limit)  	if (!bcl)  		return -ENOPROTOOPT; -	if ((limit < TIPC_MIN_LINK_WIN) || (limit > TIPC_MAX_LINK_WIN)) +	if (limit < BCLINK_WIN_MIN) +		limit = BCLINK_WIN_MIN; +	if (limit > TIPC_MAX_LINK_WIN)  		return -EINVAL; -  	tipc_bclink_lock(net);  	tipc_link_set_queue_limits(bcl, limit);  	tipc_bclink_unlock(net); diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 562c926a51cc..5f73450159df 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c @@ -121,7 +121,7 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)  {  	struct sk_buff *head = *headbuf;  	struct sk_buff *frag = *buf; -	struct sk_buff *tail; +	struct sk_buff *tail = NULL;  	struct tipc_msg *msg;  	u32 fragid;  	int delta; @@ -141,9 +141,15 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)  		if (unlikely(skb_unclone(frag, GFP_ATOMIC)))  			goto err;  		head = *headbuf = frag; -		skb_frag_list_init(head); -		TIPC_SKB_CB(head)->tail = NULL;  		*buf = NULL; +		TIPC_SKB_CB(head)->tail = NULL; +		if (skb_is_nonlinear(head)) { +			skb_walk_frags(head, tail) { +				TIPC_SKB_CB(head)->tail = tail; +			} +		} else { +			skb_frag_list_init(head); +		}  		return 0;  	} @@ -539,6 +545,7 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)  	*err = -TIPC_ERR_NO_NAME;  	if (skb_linearize(skb))  		return false; +	msg = buf_msg(skb);  	if (msg_reroute_cnt(msg))  		return false;  	dnode = addr_domain(net, msg_lookup_scope(msg)); diff --git a/net/tipc/msg.h b/net/tipc/msg.h index a82c5848d4bc..5351a3f97e8e 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h @@ -357,7 +357,7 @@ static inline u32 msg_importance(struct tipc_msg *m)  	if (likely((usr <= TIPC_CRITICAL_IMPORTANCE) && !msg_errcode(m)))  		return usr;  	if ((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER)) -		return msg_bits(m, 5, 13, 0x7); +		return msg_bits(m, 9, 0, 0x7);  	return TIPC_SYSTEM_IMPORTANCE;  } @@ -366,7 +366,7 @@ static inline void msg_set_importance(struct tipc_msg *m, u32 i)  	int usr = msg_user(m);  	if (likely((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER))) -		msg_set_bits(m, 5, 13, 0x7, i); +		msg_set_bits(m, 9, 0, 0x7, i);  	else if (i < TIPC_SYSTEM_IMPORTANCE)  		msg_set_user(m, i);  	else diff --git a/net/tipc/node.c b/net/tipc/node.c index 703875fd6cde..2c32a83037a3 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -1116,7 +1116,7 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  	}  	/* Ignore duplicate packets */ -	if (less(oseqno, rcv_nxt)) +	if ((usr != LINK_PROTOCOL) && less(oseqno, rcv_nxt))  		return true;  	/* Initiate or update failover mode if applicable */ @@ -1146,8 +1146,8 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  	if (!pl || !tipc_link_is_up(pl))  		return true; -	/* Initiate or update synch mode if applicable */ -	if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG)) { +	/* Initiate synch mode if applicable */ +	if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG) && (oseqno == 1)) {  		syncpt = iseqno + exp_pkts - 1;  		if (!tipc_link_is_up(l)) {  			tipc_link_fsm_evt(l, LINK_ESTABLISH_EVT); diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c index c170d3138953..6e648d90297a 100644 --- a/net/tipc/udp_media.c +++ b/net/tipc/udp_media.c @@ -52,6 +52,8 @@  /* IANA assigned UDP port */  #define UDP_PORT_DEFAULT	6118 +#define UDP_MIN_HEADROOM        28 +  static const struct nla_policy tipc_nl_udp_policy[TIPC_NLA_UDP_MAX + 1] = {  	[TIPC_NLA_UDP_UNSPEC]	= {.type = NLA_UNSPEC},  	[TIPC_NLA_UDP_LOCAL]	= {.type = NLA_BINARY, @@ -156,6 +158,9 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,  	struct sk_buff *clone;  	struct rtable *rt; +	if (skb_headroom(skb) < UDP_MIN_HEADROOM) +		pskb_expand_head(skb, UDP_MIN_HEADROOM, 0, GFP_ATOMIC); +  	clone = skb_clone(skb, GFP_ATOMIC);  	skb_set_inner_protocol(clone, htons(ETH_P_TIPC));  	ub = rcu_dereference_rtnl(b->media_ptr); | 

