diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/ip_output.c | 1 | ||||
-rw-r--r-- | net/ipv4/tcp_cong.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 9 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
-rw-r--r-- | net/ipv6/exthdrs.c | 29 | ||||
-rw-r--r-- | net/ipv6/route.c | 4 | ||||
-rw-r--r-- | net/netlink/af_netlink.c | 14 | ||||
-rw-r--r-- | net/sctp/socket.c | 10 | ||||
-rw-r--r-- | net/socket.c | 3 |
9 files changed, 46 insertions, 30 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 4c20f5546893..a2ede167e045 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -440,6 +440,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) | |||
440 | iph = skb->nh.iph; | 440 | iph = skb->nh.iph; |
441 | 441 | ||
442 | if (unlikely((iph->frag_off & htons(IP_DF)) && !skb->local_df)) { | 442 | if (unlikely((iph->frag_off & htons(IP_DF)) && !skb->local_df)) { |
443 | IP_INC_STATS(IPSTATS_MIB_FRAGFAILS); | ||
443 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, | 444 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, |
444 | htonl(dst_mtu(&rt->u.dst))); | 445 | htonl(dst_mtu(&rt->u.dst))); |
445 | kfree_skb(skb); | 446 | kfree_skb(skb); |
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 5765f9d03174..7ff2e4273a7c 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
@@ -189,7 +189,7 @@ void tcp_slow_start(struct tcp_sock *tp) | |||
189 | return; | 189 | return; |
190 | 190 | ||
191 | /* We MAY increase by 2 if discovered delayed ack */ | 191 | /* We MAY increase by 2 if discovered delayed ack */ |
192 | if (sysctl_tcp_abc > 1 && tp->bytes_acked > 2*tp->mss_cache) { | 192 | if (sysctl_tcp_abc > 1 && tp->bytes_acked >= 2*tp->mss_cache) { |
193 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | 193 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) |
194 | tp->snd_cwnd++; | 194 | tp->snd_cwnd++; |
195 | } | 195 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 104af5d5bcbc..111ff39a08c5 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2505,8 +2505,13 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag) | |||
2505 | if (before(ack, prior_snd_una)) | 2505 | if (before(ack, prior_snd_una)) |
2506 | goto old_ack; | 2506 | goto old_ack; |
2507 | 2507 | ||
2508 | if (sysctl_tcp_abc && icsk->icsk_ca_state < TCP_CA_CWR) | 2508 | if (sysctl_tcp_abc) { |
2509 | tp->bytes_acked += ack - prior_snd_una; | 2509 | if (icsk->icsk_ca_state < TCP_CA_CWR) |
2510 | tp->bytes_acked += ack - prior_snd_una; | ||
2511 | else if (icsk->icsk_ca_state == TCP_CA_Loss) | ||
2512 | /* we assume just one segment left network */ | ||
2513 | tp->bytes_acked += min(ack - prior_snd_una, tp->mss_cache); | ||
2514 | } | ||
2510 | 2515 | ||
2511 | if (!(flag&FLAG_SLOWPATH) && after(ack, prior_snd_una)) { | 2516 | if (!(flag&FLAG_SLOWPATH) && after(ack, prior_snd_una)) { |
2512 | /* Window is constant, pure forward advance. | 2517 | /* Window is constant, pure forward advance. |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 0c5042e7380d..c7852b38e03e 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -578,6 +578,8 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
578 | ifa->flags = flags | IFA_F_TENTATIVE; | 578 | ifa->flags = flags | IFA_F_TENTATIVE; |
579 | ifa->cstamp = ifa->tstamp = jiffies; | 579 | ifa->cstamp = ifa->tstamp = jiffies; |
580 | 580 | ||
581 | ifa->rt = rt; | ||
582 | |||
581 | ifa->idev = idev; | 583 | ifa->idev = idev; |
582 | in6_dev_hold(idev); | 584 | in6_dev_hold(idev); |
583 | /* For caller */ | 585 | /* For caller */ |
@@ -603,8 +605,6 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
603 | } | 605 | } |
604 | #endif | 606 | #endif |
605 | 607 | ||
606 | ifa->rt = rt; | ||
607 | |||
608 | in6_ifa_hold(ifa); | 608 | in6_ifa_hold(ifa); |
609 | write_unlock(&idev->lock); | 609 | write_unlock(&idev->lock); |
610 | out2: | 610 | out2: |
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 9d0ee7f0eeb5..86dac106873b 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -635,14 +635,17 @@ ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, | |||
635 | struct ipv6_txoptions *opt2; | 635 | struct ipv6_txoptions *opt2; |
636 | int err; | 636 | int err; |
637 | 637 | ||
638 | if (newtype != IPV6_HOPOPTS && opt->hopopt) | 638 | if (opt) { |
639 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->hopopt)); | 639 | if (newtype != IPV6_HOPOPTS && opt->hopopt) |
640 | if (newtype != IPV6_RTHDRDSTOPTS && opt->dst0opt) | 640 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->hopopt)); |
641 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst0opt)); | 641 | if (newtype != IPV6_RTHDRDSTOPTS && opt->dst0opt) |
642 | if (newtype != IPV6_RTHDR && opt->srcrt) | 642 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst0opt)); |
643 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->srcrt)); | 643 | if (newtype != IPV6_RTHDR && opt->srcrt) |
644 | if (newtype != IPV6_DSTOPTS && opt->dst1opt) | 644 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->srcrt)); |
645 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst1opt)); | 645 | if (newtype != IPV6_DSTOPTS && opt->dst1opt) |
646 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst1opt)); | ||
647 | } | ||
648 | |||
646 | if (newopt && newoptlen) | 649 | if (newopt && newoptlen) |
647 | tot_len += CMSG_ALIGN(newoptlen); | 650 | tot_len += CMSG_ALIGN(newoptlen); |
648 | 651 | ||
@@ -659,25 +662,25 @@ ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, | |||
659 | opt2->tot_len = tot_len; | 662 | opt2->tot_len = tot_len; |
660 | p = (char *)(opt2 + 1); | 663 | p = (char *)(opt2 + 1); |
661 | 664 | ||
662 | err = ipv6_renew_option(opt->hopopt, newopt, newoptlen, | 665 | err = ipv6_renew_option(opt ? opt->hopopt : NULL, newopt, newoptlen, |
663 | newtype != IPV6_HOPOPTS, | 666 | newtype != IPV6_HOPOPTS, |
664 | &opt2->hopopt, &p); | 667 | &opt2->hopopt, &p); |
665 | if (err) | 668 | if (err) |
666 | goto out; | 669 | goto out; |
667 | 670 | ||
668 | err = ipv6_renew_option(opt->dst0opt, newopt, newoptlen, | 671 | err = ipv6_renew_option(opt ? opt->dst0opt : NULL, newopt, newoptlen, |
669 | newtype != IPV6_RTHDRDSTOPTS, | 672 | newtype != IPV6_RTHDRDSTOPTS, |
670 | &opt2->dst0opt, &p); | 673 | &opt2->dst0opt, &p); |
671 | if (err) | 674 | if (err) |
672 | goto out; | 675 | goto out; |
673 | 676 | ||
674 | err = ipv6_renew_option(opt->srcrt, newopt, newoptlen, | 677 | err = ipv6_renew_option(opt ? opt->srcrt : NULL, newopt, newoptlen, |
675 | newtype != IPV6_RTHDR, | 678 | newtype != IPV6_RTHDR, |
676 | (struct ipv6_opt_hdr **)opt2->srcrt, &p); | 679 | (struct ipv6_opt_hdr **)&opt2->srcrt, &p); |
677 | if (err) | 680 | if (err) |
678 | goto out; | 681 | goto out; |
679 | 682 | ||
680 | err = ipv6_renew_option(opt->dst1opt, newopt, newoptlen, | 683 | err = ipv6_renew_option(opt ? opt->dst1opt : NULL, newopt, newoptlen, |
681 | newtype != IPV6_DSTOPTS, | 684 | newtype != IPV6_DSTOPTS, |
682 | &opt2->dst1opt, &p); | 685 | &opt2->dst1opt, &p); |
683 | if (err) | 686 | if (err) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 4b163711f3a8..d9baca062d24 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1532,6 +1532,10 @@ int ipv6_route_ioctl(unsigned int cmd, void __user *arg) | |||
1532 | 1532 | ||
1533 | static int ip6_pkt_discard(struct sk_buff *skb) | 1533 | static int ip6_pkt_discard(struct sk_buff *skb) |
1534 | { | 1534 | { |
1535 | int type = ipv6_addr_type(&skb->nh.ipv6h->daddr); | ||
1536 | if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED) | ||
1537 | IP6_INC_STATS(IPSTATS_MIB_INADDRERRORS); | ||
1538 | |||
1535 | IP6_INC_STATS(IPSTATS_MIB_OUTNOROUTES); | 1539 | IP6_INC_STATS(IPSTATS_MIB_OUTNOROUTES); |
1536 | icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_NOROUTE, 0, skb->dev); | 1540 | icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_NOROUTE, 0, skb->dev); |
1537 | kfree_skb(skb); | 1541 | kfree_skb(skb); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index b85c1f9f1288..8b85036ba8e3 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1273,8 +1273,7 @@ netlink_kernel_create(int unit, unsigned int groups, | |||
1273 | struct netlink_sock *nlk; | 1273 | struct netlink_sock *nlk; |
1274 | unsigned long *listeners = NULL; | 1274 | unsigned long *listeners = NULL; |
1275 | 1275 | ||
1276 | if (!nl_table) | 1276 | BUG_ON(!nl_table); |
1277 | return NULL; | ||
1278 | 1277 | ||
1279 | if (unit<0 || unit>=MAX_LINKS) | 1278 | if (unit<0 || unit>=MAX_LINKS) |
1280 | return NULL; | 1279 | return NULL; |
@@ -1745,11 +1744,8 @@ static int __init netlink_proto_init(void) | |||
1745 | netlink_skb_parms_too_large(); | 1744 | netlink_skb_parms_too_large(); |
1746 | 1745 | ||
1747 | nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL); | 1746 | nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL); |
1748 | if (!nl_table) { | 1747 | if (!nl_table) |
1749 | enomem: | 1748 | goto panic; |
1750 | printk(KERN_CRIT "netlink_init: Cannot allocate nl_table\n"); | ||
1751 | return -ENOMEM; | ||
1752 | } | ||
1753 | 1749 | ||
1754 | if (num_physpages >= (128 * 1024)) | 1750 | if (num_physpages >= (128 * 1024)) |
1755 | max = num_physpages >> (21 - PAGE_SHIFT); | 1751 | max = num_physpages >> (21 - PAGE_SHIFT); |
@@ -1769,7 +1765,7 @@ enomem: | |||
1769 | nl_pid_hash_free(nl_table[i].hash.table, | 1765 | nl_pid_hash_free(nl_table[i].hash.table, |
1770 | 1 * sizeof(*hash->table)); | 1766 | 1 * sizeof(*hash->table)); |
1771 | kfree(nl_table); | 1767 | kfree(nl_table); |
1772 | goto enomem; | 1768 | goto panic; |
1773 | } | 1769 | } |
1774 | memset(hash->table, 0, 1 * sizeof(*hash->table)); | 1770 | memset(hash->table, 0, 1 * sizeof(*hash->table)); |
1775 | hash->max_shift = order; | 1771 | hash->max_shift = order; |
@@ -1786,6 +1782,8 @@ enomem: | |||
1786 | rtnetlink_init(); | 1782 | rtnetlink_init(); |
1787 | out: | 1783 | out: |
1788 | return err; | 1784 | return err; |
1785 | panic: | ||
1786 | panic("netlink_init: Cannot allocate nl_table\n"); | ||
1789 | } | 1787 | } |
1790 | 1788 | ||
1791 | core_initcall(netlink_proto_init); | 1789 | core_initcall(netlink_proto_init); |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index fde3f55bfd4b..dab15949958e 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -1289,9 +1289,13 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout) | |||
1289 | } | 1289 | } |
1290 | } | 1290 | } |
1291 | 1291 | ||
1292 | if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) | 1292 | if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) { |
1293 | sctp_primitive_ABORT(asoc, NULL); | 1293 | struct sctp_chunk *chunk; |
1294 | else | 1294 | |
1295 | chunk = sctp_make_abort_user(asoc, NULL, 0); | ||
1296 | if (chunk) | ||
1297 | sctp_primitive_ABORT(asoc, chunk); | ||
1298 | } else | ||
1295 | sctp_primitive_SHUTDOWN(asoc, NULL); | 1299 | sctp_primitive_SHUTDOWN(asoc, NULL); |
1296 | } | 1300 | } |
1297 | 1301 | ||
diff --git a/net/socket.c b/net/socket.c index b4848ce0d6ac..6d261bf206fc 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -1178,7 +1178,8 @@ static int __sock_create(int family, int type, int protocol, struct socket **res | |||
1178 | */ | 1178 | */ |
1179 | 1179 | ||
1180 | if (!(sock = sock_alloc())) { | 1180 | if (!(sock = sock_alloc())) { |
1181 | printk(KERN_WARNING "socket: no more sockets\n"); | 1181 | if (net_ratelimit()) |
1182 | printk(KERN_WARNING "socket: no more sockets\n"); | ||
1182 | err = -ENFILE; /* Not exactly a match, but its the | 1183 | err = -ENFILE; /* Not exactly a match, but its the |
1183 | closest posix thing */ | 1184 | closest posix thing */ |
1184 | goto out; | 1185 | goto out; |