diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/8021q/vlan.c | 6 | ||||
| -rw-r--r-- | net/dccp/ipv4.c | 2 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 111 | ||||
| -rw-r--r-- | net/ipv6/icmp.c | 16 | ||||
| -rw-r--r-- | net/ipv6/route.c | 13 | ||||
| -rw-r--r-- | net/netrom/nr_in.c | 6 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 30 |
7 files changed, 159 insertions, 25 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 91e412b0ab00..67465b65abe4 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
| @@ -753,6 +753,8 @@ static int vlan_ioctl_handler(void __user *arg) | |||
| 753 | break; | 753 | break; |
| 754 | case GET_VLAN_REALDEV_NAME_CMD: | 754 | case GET_VLAN_REALDEV_NAME_CMD: |
| 755 | err = vlan_dev_get_realdev_name(args.device1, args.u.device2); | 755 | err = vlan_dev_get_realdev_name(args.device1, args.u.device2); |
| 756 | if (err) | ||
| 757 | goto out; | ||
| 756 | if (copy_to_user(arg, &args, | 758 | if (copy_to_user(arg, &args, |
| 757 | sizeof(struct vlan_ioctl_args))) { | 759 | sizeof(struct vlan_ioctl_args))) { |
| 758 | err = -EFAULT; | 760 | err = -EFAULT; |
| @@ -761,6 +763,8 @@ static int vlan_ioctl_handler(void __user *arg) | |||
| 761 | 763 | ||
| 762 | case GET_VLAN_VID_CMD: | 764 | case GET_VLAN_VID_CMD: |
| 763 | err = vlan_dev_get_vid(args.device1, &vid); | 765 | err = vlan_dev_get_vid(args.device1, &vid); |
| 766 | if (err) | ||
| 767 | goto out; | ||
| 764 | args.u.VID = vid; | 768 | args.u.VID = vid; |
| 765 | if (copy_to_user(arg, &args, | 769 | if (copy_to_user(arg, &args, |
| 766 | sizeof(struct vlan_ioctl_args))) { | 770 | sizeof(struct vlan_ioctl_args))) { |
| @@ -774,7 +778,7 @@ static int vlan_ioctl_handler(void __user *arg) | |||
| 774 | __FUNCTION__, args.cmd); | 778 | __FUNCTION__, args.cmd); |
| 775 | return -EINVAL; | 779 | return -EINVAL; |
| 776 | }; | 780 | }; |
| 777 | 781 | out: | |
| 778 | return err; | 782 | return err; |
| 779 | } | 783 | } |
| 780 | 784 | ||
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index ca03521112c5..656e13e38cfb 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
| @@ -1251,7 +1251,7 @@ static int dccp_v4_destroy_sock(struct sock *sk) | |||
| 1251 | struct dccp_sock *dp = dccp_sk(sk); | 1251 | struct dccp_sock *dp = dccp_sk(sk); |
| 1252 | 1252 | ||
| 1253 | /* | 1253 | /* |
| 1254 | * DCCP doesn't use sk_qrite_queue, just sk_send_head | 1254 | * DCCP doesn't use sk_write_queue, just sk_send_head |
| 1255 | * for retransmissions | 1255 | * for retransmissions |
| 1256 | */ | 1256 | */ |
| 1257 | if (sk->sk_send_head != NULL) { | 1257 | if (sk->sk_send_head != NULL) { |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 4ea8cf7c0cc4..510220f2ae8b 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -137,6 +137,7 @@ static int addrconf_ifdown(struct net_device *dev, int how); | |||
| 137 | static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags); | 137 | static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags); |
| 138 | static void addrconf_dad_timer(unsigned long data); | 138 | static void addrconf_dad_timer(unsigned long data); |
| 139 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp); | 139 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp); |
| 140 | static void addrconf_dad_run(struct inet6_dev *idev); | ||
| 140 | static void addrconf_rs_timer(unsigned long data); | 141 | static void addrconf_rs_timer(unsigned long data); |
| 141 | static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); | 142 | static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); |
| 142 | static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); | 143 | static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); |
| @@ -388,6 +389,9 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | |||
| 388 | } | 389 | } |
| 389 | #endif | 390 | #endif |
| 390 | 391 | ||
| 392 | if (netif_carrier_ok(dev)) | ||
| 393 | ndev->if_flags |= IF_READY; | ||
| 394 | |||
| 391 | write_lock_bh(&addrconf_lock); | 395 | write_lock_bh(&addrconf_lock); |
| 392 | dev->ip6_ptr = ndev; | 396 | dev->ip6_ptr = ndev; |
| 393 | write_unlock_bh(&addrconf_lock); | 397 | write_unlock_bh(&addrconf_lock); |
| @@ -415,6 +419,7 @@ static struct inet6_dev * ipv6_find_idev(struct net_device *dev) | |||
| 415 | if ((idev = ipv6_add_dev(dev)) == NULL) | 419 | if ((idev = ipv6_add_dev(dev)) == NULL) |
| 416 | return NULL; | 420 | return NULL; |
| 417 | } | 421 | } |
| 422 | |||
| 418 | if (dev->flags&IFF_UP) | 423 | if (dev->flags&IFF_UP) |
| 419 | ipv6_mc_up(idev); | 424 | ipv6_mc_up(idev); |
| 420 | return idev; | 425 | return idev; |
| @@ -634,8 +639,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | |||
| 634 | } | 639 | } |
| 635 | #endif | 640 | #endif |
| 636 | 641 | ||
| 637 | for (ifap = &idev->addr_list; (ifa=*ifap) != NULL; | 642 | for (ifap = &idev->addr_list; (ifa=*ifap) != NULL;) { |
| 638 | ifap = &ifa->if_next) { | ||
| 639 | if (ifa == ifp) { | 643 | if (ifa == ifp) { |
| 640 | *ifap = ifa->if_next; | 644 | *ifap = ifa->if_next; |
| 641 | __in6_ifa_put(ifp); | 645 | __in6_ifa_put(ifp); |
| @@ -643,6 +647,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | |||
| 643 | if (!(ifp->flags & IFA_F_PERMANENT) || onlink > 0) | 647 | if (!(ifp->flags & IFA_F_PERMANENT) || onlink > 0) |
| 644 | break; | 648 | break; |
| 645 | deleted = 1; | 649 | deleted = 1; |
| 650 | continue; | ||
| 646 | } else if (ifp->flags & IFA_F_PERMANENT) { | 651 | } else if (ifp->flags & IFA_F_PERMANENT) { |
| 647 | if (ipv6_prefix_equal(&ifa->addr, &ifp->addr, | 652 | if (ipv6_prefix_equal(&ifa->addr, &ifp->addr, |
| 648 | ifp->prefix_len)) { | 653 | ifp->prefix_len)) { |
| @@ -666,6 +671,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | |||
| 666 | } | 671 | } |
| 667 | } | 672 | } |
| 668 | } | 673 | } |
| 674 | ifap = &ifa->if_next; | ||
| 669 | } | 675 | } |
| 670 | write_unlock_bh(&idev->lock); | 676 | write_unlock_bh(&idev->lock); |
| 671 | 677 | ||
| @@ -903,11 +909,18 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev, | |||
| 903 | 909 | ||
| 904 | score.addr_type = __ipv6_addr_type(&ifa->addr); | 910 | score.addr_type = __ipv6_addr_type(&ifa->addr); |
| 905 | 911 | ||
| 906 | /* Rule 0: Candidate Source Address (section 4) | 912 | /* Rule 0: |
| 913 | * - Tentative Address (RFC2462 section 5.4) | ||
| 914 | * - A tentative address is not considered | ||
| 915 | * "assigned to an interface" in the traditional | ||
| 916 | * sense. | ||
| 917 | * - Candidate Source Address (section 4) | ||
| 907 | * - In any case, anycast addresses, multicast | 918 | * - In any case, anycast addresses, multicast |
| 908 | * addresses, and the unspecified address MUST | 919 | * addresses, and the unspecified address MUST |
| 909 | * NOT be included in a candidate set. | 920 | * NOT be included in a candidate set. |
| 910 | */ | 921 | */ |
| 922 | if (ifa->flags & IFA_F_TENTATIVE) | ||
| 923 | continue; | ||
| 911 | if (unlikely(score.addr_type == IPV6_ADDR_ANY || | 924 | if (unlikely(score.addr_type == IPV6_ADDR_ANY || |
| 912 | score.addr_type & IPV6_ADDR_MULTICAST)) { | 925 | score.addr_type & IPV6_ADDR_MULTICAST)) { |
| 913 | LIMIT_NETDEBUG(KERN_DEBUG | 926 | LIMIT_NETDEBUG(KERN_DEBUG |
| @@ -1215,10 +1228,8 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) | |||
| 1215 | 1228 | ||
| 1216 | /* Gets referenced address, destroys ifaddr */ | 1229 | /* Gets referenced address, destroys ifaddr */ |
| 1217 | 1230 | ||
| 1218 | void addrconf_dad_failure(struct inet6_ifaddr *ifp) | 1231 | void addrconf_dad_stop(struct inet6_ifaddr *ifp) |
| 1219 | { | 1232 | { |
| 1220 | if (net_ratelimit()) | ||
| 1221 | printk(KERN_INFO "%s: duplicate address detected!\n", ifp->idev->dev->name); | ||
| 1222 | if (ifp->flags&IFA_F_PERMANENT) { | 1233 | if (ifp->flags&IFA_F_PERMANENT) { |
| 1223 | spin_lock_bh(&ifp->lock); | 1234 | spin_lock_bh(&ifp->lock); |
| 1224 | addrconf_del_timer(ifp); | 1235 | addrconf_del_timer(ifp); |
| @@ -1244,6 +1255,12 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp) | |||
| 1244 | ipv6_del_addr(ifp); | 1255 | ipv6_del_addr(ifp); |
| 1245 | } | 1256 | } |
| 1246 | 1257 | ||
| 1258 | void addrconf_dad_failure(struct inet6_ifaddr *ifp) | ||
| 1259 | { | ||
| 1260 | if (net_ratelimit()) | ||
| 1261 | printk(KERN_INFO "%s: duplicate address detected!\n", ifp->idev->dev->name); | ||
| 1262 | addrconf_dad_stop(ifp); | ||
| 1263 | } | ||
| 1247 | 1264 | ||
| 1248 | /* Join to solicited addr multicast group. */ | 1265 | /* Join to solicited addr multicast group. */ |
| 1249 | 1266 | ||
| @@ -2133,9 +2150,42 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
| 2133 | { | 2150 | { |
| 2134 | struct net_device *dev = (struct net_device *) data; | 2151 | struct net_device *dev = (struct net_device *) data; |
| 2135 | struct inet6_dev *idev = __in6_dev_get(dev); | 2152 | struct inet6_dev *idev = __in6_dev_get(dev); |
| 2153 | int run_pending = 0; | ||
| 2136 | 2154 | ||
| 2137 | switch(event) { | 2155 | switch(event) { |
| 2138 | case NETDEV_UP: | 2156 | case NETDEV_UP: |
| 2157 | case NETDEV_CHANGE: | ||
| 2158 | if (event == NETDEV_UP) { | ||
| 2159 | if (!netif_carrier_ok(dev)) { | ||
| 2160 | /* device is not ready yet. */ | ||
| 2161 | printk(KERN_INFO | ||
| 2162 | "ADDRCONF(NETDEV_UP): %s: " | ||
| 2163 | "link is not ready\n", | ||
| 2164 | dev->name); | ||
| 2165 | break; | ||
| 2166 | } | ||
| 2167 | } else { | ||
| 2168 | if (!netif_carrier_ok(dev)) { | ||
| 2169 | /* device is still not ready. */ | ||
| 2170 | break; | ||
| 2171 | } | ||
| 2172 | |||
| 2173 | if (idev) { | ||
| 2174 | if (idev->if_flags & IF_READY) { | ||
| 2175 | /* device is already configured. */ | ||
| 2176 | break; | ||
| 2177 | } | ||
| 2178 | idev->if_flags |= IF_READY; | ||
| 2179 | } | ||
| 2180 | |||
| 2181 | printk(KERN_INFO | ||
| 2182 | "ADDRCONF(NETDEV_CHANGE): %s: " | ||
| 2183 | "link becomes ready\n", | ||
| 2184 | dev->name); | ||
| 2185 | |||
| 2186 | run_pending = 1; | ||
| 2187 | } | ||
| 2188 | |||
| 2139 | switch(dev->type) { | 2189 | switch(dev->type) { |
| 2140 | case ARPHRD_SIT: | 2190 | case ARPHRD_SIT: |
| 2141 | addrconf_sit_config(dev); | 2191 | addrconf_sit_config(dev); |
| @@ -2152,6 +2202,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
| 2152 | break; | 2202 | break; |
| 2153 | }; | 2203 | }; |
| 2154 | if (idev) { | 2204 | if (idev) { |
| 2205 | if (run_pending) | ||
| 2206 | addrconf_dad_run(idev); | ||
| 2207 | |||
| 2155 | /* If the MTU changed during the interface down, when the | 2208 | /* If the MTU changed during the interface down, when the |
| 2156 | interface up, the changed MTU must be reflected in the | 2209 | interface up, the changed MTU must be reflected in the |
| 2157 | idev as well as routers. | 2210 | idev as well as routers. |
| @@ -2186,8 +2239,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
| 2186 | */ | 2239 | */ |
| 2187 | addrconf_ifdown(dev, event != NETDEV_DOWN); | 2240 | addrconf_ifdown(dev, event != NETDEV_DOWN); |
| 2188 | break; | 2241 | break; |
| 2189 | case NETDEV_CHANGE: | 2242 | |
| 2190 | break; | ||
| 2191 | case NETDEV_CHANGENAME: | 2243 | case NETDEV_CHANGENAME: |
| 2192 | #ifdef CONFIG_SYSCTL | 2244 | #ifdef CONFIG_SYSCTL |
| 2193 | if (idev) { | 2245 | if (idev) { |
| @@ -2268,7 +2320,7 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
| 2268 | 2320 | ||
| 2269 | /* Step 3: clear flags for stateless addrconf */ | 2321 | /* Step 3: clear flags for stateless addrconf */ |
| 2270 | if (how != 1) | 2322 | if (how != 1) |
| 2271 | idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD); | 2323 | idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); |
| 2272 | 2324 | ||
| 2273 | /* Step 4: clear address list */ | 2325 | /* Step 4: clear address list */ |
| 2274 | #ifdef CONFIG_IPV6_PRIVACY | 2326 | #ifdef CONFIG_IPV6_PRIVACY |
| @@ -2377,11 +2429,20 @@ out: | |||
| 2377 | /* | 2429 | /* |
| 2378 | * Duplicate Address Detection | 2430 | * Duplicate Address Detection |
| 2379 | */ | 2431 | */ |
| 2432 | static void addrconf_dad_kick(struct inet6_ifaddr *ifp) | ||
| 2433 | { | ||
| 2434 | unsigned long rand_num; | ||
| 2435 | struct inet6_dev *idev = ifp->idev; | ||
| 2436 | |||
| 2437 | rand_num = net_random() % (idev->cnf.rtr_solicit_delay ? : 1); | ||
| 2438 | ifp->probes = idev->cnf.dad_transmits; | ||
| 2439 | addrconf_mod_timer(ifp, AC_DAD, rand_num); | ||
| 2440 | } | ||
| 2441 | |||
| 2380 | static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags) | 2442 | static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags) |
| 2381 | { | 2443 | { |
| 2382 | struct inet6_dev *idev = ifp->idev; | 2444 | struct inet6_dev *idev = ifp->idev; |
| 2383 | struct net_device *dev = idev->dev; | 2445 | struct net_device *dev = idev->dev; |
| 2384 | unsigned long rand_num; | ||
| 2385 | 2446 | ||
| 2386 | addrconf_join_solict(dev, &ifp->addr); | 2447 | addrconf_join_solict(dev, &ifp->addr); |
| 2387 | 2448 | ||
| @@ -2390,7 +2451,6 @@ static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags) | |||
| 2390 | flags); | 2451 | flags); |
| 2391 | 2452 | ||
| 2392 | net_srandom(ifp->addr.s6_addr32[3]); | 2453 | net_srandom(ifp->addr.s6_addr32[3]); |
| 2393 | rand_num = net_random() % (idev->cnf.rtr_solicit_delay ? : 1); | ||
| 2394 | 2454 | ||
| 2395 | read_lock_bh(&idev->lock); | 2455 | read_lock_bh(&idev->lock); |
| 2396 | if (ifp->dead) | 2456 | if (ifp->dead) |
| @@ -2407,8 +2467,17 @@ static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags) | |||
| 2407 | return; | 2467 | return; |
| 2408 | } | 2468 | } |
| 2409 | 2469 | ||
| 2410 | ifp->probes = idev->cnf.dad_transmits; | 2470 | if (idev->if_flags & IF_READY) |
| 2411 | addrconf_mod_timer(ifp, AC_DAD, rand_num); | 2471 | addrconf_dad_kick(ifp); |
| 2472 | else { | ||
| 2473 | /* | ||
| 2474 | * If the defice is not ready: | ||
| 2475 | * - keep it tentative if it is a permanent address. | ||
| 2476 | * - otherwise, kill it. | ||
| 2477 | */ | ||
| 2478 | in6_ifa_hold(ifp); | ||
| 2479 | addrconf_dad_stop(ifp); | ||
| 2480 | } | ||
| 2412 | 2481 | ||
| 2413 | spin_unlock_bh(&ifp->lock); | 2482 | spin_unlock_bh(&ifp->lock); |
| 2414 | out: | 2483 | out: |
| @@ -2492,6 +2561,22 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp) | |||
| 2492 | } | 2561 | } |
| 2493 | } | 2562 | } |
| 2494 | 2563 | ||
| 2564 | static void addrconf_dad_run(struct inet6_dev *idev) { | ||
| 2565 | struct inet6_ifaddr *ifp; | ||
| 2566 | |||
| 2567 | read_lock_bh(&idev->lock); | ||
| 2568 | for (ifp = idev->addr_list; ifp; ifp = ifp->if_next) { | ||
| 2569 | spin_lock_bh(&ifp->lock); | ||
| 2570 | if (!(ifp->flags & IFA_F_TENTATIVE)) { | ||
| 2571 | spin_unlock_bh(&ifp->lock); | ||
| 2572 | continue; | ||
| 2573 | } | ||
| 2574 | spin_unlock_bh(&ifp->lock); | ||
| 2575 | addrconf_dad_kick(ifp); | ||
| 2576 | } | ||
| 2577 | read_unlock_bh(&idev->lock); | ||
| 2578 | } | ||
| 2579 | |||
| 2495 | #ifdef CONFIG_PROC_FS | 2580 | #ifdef CONFIG_PROC_FS |
| 2496 | struct if6_iter_state { | 2581 | struct if6_iter_state { |
| 2497 | int bucket; | 2582 | int bucket; |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index 34a332225c17..6ec6a2b549bb 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
| @@ -328,8 +328,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
| 328 | iif = skb->dev->ifindex; | 328 | iif = skb->dev->ifindex; |
| 329 | 329 | ||
| 330 | /* | 330 | /* |
| 331 | * Must not send if we know that source is Anycast also. | 331 | * Must not send error if the source does not uniquely |
| 332 | * for now we don't know that. | 332 | * identify a single node (RFC2463 Section 2.4). |
| 333 | * We check unspecified / multicast addresses here, | ||
| 334 | * and anycast addresses will be checked later. | ||
| 333 | */ | 335 | */ |
| 334 | if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) { | 336 | if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) { |
| 335 | LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: addr_any/mcast source\n"); | 337 | LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: addr_any/mcast source\n"); |
| @@ -373,6 +375,16 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
| 373 | err = ip6_dst_lookup(sk, &dst, &fl); | 375 | err = ip6_dst_lookup(sk, &dst, &fl); |
| 374 | if (err) | 376 | if (err) |
| 375 | goto out; | 377 | goto out; |
| 378 | |||
| 379 | /* | ||
| 380 | * We won't send icmp if the destination is known | ||
| 381 | * anycast. | ||
| 382 | */ | ||
| 383 | if (((struct rt6_info *)dst)->rt6i_flags & RTF_ANYCAST) { | ||
| 384 | LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: acast source\n"); | ||
| 385 | goto out_dst_release; | ||
| 386 | } | ||
| 387 | |||
| 376 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) | 388 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) |
| 377 | goto out; | 389 | goto out; |
| 378 | 390 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 7c68bfbee361..66140f13d119 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -413,11 +413,14 @@ static struct rt6_info *rt6_cow(struct rt6_info *ort, struct in6_addr *daddr, | |||
| 413 | rt = ip6_rt_copy(ort); | 413 | rt = ip6_rt_copy(ort); |
| 414 | 414 | ||
| 415 | if (rt) { | 415 | if (rt) { |
| 416 | ipv6_addr_copy(&rt->rt6i_dst.addr, daddr); | 416 | if (!(rt->rt6i_flags&RTF_GATEWAY)) { |
| 417 | 417 | if (rt->rt6i_dst.plen != 128 && | |
| 418 | if (!(rt->rt6i_flags&RTF_GATEWAY)) | 418 | ipv6_addr_equal(&rt->rt6i_dst.addr, daddr)) |
| 419 | rt->rt6i_flags |= RTF_ANYCAST; | ||
| 419 | ipv6_addr_copy(&rt->rt6i_gateway, daddr); | 420 | ipv6_addr_copy(&rt->rt6i_gateway, daddr); |
| 421 | } | ||
| 420 | 422 | ||
| 423 | ipv6_addr_copy(&rt->rt6i_dst.addr, daddr); | ||
| 421 | rt->rt6i_dst.plen = 128; | 424 | rt->rt6i_dst.plen = 128; |
| 422 | rt->rt6i_flags |= RTF_CACHE; | 425 | rt->rt6i_flags |= RTF_CACHE; |
| 423 | rt->u.dst.flags |= DST_HOST; | 426 | rt->u.dst.flags |= DST_HOST; |
| @@ -1413,7 +1416,9 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | |||
| 1413 | rt->u.dst.obsolete = -1; | 1416 | rt->u.dst.obsolete = -1; |
| 1414 | 1417 | ||
| 1415 | rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; | 1418 | rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; |
| 1416 | if (!anycast) | 1419 | if (anycast) |
| 1420 | rt->rt6i_flags |= RTF_ANYCAST; | ||
| 1421 | else | ||
| 1417 | rt->rt6i_flags |= RTF_LOCAL; | 1422 | rt->rt6i_flags |= RTF_LOCAL; |
| 1418 | rt->rt6i_nexthop = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway); | 1423 | rt->rt6i_nexthop = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway); |
| 1419 | if (rt->rt6i_nexthop == NULL) { | 1424 | if (rt->rt6i_nexthop == NULL) { |
diff --git a/net/netrom/nr_in.c b/net/netrom/nr_in.c index 004e8599b8fe..a7d88b5ad756 100644 --- a/net/netrom/nr_in.c +++ b/net/netrom/nr_in.c | |||
| @@ -99,7 +99,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb, | |||
| 99 | break; | 99 | break; |
| 100 | 100 | ||
| 101 | case NR_RESET: | 101 | case NR_RESET: |
| 102 | if (sysctl_netrom_reset_circuit); | 102 | if (sysctl_netrom_reset_circuit) |
| 103 | nr_disconnect(sk, ECONNRESET); | 103 | nr_disconnect(sk, ECONNRESET); |
| 104 | break; | 104 | break; |
| 105 | 105 | ||
| @@ -130,7 +130,7 @@ static int nr_state2_machine(struct sock *sk, struct sk_buff *skb, | |||
| 130 | break; | 130 | break; |
| 131 | 131 | ||
| 132 | case NR_RESET: | 132 | case NR_RESET: |
| 133 | if (sysctl_netrom_reset_circuit); | 133 | if (sysctl_netrom_reset_circuit) |
| 134 | nr_disconnect(sk, ECONNRESET); | 134 | nr_disconnect(sk, ECONNRESET); |
| 135 | break; | 135 | break; |
| 136 | 136 | ||
| @@ -265,7 +265,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype | |||
| 265 | break; | 265 | break; |
| 266 | 266 | ||
| 267 | case NR_RESET: | 267 | case NR_RESET: |
| 268 | if (sysctl_netrom_reset_circuit); | 268 | if (sysctl_netrom_reset_circuit) |
| 269 | nr_disconnect(sk, ECONNRESET); | 269 | nr_disconnect(sk, ECONNRESET); |
| 270 | break; | 270 | break; |
| 271 | 271 | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 54a4be6a7d26..d19e274b9c4a 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -346,6 +346,7 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl) | |||
| 346 | struct xfrm_policy *pol, **p; | 346 | struct xfrm_policy *pol, **p; |
| 347 | struct xfrm_policy *delpol = NULL; | 347 | struct xfrm_policy *delpol = NULL; |
| 348 | struct xfrm_policy **newpos = NULL; | 348 | struct xfrm_policy **newpos = NULL; |
| 349 | struct dst_entry *gc_list; | ||
| 349 | 350 | ||
| 350 | write_lock_bh(&xfrm_policy_lock); | 351 | write_lock_bh(&xfrm_policy_lock); |
| 351 | for (p = &xfrm_policy_list[dir]; (pol=*p)!=NULL;) { | 352 | for (p = &xfrm_policy_list[dir]; (pol=*p)!=NULL;) { |
| @@ -381,9 +382,36 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl) | |||
| 381 | xfrm_pol_hold(policy); | 382 | xfrm_pol_hold(policy); |
| 382 | write_unlock_bh(&xfrm_policy_lock); | 383 | write_unlock_bh(&xfrm_policy_lock); |
| 383 | 384 | ||
| 384 | if (delpol) { | 385 | if (delpol) |
| 385 | xfrm_policy_kill(delpol); | 386 | xfrm_policy_kill(delpol); |
| 387 | |||
| 388 | read_lock_bh(&xfrm_policy_lock); | ||
| 389 | gc_list = NULL; | ||
| 390 | for (policy = policy->next; policy; policy = policy->next) { | ||
| 391 | struct dst_entry *dst; | ||
| 392 | |||
| 393 | write_lock(&policy->lock); | ||
| 394 | dst = policy->bundles; | ||
| 395 | if (dst) { | ||
| 396 | struct dst_entry *tail = dst; | ||
| 397 | while (tail->next) | ||
| 398 | tail = tail->next; | ||
| 399 | tail->next = gc_list; | ||
| 400 | gc_list = dst; | ||
| 401 | |||
| 402 | policy->bundles = NULL; | ||
| 403 | } | ||
| 404 | write_unlock(&policy->lock); | ||
| 386 | } | 405 | } |
| 406 | read_unlock_bh(&xfrm_policy_lock); | ||
| 407 | |||
| 408 | while (gc_list) { | ||
| 409 | struct dst_entry *dst = gc_list; | ||
| 410 | |||
| 411 | gc_list = dst->next; | ||
| 412 | dst_free(dst); | ||
| 413 | } | ||
| 414 | |||
| 387 | return 0; | 415 | return 0; |
| 388 | } | 416 | } |
| 389 | EXPORT_SYMBOL(xfrm_policy_insert); | 417 | EXPORT_SYMBOL(xfrm_policy_insert); |
