mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git
				synced 2025-11-01 01:17:13 +10:00 
			
		
		
		
	Merge branch 'bonding-overflow'
Hangbin Liu says: ==================== bonding: fix send_peer_notif overflow Bonding send_peer_notif was defined as u8. But the value is num_peer_notif multiplied by peer_notif_delay, which is u8 * u32. This would cause the send_peer_notif overflow. Before the fix: TEST: num_grat_arp (active-backup miimon num_grat_arp 10) [ OK ] TEST: num_grat_arp (active-backup miimon num_grat_arp 20) [ OK ] 4 garp packets sent on active slave eth1 TEST: num_grat_arp (active-backup miimon num_grat_arp 30) [FAIL] 24 garp packets sent on active slave eth1 TEST: num_grat_arp (active-backup miimon num_grat_arp 50) [FAIL] After the fix: TEST: num_grat_arp (active-backup miimon num_grat_arp 10) [ OK ] TEST: num_grat_arp (active-backup miimon num_grat_arp 20) [ OK ] TEST: num_grat_arp (active-backup miimon num_grat_arp 30) [ OK ] TEST: num_grat_arp (active-backup miimon num_grat_arp 50) [ OK ] ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
						commit
						a5b3363d8c
					
				| @ -776,10 +776,11 @@ peer_notif_delay | ||||
| 	Specify the delay, in milliseconds, between each peer | ||||
| 	notification (gratuitous ARP and unsolicited IPv6 Neighbor | ||||
| 	Advertisement) when they are issued after a failover event. | ||||
| 	This delay should be a multiple of the link monitor interval | ||||
| 	(arp_interval or miimon, whichever is active). The default | ||||
| 	value is 0 which means to match the value of the link monitor | ||||
| 	interval. | ||||
| 	This delay should be a multiple of the MII link monitor interval | ||||
| 	(miimon). | ||||
| 
 | ||||
| 	The valid range is 0 - 300000. The default value is 0, which means | ||||
| 	to match the value of the MII link monitor interval. | ||||
| 
 | ||||
| prio | ||||
| 	Slave priority. A higher number means higher priority. | ||||
|  | ||||
| @ -84,6 +84,11 @@ nla_put_failure: | ||||
| 	return -EMSGSIZE; | ||||
| } | ||||
| 
 | ||||
| /* Limit the max delay range to 300s */ | ||||
| static struct netlink_range_validation delay_range = { | ||||
| 	.max = 300000, | ||||
| }; | ||||
| 
 | ||||
| static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = { | ||||
| 	[IFLA_BOND_MODE]		= { .type = NLA_U8 }, | ||||
| 	[IFLA_BOND_ACTIVE_SLAVE]	= { .type = NLA_U32 }, | ||||
| @ -114,7 +119,7 @@ static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = { | ||||
| 	[IFLA_BOND_AD_ACTOR_SYSTEM]	= { .type = NLA_BINARY, | ||||
| 					    .len  = ETH_ALEN }, | ||||
| 	[IFLA_BOND_TLB_DYNAMIC_LB]	= { .type = NLA_U8 }, | ||||
| 	[IFLA_BOND_PEER_NOTIF_DELAY]    = { .type = NLA_U32 }, | ||||
| 	[IFLA_BOND_PEER_NOTIF_DELAY]    = NLA_POLICY_FULL_RANGE(NLA_U32, &delay_range), | ||||
| 	[IFLA_BOND_MISSED_MAX]		= { .type = NLA_U8 }, | ||||
| 	[IFLA_BOND_NS_IP6_TARGET]	= { .type = NLA_NESTED }, | ||||
| }; | ||||
|  | ||||
| @ -169,6 +169,12 @@ static const struct bond_opt_value bond_num_peer_notif_tbl[] = { | ||||
| 	{ NULL,      -1,  0} | ||||
| }; | ||||
| 
 | ||||
| static const struct bond_opt_value bond_peer_notif_delay_tbl[] = { | ||||
| 	{ "off",     0,   0}, | ||||
| 	{ "maxval",  300000, BOND_VALFLAG_MAX}, | ||||
| 	{ NULL,      -1,  0} | ||||
| }; | ||||
| 
 | ||||
| static const struct bond_opt_value bond_primary_reselect_tbl[] = { | ||||
| 	{ "always",  BOND_PRI_RESELECT_ALWAYS,  BOND_VALFLAG_DEFAULT}, | ||||
| 	{ "better",  BOND_PRI_RESELECT_BETTER,  0}, | ||||
| @ -488,7 +494,7 @@ static const struct bond_option bond_opts[BOND_OPT_LAST] = { | ||||
| 		.id = BOND_OPT_PEER_NOTIF_DELAY, | ||||
| 		.name = "peer_notif_delay", | ||||
| 		.desc = "Delay between each peer notification on failover event, in milliseconds", | ||||
| 		.values = bond_intmax_tbl, | ||||
| 		.values = bond_peer_notif_delay_tbl, | ||||
| 		.set = bond_option_peer_notif_delay_set | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| @ -233,7 +233,7 @@ struct bonding { | ||||
| 	 */ | ||||
| 	spinlock_t mode_lock; | ||||
| 	spinlock_t stats_lock; | ||||
| 	u8	 send_peer_notif; | ||||
| 	u32	 send_peer_notif; | ||||
| 	u8       igmp_retrans; | ||||
| #ifdef CONFIG_PROC_FS | ||||
| 	struct   proc_dir_entry *proc_entry; | ||||
|  | ||||
| @ -6,6 +6,7 @@ | ||||
| ALL_TESTS=" | ||||
| 	prio | ||||
| 	arp_validate | ||||
| 	num_grat_arp | ||||
| " | ||||
| 
 | ||||
| REQUIRE_MZ=no | ||||
| @ -255,6 +256,55 @@ arp_validate() | ||||
| 	arp_validate_ns "active-backup" | ||||
| } | ||||
| 
 | ||||
| garp_test() | ||||
| { | ||||
| 	local param="$1" | ||||
| 	local active_slave exp_num real_num i | ||||
| 	RET=0 | ||||
| 
 | ||||
| 	# create bond | ||||
| 	bond_reset "${param}" | ||||
| 
 | ||||
| 	bond_check_connection | ||||
| 	[ $RET -ne 0 ] && log_test "num_grat_arp" "$retmsg" | ||||
| 
 | ||||
| 
 | ||||
| 	# Add tc rules to count GARP number | ||||
| 	for i in $(seq 0 2); do | ||||
| 		tc -n ${g_ns} filter add dev s$i ingress protocol arp pref 1 handle 101 \ | ||||
| 			flower skip_hw arp_op request arp_sip ${s_ip4} arp_tip ${s_ip4} action pass | ||||
| 	done | ||||
| 
 | ||||
| 	# Do failover | ||||
| 	active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave") | ||||
| 	ip -n ${s_ns} link set ${active_slave} down | ||||
| 
 | ||||
| 	exp_num=$(echo "${param}" | cut -f6 -d ' ') | ||||
| 	sleep $((exp_num + 2)) | ||||
| 
 | ||||
| 	active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave") | ||||
| 
 | ||||
| 	# check result | ||||
| 	real_num=$(tc_rule_handle_stats_get "dev s${active_slave#eth} ingress" 101 ".packets" "-n ${g_ns}") | ||||
| 	if [ "${real_num}" -ne "${exp_num}" ]; then | ||||
| 		echo "$real_num garp packets sent on active slave ${active_slave}" | ||||
| 		RET=1 | ||||
| 	fi | ||||
| 
 | ||||
| 	for i in $(seq 0 2); do | ||||
| 		tc -n ${g_ns} filter del dev s$i ingress | ||||
| 	done | ||||
| } | ||||
| 
 | ||||
| num_grat_arp() | ||||
| { | ||||
| 	local val | ||||
| 	for val in 10 20 30 50; do | ||||
| 		garp_test "mode active-backup miimon 100 num_grat_arp $val peer_notify_delay 1000" | ||||
| 		log_test "num_grat_arp" "active-backup miimon num_grat_arp $val" | ||||
| 	done | ||||
| } | ||||
| 
 | ||||
| trap cleanup EXIT | ||||
| 
 | ||||
| setup_prepare | ||||
|  | ||||
| @ -61,6 +61,8 @@ server_create() | ||||
| 		ip -n ${g_ns} link set s${i} up | ||||
| 		ip -n ${g_ns} link set s${i} master br0 | ||||
| 		ip -n ${s_ns} link set eth${i} master bond0 | ||||
| 
 | ||||
| 		tc -n ${g_ns} qdisc add dev s${i} clsact | ||||
| 	done | ||||
| 
 | ||||
| 	ip -n ${s_ns} link set bond0 up | ||||
|  | ||||
| @ -791,8 +791,9 @@ tc_rule_handle_stats_get() | ||||
| 	local id=$1; shift | ||||
| 	local handle=$1; shift | ||||
| 	local selector=${1:-.packets}; shift | ||||
| 	local netns=${1:-""}; shift | ||||
| 
 | ||||
| 	tc -j -s filter show $id \ | ||||
| 	tc $netns -j -s filter show $id \ | ||||
| 	    | jq ".[] | select(.options.handle == $handle) | \ | ||||
| 		  .options.actions[0].stats$selector" | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user