Commit ce7fa1b3 authored by Linus Torvalds's avatar Linus Torvalds

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

parents d898d485 9bffc4ac
...@@ -866,6 +866,7 @@ enum rtnetlink_groups { ...@@ -866,6 +866,7 @@ enum rtnetlink_groups {
#define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE #define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE
RTNLGRP_IPV4_ROUTE, RTNLGRP_IPV4_ROUTE,
#define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE #define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE
RTNLGRP_NOP1,
RTNLGRP_IPV6_IFADDR, RTNLGRP_IPV6_IFADDR,
#define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR #define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR
RTNLGRP_IPV6_MROUTE, RTNLGRP_IPV6_MROUTE,
...@@ -876,8 +877,11 @@ enum rtnetlink_groups { ...@@ -876,8 +877,11 @@ enum rtnetlink_groups {
#define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO #define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO
RTNLGRP_DECnet_IFADDR, RTNLGRP_DECnet_IFADDR,
#define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR #define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR
RTNLGRP_NOP2,
RTNLGRP_DECnet_ROUTE, RTNLGRP_DECnet_ROUTE,
#define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE #define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE
RTNLGRP_NOP3,
RTNLGRP_NOP4,
RTNLGRP_IPV6_PREFIX, RTNLGRP_IPV6_PREFIX,
#define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX #define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX
__RTNLGRP_MAX __RTNLGRP_MAX
......
...@@ -890,6 +890,7 @@ struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto, ...@@ -890,6 +890,7 @@ struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
extern void xfrm_policy_flush(void); extern void xfrm_policy_flush(void);
extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
extern int xfrm_flush_bundles(void); extern int xfrm_flush_bundles(void);
extern void xfrm_flush_all_bundles(void);
extern int xfrm_bundle_ok(struct xfrm_dst *xdst, struct flowi *fl, int family); extern int xfrm_bundle_ok(struct xfrm_dst *xdst, struct flowi *fl, int family);
extern void xfrm_init_pmtu(struct dst_entry *dst); extern void xfrm_init_pmtu(struct dst_entry *dst);
......
...@@ -295,7 +295,7 @@ static int check_hbh_len(struct sk_buff *skb) ...@@ -295,7 +295,7 @@ static int check_hbh_len(struct sk_buff *skb)
len -= 2; len -= 2;
while (len > 0) { while (len > 0) {
int optlen = raw[off+1]+2; int optlen = skb->nh.raw[off+1]+2;
switch (skb->nh.raw[off]) { switch (skb->nh.raw[off]) {
case IPV6_TLV_PAD0: case IPV6_TLV_PAD0:
...@@ -308,18 +308,15 @@ static int check_hbh_len(struct sk_buff *skb) ...@@ -308,18 +308,15 @@ static int check_hbh_len(struct sk_buff *skb)
case IPV6_TLV_JUMBO: case IPV6_TLV_JUMBO:
if (skb->nh.raw[off+1] != 4 || (off&3) != 2) if (skb->nh.raw[off+1] != 4 || (off&3) != 2)
goto bad; goto bad;
pkt_len = ntohl(*(u32*)(skb->nh.raw+off+2)); pkt_len = ntohl(*(u32*)(skb->nh.raw+off+2));
if (pkt_len <= IPV6_MAXPLEN ||
skb->nh.ipv6h->payload_len)
goto bad;
if (pkt_len > skb->len - sizeof(struct ipv6hdr)) if (pkt_len > skb->len - sizeof(struct ipv6hdr))
goto bad; goto bad;
if (pkt_len + sizeof(struct ipv6hdr) < skb->len) { if (pskb_trim_rcsum(skb,
if (__pskb_trim(skb, pkt_len+sizeof(struct ipv6hdr)))
pkt_len + sizeof(struct ipv6hdr)))
goto bad; goto bad;
if (skb->ip_summed == CHECKSUM_HW)
skb->ip_summed = CHECKSUM_NONE;
}
break; break;
default: default:
if (optlen > len) if (optlen > len)
......
...@@ -12,6 +12,7 @@ ip_nat_pptp-objs := ip_nat_helper_pptp.o ip_nat_proto_gre.o ...@@ -12,6 +12,7 @@ ip_nat_pptp-objs := ip_nat_helper_pptp.o ip_nat_proto_gre.o
# connection tracking # connection tracking
obj-$(CONFIG_IP_NF_CONNTRACK) += ip_conntrack.o obj-$(CONFIG_IP_NF_CONNTRACK) += ip_conntrack.o
obj-$(CONFIG_IP_NF_NAT) += ip_nat.o
# conntrack netlink interface # conntrack netlink interface
obj-$(CONFIG_IP_NF_CONNTRACK_NETLINK) += ip_conntrack_netlink.o obj-$(CONFIG_IP_NF_CONNTRACK_NETLINK) += ip_conntrack_netlink.o
...@@ -41,7 +42,7 @@ obj-$(CONFIG_IP_NF_IPTABLES) += ip_tables.o ...@@ -41,7 +42,7 @@ obj-$(CONFIG_IP_NF_IPTABLES) += ip_tables.o
# the three instances of ip_tables # the three instances of ip_tables
obj-$(CONFIG_IP_NF_FILTER) += iptable_filter.o obj-$(CONFIG_IP_NF_FILTER) += iptable_filter.o
obj-$(CONFIG_IP_NF_MANGLE) += iptable_mangle.o obj-$(CONFIG_IP_NF_MANGLE) += iptable_mangle.o
obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o ip_nat.o obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o
obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o
# matches # matches
......
...@@ -182,6 +182,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl) ...@@ -182,6 +182,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl)
case IPPROTO_UDP: case IPPROTO_UDP:
case IPPROTO_TCP: case IPPROTO_TCP:
case IPPROTO_SCTP: case IPPROTO_SCTP:
case IPPROTO_DCCP:
if (pskb_may_pull(skb, xprth + 4 - skb->data)) { if (pskb_may_pull(skb, xprth + 4 - skb->data)) {
u16 *ports = (u16 *)xprth; u16 *ports = (u16 *)xprth;
......
...@@ -1596,9 +1596,17 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) ...@@ -1596,9 +1596,17 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
not good. not good.
*/ */
if (valid_lft >= 0x7FFFFFFF/HZ) if (valid_lft >= 0x7FFFFFFF/HZ)
rt_expires = 0; rt_expires = 0x7FFFFFFF - (0x7FFFFFFF % HZ);
else else
rt_expires = jiffies + valid_lft * HZ; rt_expires = valid_lft * HZ;
/*
* We convert this (in jiffies) to clock_t later.
* Avoid arithmetic overflow there as well.
* Overflow can happen only if HZ < USER_HZ.
*/
if (HZ < USER_HZ && rt_expires > 0x7FFFFFFF / USER_HZ)
rt_expires = 0x7FFFFFFF / USER_HZ;
if (pinfo->onlink) { if (pinfo->onlink) {
struct rt6_info *rt; struct rt6_info *rt;
...@@ -1610,12 +1618,12 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) ...@@ -1610,12 +1618,12 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt, NULL, NULL, NULL);
rt = NULL; rt = NULL;
} else { } else {
rt->rt6i_expires = rt_expires; rt->rt6i_expires = jiffies + rt_expires;
} }
} }
} else if (valid_lft) { } else if (valid_lft) {
addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len, addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len,
dev, rt_expires, RTF_ADDRCONF|RTF_EXPIRES|RTF_PREFIX_RT); dev, jiffies_to_clock_t(rt_expires), RTF_ADDRCONF|RTF_EXPIRES|RTF_PREFIX_RT);
} }
if (rt) if (rt)
dst_release(&rt->u.dst); dst_release(&rt->u.dst);
......
...@@ -211,7 +211,7 @@ config IP6_NF_TARGET_REJECT ...@@ -211,7 +211,7 @@ config IP6_NF_TARGET_REJECT
config IP6_NF_TARGET_NFQUEUE config IP6_NF_TARGET_NFQUEUE
tristate "NFQUEUE Target Support" tristate "NFQUEUE Target Support"
depends on IP_NF_IPTABLES depends on IP6_NF_IPTABLES
help help
This Target replaced the old obsolete QUEUE target. This Target replaced the old obsolete QUEUE target.
......
...@@ -829,7 +829,7 @@ int ip6_route_add(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh, ...@@ -829,7 +829,7 @@ int ip6_route_add(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh,
} }
rt->u.dst.obsolete = -1; rt->u.dst.obsolete = -1;
rt->rt6i_expires = clock_t_to_jiffies(rtmsg->rtmsg_info); rt->rt6i_expires = jiffies + clock_t_to_jiffies(rtmsg->rtmsg_info);
if (nlh && (r = NLMSG_DATA(nlh))) { if (nlh && (r = NLMSG_DATA(nlh))) {
rt->rt6i_protocol = r->rtm_protocol; rt->rt6i_protocol = r->rtm_protocol;
} else { } else {
......
...@@ -214,6 +214,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl) ...@@ -214,6 +214,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl)
case IPPROTO_UDP: case IPPROTO_UDP:
case IPPROTO_TCP: case IPPROTO_TCP:
case IPPROTO_SCTP: case IPPROTO_SCTP:
case IPPROTO_DCCP:
if (pskb_may_pull(skb, skb->nh.raw + offset + 4 - skb->data)) { if (pskb_may_pull(skb, skb->nh.raw + offset + 4 - skb->data)) {
u16 *ports = (u16 *)exthdr; u16 *ports = (u16 *)exthdr;
......
...@@ -156,10 +156,6 @@ static inline void sctp_set_owner_w(struct sctp_chunk *chunk) ...@@ -156,10 +156,6 @@ static inline void sctp_set_owner_w(struct sctp_chunk *chunk)
sizeof(struct sk_buff) + sizeof(struct sk_buff) +
sizeof(struct sctp_chunk); sizeof(struct sctp_chunk);
sk->sk_wmem_queued += SCTP_DATA_SNDSIZE(chunk) +
sizeof(struct sk_buff) +
sizeof(struct sctp_chunk);
atomic_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); atomic_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
} }
...@@ -4426,7 +4422,7 @@ int sctp_inet_listen(struct socket *sock, int backlog) ...@@ -4426,7 +4422,7 @@ int sctp_inet_listen(struct socket *sock, int backlog)
* tcp_poll(). Note that, based on these implementations, we don't * tcp_poll(). Note that, based on these implementations, we don't
* lock the socket in this function, even though it seems that, * lock the socket in this function, even though it seems that,
* ideally, locking or some other mechanisms can be used to ensure * ideally, locking or some other mechanisms can be used to ensure
* the integrity of the counters (sndbuf and wmem_queued) used * the integrity of the counters (sndbuf and wmem_alloc) used
* in this place. We assume that we don't need locks either until proven * in this place. We assume that we don't need locks either until proven
* otherwise. * otherwise.
* *
...@@ -4833,10 +4829,6 @@ static void sctp_wfree(struct sk_buff *skb) ...@@ -4833,10 +4829,6 @@ static void sctp_wfree(struct sk_buff *skb)
sizeof(struct sk_buff) + sizeof(struct sk_buff) +
sizeof(struct sctp_chunk); sizeof(struct sctp_chunk);
sk->sk_wmem_queued -= SCTP_DATA_SNDSIZE(chunk) +
sizeof(struct sk_buff) +
sizeof(struct sctp_chunk);
atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
sock_wfree(skb); sock_wfree(skb);
...@@ -4920,7 +4912,7 @@ void sctp_write_space(struct sock *sk) ...@@ -4920,7 +4912,7 @@ void sctp_write_space(struct sock *sk)
/* Is there any sndbuf space available on the socket? /* Is there any sndbuf space available on the socket?
* *
* Note that wmem_queued is the sum of the send buffers on all of the * Note that sk_wmem_alloc is the sum of the send buffers on all of the
* associations on the same socket. For a UDP-style socket with * associations on the same socket. For a UDP-style socket with
* multiple associations, it is possible for it to be "unwriteable" * multiple associations, it is possible for it to be "unwriteable"
* prematurely. I assume that this is acceptable because * prematurely. I assume that this is acceptable because
...@@ -4933,7 +4925,7 @@ static int sctp_writeable(struct sock *sk) ...@@ -4933,7 +4925,7 @@ static int sctp_writeable(struct sock *sk)
{ {
int amt = 0; int amt = 0;
amt = sk->sk_sndbuf - sk->sk_wmem_queued; amt = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
if (amt < 0) if (amt < 0)
amt = 0; amt = 0;
return amt; return amt;
......
...@@ -1014,13 +1014,12 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family) ...@@ -1014,13 +1014,12 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family)
} }
EXPORT_SYMBOL(__xfrm_route_forward); EXPORT_SYMBOL(__xfrm_route_forward);
/* Optimize later using cookies and generation ids. */
static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie) static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie)
{ {
if (!stale_bundle(dst)) /* If it is marked obsolete, which is how we even get here,
return dst; * then we have purged it from the policy bundle list and we
* did that for a good reason.
*/
return NULL; return NULL;
} }
...@@ -1104,6 +1103,16 @@ int xfrm_flush_bundles(void) ...@@ -1104,6 +1103,16 @@ int xfrm_flush_bundles(void)
return 0; return 0;
} }
static int always_true(struct dst_entry *dst)
{
return 1;
}
void xfrm_flush_all_bundles(void)
{
xfrm_prune_bundles(always_true);
}
void xfrm_init_pmtu(struct dst_entry *dst) void xfrm_init_pmtu(struct dst_entry *dst)
{ {
do { do {
......
...@@ -431,6 +431,8 @@ void xfrm_state_insert(struct xfrm_state *x) ...@@ -431,6 +431,8 @@ void xfrm_state_insert(struct xfrm_state *x)
spin_lock_bh(&xfrm_state_lock); spin_lock_bh(&xfrm_state_lock);
__xfrm_state_insert(x); __xfrm_state_insert(x);
spin_unlock_bh(&xfrm_state_lock); spin_unlock_bh(&xfrm_state_lock);
xfrm_flush_all_bundles();
} }
EXPORT_SYMBOL(xfrm_state_insert); EXPORT_SYMBOL(xfrm_state_insert);
...@@ -478,6 +480,9 @@ int xfrm_state_add(struct xfrm_state *x) ...@@ -478,6 +480,9 @@ int xfrm_state_add(struct xfrm_state *x)
spin_unlock_bh(&xfrm_state_lock); spin_unlock_bh(&xfrm_state_lock);
xfrm_state_put_afinfo(afinfo); xfrm_state_put_afinfo(afinfo);
if (!err)
xfrm_flush_all_bundles();
if (x1) { if (x1) {
xfrm_state_delete(x1); xfrm_state_delete(x1);
xfrm_state_put(x1); xfrm_state_put(x1);
......
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