Commit 60c04aec authored by Joe Perches's avatar Joe Perches Committed by David S. Miller

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: default avatarJoe Perches <joe@perches.com>
Acked-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b0ba512e
...@@ -336,38 +336,45 @@ int udp_v4_get_port(struct sock *sk, unsigned short snum) ...@@ -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, ...@@ -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)) {
struct inet_sock *inet = inet_sk(sk);
if (inet->inet_rcv_saddr != daddr) if (!net_eq(sock_net(sk), net) ||
ipv6_only_sock(sk))
return -1; return -1;
if (inet->inet_num != hnum)
inet = inet_sk(sk);
if (inet->inet_rcv_saddr != daddr ||
inet->inet_num != hnum)
return -1; return -1;
score = (sk->sk_family == PF_INET ? 2 : 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, ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment