udp: Neaten and reduce size of compute_score functions
The compute_score functions are a bit difficult to read. Neaten them a bit to reduce object sizes and make them a bit more intelligible. Return early to avoid indentation and avoid unnecessary initializations. (allyesconfig, but w/ -O2 and no profiling) $ size net/ipv[46]/udp.o.* text data bss dec hex filename 28680 1184 25 29889 74c1 net/ipv4/udp.o.new 28756 1184 25 29965 750d net/ipv4/udp.o.old 17600 1010 2 18612 48b4 net/ipv6/udp.o.new 17632 1010 2 18644 48d4 net/ipv6/udp.o.old Signed-off-by: Joe Perches <joe@perches.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
b0ba512e25
Коммит
60c04aecd8
|
@ -336,38 +336,45 @@ int udp_v4_get_port(struct sock *sk, unsigned short snum)
|
||||||
return udp_lib_get_port(sk, snum, ipv4_rcv_saddr_equal, hash2_nulladdr);
|
return udp_lib_get_port(sk, snum, ipv4_rcv_saddr_equal, hash2_nulladdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int compute_score(struct sock *sk, struct net *net, __be32 saddr,
|
static inline int compute_score(struct sock *sk, struct net *net,
|
||||||
unsigned short hnum,
|
__be32 saddr, unsigned short hnum, __be16 sport,
|
||||||
__be16 sport, __be32 daddr, __be16 dport, int dif)
|
__be32 daddr, __be16 dport, int dif)
|
||||||
{
|
{
|
||||||
int score = -1;
|
int score;
|
||||||
|
struct inet_sock *inet;
|
||||||
|
|
||||||
if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum &&
|
if (!net_eq(sock_net(sk), net) ||
|
||||||
!ipv6_only_sock(sk)) {
|
udp_sk(sk)->udp_port_hash != hnum ||
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
ipv6_only_sock(sk))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
score = (sk->sk_family == PF_INET) ? 2 : 1;
|
||||||
|
inet = inet_sk(sk);
|
||||||
|
|
||||||
score = (sk->sk_family == PF_INET ? 2 : 1);
|
|
||||||
if (inet->inet_rcv_saddr) {
|
if (inet->inet_rcv_saddr) {
|
||||||
if (inet->inet_rcv_saddr != daddr)
|
if (inet->inet_rcv_saddr != daddr)
|
||||||
return -1;
|
return -1;
|
||||||
score += 4;
|
score += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inet->inet_daddr) {
|
if (inet->inet_daddr) {
|
||||||
if (inet->inet_daddr != saddr)
|
if (inet->inet_daddr != saddr)
|
||||||
return -1;
|
return -1;
|
||||||
score += 4;
|
score += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inet->inet_dport) {
|
if (inet->inet_dport) {
|
||||||
if (inet->inet_dport != sport)
|
if (inet->inet_dport != sport)
|
||||||
return -1;
|
return -1;
|
||||||
score += 4;
|
score += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_bound_dev_if) {
|
if (sk->sk_bound_dev_if) {
|
||||||
if (sk->sk_bound_dev_if != dif)
|
if (sk->sk_bound_dev_if != dif)
|
||||||
return -1;
|
return -1;
|
||||||
score += 4;
|
score += 4;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,33 +385,39 @@ static inline int compute_score2(struct sock *sk, struct net *net,
|
||||||
__be32 saddr, __be16 sport,
|
__be32 saddr, __be16 sport,
|
||||||
__be32 daddr, unsigned int hnum, int dif)
|
__be32 daddr, unsigned int hnum, int dif)
|
||||||
{
|
{
|
||||||
int score = -1;
|
int score;
|
||||||
|
struct inet_sock *inet;
|
||||||
|
|
||||||
if (net_eq(sock_net(sk), net) && !ipv6_only_sock(sk)) {
|
if (!net_eq(sock_net(sk), net) ||
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
ipv6_only_sock(sk))
|
||||||
|
|
||||||
if (inet->inet_rcv_saddr != daddr)
|
|
||||||
return -1;
|
|
||||||
if (inet->inet_num != hnum)
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
score = (sk->sk_family == PF_INET ? 2 : 1);
|
inet = inet_sk(sk);
|
||||||
|
|
||||||
|
if (inet->inet_rcv_saddr != daddr ||
|
||||||
|
inet->inet_num != hnum)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
score = (sk->sk_family == PF_INET) ? 2 : 1;
|
||||||
|
|
||||||
if (inet->inet_daddr) {
|
if (inet->inet_daddr) {
|
||||||
if (inet->inet_daddr != saddr)
|
if (inet->inet_daddr != saddr)
|
||||||
return -1;
|
return -1;
|
||||||
score += 4;
|
score += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inet->inet_dport) {
|
if (inet->inet_dport) {
|
||||||
if (inet->inet_dport != sport)
|
if (inet->inet_dport != sport)
|
||||||
return -1;
|
return -1;
|
||||||
score += 4;
|
score += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_bound_dev_if) {
|
if (sk->sk_bound_dev_if) {
|
||||||
if (sk->sk_bound_dev_if != dif)
|
if (sk->sk_bound_dev_if != dif)
|
||||||
return -1;
|
return -1;
|
||||||
score += 4;
|
score += 4;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -148,72 +148,85 @@ static inline int compute_score(struct sock *sk, struct net *net,
|
||||||
const struct in6_addr *daddr, __be16 dport,
|
const struct in6_addr *daddr, __be16 dport,
|
||||||
int dif)
|
int dif)
|
||||||
{
|
{
|
||||||
int score = -1;
|
int score;
|
||||||
|
struct inet_sock *inet;
|
||||||
|
|
||||||
if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum &&
|
if (!net_eq(sock_net(sk), net) ||
|
||||||
sk->sk_family == PF_INET6) {
|
udp_sk(sk)->udp_port_hash != hnum ||
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
sk->sk_family != PF_INET6)
|
||||||
|
return -1;
|
||||||
|
|
||||||
score = 0;
|
score = 0;
|
||||||
|
inet = inet_sk(sk);
|
||||||
|
|
||||||
if (inet->inet_dport) {
|
if (inet->inet_dport) {
|
||||||
if (inet->inet_dport != sport)
|
if (inet->inet_dport != sport)
|
||||||
return -1;
|
return -1;
|
||||||
score++;
|
score++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
|
if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
|
||||||
if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr))
|
if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr))
|
||||||
return -1;
|
return -1;
|
||||||
score++;
|
score++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ipv6_addr_any(&sk->sk_v6_daddr)) {
|
if (!ipv6_addr_any(&sk->sk_v6_daddr)) {
|
||||||
if (!ipv6_addr_equal(&sk->sk_v6_daddr, saddr))
|
if (!ipv6_addr_equal(&sk->sk_v6_daddr, saddr))
|
||||||
return -1;
|
return -1;
|
||||||
score++;
|
score++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_bound_dev_if) {
|
if (sk->sk_bound_dev_if) {
|
||||||
if (sk->sk_bound_dev_if != dif)
|
if (sk->sk_bound_dev_if != dif)
|
||||||
return -1;
|
return -1;
|
||||||
score++;
|
score++;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SCORE2_MAX (1 + 1 + 1)
|
#define SCORE2_MAX (1 + 1 + 1)
|
||||||
static inline int compute_score2(struct sock *sk, struct net *net,
|
static inline int compute_score2(struct sock *sk, struct net *net,
|
||||||
const struct in6_addr *saddr, __be16 sport,
|
const struct in6_addr *saddr, __be16 sport,
|
||||||
const struct in6_addr *daddr, unsigned short hnum,
|
const struct in6_addr *daddr,
|
||||||
int dif)
|
unsigned short hnum, int dif)
|
||||||
{
|
{
|
||||||
int score = -1;
|
int score;
|
||||||
|
struct inet_sock *inet;
|
||||||
|
|
||||||
if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum &&
|
if (!net_eq(sock_net(sk), net) ||
|
||||||
sk->sk_family == PF_INET6) {
|
udp_sk(sk)->udp_port_hash != hnum ||
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
sk->sk_family != PF_INET6)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr))
|
if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
score = 0;
|
score = 0;
|
||||||
|
inet = inet_sk(sk);
|
||||||
|
|
||||||
if (inet->inet_dport) {
|
if (inet->inet_dport) {
|
||||||
if (inet->inet_dport != sport)
|
if (inet->inet_dport != sport)
|
||||||
return -1;
|
return -1;
|
||||||
score++;
|
score++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ipv6_addr_any(&sk->sk_v6_daddr)) {
|
if (!ipv6_addr_any(&sk->sk_v6_daddr)) {
|
||||||
if (!ipv6_addr_equal(&sk->sk_v6_daddr, saddr))
|
if (!ipv6_addr_equal(&sk->sk_v6_daddr, saddr))
|
||||||
return -1;
|
return -1;
|
||||||
score++;
|
score++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_bound_dev_if) {
|
if (sk->sk_bound_dev_if) {
|
||||||
if (sk->sk_bound_dev_if != dif)
|
if (sk->sk_bound_dev_if != dif)
|
||||||
return -1;
|
return -1;
|
||||||
score++;
|
score++;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* called with read_rcu_lock() */
|
/* called with read_rcu_lock() */
|
||||||
static struct sock *udp6_lib_lookup2(struct net *net,
|
static struct sock *udp6_lib_lookup2(struct net *net,
|
||||||
const struct in6_addr *saddr, __be16 sport,
|
const struct in6_addr *saddr, __be16 sport,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче