Commit c0eea79b authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

parents adb9c9ac 35eaa31e
...@@ -57,7 +57,7 @@ struct ifb_private { ...@@ -57,7 +57,7 @@ struct ifb_private {
struct sk_buff_head tq; struct sk_buff_head tq;
}; };
static int numifbs = 1; static int numifbs = 2;
static void ri_tasklet(unsigned long dev); static void ri_tasklet(unsigned long dev);
static int ifb_xmit(struct sk_buff *skb, struct net_device *dev); static int ifb_xmit(struct sk_buff *skb, struct net_device *dev);
......
...@@ -403,6 +403,11 @@ unsigned xfrm_spi_hash(xfrm_address_t *addr, u32 spi, u8 proto, unsigned short f ...@@ -403,6 +403,11 @@ unsigned xfrm_spi_hash(xfrm_address_t *addr, u32 spi, u8 proto, unsigned short f
extern void __xfrm_state_destroy(struct xfrm_state *); extern void __xfrm_state_destroy(struct xfrm_state *);
static inline void __xfrm_state_put(struct xfrm_state *x)
{
atomic_dec(&x->refcnt);
}
static inline void xfrm_state_put(struct xfrm_state *x) static inline void xfrm_state_put(struct xfrm_state *x)
{ {
if (atomic_dec_and_test(&x->refcnt)) if (atomic_dec_and_test(&x->refcnt))
......
...@@ -90,6 +90,7 @@ static struct rtable __fake_rtable = { ...@@ -90,6 +90,7 @@ static struct rtable __fake_rtable = {
.dev = &__fake_net_device, .dev = &__fake_net_device,
.path = &__fake_rtable.u.dst, .path = &__fake_rtable.u.dst,
.metrics = {[RTAX_MTU - 1] = 1500}, .metrics = {[RTAX_MTU - 1] = 1500},
.flags = DST_NOXFRM,
} }
}, },
.rt_flags = 0, .rt_flags = 0,
......
...@@ -95,6 +95,12 @@ int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, ...@@ -95,6 +95,12 @@ int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
saddr = dev->dev_addr; saddr = dev->dev_addr;
memcpy(eth->h_source,saddr,dev->addr_len); memcpy(eth->h_source,saddr,dev->addr_len);
if(daddr)
{
memcpy(eth->h_dest,daddr,dev->addr_len);
return ETH_HLEN;
}
/* /*
* Anyway, the loopback-device should never use this function... * Anyway, the loopback-device should never use this function...
*/ */
...@@ -105,12 +111,6 @@ int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, ...@@ -105,12 +111,6 @@ int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
return ETH_HLEN; return ETH_HLEN;
} }
if(daddr)
{
memcpy(eth->h_dest,daddr,dev->addr_len);
return ETH_HLEN;
}
return -ETH_HLEN; return -ETH_HLEN;
} }
......
...@@ -835,7 +835,7 @@ static int rt_garbage_collect(void) ...@@ -835,7 +835,7 @@ static int rt_garbage_collect(void)
int r; int r;
rthp = rt_remove_balanced_route( rthp = rt_remove_balanced_route(
&rt_hash_table[i].chain, &rt_hash_table[k].chain,
rth, rth,
&r); &r);
goal -= r; goal -= r;
......
...@@ -35,6 +35,7 @@ __xfrm4_find_bundle(struct flowi *fl, struct xfrm_policy *policy) ...@@ -35,6 +35,7 @@ __xfrm4_find_bundle(struct flowi *fl, struct xfrm_policy *policy)
if (xdst->u.rt.fl.oif == fl->oif && /*XXX*/ if (xdst->u.rt.fl.oif == fl->oif && /*XXX*/
xdst->u.rt.fl.fl4_dst == fl->fl4_dst && xdst->u.rt.fl.fl4_dst == fl->fl4_dst &&
xdst->u.rt.fl.fl4_src == fl->fl4_src && xdst->u.rt.fl.fl4_src == fl->fl4_src &&
xdst->u.rt.fl.fl4_tos == fl->fl4_tos &&
xfrm_bundle_ok(xdst, fl, AF_INET)) { xfrm_bundle_ok(xdst, fl, AF_INET)) {
dst_clone(dst); dst_clone(dst);
break; break;
...@@ -61,7 +62,8 @@ __xfrm4_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int ...@@ -61,7 +62,8 @@ __xfrm4_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
.nl_u = { .nl_u = {
.ip4_u = { .ip4_u = {
.saddr = local, .saddr = local,
.daddr = remote .daddr = remote,
.tos = fl->fl4_tos
} }
} }
}; };
...@@ -230,6 +232,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl) ...@@ -230,6 +232,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl)
fl->proto = iph->protocol; fl->proto = iph->protocol;
fl->fl4_dst = iph->daddr; fl->fl4_dst = iph->daddr;
fl->fl4_src = iph->saddr; fl->fl4_src = iph->saddr;
fl->fl4_tos = iph->tos;
} }
static inline int xfrm4_garbage_collect(void) static inline int xfrm4_garbage_collect(void)
......
...@@ -1423,7 +1423,7 @@ static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, ...@@ -1423,7 +1423,7 @@ static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr,
if (err < 0) { if (err < 0) {
x->km.state = XFRM_STATE_DEAD; x->km.state = XFRM_STATE_DEAD;
xfrm_state_put(x); __xfrm_state_put(x);
goto out; goto out;
} }
......
...@@ -782,7 +782,7 @@ int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, ...@@ -782,7 +782,7 @@ int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
int nx = 0; int nx = 0;
int err; int err;
u32 genid; u32 genid;
u16 family = dst_orig->ops->family; u16 family;
u8 dir = policy_to_flow_dir(XFRM_POLICY_OUT); u8 dir = policy_to_flow_dir(XFRM_POLICY_OUT);
u32 sk_sid = security_sk_sid(sk, fl, dir); u32 sk_sid = security_sk_sid(sk, fl, dir);
restart: restart:
...@@ -796,13 +796,14 @@ int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, ...@@ -796,13 +796,14 @@ int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
if ((dst_orig->flags & DST_NOXFRM) || !xfrm_policy_list[XFRM_POLICY_OUT]) if ((dst_orig->flags & DST_NOXFRM) || !xfrm_policy_list[XFRM_POLICY_OUT])
return 0; return 0;
policy = flow_cache_lookup(fl, sk_sid, family, dir, policy = flow_cache_lookup(fl, sk_sid, dst_orig->ops->family,
xfrm_policy_lookup); dir, xfrm_policy_lookup);
} }
if (!policy) if (!policy)
return 0; return 0;
family = dst_orig->ops->family;
policy->curlft.use_time = (unsigned long)xtime.tv_sec; policy->curlft.use_time = (unsigned long)xtime.tv_sec;
switch (policy->action) { switch (policy->action) {
......
...@@ -220,14 +220,14 @@ static int __xfrm_state_delete(struct xfrm_state *x) ...@@ -220,14 +220,14 @@ static int __xfrm_state_delete(struct xfrm_state *x)
x->km.state = XFRM_STATE_DEAD; x->km.state = XFRM_STATE_DEAD;
spin_lock(&xfrm_state_lock); spin_lock(&xfrm_state_lock);
list_del(&x->bydst); list_del(&x->bydst);
atomic_dec(&x->refcnt); __xfrm_state_put(x);
if (x->id.spi) { if (x->id.spi) {
list_del(&x->byspi); list_del(&x->byspi);
atomic_dec(&x->refcnt); __xfrm_state_put(x);
} }
spin_unlock(&xfrm_state_lock); spin_unlock(&xfrm_state_lock);
if (del_timer(&x->timer)) if (del_timer(&x->timer))
atomic_dec(&x->refcnt); __xfrm_state_put(x);
/* The number two in this test is the reference /* The number two in this test is the reference
* mentioned in the comment below plus the reference * mentioned in the comment below plus the reference
...@@ -243,7 +243,7 @@ static int __xfrm_state_delete(struct xfrm_state *x) ...@@ -243,7 +243,7 @@ static int __xfrm_state_delete(struct xfrm_state *x)
* The xfrm_state_alloc call gives a reference, and that * The xfrm_state_alloc call gives a reference, and that
* is what we are dropping here. * is what we are dropping here.
*/ */
atomic_dec(&x->refcnt); __xfrm_state_put(x);
err = 0; err = 0;
} }
......
...@@ -345,7 +345,7 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) ...@@ -345,7 +345,7 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
if (err < 0) { if (err < 0) {
x->km.state = XFRM_STATE_DEAD; x->km.state = XFRM_STATE_DEAD;
xfrm_state_put(x); __xfrm_state_put(x);
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment