Merge branch 'master' of ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
1805b2f048
130 changed files with 850 additions and 534 deletions
|
@ -835,8 +835,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
|
|||
if (skb_headroom(skb) < max_headroom || skb_shared(skb)||
|
||||
(skb_cloned(skb) && !skb_clone_writable(skb, 0))) {
|
||||
struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
|
||||
if (max_headroom > dev->needed_headroom)
|
||||
dev->needed_headroom = max_headroom;
|
||||
if (!new_skb) {
|
||||
ip_rt_put(rt);
|
||||
dev->stats.tx_dropped++;
|
||||
|
|
|
@ -1308,7 +1308,12 @@ static void rt_del(unsigned hash, struct rtable *rt)
|
|||
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;
|
||||
|
||||
|
@ -1331,13 +1336,34 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
|
|||
goto reject_redirect;
|
||||
}
|
||||
|
||||
peer = inet_getpeer_v4(daddr, 1);
|
||||
if (peer) {
|
||||
peer->redirect_learned.a4 = new_gw;
|
||||
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;
|
||||
|
||||
inet_putpeer(peer);
|
||||
if (rt->dst.error || rt->dst.dev != dev ||
|
||||
rt->rt_gateway != old_gw) {
|
||||
ip_rt_put(rt);
|
||||
continue;
|
||||
}
|
||||
|
||||
atomic_inc(&__rt_peer_genid);
|
||||
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;
|
||||
|
||||
|
|
|
@ -328,6 +328,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
|
|||
struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw);
|
||||
const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);
|
||||
|
||||
tw->tw_transparent = inet_sk(sk)->transparent;
|
||||
tw->tw_rcv_wscale = tp->rx_opt.rcv_wscale;
|
||||
tcptw->tw_rcv_nxt = tp->rcv_nxt;
|
||||
tcptw->tw_snd_nxt = tp->snd_nxt;
|
||||
|
|
|
@ -79,13 +79,13 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
|
|||
struct rtable *rt = (struct rtable *)xdst->route;
|
||||
const struct flowi4 *fl4 = &fl->u.ip4;
|
||||
|
||||
rt->rt_key_dst = fl4->daddr;
|
||||
rt->rt_key_src = fl4->saddr;
|
||||
rt->rt_key_tos = fl4->flowi4_tos;
|
||||
rt->rt_route_iif = fl4->flowi4_iif;
|
||||
rt->rt_iif = fl4->flowi4_iif;
|
||||
rt->rt_oif = fl4->flowi4_oif;
|
||||
rt->rt_mark = fl4->flowi4_mark;
|
||||
xdst->u.rt.rt_key_dst = fl4->daddr;
|
||||
xdst->u.rt.rt_key_src = fl4->saddr;
|
||||
xdst->u.rt.rt_key_tos = fl4->flowi4_tos;
|
||||
xdst->u.rt.rt_route_iif = fl4->flowi4_iif;
|
||||
xdst->u.rt.rt_iif = fl4->flowi4_iif;
|
||||
xdst->u.rt.rt_oif = fl4->flowi4_oif;
|
||||
xdst->u.rt.rt_mark = fl4->flowi4_mark;
|
||||
|
||||
xdst->u.dst.dev = dev;
|
||||
dev_hold(dev);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue