[IPV4]: Fix "ipOutNoRoutes" counter error for TCP and UDP

Signed-off-by: Wei Dong <weidong@cn.fujitsu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by Wei Dong and committed by David S. Miller 584bdf8c 4fcd6b99

+13 -3
+5 -1
net/ipv4/datagram.c
··· 50 RT_CONN_FLAGS(sk), oif, 51 sk->sk_protocol, 52 inet->sport, usin->sin_port, sk, 1); 53 - if (err) 54 return err; 55 if ((rt->rt_flags & RTCF_BROADCAST) && !sock_flag(sk, SOCK_BROADCAST)) { 56 ip_rt_put(rt); 57 return -EACCES;
··· 50 RT_CONN_FLAGS(sk), oif, 51 sk->sk_protocol, 52 inet->sport, usin->sin_port, sk, 1); 53 + if (err) { 54 + if (err == -ENETUNREACH) 55 + IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES); 56 return err; 57 + } 58 + 59 if ((rt->rt_flags & RTCF_BROADCAST) && !sock_flag(sk, SOCK_BROADCAST)) { 60 ip_rt_put(rt); 61 return -EACCES;
+4 -1
net/ipv4/tcp_ipv4.c
··· 192 RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, 193 IPPROTO_TCP, 194 inet->sport, usin->sin_port, sk, 1); 195 - if (tmp < 0) 196 return tmp; 197 198 if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { 199 ip_rt_put(rt);
··· 192 RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, 193 IPPROTO_TCP, 194 inet->sport, usin->sin_port, sk, 1); 195 + if (tmp < 0) { 196 + if (tmp == -ENETUNREACH) 197 + IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES); 198 return tmp; 199 + } 200 201 if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { 202 ip_rt_put(rt);
+4 -1
net/ipv4/udp.c
··· 722 .dport = dport } } }; 723 security_sk_classify_flow(sk, &fl); 724 err = ip_route_output_flow(&rt, &fl, sk, 1); 725 - if (err) 726 goto out; 727 728 err = -EACCES; 729 if ((rt->rt_flags & RTCF_BROADCAST) &&
··· 722 .dport = dport } } }; 723 security_sk_classify_flow(sk, &fl); 724 err = ip_route_output_flow(&rt, &fl, sk, 1); 725 + if (err) { 726 + if (err == -ENETUNREACH) 727 + IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES); 728 goto out; 729 + } 730 731 err = -EACCES; 732 if ((rt->rt_flags & RTCF_BROADCAST) &&