diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/batman-adv/multicast.c | 11 | ||||
| -rw-r--r-- | net/batman-adv/network-coding.c | 2 | ||||
| -rw-r--r-- | net/batman-adv/originator.c | 7 | ||||
| -rw-r--r-- | net/batman-adv/routing.c | 6 | ||||
| -rw-r--r-- | net/bridge/br_input.c | 3 | ||||
| -rw-r--r-- | net/ceph/auth_x.c | 2 | ||||
| -rw-r--r-- | net/ceph/mon_client.c | 2 | ||||
| -rw-r--r-- | net/core/neighbour.c | 44 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nft_redir_ipv4.c | 8 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 4 | ||||
| -rw-r--r-- | net/ipv6/netfilter/nft_redir_ipv6.c | 8 | ||||
| -rw-r--r-- | net/mac80211/key.c | 12 | ||||
| -rw-r--r-- | net/netfilter/ipvs/ip_vs_ftp.c | 10 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_core.c | 20 | ||||
| -rw-r--r-- | net/netfilter/nf_tables_api.c | 14 | ||||
| -rw-r--r-- | net/netfilter/nfnetlink.c | 5 | ||||
| -rw-r--r-- | net/netfilter/nft_nat.c | 8 | ||||
| -rw-r--r-- | net/openvswitch/datapath.c | 3 | ||||
| -rw-r--r-- | net/openvswitch/flow.c | 5 | ||||
| -rw-r--r-- | net/openvswitch/vport.c | 2 | ||||
| -rw-r--r-- | net/packet/af_packet.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xdr.c | 6 | ||||
| -rw-r--r-- | net/tipc/bcast.c | 5 | 
23 files changed, 126 insertions, 63 deletions
| diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c index ab6bb2af1d45..b24e4bb64fb5 100644 --- a/net/batman-adv/multicast.c +++ b/net/batman-adv/multicast.c @@ -685,11 +685,13 @@ static void batadv_mcast_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,  		if (orig_initialized)  			atomic_dec(&bat_priv->mcast.num_disabled);  		orig->capabilities |= BATADV_ORIG_CAPA_HAS_MCAST; -	/* If mcast support is being switched off increase the disabled -	 * mcast node counter. +	/* If mcast support is being switched off or if this is an initial +	 * OGM without mcast support then increase the disabled mcast +	 * node counter.  	 */  	} else if (!orig_mcast_enabled && -		   orig->capabilities & BATADV_ORIG_CAPA_HAS_MCAST) { +		   (orig->capabilities & BATADV_ORIG_CAPA_HAS_MCAST || +		    !orig_initialized)) {  		atomic_inc(&bat_priv->mcast.num_disabled);  		orig->capabilities &= ~BATADV_ORIG_CAPA_HAS_MCAST;  	} @@ -738,7 +740,8 @@ void batadv_mcast_purge_orig(struct batadv_orig_node *orig)  {  	struct batadv_priv *bat_priv = orig->bat_priv; -	if (!(orig->capabilities & BATADV_ORIG_CAPA_HAS_MCAST)) +	if (!(orig->capabilities & BATADV_ORIG_CAPA_HAS_MCAST) && +	    orig->capa_initialized & BATADV_ORIG_CAPA_HAS_MCAST)  		atomic_dec(&bat_priv->mcast.num_disabled);  	batadv_mcast_want_unsnoop_update(bat_priv, orig, BATADV_NO_FLAGS); diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c index 8d04d174669e..fab47f1f3ef9 100644 --- a/net/batman-adv/network-coding.c +++ b/net/batman-adv/network-coding.c @@ -133,7 +133,7 @@ int batadv_nc_mesh_init(struct batadv_priv *bat_priv)  	if (!bat_priv->nc.decoding_hash)  		goto err; -	batadv_hash_set_lock_class(bat_priv->nc.coding_hash, +	batadv_hash_set_lock_class(bat_priv->nc.decoding_hash,  				   &batadv_nc_decoding_hash_lock_class_key);  	INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker); diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c index 6a484514cd3e..bea8198d0198 100644 --- a/net/batman-adv/originator.c +++ b/net/batman-adv/originator.c @@ -570,9 +570,6 @@ static void batadv_orig_node_free_rcu(struct rcu_head *rcu)  	batadv_frag_purge_orig(orig_node, NULL); -	batadv_tt_global_del_orig(orig_node->bat_priv, orig_node, -1, -				  "originator timed out"); -  	if (orig_node->bat_priv->bat_algo_ops->bat_orig_free)  		orig_node->bat_priv->bat_algo_ops->bat_orig_free(orig_node); @@ -678,6 +675,7 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,  	atomic_set(&orig_node->last_ttvn, 0);  	orig_node->tt_buff = NULL;  	orig_node->tt_buff_len = 0; +	orig_node->last_seen = jiffies;  	reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);  	orig_node->bcast_seqno_reset = reset_time;  #ifdef CONFIG_BATMAN_ADV_MCAST @@ -977,6 +975,9 @@ static void _batadv_purge_orig(struct batadv_priv *bat_priv)  			if (batadv_purge_orig_node(bat_priv, orig_node)) {  				batadv_gw_node_delete(bat_priv, orig_node);  				hlist_del_rcu(&orig_node->hash_entry); +				batadv_tt_global_del_orig(orig_node->bat_priv, +							  orig_node, -1, +							  "originator timed out");  				batadv_orig_node_free_ref(orig_node);  				continue;  			} diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index 35f76f2f7824..6648f321864d 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c @@ -443,11 +443,13 @@ batadv_find_router(struct batadv_priv *bat_priv,  	router = batadv_orig_router_get(orig_node, recv_if); +	if (!router) +		return router; +  	/* only consider bonding for recv_if == BATADV_IF_DEFAULT (first hop)  	 * and if activated.  	 */ -	if (recv_if == BATADV_IF_DEFAULT || !atomic_read(&bat_priv->bonding) || -	    !router) +	if (!(recv_if == BATADV_IF_DEFAULT && atomic_read(&bat_priv->bonding)))  		return router;  	/* bonding: loop through the list of possible routers found diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 1f1de715197c..e2aa7be3a847 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c @@ -154,7 +154,8 @@ int br_handle_frame_finish(struct sk_buff *skb)  	dst = NULL;  	if (is_broadcast_ether_addr(dest)) { -		if (p->flags & BR_PROXYARP && +		if (IS_ENABLED(CONFIG_INET) && +		    p->flags & BR_PROXYARP &&  		    skb->protocol == htons(ETH_P_ARP))  			br_do_proxy_arp(skb, br, vid); diff --git a/net/ceph/auth_x.c b/net/ceph/auth_x.c index 15845814a0f2..ba6eb17226da 100644 --- a/net/ceph/auth_x.c +++ b/net/ceph/auth_x.c @@ -676,7 +676,7 @@ static int calcu_signature(struct ceph_x_authorizer *au,  	int ret;  	char tmp_enc[40];  	__le32 tmp[5] = { -		16u, msg->hdr.crc, msg->footer.front_crc, +		cpu_to_le32(16), msg->hdr.crc, msg->footer.front_crc,  		msg->footer.middle_crc, msg->footer.data_crc,  	};  	ret = ceph_x_encrypt(&au->session_key, &tmp, sizeof(tmp), diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c index a83062ceeec9..f2148e22b148 100644 --- a/net/ceph/mon_client.c +++ b/net/ceph/mon_client.c @@ -717,7 +717,7 @@ static int get_poolop_reply_buf(const char *src, size_t src_len,  	if (src_len != sizeof(u32) + dst_len)  		return -EINVAL; -	buf_len = le32_to_cpu(*(u32 *)src); +	buf_len = le32_to_cpu(*(__le32 *)src);  	if (buf_len != dst_len)  		return -EINVAL; diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 8e38f17288d3..8d614c93f86a 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -2043,6 +2043,12 @@ static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh)  			case NDTPA_BASE_REACHABLE_TIME:  				NEIGH_VAR_SET(p, BASE_REACHABLE_TIME,  					      nla_get_msecs(tbp[i])); +				/* update reachable_time as well, otherwise, the change will +				 * only be effective after the next time neigh_periodic_work +				 * decides to recompute it (can be multiple minutes) +				 */ +				p->reachable_time = +					neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));  				break;  			case NDTPA_GC_STALETIME:  				NEIGH_VAR_SET(p, GC_STALETIME, @@ -2921,6 +2927,31 @@ static int neigh_proc_dointvec_unres_qlen(struct ctl_table *ctl, int write,  	return ret;  } +static int neigh_proc_base_reachable_time(struct ctl_table *ctl, int write, +					  void __user *buffer, +					  size_t *lenp, loff_t *ppos) +{ +	struct neigh_parms *p = ctl->extra2; +	int ret; + +	if (strcmp(ctl->procname, "base_reachable_time") == 0) +		ret = neigh_proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos); +	else if (strcmp(ctl->procname, "base_reachable_time_ms") == 0) +		ret = neigh_proc_dointvec_ms_jiffies(ctl, write, buffer, lenp, ppos); +	else +		ret = -1; + +	if (write && ret == 0) { +		/* update reachable_time as well, otherwise, the change will +		 * only be effective after the next time neigh_periodic_work +		 * decides to recompute it +		 */ +		p->reachable_time = +			neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME)); +	} +	return ret; +} +  #define NEIGH_PARMS_DATA_OFFSET(index)	\  	(&((struct neigh_parms *) 0)->data[index]) @@ -3047,6 +3078,19 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,  		t->neigh_vars[NEIGH_VAR_RETRANS_TIME_MS].proc_handler = handler;  		/* ReachableTime (in milliseconds) */  		t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].proc_handler = handler; +	} else { +		/* Those handlers will update p->reachable_time after +		 * base_reachable_time(_ms) is set to ensure the new timer starts being +		 * applied after the next neighbour update instead of waiting for +		 * neigh_periodic_work to update its value (can be multiple minutes) +		 * So any handler that replaces them should do this as well +		 */ +		/* ReachableTime */ +		t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME].proc_handler = +			neigh_proc_base_reachable_time; +		/* ReachableTime (in milliseconds) */ +		t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].proc_handler = +			neigh_proc_base_reachable_time;  	}  	/* Don't export sysctls to unprivileged users */ diff --git a/net/ipv4/netfilter/nft_redir_ipv4.c b/net/ipv4/netfilter/nft_redir_ipv4.c index ff2d23d8c87a..6ecfce63201a 100644 --- a/net/ipv4/netfilter/nft_redir_ipv4.c +++ b/net/ipv4/netfilter/nft_redir_ipv4.c @@ -27,10 +27,10 @@ static void nft_redir_ipv4_eval(const struct nft_expr *expr,  	memset(&mr, 0, sizeof(mr));  	if (priv->sreg_proto_min) { -		mr.range[0].min.all = (__force __be16) -					data[priv->sreg_proto_min].data[0]; -		mr.range[0].max.all = (__force __be16) -					data[priv->sreg_proto_max].data[0]; +		mr.range[0].min.all = +			*(__be16 *)&data[priv->sreg_proto_min].data[0]; +		mr.range[0].max.all = +			*(__be16 *)&data[priv->sreg_proto_max].data[0];  		mr.range[0].flags |= NF_NAT_RANGE_PROTO_SPECIFIED;  	} diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 7f18262e2326..65caf8b95e17 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2019,7 +2019,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,  		if (unlikely(!tcp_snd_wnd_test(tp, skb, mss_now)))  			break; -		if (tso_segs == 1) { +		if (tso_segs == 1 || !max_segs) {  			if (unlikely(!tcp_nagle_test(tp, skb, mss_now,  						     (tcp_skb_is_last(sk, skb) ?  						      nonagle : TCP_NAGLE_PUSH)))) @@ -2032,7 +2032,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,  		}  		limit = mss_now; -		if (tso_segs > 1 && !tcp_urg_mode(tp)) +		if (tso_segs > 1 && max_segs && !tcp_urg_mode(tp))  			limit = tcp_mss_split_point(sk, skb, mss_now,  						    min_t(unsigned int,  							  cwnd_quota, diff --git a/net/ipv6/netfilter/nft_redir_ipv6.c b/net/ipv6/netfilter/nft_redir_ipv6.c index 2433a6bfb191..11820b6b3613 100644 --- a/net/ipv6/netfilter/nft_redir_ipv6.c +++ b/net/ipv6/netfilter/nft_redir_ipv6.c @@ -27,10 +27,10 @@ static void nft_redir_ipv6_eval(const struct nft_expr *expr,  	memset(&range, 0, sizeof(range));  	if (priv->sreg_proto_min) { -		range.min_proto.all = (__force __be16) -					data[priv->sreg_proto_min].data[0]; -		range.max_proto.all = (__force __be16) -					data[priv->sreg_proto_max].data[0]; +		range.min_proto.all = +			*(__be16 *)&data[priv->sreg_proto_min].data[0]; +		range.max_proto.all = +			*(__be16 *)&data[priv->sreg_proto_max].data[0];  		range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED;  	} diff --git a/net/mac80211/key.c b/net/mac80211/key.c index 0bb7038121ac..bd4e46ec32bd 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c @@ -140,7 +140,9 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)  	if (!ret) {  		key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; -		if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) +		if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || +		      (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) || +		      (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)))  			sdata->crypto_tx_tailroom_needed_cnt--;  		WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) && @@ -188,7 +190,9 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)  	sta = key->sta;  	sdata = key->sdata; -	if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) +	if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || +	      (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) || +	      (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)))  		increment_tailroom_need_count(sdata);  	ret = drv_set_key(key->local, DISABLE_KEY, sdata, @@ -884,7 +888,9 @@ void ieee80211_remove_key(struct ieee80211_key_conf *keyconf)  	if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {  		key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; -		if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) +		if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || +		      (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) || +		      (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)))  			increment_tailroom_need_count(key->sdata);  	} diff --git a/net/netfilter/ipvs/ip_vs_ftp.c b/net/netfilter/ipvs/ip_vs_ftp.c index 1d5341f3761d..5d3daae98bf0 100644 --- a/net/netfilter/ipvs/ip_vs_ftp.c +++ b/net/netfilter/ipvs/ip_vs_ftp.c @@ -183,6 +183,8 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,  	struct nf_conn *ct;  	struct net *net; +	*diff = 0; +  #ifdef CONFIG_IP_VS_IPV6  	/* This application helper doesn't work with IPv6 yet,  	 * so turn this into a no-op for IPv6 packets @@ -191,8 +193,6 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,  		return 1;  #endif -	*diff = 0; -  	/* Only useful for established sessions */  	if (cp->state != IP_VS_TCP_S_ESTABLISHED)  		return 1; @@ -322,6 +322,9 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,  	struct ip_vs_conn *n_cp;  	struct net *net; +	/* no diff required for incoming packets */ +	*diff = 0; +  #ifdef CONFIG_IP_VS_IPV6  	/* This application helper doesn't work with IPv6 yet,  	 * so turn this into a no-op for IPv6 packets @@ -330,9 +333,6 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,  		return 1;  #endif -	/* no diff required for incoming packets */ -	*diff = 0; -  	/* Only useful for established sessions */  	if (cp->state != IP_VS_TCP_S_ESTABLISHED)  		return 1; diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index a11674806707..46d1b26a468e 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -611,16 +611,15 @@ __nf_conntrack_confirm(struct sk_buff *skb)  	 */  	NF_CT_ASSERT(!nf_ct_is_confirmed(ct));  	pr_debug("Confirming conntrack %p\n", ct); -	/* We have to check the DYING flag inside the lock to prevent -	   a race against nf_ct_get_next_corpse() possibly called from -	   user context, else we insert an already 'dead' hash, blocking -	   further use of that particular connection -JM */ +	/* We have to check the DYING flag after unlink to prevent +	 * a race against nf_ct_get_next_corpse() possibly called from +	 * user context, else we insert an already 'dead' hash, blocking +	 * further use of that particular connection -JM. +	 */ +	nf_ct_del_from_dying_or_unconfirmed_list(ct); -	if (unlikely(nf_ct_is_dying(ct))) { -		nf_conntrack_double_unlock(hash, reply_hash); -		local_bh_enable(); -		return NF_ACCEPT; -	} +	if (unlikely(nf_ct_is_dying(ct))) +		goto out;  	/* See if there's one in the list already, including reverse:  	   NAT could have grabbed it without realizing, since we're @@ -636,8 +635,6 @@ __nf_conntrack_confirm(struct sk_buff *skb)  		    zone == nf_ct_zone(nf_ct_tuplehash_to_ctrack(h)))  			goto out; -	nf_ct_del_from_dying_or_unconfirmed_list(ct); -  	/* Timer relative to confirmation time, not original  	   setting time, otherwise we'd get timer wrap in  	   weird delay cases. */ @@ -673,6 +670,7 @@ __nf_conntrack_confirm(struct sk_buff *skb)  	return NF_ACCEPT;  out: +	nf_ct_add_to_dying_list(ct);  	nf_conntrack_double_unlock(hash, reply_hash);  	NF_CT_STAT_INC(net, insert_failed);  	local_bh_enable(); diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 129a8daa4abf..3b3ddb4fb9ee 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -713,16 +713,12 @@ static int nft_flush_table(struct nft_ctx *ctx)  	struct nft_chain *chain, *nc;  	struct nft_set *set, *ns; -	list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) { +	list_for_each_entry(chain, &ctx->table->chains, list) {  		ctx->chain = chain;  		err = nft_delrule_by_chain(ctx);  		if (err < 0)  			goto out; - -		err = nft_delchain(ctx); -		if (err < 0) -			goto out;  	}  	list_for_each_entry_safe(set, ns, &ctx->table->sets, list) { @@ -735,6 +731,14 @@ static int nft_flush_table(struct nft_ctx *ctx)  			goto out;  	} +	list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) { +		ctx->chain = chain; + +		err = nft_delchain(ctx); +		if (err < 0) +			goto out; +	} +  	err = nft_deltable(ctx);  out:  	return err; diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index cde4a6702fa3..c421d94c4652 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c @@ -321,7 +321,8 @@ replay:  		nlh = nlmsg_hdr(skb);  		err = 0; -		if (nlh->nlmsg_len < NLMSG_HDRLEN) { +		if (nlmsg_len(nlh) < sizeof(struct nfgenmsg) || +		    skb->len < nlh->nlmsg_len) {  			err = -EINVAL;  			goto ack;  		} @@ -469,7 +470,7 @@ static int nfnetlink_bind(struct net *net, int group)  	int type;  	if (group <= NFNLGRP_NONE || group > NFNLGRP_MAX) -		return -EINVAL; +		return 0;  	type = nfnl_group2type[group]; diff --git a/net/netfilter/nft_nat.c b/net/netfilter/nft_nat.c index afe2b0b45ec4..aff54fb1c8a0 100644 --- a/net/netfilter/nft_nat.c +++ b/net/netfilter/nft_nat.c @@ -65,10 +65,10 @@ static void nft_nat_eval(const struct nft_expr *expr,  	}  	if (priv->sreg_proto_min) { -		range.min_proto.all = (__force __be16) -					data[priv->sreg_proto_min].data[0]; -		range.max_proto.all = (__force __be16) -					data[priv->sreg_proto_max].data[0]; +		range.min_proto.all = +			*(__be16 *)&data[priv->sreg_proto_min].data[0]; +		range.max_proto.all = +			*(__be16 *)&data[priv->sreg_proto_max].data[0];  		range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED;  	} diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 4e9a5f035cbc..b07349e82d78 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -524,7 +524,7 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)  	struct vport *input_vport;  	int len;  	int err; -	bool log = !a[OVS_FLOW_ATTR_PROBE]; +	bool log = !a[OVS_PACKET_ATTR_PROBE];  	err = -EINVAL;  	if (!a[OVS_PACKET_ATTR_PACKET] || !a[OVS_PACKET_ATTR_KEY] || @@ -610,6 +610,7 @@ static const struct nla_policy packet_policy[OVS_PACKET_ATTR_MAX + 1] = {  	[OVS_PACKET_ATTR_PACKET] = { .len = ETH_HLEN },  	[OVS_PACKET_ATTR_KEY] = { .type = NLA_NESTED },  	[OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, +	[OVS_PACKET_ATTR_PROBE] = { .type = NLA_FLAG },  };  static const struct genl_ops dp_packet_genl_ops[] = { diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 70bef2ab7f2b..da2fae0873a5 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -70,6 +70,7 @@ void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags,  {  	struct flow_stats *stats;  	int node = numa_node_id(); +	int len = skb->len + (vlan_tx_tag_present(skb) ? VLAN_HLEN : 0);  	stats = rcu_dereference(flow->stats[node]); @@ -105,7 +106,7 @@ void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags,  				if (likely(new_stats)) {  					new_stats->used = jiffies;  					new_stats->packet_count = 1; -					new_stats->byte_count = skb->len; +					new_stats->byte_count = len;  					new_stats->tcp_flags = tcp_flags;  					spin_lock_init(&new_stats->lock); @@ -120,7 +121,7 @@ void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags,  	stats->used = jiffies;  	stats->packet_count++; -	stats->byte_count += skb->len; +	stats->byte_count += len;  	stats->tcp_flags |= tcp_flags;  unlock:  	spin_unlock(&stats->lock); diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index 53f3ebbfceab..2034c6d9cb5a 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c @@ -480,7 +480,7 @@ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb,  	stats = this_cpu_ptr(vport->percpu_stats);  	u64_stats_update_begin(&stats->syncp);  	stats->rx_packets++; -	stats->rx_bytes += skb->len; +	stats->rx_bytes += skb->len + (vlan_tx_tag_present(skb) ? VLAN_HLEN : 0);  	u64_stats_update_end(&stats->syncp);  	OVS_CB(skb)->input_vport = vport; diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 6880f34a529a..9cfe2e1dd8b5 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -2517,7 +2517,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)  	err = -EINVAL;  	if (sock->type == SOCK_DGRAM) {  		offset = dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len); -		if (unlikely(offset) < 0) +		if (unlikely(offset < 0))  			goto out_free;  	} else {  		if (ll_header_truncated(dev, len)) diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 1cb61242e55e..4439ac4c1b53 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -606,7 +606,7 @@ void xdr_truncate_encode(struct xdr_stream *xdr, size_t len)  	struct kvec *head = buf->head;  	struct kvec *tail = buf->tail;  	int fraglen; -	int new, old; +	int new;  	if (len > buf->len) {  		WARN_ON_ONCE(1); @@ -629,8 +629,8 @@ void xdr_truncate_encode(struct xdr_stream *xdr, size_t len)  	buf->len -= fraglen;  	new = buf->page_base + buf->page_len; -	old = new + fraglen; -	xdr->page_ptr -= (old >> PAGE_SHIFT) - (new >> PAGE_SHIFT); + +	xdr->page_ptr = buf->pages + (new >> PAGE_SHIFT);  	if (buf->page_len) {  		xdr->p = page_address(*xdr->page_ptr); diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 96ceefeb9daf..a9e174fc0f91 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c @@ -220,10 +220,11 @@ static void bclink_retransmit_pkt(u32 after, u32 to)  	struct sk_buff *skb;  	skb_queue_walk(&bcl->outqueue, skb) { -		if (more(buf_seqno(skb), after)) +		if (more(buf_seqno(skb), after)) { +			tipc_link_retransmit(bcl, skb, mod(to - after));  			break; +		}  	} -	tipc_link_retransmit(bcl, skb, mod(to - after));  }  /** | 
