diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/dev.c | 20 | ||||
| -rw-r--r-- | net/ipv6/route.c | 16 |
2 files changed, 22 insertions, 14 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 2dce673a039b..4fba549caf29 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -127,7 +127,7 @@ | |||
| 127 | * sure which should go first, but I bet it won't make much | 127 | * sure which should go first, but I bet it won't make much |
| 128 | * difference if we are running VLANs. The good news is that | 128 | * difference if we are running VLANs. The good news is that |
| 129 | * this protocol won't be in the list unless compiled in, so | 129 | * this protocol won't be in the list unless compiled in, so |
| 130 | * the average user (w/out VLANs) will not be adversly affected. | 130 | * the average user (w/out VLANs) will not be adversely affected. |
| 131 | * --BLG | 131 | * --BLG |
| 132 | * | 132 | * |
| 133 | * 0800 IP | 133 | * 0800 IP |
| @@ -149,7 +149,7 @@ static struct list_head ptype_base[16]; /* 16 way hashed list */ | |||
| 149 | static struct list_head ptype_all; /* Taps */ | 149 | static struct list_head ptype_all; /* Taps */ |
| 150 | 150 | ||
| 151 | /* | 151 | /* |
| 152 | * The @dev_base list is protected by @dev_base_lock and the rtln | 152 | * The @dev_base list is protected by @dev_base_lock and the rtnl |
| 153 | * semaphore. | 153 | * semaphore. |
| 154 | * | 154 | * |
| 155 | * Pure readers hold dev_base_lock for reading. | 155 | * Pure readers hold dev_base_lock for reading. |
| @@ -641,10 +641,12 @@ int dev_valid_name(const char *name) | |||
| 641 | * @name: name format string | 641 | * @name: name format string |
| 642 | * | 642 | * |
| 643 | * Passed a format string - eg "lt%d" it will try and find a suitable | 643 | * Passed a format string - eg "lt%d" it will try and find a suitable |
| 644 | * id. Not efficient for many devices, not called a lot. The caller | 644 | * id. It scans list of devices to build up a free map, then chooses |
| 645 | * must hold the dev_base or rtnl lock while allocating the name and | 645 | * the first empty slot. The caller must hold the dev_base or rtnl lock |
| 646 | * adding the device in order to avoid duplicates. Returns the number | 646 | * while allocating the name and adding the device in order to avoid |
| 647 | * of the unit assigned or a negative errno code. | 647 | * duplicates. |
| 648 | * Limited to bits_per_byte * page size devices (ie 32K on most platforms). | ||
| 649 | * Returns the number of the unit assigned or a negative errno code. | ||
| 648 | */ | 650 | */ |
| 649 | 651 | ||
| 650 | int dev_alloc_name(struct net_device *dev, const char *name) | 652 | int dev_alloc_name(struct net_device *dev, const char *name) |
| @@ -744,7 +746,7 @@ int dev_change_name(struct net_device *dev, char *newname) | |||
| 744 | } | 746 | } |
| 745 | 747 | ||
| 746 | /** | 748 | /** |
| 747 | * netdev_features_change - device changes fatures | 749 | * netdev_features_change - device changes features |
| 748 | * @dev: device to cause notification | 750 | * @dev: device to cause notification |
| 749 | * | 751 | * |
| 750 | * Called to indicate a device has changed features. | 752 | * Called to indicate a device has changed features. |
| @@ -2196,7 +2198,7 @@ int netdev_set_master(struct net_device *slave, struct net_device *master) | |||
| 2196 | * @dev: device | 2198 | * @dev: device |
| 2197 | * @inc: modifier | 2199 | * @inc: modifier |
| 2198 | * | 2200 | * |
| 2199 | * Add or remove promsicuity from a device. While the count in the device | 2201 | * Add or remove promiscuity from a device. While the count in the device |
| 2200 | * remains above zero the interface remains promiscuous. Once it hits zero | 2202 | * remains above zero the interface remains promiscuous. Once it hits zero |
| 2201 | * the device reverts back to normal filtering operation. A negative inc | 2203 | * the device reverts back to normal filtering operation. A negative inc |
| 2202 | * value is used to drop promiscuity on the device. | 2204 | * value is used to drop promiscuity on the device. |
| @@ -3122,7 +3124,7 @@ EXPORT_SYMBOL(alloc_netdev); | |||
| 3122 | void free_netdev(struct net_device *dev) | 3124 | void free_netdev(struct net_device *dev) |
| 3123 | { | 3125 | { |
| 3124 | #ifdef CONFIG_SYSFS | 3126 | #ifdef CONFIG_SYSFS |
| 3125 | /* Compatiablity with error handling in drivers */ | 3127 | /* Compatibility with error handling in drivers */ |
| 3126 | if (dev->reg_state == NETREG_UNINITIALIZED) { | 3128 | if (dev->reg_state == NETREG_UNINITIALIZED) { |
| 3127 | kfree((char *)dev - dev->padded); | 3129 | kfree((char *)dev - dev->padded); |
| 3128 | return; | 3130 | return; |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 0190e39096b9..8a777932786d 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -280,10 +280,13 @@ static int inline rt6_check_neigh(struct rt6_info *rt) | |||
| 280 | { | 280 | { |
| 281 | struct neighbour *neigh = rt->rt6i_nexthop; | 281 | struct neighbour *neigh = rt->rt6i_nexthop; |
| 282 | int m = 0; | 282 | int m = 0; |
| 283 | if (neigh) { | 283 | if (rt->rt6i_flags & RTF_NONEXTHOP || |
| 284 | !(rt->rt6i_flags & RTF_GATEWAY)) | ||
| 285 | m = 1; | ||
| 286 | else if (neigh) { | ||
| 284 | read_lock_bh(&neigh->lock); | 287 | read_lock_bh(&neigh->lock); |
| 285 | if (neigh->nud_state & NUD_VALID) | 288 | if (neigh->nud_state & NUD_VALID) |
| 286 | m = 1; | 289 | m = 2; |
| 287 | read_unlock_bh(&neigh->lock); | 290 | read_unlock_bh(&neigh->lock); |
| 288 | } | 291 | } |
| 289 | return m; | 292 | return m; |
| @@ -292,15 +295,18 @@ static int inline rt6_check_neigh(struct rt6_info *rt) | |||
| 292 | static int rt6_score_route(struct rt6_info *rt, int oif, | 295 | static int rt6_score_route(struct rt6_info *rt, int oif, |
| 293 | int strict) | 296 | int strict) |
| 294 | { | 297 | { |
| 295 | int m = rt6_check_dev(rt, oif); | 298 | int m, n; |
| 299 | |||
| 300 | m = rt6_check_dev(rt, oif); | ||
| 296 | if (!m && (strict & RT6_SELECT_F_IFACE)) | 301 | if (!m && (strict & RT6_SELECT_F_IFACE)) |
| 297 | return -1; | 302 | return -1; |
| 298 | #ifdef CONFIG_IPV6_ROUTER_PREF | 303 | #ifdef CONFIG_IPV6_ROUTER_PREF |
| 299 | m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; | 304 | m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; |
| 300 | #endif | 305 | #endif |
| 301 | if (rt6_check_neigh(rt)) | 306 | n = rt6_check_neigh(rt); |
| 307 | if (n > 1) | ||
| 302 | m |= 16; | 308 | m |= 16; |
| 303 | else if (strict & RT6_SELECT_F_REACHABLE) | 309 | else if (!n && strict & RT6_SELECT_F_REACHABLE) |
| 304 | return -1; | 310 | return -1; |
| 305 | return m; | 311 | return m; |
| 306 | } | 312 | } |
