Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/broadcom/genet/bcmmii.c drivers/net/hyperv/netvsc.c kernel/bpf/hashtab.c Almost entirely overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1083,7 +1083,8 @@ static void nl_fib_input(struct sk_buff *skb)
|
||||
|
||||
net = sock_net(skb->sk);
|
||||
nlh = nlmsg_hdr(skb);
|
||||
if (skb->len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len ||
|
||||
if (skb->len < nlmsg_total_size(sizeof(*frn)) ||
|
||||
skb->len < nlh->nlmsg_len ||
|
||||
nlmsg_len(nlh) < sizeof(*frn))
|
||||
return;
|
||||
|
||||
|
@@ -198,6 +198,7 @@ static void ip_expire(unsigned long arg)
|
||||
qp = container_of((struct inet_frag_queue *) arg, struct ipq, q);
|
||||
net = container_of(qp->q.net, struct net, ipv4.frags);
|
||||
|
||||
rcu_read_lock();
|
||||
spin_lock(&qp->q.lock);
|
||||
|
||||
if (qp->q.flags & INET_FRAG_COMPLETE)
|
||||
@@ -207,7 +208,7 @@ static void ip_expire(unsigned long arg)
|
||||
__IP_INC_STATS(net, IPSTATS_MIB_REASMFAILS);
|
||||
|
||||
if (!inet_frag_evicting(&qp->q)) {
|
||||
struct sk_buff *head = qp->q.fragments;
|
||||
struct sk_buff *clone, *head = qp->q.fragments;
|
||||
const struct iphdr *iph;
|
||||
int err;
|
||||
|
||||
@@ -216,32 +217,40 @@ static void ip_expire(unsigned long arg)
|
||||
if (!(qp->q.flags & INET_FRAG_FIRST_IN) || !qp->q.fragments)
|
||||
goto out;
|
||||
|
||||
rcu_read_lock();
|
||||
head->dev = dev_get_by_index_rcu(net, qp->iif);
|
||||
if (!head->dev)
|
||||
goto out_rcu_unlock;
|
||||
goto out;
|
||||
|
||||
|
||||
/* skb has no dst, perform route lookup again */
|
||||
iph = ip_hdr(head);
|
||||
err = ip_route_input_noref(head, iph->daddr, iph->saddr,
|
||||
iph->tos, head->dev);
|
||||
if (err)
|
||||
goto out_rcu_unlock;
|
||||
goto out;
|
||||
|
||||
/* Only an end host needs to send an ICMP
|
||||
* "Fragment Reassembly Timeout" message, per RFC792.
|
||||
*/
|
||||
if (frag_expire_skip_icmp(qp->user) &&
|
||||
(skb_rtable(head)->rt_type != RTN_LOCAL))
|
||||
goto out_rcu_unlock;
|
||||
goto out;
|
||||
|
||||
clone = skb_clone(head, GFP_ATOMIC);
|
||||
|
||||
/* Send an ICMP "Fragment Reassembly Timeout" message. */
|
||||
icmp_send(head, ICMP_TIME_EXCEEDED, ICMP_EXC_FRAGTIME, 0);
|
||||
out_rcu_unlock:
|
||||
rcu_read_unlock();
|
||||
if (clone) {
|
||||
spin_unlock(&qp->q.lock);
|
||||
icmp_send(clone, ICMP_TIME_EXCEEDED,
|
||||
ICMP_EXC_FRAGTIME, 0);
|
||||
consume_skb(clone);
|
||||
goto out_rcu_unlock;
|
||||
}
|
||||
}
|
||||
out:
|
||||
spin_unlock(&qp->q.lock);
|
||||
out_rcu_unlock:
|
||||
rcu_read_unlock();
|
||||
ipq_put(qp);
|
||||
}
|
||||
|
||||
|
@@ -165,6 +165,10 @@ static unsigned int ipv4_conntrack_local(void *priv,
|
||||
if (skb->len < sizeof(struct iphdr) ||
|
||||
ip_hdrlen(skb) < sizeof(struct iphdr))
|
||||
return NF_ACCEPT;
|
||||
|
||||
if (ip_is_fragment(ip_hdr(skb))) /* IP_NODEFRAG setsockopt set */
|
||||
return NF_ACCEPT;
|
||||
|
||||
return nf_conntrack_in(state->net, PF_INET, state->hook, skb);
|
||||
}
|
||||
|
||||
|
@@ -255,11 +255,6 @@ nf_nat_ipv4_fn(void *priv, struct sk_buff *skb,
|
||||
/* maniptype == SRC for postrouting. */
|
||||
enum nf_nat_manip_type maniptype = HOOK2MANIP(state->hook);
|
||||
|
||||
/* We never see fragments: conntrack defrags on pre-routing
|
||||
* and local-out, and nf_nat_out protects post-routing.
|
||||
*/
|
||||
NF_CT_ASSERT(!ip_is_fragment(ip_hdr(skb)));
|
||||
|
||||
ct = nf_ct_get(skb, &ctinfo);
|
||||
/* Can't track? It's not due to stress, or conntrack would
|
||||
* have dropped it. Hence it's the user's responsibilty to
|
||||
|
@@ -26,10 +26,10 @@ static void nft_masq_ipv4_eval(const struct nft_expr *expr,
|
||||
memset(&range, 0, sizeof(range));
|
||||
range.flags = priv->flags;
|
||||
if (priv->sreg_proto_min) {
|
||||
range.min_proto.all =
|
||||
*(__be16 *)®s->data[priv->sreg_proto_min];
|
||||
range.max_proto.all =
|
||||
*(__be16 *)®s->data[priv->sreg_proto_max];
|
||||
range.min_proto.all = (__force __be16)nft_reg_load16(
|
||||
®s->data[priv->sreg_proto_min]);
|
||||
range.max_proto.all = (__force __be16)nft_reg_load16(
|
||||
®s->data[priv->sreg_proto_max]);
|
||||
}
|
||||
regs->verdict.code = nf_nat_masquerade_ipv4(pkt->skb, nft_hook(pkt),
|
||||
&range, nft_out(pkt));
|
||||
|
@@ -26,10 +26,10 @@ static void nft_redir_ipv4_eval(const struct nft_expr *expr,
|
||||
|
||||
memset(&mr, 0, sizeof(mr));
|
||||
if (priv->sreg_proto_min) {
|
||||
mr.range[0].min.all =
|
||||
*(__be16 *)®s->data[priv->sreg_proto_min];
|
||||
mr.range[0].max.all =
|
||||
*(__be16 *)®s->data[priv->sreg_proto_max];
|
||||
mr.range[0].min.all = (__force __be16)nft_reg_load16(
|
||||
®s->data[priv->sreg_proto_min]);
|
||||
mr.range[0].max.all = (__force __be16)nft_reg_load16(
|
||||
®s->data[priv->sreg_proto_max]);
|
||||
mr.range[0].flags |= NF_NAT_RANGE_PROTO_SPECIFIED;
|
||||
}
|
||||
|
||||
|
@@ -2770,7 +2770,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
|
||||
{
|
||||
const struct tcp_sock *tp = tcp_sk(sk); /* iff sk_type == SOCK_STREAM */
|
||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
u32 now = tcp_time_stamp, intv;
|
||||
u32 now, intv;
|
||||
u64 rate64;
|
||||
bool slow;
|
||||
u32 rate;
|
||||
@@ -2839,6 +2839,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
|
||||
info->tcpi_retrans = tp->retrans_out;
|
||||
info->tcpi_fackets = tp->fackets_out;
|
||||
|
||||
now = tcp_time_stamp;
|
||||
info->tcpi_last_data_sent = jiffies_to_msecs(now - tp->lsndtime);
|
||||
info->tcpi_last_data_recv = jiffies_to_msecs(now - icsk->icsk_ack.lrcvtime);
|
||||
info->tcpi_last_ack_recv = jiffies_to_msecs(now - tp->rcv_tstamp);
|
||||
|
@@ -5541,6 +5541,7 @@ void tcp_finish_connect(struct sock *sk, struct sk_buff *skb)
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
|
||||
tcp_set_state(sk, TCP_ESTABLISHED);
|
||||
icsk->icsk_ack.lrcvtime = tcp_time_stamp;
|
||||
|
||||
if (skb) {
|
||||
icsk->icsk_af_ops->sk_rx_dst_set(sk, skb);
|
||||
@@ -5759,7 +5760,6 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
|
||||
* to stand against the temptation 8) --ANK
|
||||
*/
|
||||
inet_csk_schedule_ack(sk);
|
||||
icsk->icsk_ack.lrcvtime = tcp_time_stamp;
|
||||
tcp_enter_quickack_mode(sk);
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
|
||||
TCP_DELACK_MAX, TCP_RTO_MAX);
|
||||
|
@@ -446,6 +446,7 @@ struct sock *tcp_create_openreq_child(const struct sock *sk,
|
||||
newtp->mdev_us = jiffies_to_usecs(TCP_TIMEOUT_INIT);
|
||||
minmax_reset(&newtp->rtt_min, tcp_time_stamp, ~0U);
|
||||
newicsk->icsk_rto = TCP_TIMEOUT_INIT;
|
||||
newicsk->icsk_ack.lrcvtime = tcp_time_stamp;
|
||||
|
||||
newtp->packets_out = 0;
|
||||
newtp->retrans_out = 0;
|
||||
|
Reference in New Issue
Block a user