diff options
Diffstat (limited to 'net/ipv4/tcp_metrics.c')
| -rw-r--r-- | net/ipv4/tcp_metrics.c | 83 | 
1 files changed, 34 insertions, 49 deletions
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c index a51d63a43e33..c8cbc2b4b792 100644 --- a/net/ipv4/tcp_metrics.c +++ b/net/ipv4/tcp_metrics.c @@ -81,11 +81,7 @@ static void tcp_metric_set(struct tcp_metrics_block *tm,  static bool addr_same(const struct inetpeer_addr *a,  		      const struct inetpeer_addr *b)  { -	if (a->family != b->family) -		return false; -	if (a->family == AF_INET) -		return a->addr.a4 == b->addr.a4; -	return ipv6_addr_equal(&a->addr.in6, &b->addr.in6); +	return inetpeer_addr_cmp(a, b) == 0;  }  struct tcpm_hash_bucket { @@ -247,14 +243,14 @@ static struct tcp_metrics_block *__tcp_get_metrics_req(struct request_sock *req,  	daddr.family = req->rsk_ops->family;  	switch (daddr.family) {  	case AF_INET: -		saddr.addr.a4 = inet_rsk(req)->ir_loc_addr; -		daddr.addr.a4 = inet_rsk(req)->ir_rmt_addr; -		hash = (__force unsigned int) daddr.addr.a4; +		inetpeer_set_addr_v4(&saddr, inet_rsk(req)->ir_loc_addr); +		inetpeer_set_addr_v4(&daddr, inet_rsk(req)->ir_rmt_addr); +		hash = ipv4_addr_hash(inet_rsk(req)->ir_rmt_addr);  		break;  #if IS_ENABLED(CONFIG_IPV6)  	case AF_INET6: -		saddr.addr.in6 = inet_rsk(req)->ir_v6_loc_addr; -		daddr.addr.in6 = inet_rsk(req)->ir_v6_rmt_addr; +		inetpeer_set_addr_v6(&saddr, &inet_rsk(req)->ir_v6_loc_addr); +		inetpeer_set_addr_v6(&daddr, &inet_rsk(req)->ir_v6_rmt_addr);  		hash = ipv6_addr_hash(&inet_rsk(req)->ir_v6_rmt_addr);  		break;  #endif @@ -285,25 +281,19 @@ static struct tcp_metrics_block *__tcp_get_metrics_tw(struct inet_timewait_sock  	struct net *net;  	if (tw->tw_family == AF_INET) { -		saddr.family = AF_INET; -		saddr.addr.a4 = tw->tw_rcv_saddr; -		daddr.family = AF_INET; -		daddr.addr.a4 = tw->tw_daddr; -		hash = (__force unsigned int) daddr.addr.a4; +		inetpeer_set_addr_v4(&saddr, tw->tw_rcv_saddr); +		inetpeer_set_addr_v4(&daddr, tw->tw_daddr); +		hash = ipv4_addr_hash(tw->tw_daddr);  	}  #if IS_ENABLED(CONFIG_IPV6)  	else if (tw->tw_family == AF_INET6) {  		if (ipv6_addr_v4mapped(&tw->tw_v6_daddr)) { -			saddr.family = AF_INET; -			saddr.addr.a4 = tw->tw_rcv_saddr; -			daddr.family = AF_INET; -			daddr.addr.a4 = tw->tw_daddr; -			hash = (__force unsigned int) daddr.addr.a4; +			inetpeer_set_addr_v4(&saddr, tw->tw_rcv_saddr); +			inetpeer_set_addr_v4(&daddr, tw->tw_daddr); +			hash = ipv4_addr_hash(tw->tw_daddr);  		} else { -			saddr.family = AF_INET6; -			saddr.addr.in6 = tw->tw_v6_rcv_saddr; -			daddr.family = AF_INET6; -			daddr.addr.in6 = tw->tw_v6_daddr; +			inetpeer_set_addr_v6(&saddr, &tw->tw_v6_rcv_saddr); +			inetpeer_set_addr_v6(&daddr, &tw->tw_v6_daddr);  			hash = ipv6_addr_hash(&tw->tw_v6_daddr);  		}  	} @@ -335,25 +325,19 @@ static struct tcp_metrics_block *tcp_get_metrics(struct sock *sk,  	struct net *net;  	if (sk->sk_family == AF_INET) { -		saddr.family = AF_INET; -		saddr.addr.a4 = inet_sk(sk)->inet_saddr; -		daddr.family = AF_INET; -		daddr.addr.a4 = inet_sk(sk)->inet_daddr; -		hash = (__force unsigned int) daddr.addr.a4; +		inetpeer_set_addr_v4(&saddr, inet_sk(sk)->inet_saddr); +		inetpeer_set_addr_v4(&daddr, inet_sk(sk)->inet_daddr); +		hash = ipv4_addr_hash(inet_sk(sk)->inet_daddr);  	}  #if IS_ENABLED(CONFIG_IPV6)  	else if (sk->sk_family == AF_INET6) {  		if (ipv6_addr_v4mapped(&sk->sk_v6_daddr)) { -			saddr.family = AF_INET; -			saddr.addr.a4 = inet_sk(sk)->inet_saddr; -			daddr.family = AF_INET; -			daddr.addr.a4 = inet_sk(sk)->inet_daddr; -			hash = (__force unsigned int) daddr.addr.a4; +			inetpeer_set_addr_v4(&saddr, inet_sk(sk)->inet_saddr); +			inetpeer_set_addr_v4(&daddr, inet_sk(sk)->inet_daddr); +			hash = ipv4_addr_hash(inet_sk(sk)->inet_daddr);  		} else { -			saddr.family = AF_INET6; -			saddr.addr.in6 = sk->sk_v6_rcv_saddr; -			daddr.family = AF_INET6; -			daddr.addr.in6 = sk->sk_v6_daddr; +			inetpeer_set_addr_v6(&saddr, &sk->sk_v6_rcv_saddr); +			inetpeer_set_addr_v6(&daddr, &sk->sk_v6_daddr);  			hash = ipv6_addr_hash(&sk->sk_v6_daddr);  		}  	} @@ -461,7 +445,7 @@ void tcp_update_metrics(struct sock *sk)  				tcp_metric_set(tm, TCP_METRIC_CWND,  					       tp->snd_cwnd);  		} -	} else if (tp->snd_cwnd > tp->snd_ssthresh && +	} else if (!tcp_in_slow_start(tp) &&  		   icsk->icsk_ca_state == TCP_CA_Open) {  		/* Cong. avoidance phase, cwnd is reliable. */  		if (!tcp_metric_locked(tm, TCP_METRIC_SSTHRESH)) @@ -796,18 +780,18 @@ static int tcp_metrics_fill_info(struct sk_buff *msg,  	switch (tm->tcpm_daddr.family) {  	case AF_INET:  		if (nla_put_in_addr(msg, TCP_METRICS_ATTR_ADDR_IPV4, -				    tm->tcpm_daddr.addr.a4) < 0) +				    inetpeer_get_addr_v4(&tm->tcpm_daddr)) < 0)  			goto nla_put_failure;  		if (nla_put_in_addr(msg, TCP_METRICS_ATTR_SADDR_IPV4, -				    tm->tcpm_saddr.addr.a4) < 0) +				    inetpeer_get_addr_v4(&tm->tcpm_saddr)) < 0)  			goto nla_put_failure;  		break;  	case AF_INET6:  		if (nla_put_in6_addr(msg, TCP_METRICS_ATTR_ADDR_IPV6, -				     &tm->tcpm_daddr.addr.in6) < 0) +				     inetpeer_get_addr_v6(&tm->tcpm_daddr)) < 0)  			goto nla_put_failure;  		if (nla_put_in6_addr(msg, TCP_METRICS_ATTR_SADDR_IPV6, -				     &tm->tcpm_saddr.addr.in6) < 0) +				     inetpeer_get_addr_v6(&tm->tcpm_saddr)) < 0)  			goto nla_put_failure;  		break;  	default: @@ -956,20 +940,21 @@ static int __parse_nl_addr(struct genl_info *info, struct inetpeer_addr *addr,  	a = info->attrs[v4];  	if (a) { -		addr->family = AF_INET; -		addr->addr.a4 = nla_get_in_addr(a); +		inetpeer_set_addr_v4(addr, nla_get_in_addr(a));  		if (hash) -			*hash = (__force unsigned int) addr->addr.a4; +			*hash = ipv4_addr_hash(inetpeer_get_addr_v4(addr));  		return 0;  	}  	a = info->attrs[v6];  	if (a) { +		struct in6_addr in6; +  		if (nla_len(a) != sizeof(struct in6_addr))  			return -EINVAL; -		addr->family = AF_INET6; -		addr->addr.in6 = nla_get_in6_addr(a); +		in6 = nla_get_in6_addr(a); +		inetpeer_set_addr_v6(addr, &in6);  		if (hash) -			*hash = ipv6_addr_hash(&addr->addr.in6); +			*hash = ipv6_addr_hash(inetpeer_get_addr_v6(addr));  		return 0;  	}  	return optional ? 1 : -EAFNOSUPPORT;  |