mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Just several instances of overlapping changes. Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
de0ba9a0d8
276 changed files with 2475 additions and 1313 deletions
|
|
@ -479,6 +479,9 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,
|
|||
if (!rtnh_ok(rtnh, remaining))
|
||||
return -EINVAL;
|
||||
|
||||
if (rtnh->rtnh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN))
|
||||
return -EINVAL;
|
||||
|
||||
nexthop_nh->nh_flags =
|
||||
(cfg->fc_flags & ~0xFF) | rtnh->rtnh_flags;
|
||||
nexthop_nh->nh_oif = rtnh->rtnh_ifindex;
|
||||
|
|
@ -1003,6 +1006,9 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
|
|||
if (fib_props[cfg->fc_type].scope > cfg->fc_scope)
|
||||
goto err_inval;
|
||||
|
||||
if (cfg->fc_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN))
|
||||
goto err_inval;
|
||||
|
||||
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
||||
if (cfg->fc_mp) {
|
||||
nhs = fib_count_nexthops(cfg->fc_mp, cfg->fc_mp_len);
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ int sysctl_tcp_adv_win_scale __read_mostly = 1;
|
|||
EXPORT_SYMBOL(sysctl_tcp_adv_win_scale);
|
||||
|
||||
/* rfc5961 challenge ack rate limiting */
|
||||
int sysctl_tcp_challenge_ack_limit = 100;
|
||||
int sysctl_tcp_challenge_ack_limit = 1000;
|
||||
|
||||
int sysctl_tcp_stdurg __read_mostly;
|
||||
int sysctl_tcp_rfc1337 __read_mostly;
|
||||
|
|
@ -3424,6 +3424,23 @@ static int tcp_ack_update_window(struct sock *sk, const struct sk_buff *skb, u32
|
|||
return flag;
|
||||
}
|
||||
|
||||
static bool __tcp_oow_rate_limited(struct net *net, int mib_idx,
|
||||
u32 *last_oow_ack_time)
|
||||
{
|
||||
if (*last_oow_ack_time) {
|
||||
s32 elapsed = (s32)(tcp_time_stamp - *last_oow_ack_time);
|
||||
|
||||
if (0 <= elapsed && elapsed < sysctl_tcp_invalid_ratelimit) {
|
||||
NET_INC_STATS(net, mib_idx);
|
||||
return true; /* rate-limited: don't send yet! */
|
||||
}
|
||||
}
|
||||
|
||||
*last_oow_ack_time = tcp_time_stamp;
|
||||
|
||||
return false; /* not rate-limited: go ahead, send dupack now! */
|
||||
}
|
||||
|
||||
/* Return true if we're currently rate-limiting out-of-window ACKs and
|
||||
* thus shouldn't send a dupack right now. We rate-limit dupacks in
|
||||
* response to out-of-window SYNs or ACKs to mitigate ACK loops or DoS
|
||||
|
|
@ -3437,21 +3454,9 @@ bool tcp_oow_rate_limited(struct net *net, const struct sk_buff *skb,
|
|||
/* Data packets without SYNs are not likely part of an ACK loop. */
|
||||
if ((TCP_SKB_CB(skb)->seq != TCP_SKB_CB(skb)->end_seq) &&
|
||||
!tcp_hdr(skb)->syn)
|
||||
goto not_rate_limited;
|
||||
return false;
|
||||
|
||||
if (*last_oow_ack_time) {
|
||||
s32 elapsed = (s32)(tcp_time_stamp - *last_oow_ack_time);
|
||||
|
||||
if (0 <= elapsed && elapsed < sysctl_tcp_invalid_ratelimit) {
|
||||
NET_INC_STATS(net, mib_idx);
|
||||
return true; /* rate-limited: don't send yet! */
|
||||
}
|
||||
}
|
||||
|
||||
*last_oow_ack_time = tcp_time_stamp;
|
||||
|
||||
not_rate_limited:
|
||||
return false; /* not rate-limited: go ahead, send dupack now! */
|
||||
return __tcp_oow_rate_limited(net, mib_idx, last_oow_ack_time);
|
||||
}
|
||||
|
||||
/* RFC 5961 7 [ACK Throttling] */
|
||||
|
|
@ -3461,21 +3466,26 @@ static void tcp_send_challenge_ack(struct sock *sk, const struct sk_buff *skb)
|
|||
static u32 challenge_timestamp;
|
||||
static unsigned int challenge_count;
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
u32 now;
|
||||
u32 count, now;
|
||||
|
||||
/* First check our per-socket dupack rate limit. */
|
||||
if (tcp_oow_rate_limited(sock_net(sk), skb,
|
||||
LINUX_MIB_TCPACKSKIPPEDCHALLENGE,
|
||||
&tp->last_oow_ack_time))
|
||||
if (__tcp_oow_rate_limited(sock_net(sk),
|
||||
LINUX_MIB_TCPACKSKIPPEDCHALLENGE,
|
||||
&tp->last_oow_ack_time))
|
||||
return;
|
||||
|
||||
/* Then check the check host-wide RFC 5961 rate limit. */
|
||||
/* Then check host-wide RFC 5961 rate limit. */
|
||||
now = jiffies / HZ;
|
||||
if (now != challenge_timestamp) {
|
||||
u32 half = (sysctl_tcp_challenge_ack_limit + 1) >> 1;
|
||||
|
||||
challenge_timestamp = now;
|
||||
challenge_count = 0;
|
||||
WRITE_ONCE(challenge_count, half +
|
||||
prandom_u32_max(sysctl_tcp_challenge_ack_limit));
|
||||
}
|
||||
if (++challenge_count <= sysctl_tcp_challenge_ack_limit) {
|
||||
count = READ_ONCE(challenge_count);
|
||||
if (count > 0) {
|
||||
WRITE_ONCE(challenge_count, count - 1);
|
||||
NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK);
|
||||
tcp_send_ack(sk);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1583,6 +1583,8 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
if (sk_filter(sk, skb))
|
||||
goto drop;
|
||||
if (unlikely(skb->len < sizeof(struct udphdr)))
|
||||
goto drop;
|
||||
|
||||
udp_csum_pull_header(skb);
|
||||
if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue