Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The forcedeth changes had a conflict with the conversion over to atomic u64 statistics in net-next. The libertas cfg.c code had a conflict with the bss reference counting fix by John Linville in net-next. Conflicts: drivers/net/ethernet/nvidia/forcedeth.c drivers/net/wireless/libertas/cfg.c
This commit is contained in:
@@ -136,8 +136,6 @@ static void ah_output_done(struct crypto_async_request *base, int err)
|
||||
memcpy(top_iph+1, iph+1, top_iph->ihl*4 - sizeof(struct iphdr));
|
||||
}
|
||||
|
||||
err = ah->nexthdr;
|
||||
|
||||
kfree(AH_SKB_CB(skb)->tmp);
|
||||
xfrm_output_resume(skb, err);
|
||||
}
|
||||
@@ -264,12 +262,12 @@ static void ah_input_done(struct crypto_async_request *base, int err)
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = ah->nexthdr;
|
||||
|
||||
skb->network_header += ah_hlen;
|
||||
memcpy(skb_network_header(skb), work_iph, ihl);
|
||||
__skb_pull(skb, ah_hlen + ihl);
|
||||
skb_set_transport_header(skb, -ihl);
|
||||
|
||||
err = ah->nexthdr;
|
||||
out:
|
||||
kfree(AH_SKB_CB(skb)->tmp);
|
||||
xfrm_input_resume(skb, err);
|
||||
@@ -371,8 +369,6 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
if (err == -EINPROGRESS)
|
||||
goto out;
|
||||
|
||||
if (err == -EBUSY)
|
||||
err = NET_XMIT_DROP;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
|
@@ -133,8 +133,8 @@ static int inet_csk_diag_fill(struct sock *sk,
|
||||
&np->rcv_saddr);
|
||||
ipv6_addr_copy((struct in6_addr *)r->id.idiag_dst,
|
||||
&np->daddr);
|
||||
if (ext & (1 << (INET_DIAG_TOS - 1)))
|
||||
RTA_PUT_U8(skb, INET_DIAG_TOS, np->tclass);
|
||||
if (ext & (1 << (INET_DIAG_TCLASS - 1)))
|
||||
RTA_PUT_U8(skb, INET_DIAG_TCLASS, np->tclass);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -640,6 +640,7 @@ int ip_options_rcv_srr(struct sk_buff *skb)
|
||||
}
|
||||
if (srrptr <= srrspace) {
|
||||
opt->srr_is_hit = 1;
|
||||
iph->daddr = nexthop;
|
||||
opt->is_changed = 1;
|
||||
}
|
||||
return 0;
|
||||
|
@@ -339,7 +339,6 @@ void ping_err(struct sk_buff *skb, u32 info)
|
||||
sk = ping_v4_lookup(net, iph->daddr, iph->saddr,
|
||||
ntohs(icmph->un.echo.id), skb->dev->ifindex);
|
||||
if (sk == NULL) {
|
||||
ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
|
||||
pr_debug("no socket, dropping\n");
|
||||
return; /* No socket for error */
|
||||
}
|
||||
@@ -679,7 +678,6 @@ static int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
||||
pr_debug("ping_queue_rcv_skb(sk=%p,sk->num=%d,skb=%p)\n",
|
||||
inet_sk(sk), inet_sk(sk)->inet_num, skb);
|
||||
if (sock_queue_rcv_skb(sk, skb) < 0) {
|
||||
ICMP_INC_STATS_BH(sock_net(sk), ICMP_MIB_INERRORS);
|
||||
kfree_skb(skb);
|
||||
pr_debug("ping_queue_rcv_skb -> failed\n");
|
||||
return -1;
|
||||
|
112
net/ipv4/route.c
112
net/ipv4/route.c
@@ -1304,16 +1304,42 @@ static void rt_del(unsigned hash, struct rtable *rt)
|
||||
spin_unlock_bh(rt_hash_lock_addr(hash));
|
||||
}
|
||||
|
||||
static int check_peer_redir(struct dst_entry *dst, struct inet_peer *peer)
|
||||
{
|
||||
struct rtable *rt = (struct rtable *) dst;
|
||||
__be32 orig_gw = rt->rt_gateway;
|
||||
struct neighbour *n, *old_n;
|
||||
|
||||
dst_confirm(&rt->dst);
|
||||
|
||||
rt->rt_gateway = peer->redirect_learned.a4;
|
||||
|
||||
n = ipv4_neigh_lookup(&rt->dst, &rt->rt_gateway);
|
||||
if (IS_ERR(n))
|
||||
return PTR_ERR(n);
|
||||
old_n = xchg(&rt->dst._neighbour, n);
|
||||
if (old_n)
|
||||
neigh_release(old_n);
|
||||
if (!n || !(n->nud_state & NUD_VALID)) {
|
||||
if (n)
|
||||
neigh_event_send(n, NULL);
|
||||
rt->rt_gateway = orig_gw;
|
||||
return -EAGAIN;
|
||||
} else {
|
||||
rt->rt_flags |= RTCF_REDIRECTED;
|
||||
call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, n);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* called in rcu_read_lock() section */
|
||||
void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
|
||||
__be32 saddr, struct net_device *dev)
|
||||
{
|
||||
int s, i;
|
||||
struct in_device *in_dev = __in_dev_get_rcu(dev);
|
||||
struct rtable *rt;
|
||||
__be32 skeys[2] = { saddr, 0 };
|
||||
int ikeys[2] = { dev->ifindex, 0 };
|
||||
struct flowi4 fl4;
|
||||
struct inet_peer *peer;
|
||||
struct net *net;
|
||||
|
||||
@@ -1336,33 +1362,42 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
|
||||
goto reject_redirect;
|
||||
}
|
||||
|
||||
memset(&fl4, 0, sizeof(fl4));
|
||||
fl4.daddr = daddr;
|
||||
for (s = 0; s < 2; s++) {
|
||||
for (i = 0; i < 2; i++) {
|
||||
fl4.flowi4_oif = ikeys[i];
|
||||
fl4.saddr = skeys[s];
|
||||
rt = __ip_route_output_key(net, &fl4);
|
||||
if (IS_ERR(rt))
|
||||
continue;
|
||||
unsigned int hash;
|
||||
struct rtable __rcu **rthp;
|
||||
struct rtable *rt;
|
||||
|
||||
if (rt->dst.error || rt->dst.dev != dev ||
|
||||
rt->rt_gateway != old_gw) {
|
||||
ip_rt_put(rt);
|
||||
continue;
|
||||
hash = rt_hash(daddr, skeys[s], ikeys[i], rt_genid(net));
|
||||
|
||||
rthp = &rt_hash_table[hash].chain;
|
||||
|
||||
while ((rt = rcu_dereference(*rthp)) != NULL) {
|
||||
rthp = &rt->dst.rt_next;
|
||||
|
||||
if (rt->rt_key_dst != daddr ||
|
||||
rt->rt_key_src != skeys[s] ||
|
||||
rt->rt_oif != ikeys[i] ||
|
||||
rt_is_input_route(rt) ||
|
||||
rt_is_expired(rt) ||
|
||||
!net_eq(dev_net(rt->dst.dev), net) ||
|
||||
rt->dst.error ||
|
||||
rt->dst.dev != dev ||
|
||||
rt->rt_gateway != old_gw)
|
||||
continue;
|
||||
|
||||
if (!rt->peer)
|
||||
rt_bind_peer(rt, rt->rt_dst, 1);
|
||||
|
||||
peer = rt->peer;
|
||||
if (peer) {
|
||||
if (peer->redirect_learned.a4 != new_gw) {
|
||||
peer->redirect_learned.a4 = new_gw;
|
||||
atomic_inc(&__rt_peer_genid);
|
||||
}
|
||||
check_peer_redir(&rt->dst, peer);
|
||||
}
|
||||
}
|
||||
|
||||
if (!rt->peer)
|
||||
rt_bind_peer(rt, rt->rt_dst, 1);
|
||||
|
||||
peer = rt->peer;
|
||||
if (peer) {
|
||||
peer->redirect_learned.a4 = new_gw;
|
||||
atomic_inc(&__rt_peer_genid);
|
||||
}
|
||||
|
||||
ip_rt_put(rt);
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -1649,33 +1684,6 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
|
||||
}
|
||||
}
|
||||
|
||||
static int check_peer_redir(struct dst_entry *dst, struct inet_peer *peer)
|
||||
{
|
||||
struct rtable *rt = (struct rtable *) dst;
|
||||
__be32 orig_gw = rt->rt_gateway;
|
||||
struct neighbour *n, *old_n;
|
||||
|
||||
dst_confirm(&rt->dst);
|
||||
|
||||
rt->rt_gateway = peer->redirect_learned.a4;
|
||||
|
||||
n = ipv4_neigh_lookup(&rt->dst, &rt->rt_gateway);
|
||||
if (IS_ERR(n))
|
||||
return PTR_ERR(n);
|
||||
old_n = xchg(&rt->dst._neighbour, n);
|
||||
if (old_n)
|
||||
neigh_release(old_n);
|
||||
if (!n || !(n->nud_state & NUD_VALID)) {
|
||||
if (n)
|
||||
neigh_event_send(n, NULL);
|
||||
rt->rt_gateway = orig_gw;
|
||||
return -EAGAIN;
|
||||
} else {
|
||||
rt->rt_flags |= RTCF_REDIRECTED;
|
||||
call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, n);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie)
|
||||
{
|
||||
|
@@ -1510,6 +1510,7 @@ exit:
|
||||
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
|
||||
return NULL;
|
||||
put_and_exit:
|
||||
tcp_clear_xmit_timers(newsk);
|
||||
bh_unlock_sock(newsk);
|
||||
sock_put(newsk);
|
||||
goto exit;
|
||||
|
Reference in New Issue
Block a user