diff options
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
| -rw-r--r-- | net/ipv6/ip6_output.c | 2 | ||||
| -rw-r--r-- | net/ipv6/netfilter/Kconfig | 11 | ||||
| -rw-r--r-- | net/ipv6/netfilter/Makefile | 2 | ||||
| -rw-r--r-- | net/ipv6/netfilter/ip6_queue.c | 4 | ||||
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 18 | ||||
| -rw-r--r-- | net/ipv6/udp.c | 14 |
7 files changed, 38 insertions, 17 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 2fea3f4402a0..a970b4727ce8 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1806,7 +1806,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
| 1806 | } | 1806 | } |
| 1807 | 1807 | ||
| 1808 | for (dev = dev_base; dev != NULL; dev = dev->next) { | 1808 | for (dev = dev_base; dev != NULL; dev = dev->next) { |
| 1809 | struct in_device * in_dev = __in_dev_get(dev); | 1809 | struct in_device * in_dev = __in_dev_get_rtnl(dev); |
| 1810 | if (in_dev && (dev->flags & IFF_UP)) { | 1810 | if (in_dev && (dev->flags & IFF_UP)) { |
| 1811 | struct in_ifaddr * ifa; | 1811 | struct in_ifaddr * ifa; |
| 1812 | 1812 | ||
| @@ -3520,6 +3520,8 @@ int __init addrconf_init(void) | |||
| 3520 | if (err) | 3520 | if (err) |
| 3521 | return err; | 3521 | return err; |
| 3522 | 3522 | ||
| 3523 | ip6_null_entry.rt6i_idev = in6_dev_get(&loopback_dev); | ||
| 3524 | |||
| 3523 | register_netdevice_notifier(&ipv6_dev_notf); | 3525 | register_netdevice_notifier(&ipv6_dev_notf); |
| 3524 | 3526 | ||
| 3525 | #ifdef CONFIG_IPV6_PRIVACY | 3527 | #ifdef CONFIG_IPV6_PRIVACY |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 2f589f24c093..563b442ffab8 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -666,7 +666,7 @@ slow_path: | |||
| 666 | */ | 666 | */ |
| 667 | fh->nexthdr = nexthdr; | 667 | fh->nexthdr = nexthdr; |
| 668 | fh->reserved = 0; | 668 | fh->reserved = 0; |
| 669 | if (frag_id) { | 669 | if (!frag_id) { |
| 670 | ipv6_select_ident(skb, fh); | 670 | ipv6_select_ident(skb, fh); |
| 671 | frag_id = fh->identification; | 671 | frag_id = fh->identification; |
| 672 | } else | 672 | } else |
diff --git a/net/ipv6/netfilter/Kconfig b/net/ipv6/netfilter/Kconfig index 216fbe1ac65c..bb7ccfe33f23 100644 --- a/net/ipv6/netfilter/Kconfig +++ b/net/ipv6/netfilter/Kconfig | |||
| @@ -209,6 +209,17 @@ config IP6_NF_TARGET_REJECT | |||
| 209 | 209 | ||
| 210 | To compile it as a module, choose M here. If unsure, say N. | 210 | To compile it as a module, choose M here. If unsure, say N. |
| 211 | 211 | ||
| 212 | config IP6_NF_TARGET_NFQUEUE | ||
| 213 | tristate "NFQUEUE Target Support" | ||
| 214 | depends on IP_NF_IPTABLES | ||
| 215 | help | ||
| 216 | This Target replaced the old obsolete QUEUE target. | ||
| 217 | |||
| 218 | As opposed to QUEUE, it supports 65535 different queues, | ||
| 219 | not just one. | ||
| 220 | |||
| 221 | To compile it as a module, choose M here. If unsure, say N. | ||
| 222 | |||
| 212 | # if [ "$CONFIG_IP6_NF_FILTER" != "n" ]; then | 223 | # if [ "$CONFIG_IP6_NF_FILTER" != "n" ]; then |
| 213 | # dep_tristate ' REJECT target support' CONFIG_IP6_NF_TARGET_REJECT $CONFIG_IP6_NF_FILTER | 224 | # dep_tristate ' REJECT target support' CONFIG_IP6_NF_TARGET_REJECT $CONFIG_IP6_NF_FILTER |
| 214 | # if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then | 225 | # if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then |
diff --git a/net/ipv6/netfilter/Makefile b/net/ipv6/netfilter/Makefile index bd9a16a5cbba..2b2c370e8b1c 100644 --- a/net/ipv6/netfilter/Makefile +++ b/net/ipv6/netfilter/Makefile | |||
| @@ -21,9 +21,9 @@ obj-$(CONFIG_IP6_NF_FILTER) += ip6table_filter.o | |||
| 21 | obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_mangle.o | 21 | obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_mangle.o |
| 22 | obj-$(CONFIG_IP6_NF_TARGET_MARK) += ip6t_MARK.o | 22 | obj-$(CONFIG_IP6_NF_TARGET_MARK) += ip6t_MARK.o |
| 23 | obj-$(CONFIG_IP6_NF_TARGET_HL) += ip6t_HL.o | 23 | obj-$(CONFIG_IP6_NF_TARGET_HL) += ip6t_HL.o |
| 24 | obj-$(CONFIG_IP6_NF_TARGET_NFQUEUE) += ip6t_NFQUEUE.o | ||
| 24 | obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o | 25 | obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o |
| 25 | obj-$(CONFIG_IP6_NF_TARGET_LOG) += ip6t_LOG.o | 26 | obj-$(CONFIG_IP6_NF_TARGET_LOG) += ip6t_LOG.o |
| 26 | obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o | 27 | obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o |
| 27 | obj-$(CONFIG_IP6_NF_MATCH_HL) += ip6t_hl.o | 28 | obj-$(CONFIG_IP6_NF_MATCH_HL) += ip6t_hl.o |
| 28 | obj-$(CONFIG_IP6_NF_TARGET_REJECT) += ip6t_REJECT.o | 29 | obj-$(CONFIG_IP6_NF_TARGET_REJECT) += ip6t_REJECT.o |
| 29 | obj-$(CONFIG_NETFILTER_NETLINK_QUEUE) += ip6t_NFQUEUE.o | ||
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index aa11cf366efa..5027bbe6415e 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
| @@ -238,8 +238,8 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) | |||
| 238 | 238 | ||
| 239 | pmsg->packet_id = (unsigned long )entry; | 239 | pmsg->packet_id = (unsigned long )entry; |
| 240 | pmsg->data_len = data_len; | 240 | pmsg->data_len = data_len; |
| 241 | pmsg->timestamp_sec = skb_tv_base.tv_sec + entry->skb->tstamp.off_sec; | 241 | pmsg->timestamp_sec = entry->skb->tstamp.off_sec; |
| 242 | pmsg->timestamp_usec = skb_tv_base.tv_usec + entry->skb->tstamp.off_usec; | 242 | pmsg->timestamp_usec = entry->skb->tstamp.off_usec; |
| 243 | pmsg->mark = entry->skb->nfmark; | 243 | pmsg->mark = entry->skb->nfmark; |
| 244 | pmsg->hook = entry->info->hook; | 244 | pmsg->hook = entry->info->hook; |
| 245 | pmsg->hw_protocol = entry->skb->protocol; | 245 | pmsg->hw_protocol = entry->skb->protocol; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 80643e6b346b..d693cb988b78 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -209,9 +209,11 @@ static __inline__ void __tcp_v6_hash(struct sock *sk) | |||
| 209 | lock = &tcp_hashinfo.lhash_lock; | 209 | lock = &tcp_hashinfo.lhash_lock; |
| 210 | inet_listen_wlock(&tcp_hashinfo); | 210 | inet_listen_wlock(&tcp_hashinfo); |
| 211 | } else { | 211 | } else { |
| 212 | sk->sk_hashent = inet6_sk_ehashfn(sk, tcp_hashinfo.ehash_size); | 212 | unsigned int hash; |
| 213 | list = &tcp_hashinfo.ehash[sk->sk_hashent].chain; | 213 | sk->sk_hash = hash = inet6_sk_ehashfn(sk); |
| 214 | lock = &tcp_hashinfo.ehash[sk->sk_hashent].lock; | 214 | hash &= (tcp_hashinfo.ehash_size - 1); |
| 215 | list = &tcp_hashinfo.ehash[hash].chain; | ||
| 216 | lock = &tcp_hashinfo.ehash[hash].lock; | ||
| 215 | write_lock(lock); | 217 | write_lock(lock); |
| 216 | } | 218 | } |
| 217 | 219 | ||
| @@ -322,13 +324,13 @@ static int __tcp_v6_check_established(struct sock *sk, const __u16 lport, | |||
| 322 | const struct in6_addr *saddr = &np->daddr; | 324 | const struct in6_addr *saddr = &np->daddr; |
| 323 | const int dif = sk->sk_bound_dev_if; | 325 | const int dif = sk->sk_bound_dev_if; |
| 324 | const u32 ports = INET_COMBINED_PORTS(inet->dport, lport); | 326 | const u32 ports = INET_COMBINED_PORTS(inet->dport, lport); |
| 325 | const int hash = inet6_ehashfn(daddr, inet->num, saddr, inet->dport, | 327 | unsigned int hash = inet6_ehashfn(daddr, inet->num, saddr, inet->dport); |
| 326 | tcp_hashinfo.ehash_size); | 328 | struct inet_ehash_bucket *head = inet_ehash_bucket(&tcp_hashinfo, hash); |
| 327 | struct inet_ehash_bucket *head = &tcp_hashinfo.ehash[hash]; | ||
| 328 | struct sock *sk2; | 329 | struct sock *sk2; |
| 329 | const struct hlist_node *node; | 330 | const struct hlist_node *node; |
| 330 | struct inet_timewait_sock *tw; | 331 | struct inet_timewait_sock *tw; |
| 331 | 332 | ||
| 333 | prefetch(head->chain.first); | ||
| 332 | write_lock(&head->lock); | 334 | write_lock(&head->lock); |
| 333 | 335 | ||
| 334 | /* Check TIME-WAIT sockets first. */ | 336 | /* Check TIME-WAIT sockets first. */ |
| @@ -365,14 +367,14 @@ static int __tcp_v6_check_established(struct sock *sk, const __u16 lport, | |||
| 365 | 367 | ||
| 366 | /* And established part... */ | 368 | /* And established part... */ |
| 367 | sk_for_each(sk2, node, &head->chain) { | 369 | sk_for_each(sk2, node, &head->chain) { |
| 368 | if (INET6_MATCH(sk2, saddr, daddr, ports, dif)) | 370 | if (INET6_MATCH(sk2, hash, saddr, daddr, ports, dif)) |
| 369 | goto not_unique; | 371 | goto not_unique; |
| 370 | } | 372 | } |
| 371 | 373 | ||
| 372 | unique: | 374 | unique: |
| 373 | BUG_TRAP(sk_unhashed(sk)); | 375 | BUG_TRAP(sk_unhashed(sk)); |
| 374 | __sk_add_node(sk, &head->chain); | 376 | __sk_add_node(sk, &head->chain); |
| 375 | sk->sk_hashent = hash; | 377 | sk->sk_hash = hash; |
| 376 | sock_prot_inc_use(sk->sk_prot); | 378 | sock_prot_inc_use(sk->sk_prot); |
| 377 | write_unlock(&head->lock); | 379 | write_unlock(&head->lock); |
| 378 | 380 | ||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 6001948600f3..e4cad11f284a 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -852,10 +852,16 @@ do_append_data: | |||
| 852 | else if (!corkreq) | 852 | else if (!corkreq) |
| 853 | err = udp_v6_push_pending_frames(sk, up); | 853 | err = udp_v6_push_pending_frames(sk, up); |
| 854 | 854 | ||
| 855 | if (dst && connected) | 855 | if (dst) { |
| 856 | ip6_dst_store(sk, dst, | 856 | if (connected) { |
| 857 | ipv6_addr_equal(&fl->fl6_dst, &np->daddr) ? | 857 | ip6_dst_store(sk, dst, |
| 858 | &np->daddr : NULL); | 858 | ipv6_addr_equal(&fl->fl6_dst, &np->daddr) ? |
| 859 | &np->daddr : NULL); | ||
| 860 | } else { | ||
| 861 | dst_release(dst); | ||
| 862 | } | ||
| 863 | } | ||
| 864 | |||
| 859 | if (err > 0) | 865 | if (err > 0) |
| 860 | err = np->recverr ? net_xmit_errno(err) : 0; | 866 | err = np->recverr ? net_xmit_errno(err) : 0; |
| 861 | release_sock(sk); | 867 | release_sock(sk); |
