diff options
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/dev.c | 589 |
1 files changed, 292 insertions, 297 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 4b3356616976..dd94ae637e66 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -191,7 +191,6 @@ static struct list_head ptype_all __read_mostly; /* Taps */ | |||
| 191 | * semaphore held. | 191 | * semaphore held. |
| 192 | */ | 192 | */ |
| 193 | DEFINE_RWLOCK(dev_base_lock); | 193 | DEFINE_RWLOCK(dev_base_lock); |
| 194 | |||
| 195 | EXPORT_SYMBOL(dev_base_lock); | 194 | EXPORT_SYMBOL(dev_base_lock); |
| 196 | 195 | ||
| 197 | #define NETDEV_HASHBITS 8 | 196 | #define NETDEV_HASHBITS 8 |
| @@ -248,6 +247,7 @@ static RAW_NOTIFIER_HEAD(netdev_chain); | |||
| 248 | */ | 247 | */ |
| 249 | 248 | ||
| 250 | DEFINE_PER_CPU(struct softnet_data, softnet_data); | 249 | DEFINE_PER_CPU(struct softnet_data, softnet_data); |
| 250 | EXPORT_PER_CPU_SYMBOL(softnet_data); | ||
| 251 | 251 | ||
| 252 | #ifdef CONFIG_LOCKDEP | 252 | #ifdef CONFIG_LOCKDEP |
| 253 | /* | 253 | /* |
| @@ -381,6 +381,7 @@ void dev_add_pack(struct packet_type *pt) | |||
| 381 | } | 381 | } |
| 382 | spin_unlock_bh(&ptype_lock); | 382 | spin_unlock_bh(&ptype_lock); |
| 383 | } | 383 | } |
| 384 | EXPORT_SYMBOL(dev_add_pack); | ||
| 384 | 385 | ||
| 385 | /** | 386 | /** |
| 386 | * __dev_remove_pack - remove packet handler | 387 | * __dev_remove_pack - remove packet handler |
| @@ -418,6 +419,8 @@ void __dev_remove_pack(struct packet_type *pt) | |||
| 418 | out: | 419 | out: |
| 419 | spin_unlock_bh(&ptype_lock); | 420 | spin_unlock_bh(&ptype_lock); |
| 420 | } | 421 | } |
| 422 | EXPORT_SYMBOL(__dev_remove_pack); | ||
| 423 | |||
| 421 | /** | 424 | /** |
| 422 | * dev_remove_pack - remove packet handler | 425 | * dev_remove_pack - remove packet handler |
| 423 | * @pt: packet type declaration | 426 | * @pt: packet type declaration |
| @@ -436,6 +439,7 @@ void dev_remove_pack(struct packet_type *pt) | |||
| 436 | 439 | ||
| 437 | synchronize_net(); | 440 | synchronize_net(); |
| 438 | } | 441 | } |
| 442 | EXPORT_SYMBOL(dev_remove_pack); | ||
| 439 | 443 | ||
| 440 | /****************************************************************************** | 444 | /****************************************************************************** |
| 441 | 445 | ||
| @@ -499,6 +503,7 @@ int netdev_boot_setup_check(struct net_device *dev) | |||
| 499 | } | 503 | } |
| 500 | return 0; | 504 | return 0; |
| 501 | } | 505 | } |
| 506 | EXPORT_SYMBOL(netdev_boot_setup_check); | ||
| 502 | 507 | ||
| 503 | 508 | ||
| 504 | /** | 509 | /** |
| @@ -591,6 +596,7 @@ struct net_device *__dev_get_by_name(struct net *net, const char *name) | |||
| 591 | } | 596 | } |
| 592 | return NULL; | 597 | return NULL; |
| 593 | } | 598 | } |
| 599 | EXPORT_SYMBOL(__dev_get_by_name); | ||
| 594 | 600 | ||
| 595 | /** | 601 | /** |
| 596 | * dev_get_by_name - find a device by its name | 602 | * dev_get_by_name - find a device by its name |
| @@ -615,6 +621,7 @@ struct net_device *dev_get_by_name(struct net *net, const char *name) | |||
| 615 | read_unlock(&dev_base_lock); | 621 | read_unlock(&dev_base_lock); |
| 616 | return dev; | 622 | return dev; |
| 617 | } | 623 | } |
| 624 | EXPORT_SYMBOL(dev_get_by_name); | ||
| 618 | 625 | ||
| 619 | /** | 626 | /** |
| 620 | * __dev_get_by_index - find a device by its ifindex | 627 | * __dev_get_by_index - find a device by its ifindex |
| @@ -640,6 +647,7 @@ struct net_device *__dev_get_by_index(struct net *net, int ifindex) | |||
| 640 | } | 647 | } |
| 641 | return NULL; | 648 | return NULL; |
| 642 | } | 649 | } |
| 650 | EXPORT_SYMBOL(__dev_get_by_index); | ||
| 643 | 651 | ||
| 644 | 652 | ||
| 645 | /** | 653 | /** |
| @@ -664,6 +672,7 @@ struct net_device *dev_get_by_index(struct net *net, int ifindex) | |||
| 664 | read_unlock(&dev_base_lock); | 672 | read_unlock(&dev_base_lock); |
| 665 | return dev; | 673 | return dev; |
| 666 | } | 674 | } |
| 675 | EXPORT_SYMBOL(dev_get_by_index); | ||
| 667 | 676 | ||
| 668 | /** | 677 | /** |
| 669 | * dev_getbyhwaddr - find a device by its hardware address | 678 | * dev_getbyhwaddr - find a device by its hardware address |
| @@ -693,7 +702,6 @@ struct net_device *dev_getbyhwaddr(struct net *net, unsigned short type, char *h | |||
| 693 | 702 | ||
| 694 | return NULL; | 703 | return NULL; |
| 695 | } | 704 | } |
| 696 | |||
| 697 | EXPORT_SYMBOL(dev_getbyhwaddr); | 705 | EXPORT_SYMBOL(dev_getbyhwaddr); |
| 698 | 706 | ||
| 699 | struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type) | 707 | struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type) |
| @@ -707,7 +715,6 @@ struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type) | |||
| 707 | 715 | ||
| 708 | return NULL; | 716 | return NULL; |
| 709 | } | 717 | } |
| 710 | |||
| 711 | EXPORT_SYMBOL(__dev_getfirstbyhwtype); | 718 | EXPORT_SYMBOL(__dev_getfirstbyhwtype); |
| 712 | 719 | ||
| 713 | struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type) | 720 | struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type) |
| @@ -721,7 +728,6 @@ struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type) | |||
| 721 | rtnl_unlock(); | 728 | rtnl_unlock(); |
| 722 | return dev; | 729 | return dev; |
| 723 | } | 730 | } |
| 724 | |||
| 725 | EXPORT_SYMBOL(dev_getfirstbyhwtype); | 731 | EXPORT_SYMBOL(dev_getfirstbyhwtype); |
| 726 | 732 | ||
| 727 | /** | 733 | /** |
| @@ -736,7 +742,8 @@ EXPORT_SYMBOL(dev_getfirstbyhwtype); | |||
| 736 | * dev_put to indicate they have finished with it. | 742 | * dev_put to indicate they have finished with it. |
| 737 | */ | 743 | */ |
| 738 | 744 | ||
| 739 | struct net_device * dev_get_by_flags(struct net *net, unsigned short if_flags, unsigned short mask) | 745 | struct net_device *dev_get_by_flags(struct net *net, unsigned short if_flags, |
| 746 | unsigned short mask) | ||
| 740 | { | 747 | { |
| 741 | struct net_device *dev, *ret; | 748 | struct net_device *dev, *ret; |
| 742 | 749 | ||
| @@ -752,6 +759,7 @@ struct net_device * dev_get_by_flags(struct net *net, unsigned short if_flags, u | |||
| 752 | read_unlock(&dev_base_lock); | 759 | read_unlock(&dev_base_lock); |
| 753 | return ret; | 760 | return ret; |
| 754 | } | 761 | } |
| 762 | EXPORT_SYMBOL(dev_get_by_flags); | ||
| 755 | 763 | ||
| 756 | /** | 764 | /** |
| 757 | * dev_valid_name - check if name is okay for network device | 765 | * dev_valid_name - check if name is okay for network device |
| @@ -777,6 +785,7 @@ int dev_valid_name(const char *name) | |||
| 777 | } | 785 | } |
| 778 | return 1; | 786 | return 1; |
| 779 | } | 787 | } |
| 788 | EXPORT_SYMBOL(dev_valid_name); | ||
| 780 | 789 | ||
| 781 | /** | 790 | /** |
| 782 | * __dev_alloc_name - allocate a name for a device | 791 | * __dev_alloc_name - allocate a name for a device |
| @@ -870,6 +879,7 @@ int dev_alloc_name(struct net_device *dev, const char *name) | |||
| 870 | strlcpy(dev->name, buf, IFNAMSIZ); | 879 | strlcpy(dev->name, buf, IFNAMSIZ); |
| 871 | return ret; | 880 | return ret; |
| 872 | } | 881 | } |
| 882 | EXPORT_SYMBOL(dev_alloc_name); | ||
| 873 | 883 | ||
| 874 | 884 | ||
| 875 | /** | 885 | /** |
| @@ -906,8 +916,7 @@ int dev_change_name(struct net_device *dev, const char *newname) | |||
| 906 | err = dev_alloc_name(dev, newname); | 916 | err = dev_alloc_name(dev, newname); |
| 907 | if (err < 0) | 917 | if (err < 0) |
| 908 | return err; | 918 | return err; |
| 909 | } | 919 | } else if (__dev_get_by_name(net, newname)) |
| 910 | else if (__dev_get_by_name(net, newname)) | ||
| 911 | return -EEXIST; | 920 | return -EEXIST; |
| 912 | else | 921 | else |
| 913 | strlcpy(dev->name, newname, IFNAMSIZ); | 922 | strlcpy(dev->name, newname, IFNAMSIZ); |
| @@ -970,7 +979,7 @@ int dev_set_alias(struct net_device *dev, const char *alias, size_t len) | |||
| 970 | return 0; | 979 | return 0; |
| 971 | } | 980 | } |
| 972 | 981 | ||
| 973 | dev->ifalias = krealloc(dev->ifalias, len+1, GFP_KERNEL); | 982 | dev->ifalias = krealloc(dev->ifalias, len + 1, GFP_KERNEL); |
| 974 | if (!dev->ifalias) | 983 | if (!dev->ifalias) |
| 975 | return -ENOMEM; | 984 | return -ENOMEM; |
| 976 | 985 | ||
| @@ -1006,6 +1015,7 @@ void netdev_state_change(struct net_device *dev) | |||
| 1006 | rtmsg_ifinfo(RTM_NEWLINK, dev, 0); | 1015 | rtmsg_ifinfo(RTM_NEWLINK, dev, 0); |
| 1007 | } | 1016 | } |
| 1008 | } | 1017 | } |
| 1018 | EXPORT_SYMBOL(netdev_state_change); | ||
| 1009 | 1019 | ||
| 1010 | void netdev_bonding_change(struct net_device *dev) | 1020 | void netdev_bonding_change(struct net_device *dev) |
| 1011 | { | 1021 | { |
| @@ -1034,6 +1044,7 @@ void dev_load(struct net *net, const char *name) | |||
| 1034 | if (!dev && capable(CAP_SYS_MODULE)) | 1044 | if (!dev && capable(CAP_SYS_MODULE)) |
| 1035 | request_module("%s", name); | 1045 | request_module("%s", name); |
| 1036 | } | 1046 | } |
| 1047 | EXPORT_SYMBOL(dev_load); | ||
| 1037 | 1048 | ||
| 1038 | /** | 1049 | /** |
| 1039 | * dev_open - prepare an interface for use. | 1050 | * dev_open - prepare an interface for use. |
| @@ -1118,6 +1129,7 @@ int dev_open(struct net_device *dev) | |||
| 1118 | 1129 | ||
| 1119 | return ret; | 1130 | return ret; |
| 1120 | } | 1131 | } |
| 1132 | EXPORT_SYMBOL(dev_open); | ||
| 1121 | 1133 | ||
| 1122 | /** | 1134 | /** |
| 1123 | * dev_close - shutdown an interface. | 1135 | * dev_close - shutdown an interface. |
| @@ -1184,6 +1196,7 @@ int dev_close(struct net_device *dev) | |||
| 1184 | 1196 | ||
| 1185 | return 0; | 1197 | return 0; |
| 1186 | } | 1198 | } |
| 1199 | EXPORT_SYMBOL(dev_close); | ||
| 1187 | 1200 | ||
| 1188 | 1201 | ||
| 1189 | /** | 1202 | /** |
| @@ -1279,6 +1292,7 @@ rollback: | |||
| 1279 | raw_notifier_chain_unregister(&netdev_chain, nb); | 1292 | raw_notifier_chain_unregister(&netdev_chain, nb); |
| 1280 | goto unlock; | 1293 | goto unlock; |
| 1281 | } | 1294 | } |
| 1295 | EXPORT_SYMBOL(register_netdevice_notifier); | ||
| 1282 | 1296 | ||
| 1283 | /** | 1297 | /** |
| 1284 | * unregister_netdevice_notifier - unregister a network notifier block | 1298 | * unregister_netdevice_notifier - unregister a network notifier block |
| @@ -1299,6 +1313,7 @@ int unregister_netdevice_notifier(struct notifier_block *nb) | |||
| 1299 | rtnl_unlock(); | 1313 | rtnl_unlock(); |
| 1300 | return err; | 1314 | return err; |
| 1301 | } | 1315 | } |
| 1316 | EXPORT_SYMBOL(unregister_netdevice_notifier); | ||
| 1302 | 1317 | ||
| 1303 | /** | 1318 | /** |
| 1304 | * call_netdevice_notifiers - call all network notifier blocks | 1319 | * call_netdevice_notifiers - call all network notifier blocks |
| @@ -1321,11 +1336,13 @@ void net_enable_timestamp(void) | |||
| 1321 | { | 1336 | { |
| 1322 | atomic_inc(&netstamp_needed); | 1337 | atomic_inc(&netstamp_needed); |
| 1323 | } | 1338 | } |
| 1339 | EXPORT_SYMBOL(net_enable_timestamp); | ||
| 1324 | 1340 | ||
| 1325 | void net_disable_timestamp(void) | 1341 | void net_disable_timestamp(void) |
| 1326 | { | 1342 | { |
| 1327 | atomic_dec(&netstamp_needed); | 1343 | atomic_dec(&netstamp_needed); |
| 1328 | } | 1344 | } |
| 1345 | EXPORT_SYMBOL(net_disable_timestamp); | ||
| 1329 | 1346 | ||
| 1330 | static inline void net_timestamp(struct sk_buff *skb) | 1347 | static inline void net_timestamp(struct sk_buff *skb) |
| 1331 | { | 1348 | { |
| @@ -1359,7 +1376,7 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev) | |||
| 1359 | if ((ptype->dev == dev || !ptype->dev) && | 1376 | if ((ptype->dev == dev || !ptype->dev) && |
| 1360 | (ptype->af_packet_priv == NULL || | 1377 | (ptype->af_packet_priv == NULL || |
| 1361 | (struct sock *)ptype->af_packet_priv != skb->sk)) { | 1378 | (struct sock *)ptype->af_packet_priv != skb->sk)) { |
| 1362 | struct sk_buff *skb2= skb_clone(skb, GFP_ATOMIC); | 1379 | struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); |
| 1363 | if (!skb2) | 1380 | if (!skb2) |
| 1364 | break; | 1381 | break; |
| 1365 | 1382 | ||
| @@ -1527,6 +1544,7 @@ out_set_summed: | |||
| 1527 | out: | 1544 | out: |
| 1528 | return ret; | 1545 | return ret; |
| 1529 | } | 1546 | } |
| 1547 | EXPORT_SYMBOL(skb_checksum_help); | ||
| 1530 | 1548 | ||
| 1531 | /** | 1549 | /** |
| 1532 | * skb_gso_segment - Perform segmentation on skb. | 1550 | * skb_gso_segment - Perform segmentation on skb. |
| @@ -1589,7 +1607,6 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) | |||
| 1589 | 1607 | ||
| 1590 | return segs; | 1608 | return segs; |
| 1591 | } | 1609 | } |
| 1592 | |||
| 1593 | EXPORT_SYMBOL(skb_gso_segment); | 1610 | EXPORT_SYMBOL(skb_gso_segment); |
| 1594 | 1611 | ||
| 1595 | /* Take action when hardware reception checksum errors are detected. */ | 1612 | /* Take action when hardware reception checksum errors are detected. */ |
| @@ -1755,7 +1772,7 @@ u16 skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb) | |||
| 1755 | 1772 | ||
| 1756 | if (skb_rx_queue_recorded(skb)) { | 1773 | if (skb_rx_queue_recorded(skb)) { |
| 1757 | hash = skb_get_rx_queue(skb); | 1774 | hash = skb_get_rx_queue(skb); |
| 1758 | while (unlikely (hash >= dev->real_num_tx_queues)) | 1775 | while (unlikely(hash >= dev->real_num_tx_queues)) |
| 1759 | hash -= dev->real_num_tx_queues; | 1776 | hash -= dev->real_num_tx_queues; |
| 1760 | return hash; | 1777 | return hash; |
| 1761 | } | 1778 | } |
| @@ -1890,7 +1907,7 @@ gso: | |||
| 1890 | q = rcu_dereference(txq->qdisc); | 1907 | q = rcu_dereference(txq->qdisc); |
| 1891 | 1908 | ||
| 1892 | #ifdef CONFIG_NET_CLS_ACT | 1909 | #ifdef CONFIG_NET_CLS_ACT |
| 1893 | skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_EGRESS); | 1910 | skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_EGRESS); |
| 1894 | #endif | 1911 | #endif |
| 1895 | if (q->enqueue) { | 1912 | if (q->enqueue) { |
| 1896 | rc = __dev_xmit_skb(skb, q, dev, txq); | 1913 | rc = __dev_xmit_skb(skb, q, dev, txq); |
| @@ -1946,6 +1963,7 @@ out: | |||
| 1946 | rcu_read_unlock_bh(); | 1963 | rcu_read_unlock_bh(); |
| 1947 | return rc; | 1964 | return rc; |
| 1948 | } | 1965 | } |
| 1966 | EXPORT_SYMBOL(dev_queue_xmit); | ||
| 1949 | 1967 | ||
| 1950 | 1968 | ||
| 1951 | /*======================================================================= | 1969 | /*======================================================================= |
| @@ -2012,6 +2030,7 @@ enqueue: | |||
| 2012 | kfree_skb(skb); | 2030 | kfree_skb(skb); |
| 2013 | return NET_RX_DROP; | 2031 | return NET_RX_DROP; |
| 2014 | } | 2032 | } |
| 2033 | EXPORT_SYMBOL(netif_rx); | ||
| 2015 | 2034 | ||
| 2016 | int netif_rx_ni(struct sk_buff *skb) | 2035 | int netif_rx_ni(struct sk_buff *skb) |
| 2017 | { | 2036 | { |
| @@ -2025,7 +2044,6 @@ int netif_rx_ni(struct sk_buff *skb) | |||
| 2025 | 2044 | ||
| 2026 | return err; | 2045 | return err; |
| 2027 | } | 2046 | } |
| 2028 | |||
| 2029 | EXPORT_SYMBOL(netif_rx_ni); | 2047 | EXPORT_SYMBOL(netif_rx_ni); |
| 2030 | 2048 | ||
| 2031 | static void net_tx_action(struct softirq_action *h) | 2049 | static void net_tx_action(struct softirq_action *h) |
| @@ -2358,6 +2376,7 @@ out: | |||
| 2358 | rcu_read_unlock(); | 2376 | rcu_read_unlock(); |
| 2359 | return ret; | 2377 | return ret; |
| 2360 | } | 2378 | } |
| 2379 | EXPORT_SYMBOL(netif_receive_skb); | ||
| 2361 | 2380 | ||
| 2362 | /* Network device is going away, flush any packets still pending */ | 2381 | /* Network device is going away, flush any packets still pending */ |
| 2363 | static void flush_backlog(void *arg) | 2382 | static void flush_backlog(void *arg) |
| @@ -2874,7 +2893,7 @@ softnet_break: | |||
| 2874 | goto out; | 2893 | goto out; |
| 2875 | } | 2894 | } |
| 2876 | 2895 | ||
| 2877 | static gifconf_func_t * gifconf_list [NPROTO]; | 2896 | static gifconf_func_t *gifconf_list[NPROTO]; |
| 2878 | 2897 | ||
| 2879 | /** | 2898 | /** |
| 2880 | * register_gifconf - register a SIOCGIF handler | 2899 | * register_gifconf - register a SIOCGIF handler |
| @@ -2885,13 +2904,14 @@ static gifconf_func_t * gifconf_list [NPROTO]; | |||
| 2885 | * that is passed must not be freed or reused until it has been replaced | 2904 | * that is passed must not be freed or reused until it has been replaced |
| 2886 | * by another handler. | 2905 | * by another handler. |
| 2887 | */ | 2906 | */ |
| 2888 | int register_gifconf(unsigned int family, gifconf_func_t * gifconf) | 2907 | int register_gifconf(unsigned int family, gifconf_func_t *gifconf) |
| 2889 | { | 2908 | { |
| 2890 | if (family >= NPROTO) | 2909 | if (family >= NPROTO) |
| 2891 | return -EINVAL; | 2910 | return -EINVAL; |
| 2892 | gifconf_list[family] = gifconf; | 2911 | gifconf_list[family] = gifconf; |
| 2893 | return 0; | 2912 | return 0; |
| 2894 | } | 2913 | } |
| 2914 | EXPORT_SYMBOL(register_gifconf); | ||
| 2895 | 2915 | ||
| 2896 | 2916 | ||
| 2897 | /* | 2917 | /* |
| @@ -3102,7 +3122,7 @@ static int softnet_seq_show(struct seq_file *seq, void *v) | |||
| 3102 | seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x %08x\n", | 3122 | seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x %08x\n", |
| 3103 | s->total, s->dropped, s->time_squeeze, 0, | 3123 | s->total, s->dropped, s->time_squeeze, 0, |
| 3104 | 0, 0, 0, 0, /* was fastroute */ | 3124 | 0, 0, 0, 0, /* was fastroute */ |
| 3105 | s->cpu_collision ); | 3125 | s->cpu_collision); |
| 3106 | return 0; | 3126 | return 0; |
| 3107 | } | 3127 | } |
| 3108 | 3128 | ||
| @@ -3338,6 +3358,7 @@ int netdev_set_master(struct net_device *slave, struct net_device *master) | |||
| 3338 | rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE); | 3358 | rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE); |
| 3339 | return 0; | 3359 | return 0; |
| 3340 | } | 3360 | } |
| 3361 | EXPORT_SYMBOL(netdev_set_master); | ||
| 3341 | 3362 | ||
| 3342 | static void dev_change_rx_flags(struct net_device *dev, int flags) | 3363 | static void dev_change_rx_flags(struct net_device *dev, int flags) |
| 3343 | { | 3364 | { |
| @@ -3416,6 +3437,7 @@ int dev_set_promiscuity(struct net_device *dev, int inc) | |||
| 3416 | dev_set_rx_mode(dev); | 3437 | dev_set_rx_mode(dev); |
| 3417 | return err; | 3438 | return err; |
| 3418 | } | 3439 | } |
| 3440 | EXPORT_SYMBOL(dev_set_promiscuity); | ||
| 3419 | 3441 | ||
| 3420 | /** | 3442 | /** |
| 3421 | * dev_set_allmulti - update allmulti count on a device | 3443 | * dev_set_allmulti - update allmulti count on a device |
| @@ -3459,6 +3481,7 @@ int dev_set_allmulti(struct net_device *dev, int inc) | |||
| 3459 | } | 3481 | } |
| 3460 | return 0; | 3482 | return 0; |
| 3461 | } | 3483 | } |
| 3484 | EXPORT_SYMBOL(dev_set_allmulti); | ||
| 3462 | 3485 | ||
| 3463 | /* | 3486 | /* |
| 3464 | * Upload unicast and multicast address lists to device and | 3487 | * Upload unicast and multicast address lists to device and |
| @@ -4088,6 +4111,7 @@ unsigned dev_get_flags(const struct net_device *dev) | |||
| 4088 | 4111 | ||
| 4089 | return flags; | 4112 | return flags; |
| 4090 | } | 4113 | } |
| 4114 | EXPORT_SYMBOL(dev_get_flags); | ||
| 4091 | 4115 | ||
| 4092 | /** | 4116 | /** |
| 4093 | * dev_change_flags - change device settings | 4117 | * dev_change_flags - change device settings |
| @@ -4138,12 +4162,13 @@ int dev_change_flags(struct net_device *dev, unsigned flags) | |||
| 4138 | } | 4162 | } |
| 4139 | 4163 | ||
| 4140 | if (dev->flags & IFF_UP && | 4164 | if (dev->flags & IFF_UP && |
| 4141 | ((old_flags ^ dev->flags) &~ (IFF_UP | IFF_PROMISC | IFF_ALLMULTI | | 4165 | ((old_flags ^ dev->flags) & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI | |
| 4142 | IFF_VOLATILE))) | 4166 | IFF_VOLATILE))) |
| 4143 | call_netdevice_notifiers(NETDEV_CHANGE, dev); | 4167 | call_netdevice_notifiers(NETDEV_CHANGE, dev); |
| 4144 | 4168 | ||
| 4145 | if ((flags ^ dev->gflags) & IFF_PROMISC) { | 4169 | if ((flags ^ dev->gflags) & IFF_PROMISC) { |
| 4146 | int inc = (flags & IFF_PROMISC) ? +1 : -1; | 4170 | int inc = (flags & IFF_PROMISC) ? 1 : -1; |
| 4171 | |||
| 4147 | dev->gflags ^= IFF_PROMISC; | 4172 | dev->gflags ^= IFF_PROMISC; |
| 4148 | dev_set_promiscuity(dev, inc); | 4173 | dev_set_promiscuity(dev, inc); |
| 4149 | } | 4174 | } |
| @@ -4153,7 +4178,8 @@ int dev_change_flags(struct net_device *dev, unsigned flags) | |||
| 4153 | IFF_ALLMULTI is requested not asking us and not reporting. | 4178 | IFF_ALLMULTI is requested not asking us and not reporting. |
| 4154 | */ | 4179 | */ |
| 4155 | if ((flags ^ dev->gflags) & IFF_ALLMULTI) { | 4180 | if ((flags ^ dev->gflags) & IFF_ALLMULTI) { |
| 4156 | int inc = (flags & IFF_ALLMULTI) ? +1 : -1; | 4181 | int inc = (flags & IFF_ALLMULTI) ? 1 : -1; |
| 4182 | |||
| 4157 | dev->gflags ^= IFF_ALLMULTI; | 4183 | dev->gflags ^= IFF_ALLMULTI; |
| 4158 | dev_set_allmulti(dev, inc); | 4184 | dev_set_allmulti(dev, inc); |
| 4159 | } | 4185 | } |
| @@ -4165,6 +4191,7 @@ int dev_change_flags(struct net_device *dev, unsigned flags) | |||
| 4165 | 4191 | ||
| 4166 | return ret; | 4192 | return ret; |
| 4167 | } | 4193 | } |
| 4194 | EXPORT_SYMBOL(dev_change_flags); | ||
| 4168 | 4195 | ||
| 4169 | /** | 4196 | /** |
| 4170 | * dev_set_mtu - Change maximum transfer unit | 4197 | * dev_set_mtu - Change maximum transfer unit |
| @@ -4198,6 +4225,7 @@ int dev_set_mtu(struct net_device *dev, int new_mtu) | |||
| 4198 | call_netdevice_notifiers(NETDEV_CHANGEMTU, dev); | 4225 | call_netdevice_notifiers(NETDEV_CHANGEMTU, dev); |
| 4199 | return err; | 4226 | return err; |
| 4200 | } | 4227 | } |
| 4228 | EXPORT_SYMBOL(dev_set_mtu); | ||
| 4201 | 4229 | ||
| 4202 | /** | 4230 | /** |
| 4203 | * dev_set_mac_address - Change Media Access Control Address | 4231 | * dev_set_mac_address - Change Media Access Control Address |
| @@ -4222,6 +4250,7 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa) | |||
| 4222 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); | 4250 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); |
| 4223 | return err; | 4251 | return err; |
| 4224 | } | 4252 | } |
| 4253 | EXPORT_SYMBOL(dev_set_mac_address); | ||
| 4225 | 4254 | ||
| 4226 | /* | 4255 | /* |
| 4227 | * Perform the SIOCxIFxxx calls, inside read_lock(dev_base_lock) | 4256 | * Perform the SIOCxIFxxx calls, inside read_lock(dev_base_lock) |
| @@ -4235,56 +4264,56 @@ static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cm | |||
| 4235 | return -ENODEV; | 4264 | return -ENODEV; |
| 4236 | 4265 | ||
| 4237 | switch (cmd) { | 4266 | switch (cmd) { |
| 4238 | case SIOCGIFFLAGS: /* Get interface flags */ | 4267 | case SIOCGIFFLAGS: /* Get interface flags */ |
| 4239 | ifr->ifr_flags = (short) dev_get_flags(dev); | 4268 | ifr->ifr_flags = (short) dev_get_flags(dev); |
| 4240 | return 0; | 4269 | return 0; |
| 4241 | 4270 | ||
| 4242 | case SIOCGIFMETRIC: /* Get the metric on the interface | 4271 | case SIOCGIFMETRIC: /* Get the metric on the interface |
| 4243 | (currently unused) */ | 4272 | (currently unused) */ |
| 4244 | ifr->ifr_metric = 0; | 4273 | ifr->ifr_metric = 0; |
| 4245 | return 0; | 4274 | return 0; |
| 4246 | 4275 | ||
| 4247 | case SIOCGIFMTU: /* Get the MTU of a device */ | 4276 | case SIOCGIFMTU: /* Get the MTU of a device */ |
| 4248 | ifr->ifr_mtu = dev->mtu; | 4277 | ifr->ifr_mtu = dev->mtu; |
| 4249 | return 0; | 4278 | return 0; |
| 4250 | 4279 | ||
| 4251 | case SIOCGIFHWADDR: | 4280 | case SIOCGIFHWADDR: |
| 4252 | if (!dev->addr_len) | 4281 | if (!dev->addr_len) |
| 4253 | memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data); | 4282 | memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data); |
| 4254 | else | 4283 | else |
| 4255 | memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, | 4284 | memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, |
| 4256 | min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); | 4285 | min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); |
| 4257 | ifr->ifr_hwaddr.sa_family = dev->type; | 4286 | ifr->ifr_hwaddr.sa_family = dev->type; |
| 4258 | return 0; | 4287 | return 0; |
| 4259 | 4288 | ||
| 4260 | case SIOCGIFSLAVE: | 4289 | case SIOCGIFSLAVE: |
| 4261 | err = -EINVAL; | 4290 | err = -EINVAL; |
| 4262 | break; | 4291 | break; |
| 4263 | 4292 | ||
| 4264 | case SIOCGIFMAP: | 4293 | case SIOCGIFMAP: |
| 4265 | ifr->ifr_map.mem_start = dev->mem_start; | 4294 | ifr->ifr_map.mem_start = dev->mem_start; |
| 4266 | ifr->ifr_map.mem_end = dev->mem_end; | 4295 | ifr->ifr_map.mem_end = dev->mem_end; |
| 4267 | ifr->ifr_map.base_addr = dev->base_addr; | 4296 | ifr->ifr_map.base_addr = dev->base_addr; |
| 4268 | ifr->ifr_map.irq = dev->irq; | 4297 | ifr->ifr_map.irq = dev->irq; |
| 4269 | ifr->ifr_map.dma = dev->dma; | 4298 | ifr->ifr_map.dma = dev->dma; |
| 4270 | ifr->ifr_map.port = dev->if_port; | 4299 | ifr->ifr_map.port = dev->if_port; |
| 4271 | return 0; | 4300 | return 0; |
| 4272 | 4301 | ||
| 4273 | case SIOCGIFINDEX: | 4302 | case SIOCGIFINDEX: |
| 4274 | ifr->ifr_ifindex = dev->ifindex; | 4303 | ifr->ifr_ifindex = dev->ifindex; |
| 4275 | return 0; | 4304 | return 0; |
| 4276 | 4305 | ||
| 4277 | case SIOCGIFTXQLEN: | 4306 | case SIOCGIFTXQLEN: |
| 4278 | ifr->ifr_qlen = dev->tx_queue_len; | 4307 | ifr->ifr_qlen = dev->tx_queue_len; |
| 4279 | return 0; | 4308 | return 0; |
| 4280 | 4309 | ||
| 4281 | default: | 4310 | default: |
| 4282 | /* dev_ioctl() should ensure this case | 4311 | /* dev_ioctl() should ensure this case |
| 4283 | * is never reached | 4312 | * is never reached |
| 4284 | */ | 4313 | */ |
| 4285 | WARN_ON(1); | 4314 | WARN_ON(1); |
| 4286 | err = -EINVAL; | 4315 | err = -EINVAL; |
| 4287 | break; | 4316 | break; |
| 4288 | 4317 | ||
| 4289 | } | 4318 | } |
| 4290 | return err; | 4319 | return err; |
| @@ -4305,92 +4334,91 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
| 4305 | ops = dev->netdev_ops; | 4334 | ops = dev->netdev_ops; |
| 4306 | 4335 | ||
| 4307 | switch (cmd) { | 4336 | switch (cmd) { |
| 4308 | case SIOCSIFFLAGS: /* Set interface flags */ | 4337 | case SIOCSIFFLAGS: /* Set interface flags */ |
| 4309 | return dev_change_flags(dev, ifr->ifr_flags); | 4338 | return dev_change_flags(dev, ifr->ifr_flags); |
| 4310 | |||
| 4311 | case SIOCSIFMETRIC: /* Set the metric on the interface | ||
| 4312 | (currently unused) */ | ||
| 4313 | return -EOPNOTSUPP; | ||
| 4314 | |||
| 4315 | case SIOCSIFMTU: /* Set the MTU of a device */ | ||
| 4316 | return dev_set_mtu(dev, ifr->ifr_mtu); | ||
| 4317 | 4339 | ||
| 4318 | case SIOCSIFHWADDR: | 4340 | case SIOCSIFMETRIC: /* Set the metric on the interface |
| 4319 | return dev_set_mac_address(dev, &ifr->ifr_hwaddr); | 4341 | (currently unused) */ |
| 4342 | return -EOPNOTSUPP; | ||
| 4320 | 4343 | ||
| 4321 | case SIOCSIFHWBROADCAST: | 4344 | case SIOCSIFMTU: /* Set the MTU of a device */ |
| 4322 | if (ifr->ifr_hwaddr.sa_family != dev->type) | 4345 | return dev_set_mtu(dev, ifr->ifr_mtu); |
| 4323 | return -EINVAL; | ||
| 4324 | memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data, | ||
| 4325 | min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); | ||
| 4326 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); | ||
| 4327 | return 0; | ||
| 4328 | 4346 | ||
| 4329 | case SIOCSIFMAP: | 4347 | case SIOCSIFHWADDR: |
| 4330 | if (ops->ndo_set_config) { | 4348 | return dev_set_mac_address(dev, &ifr->ifr_hwaddr); |
| 4331 | if (!netif_device_present(dev)) | ||
| 4332 | return -ENODEV; | ||
| 4333 | return ops->ndo_set_config(dev, &ifr->ifr_map); | ||
| 4334 | } | ||
| 4335 | return -EOPNOTSUPP; | ||
| 4336 | 4349 | ||
| 4337 | case SIOCADDMULTI: | 4350 | case SIOCSIFHWBROADCAST: |
| 4338 | if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || | 4351 | if (ifr->ifr_hwaddr.sa_family != dev->type) |
| 4339 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) | 4352 | return -EINVAL; |
| 4340 | return -EINVAL; | 4353 | memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data, |
| 4341 | if (!netif_device_present(dev)) | 4354 | min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); |
| 4342 | return -ENODEV; | 4355 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); |
| 4343 | return dev_mc_add(dev, ifr->ifr_hwaddr.sa_data, | 4356 | return 0; |
| 4344 | dev->addr_len, 1); | ||
| 4345 | 4357 | ||
| 4346 | case SIOCDELMULTI: | 4358 | case SIOCSIFMAP: |
| 4347 | if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || | 4359 | if (ops->ndo_set_config) { |
| 4348 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) | ||
| 4349 | return -EINVAL; | ||
| 4350 | if (!netif_device_present(dev)) | 4360 | if (!netif_device_present(dev)) |
| 4351 | return -ENODEV; | 4361 | return -ENODEV; |
| 4352 | return dev_mc_delete(dev, ifr->ifr_hwaddr.sa_data, | 4362 | return ops->ndo_set_config(dev, &ifr->ifr_map); |
| 4353 | dev->addr_len, 1); | 4363 | } |
| 4364 | return -EOPNOTSUPP; | ||
| 4354 | 4365 | ||
| 4355 | case SIOCSIFTXQLEN: | 4366 | case SIOCADDMULTI: |
| 4356 | if (ifr->ifr_qlen < 0) | 4367 | if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || |
| 4357 | return -EINVAL; | 4368 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) |
| 4358 | dev->tx_queue_len = ifr->ifr_qlen; | 4369 | return -EINVAL; |
| 4359 | return 0; | 4370 | if (!netif_device_present(dev)) |
| 4371 | return -ENODEV; | ||
| 4372 | return dev_mc_add(dev, ifr->ifr_hwaddr.sa_data, | ||
| 4373 | dev->addr_len, 1); | ||
| 4374 | |||
| 4375 | case SIOCDELMULTI: | ||
| 4376 | if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || | ||
| 4377 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) | ||
| 4378 | return -EINVAL; | ||
| 4379 | if (!netif_device_present(dev)) | ||
| 4380 | return -ENODEV; | ||
| 4381 | return dev_mc_delete(dev, ifr->ifr_hwaddr.sa_data, | ||
| 4382 | dev->addr_len, 1); | ||
| 4360 | 4383 | ||
| 4361 | case SIOCSIFNAME: | 4384 | case SIOCSIFTXQLEN: |
| 4362 | ifr->ifr_newname[IFNAMSIZ-1] = '\0'; | 4385 | if (ifr->ifr_qlen < 0) |
| 4363 | return dev_change_name(dev, ifr->ifr_newname); | 4386 | return -EINVAL; |
| 4387 | dev->tx_queue_len = ifr->ifr_qlen; | ||
| 4388 | return 0; | ||
| 4364 | 4389 | ||
| 4365 | /* | 4390 | case SIOCSIFNAME: |
| 4366 | * Unknown or private ioctl | 4391 | ifr->ifr_newname[IFNAMSIZ-1] = '\0'; |
| 4367 | */ | 4392 | return dev_change_name(dev, ifr->ifr_newname); |
| 4368 | 4393 | ||
| 4369 | default: | 4394 | /* |
| 4370 | if ((cmd >= SIOCDEVPRIVATE && | 4395 | * Unknown or private ioctl |
| 4371 | cmd <= SIOCDEVPRIVATE + 15) || | 4396 | */ |
| 4372 | cmd == SIOCBONDENSLAVE || | 4397 | default: |
| 4373 | cmd == SIOCBONDRELEASE || | 4398 | if ((cmd >= SIOCDEVPRIVATE && |
| 4374 | cmd == SIOCBONDSETHWADDR || | 4399 | cmd <= SIOCDEVPRIVATE + 15) || |
| 4375 | cmd == SIOCBONDSLAVEINFOQUERY || | 4400 | cmd == SIOCBONDENSLAVE || |
| 4376 | cmd == SIOCBONDINFOQUERY || | 4401 | cmd == SIOCBONDRELEASE || |
| 4377 | cmd == SIOCBONDCHANGEACTIVE || | 4402 | cmd == SIOCBONDSETHWADDR || |
| 4378 | cmd == SIOCGMIIPHY || | 4403 | cmd == SIOCBONDSLAVEINFOQUERY || |
| 4379 | cmd == SIOCGMIIREG || | 4404 | cmd == SIOCBONDINFOQUERY || |
| 4380 | cmd == SIOCSMIIREG || | 4405 | cmd == SIOCBONDCHANGEACTIVE || |
| 4381 | cmd == SIOCBRADDIF || | 4406 | cmd == SIOCGMIIPHY || |
| 4382 | cmd == SIOCBRDELIF || | 4407 | cmd == SIOCGMIIREG || |
| 4383 | cmd == SIOCSHWTSTAMP || | 4408 | cmd == SIOCSMIIREG || |
| 4384 | cmd == SIOCWANDEV) { | 4409 | cmd == SIOCBRADDIF || |
| 4385 | err = -EOPNOTSUPP; | 4410 | cmd == SIOCBRDELIF || |
| 4386 | if (ops->ndo_do_ioctl) { | 4411 | cmd == SIOCSHWTSTAMP || |
| 4387 | if (netif_device_present(dev)) | 4412 | cmd == SIOCWANDEV) { |
| 4388 | err = ops->ndo_do_ioctl(dev, ifr, cmd); | 4413 | err = -EOPNOTSUPP; |
| 4389 | else | 4414 | if (ops->ndo_do_ioctl) { |
| 4390 | err = -ENODEV; | 4415 | if (netif_device_present(dev)) |
| 4391 | } | 4416 | err = ops->ndo_do_ioctl(dev, ifr, cmd); |
| 4392 | } else | 4417 | else |
| 4393 | err = -EINVAL; | 4418 | err = -ENODEV; |
| 4419 | } | ||
| 4420 | } else | ||
| 4421 | err = -EINVAL; | ||
| 4394 | 4422 | ||
| 4395 | } | 4423 | } |
| 4396 | return err; | 4424 | return err; |
| @@ -4447,135 +4475,135 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
| 4447 | */ | 4475 | */ |
| 4448 | 4476 | ||
| 4449 | switch (cmd) { | 4477 | switch (cmd) { |
| 4450 | /* | 4478 | /* |
| 4451 | * These ioctl calls: | 4479 | * These ioctl calls: |
| 4452 | * - can be done by all. | 4480 | * - can be done by all. |
| 4453 | * - atomic and do not require locking. | 4481 | * - atomic and do not require locking. |
| 4454 | * - return a value | 4482 | * - return a value |
| 4455 | */ | 4483 | */ |
| 4456 | case SIOCGIFFLAGS: | 4484 | case SIOCGIFFLAGS: |
| 4457 | case SIOCGIFMETRIC: | 4485 | case SIOCGIFMETRIC: |
| 4458 | case SIOCGIFMTU: | 4486 | case SIOCGIFMTU: |
| 4459 | case SIOCGIFHWADDR: | 4487 | case SIOCGIFHWADDR: |
| 4460 | case SIOCGIFSLAVE: | 4488 | case SIOCGIFSLAVE: |
| 4461 | case SIOCGIFMAP: | 4489 | case SIOCGIFMAP: |
| 4462 | case SIOCGIFINDEX: | 4490 | case SIOCGIFINDEX: |
| 4463 | case SIOCGIFTXQLEN: | 4491 | case SIOCGIFTXQLEN: |
| 4464 | dev_load(net, ifr.ifr_name); | 4492 | dev_load(net, ifr.ifr_name); |
| 4465 | read_lock(&dev_base_lock); | 4493 | read_lock(&dev_base_lock); |
| 4466 | ret = dev_ifsioc_locked(net, &ifr, cmd); | 4494 | ret = dev_ifsioc_locked(net, &ifr, cmd); |
| 4467 | read_unlock(&dev_base_lock); | 4495 | read_unlock(&dev_base_lock); |
| 4468 | if (!ret) { | 4496 | if (!ret) { |
| 4469 | if (colon) | 4497 | if (colon) |
| 4470 | *colon = ':'; | 4498 | *colon = ':'; |
| 4471 | if (copy_to_user(arg, &ifr, | 4499 | if (copy_to_user(arg, &ifr, |
| 4472 | sizeof(struct ifreq))) | 4500 | sizeof(struct ifreq))) |
| 4473 | ret = -EFAULT; | 4501 | ret = -EFAULT; |
| 4474 | } | 4502 | } |
| 4475 | return ret; | 4503 | return ret; |
| 4476 | 4504 | ||
| 4477 | case SIOCETHTOOL: | 4505 | case SIOCETHTOOL: |
| 4478 | dev_load(net, ifr.ifr_name); | 4506 | dev_load(net, ifr.ifr_name); |
| 4479 | rtnl_lock(); | 4507 | rtnl_lock(); |
| 4480 | ret = dev_ethtool(net, &ifr); | 4508 | ret = dev_ethtool(net, &ifr); |
| 4481 | rtnl_unlock(); | 4509 | rtnl_unlock(); |
| 4482 | if (!ret) { | 4510 | if (!ret) { |
| 4483 | if (colon) | 4511 | if (colon) |
| 4484 | *colon = ':'; | 4512 | *colon = ':'; |
| 4485 | if (copy_to_user(arg, &ifr, | 4513 | if (copy_to_user(arg, &ifr, |
| 4486 | sizeof(struct ifreq))) | 4514 | sizeof(struct ifreq))) |
| 4487 | ret = -EFAULT; | 4515 | ret = -EFAULT; |
| 4488 | } | 4516 | } |
| 4489 | return ret; | 4517 | return ret; |
| 4490 | 4518 | ||
| 4491 | /* | 4519 | /* |
| 4492 | * These ioctl calls: | 4520 | * These ioctl calls: |
| 4493 | * - require superuser power. | 4521 | * - require superuser power. |
| 4494 | * - require strict serialization. | 4522 | * - require strict serialization. |
| 4495 | * - return a value | 4523 | * - return a value |
| 4496 | */ | 4524 | */ |
| 4497 | case SIOCGMIIPHY: | 4525 | case SIOCGMIIPHY: |
| 4498 | case SIOCGMIIREG: | 4526 | case SIOCGMIIREG: |
| 4499 | case SIOCSIFNAME: | 4527 | case SIOCSIFNAME: |
| 4500 | if (!capable(CAP_NET_ADMIN)) | 4528 | if (!capable(CAP_NET_ADMIN)) |
| 4501 | return -EPERM; | 4529 | return -EPERM; |
| 4502 | dev_load(net, ifr.ifr_name); | 4530 | dev_load(net, ifr.ifr_name); |
| 4503 | rtnl_lock(); | 4531 | rtnl_lock(); |
| 4504 | ret = dev_ifsioc(net, &ifr, cmd); | 4532 | ret = dev_ifsioc(net, &ifr, cmd); |
| 4505 | rtnl_unlock(); | 4533 | rtnl_unlock(); |
| 4506 | if (!ret) { | 4534 | if (!ret) { |
| 4507 | if (colon) | 4535 | if (colon) |
| 4508 | *colon = ':'; | 4536 | *colon = ':'; |
| 4509 | if (copy_to_user(arg, &ifr, | 4537 | if (copy_to_user(arg, &ifr, |
| 4510 | sizeof(struct ifreq))) | 4538 | sizeof(struct ifreq))) |
| 4511 | ret = -EFAULT; | 4539 | ret = -EFAULT; |
| 4512 | } | 4540 | } |
| 4513 | return ret; | 4541 | return ret; |
| 4514 | 4542 | ||
| 4515 | /* | 4543 | /* |
| 4516 | * These ioctl calls: | 4544 | * These ioctl calls: |
| 4517 | * - require superuser power. | 4545 | * - require superuser power. |
| 4518 | * - require strict serialization. | 4546 | * - require strict serialization. |
| 4519 | * - do not return a value | 4547 | * - do not return a value |
| 4520 | */ | 4548 | */ |
| 4521 | case SIOCSIFFLAGS: | 4549 | case SIOCSIFFLAGS: |
| 4522 | case SIOCSIFMETRIC: | 4550 | case SIOCSIFMETRIC: |
| 4523 | case SIOCSIFMTU: | 4551 | case SIOCSIFMTU: |
| 4524 | case SIOCSIFMAP: | 4552 | case SIOCSIFMAP: |
| 4525 | case SIOCSIFHWADDR: | 4553 | case SIOCSIFHWADDR: |
| 4526 | case SIOCSIFSLAVE: | 4554 | case SIOCSIFSLAVE: |
| 4527 | case SIOCADDMULTI: | 4555 | case SIOCADDMULTI: |
| 4528 | case SIOCDELMULTI: | 4556 | case SIOCDELMULTI: |
| 4529 | case SIOCSIFHWBROADCAST: | 4557 | case SIOCSIFHWBROADCAST: |
| 4530 | case SIOCSIFTXQLEN: | 4558 | case SIOCSIFTXQLEN: |
| 4531 | case SIOCSMIIREG: | 4559 | case SIOCSMIIREG: |
| 4532 | case SIOCBONDENSLAVE: | 4560 | case SIOCBONDENSLAVE: |
| 4533 | case SIOCBONDRELEASE: | 4561 | case SIOCBONDRELEASE: |
| 4534 | case SIOCBONDSETHWADDR: | 4562 | case SIOCBONDSETHWADDR: |
| 4535 | case SIOCBONDCHANGEACTIVE: | 4563 | case SIOCBONDCHANGEACTIVE: |
| 4536 | case SIOCBRADDIF: | 4564 | case SIOCBRADDIF: |
| 4537 | case SIOCBRDELIF: | 4565 | case SIOCBRDELIF: |
| 4538 | case SIOCSHWTSTAMP: | 4566 | case SIOCSHWTSTAMP: |
| 4539 | if (!capable(CAP_NET_ADMIN)) | 4567 | if (!capable(CAP_NET_ADMIN)) |
| 4540 | return -EPERM; | 4568 | return -EPERM; |
| 4541 | /* fall through */ | 4569 | /* fall through */ |
| 4542 | case SIOCBONDSLAVEINFOQUERY: | 4570 | case SIOCBONDSLAVEINFOQUERY: |
| 4543 | case SIOCBONDINFOQUERY: | 4571 | case SIOCBONDINFOQUERY: |
| 4572 | dev_load(net, ifr.ifr_name); | ||
| 4573 | rtnl_lock(); | ||
| 4574 | ret = dev_ifsioc(net, &ifr, cmd); | ||
| 4575 | rtnl_unlock(); | ||
| 4576 | return ret; | ||
| 4577 | |||
| 4578 | case SIOCGIFMEM: | ||
| 4579 | /* Get the per device memory space. We can add this but | ||
| 4580 | * currently do not support it */ | ||
| 4581 | case SIOCSIFMEM: | ||
| 4582 | /* Set the per device memory buffer space. | ||
| 4583 | * Not applicable in our case */ | ||
| 4584 | case SIOCSIFLINK: | ||
| 4585 | return -EINVAL; | ||
| 4586 | |||
| 4587 | /* | ||
| 4588 | * Unknown or private ioctl. | ||
| 4589 | */ | ||
| 4590 | default: | ||
| 4591 | if (cmd == SIOCWANDEV || | ||
| 4592 | (cmd >= SIOCDEVPRIVATE && | ||
| 4593 | cmd <= SIOCDEVPRIVATE + 15)) { | ||
| 4544 | dev_load(net, ifr.ifr_name); | 4594 | dev_load(net, ifr.ifr_name); |
| 4545 | rtnl_lock(); | 4595 | rtnl_lock(); |
| 4546 | ret = dev_ifsioc(net, &ifr, cmd); | 4596 | ret = dev_ifsioc(net, &ifr, cmd); |
| 4547 | rtnl_unlock(); | 4597 | rtnl_unlock(); |
| 4598 | if (!ret && copy_to_user(arg, &ifr, | ||
| 4599 | sizeof(struct ifreq))) | ||
| 4600 | ret = -EFAULT; | ||
| 4548 | return ret; | 4601 | return ret; |
| 4549 | 4602 | } | |
| 4550 | case SIOCGIFMEM: | 4603 | /* Take care of Wireless Extensions */ |
| 4551 | /* Get the per device memory space. We can add this but | 4604 | if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) |
| 4552 | * currently do not support it */ | 4605 | return wext_handle_ioctl(net, &ifr, cmd, arg); |
| 4553 | case SIOCSIFMEM: | 4606 | return -EINVAL; |
| 4554 | /* Set the per device memory buffer space. | ||
| 4555 | * Not applicable in our case */ | ||
| 4556 | case SIOCSIFLINK: | ||
| 4557 | return -EINVAL; | ||
| 4558 | |||
| 4559 | /* | ||
| 4560 | * Unknown or private ioctl. | ||
| 4561 | */ | ||
| 4562 | default: | ||
| 4563 | if (cmd == SIOCWANDEV || | ||
| 4564 | (cmd >= SIOCDEVPRIVATE && | ||
| 4565 | cmd <= SIOCDEVPRIVATE + 15)) { | ||
| 4566 | dev_load(net, ifr.ifr_name); | ||
| 4567 | rtnl_lock(); | ||
| 4568 | ret = dev_ifsioc(net, &ifr, cmd); | ||
| 4569 | rtnl_unlock(); | ||
| 4570 | if (!ret && copy_to_user(arg, &ifr, | ||
| 4571 | sizeof(struct ifreq))) | ||
| 4572 | ret = -EFAULT; | ||
| 4573 | return ret; | ||
| 4574 | } | ||
| 4575 | /* Take care of Wireless Extensions */ | ||
| 4576 | if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) | ||
| 4577 | return wext_handle_ioctl(net, &ifr, cmd, arg); | ||
| 4578 | return -EINVAL; | ||
| 4579 | } | 4607 | } |
| 4580 | } | 4608 | } |
| 4581 | 4609 | ||
| @@ -4840,6 +4868,7 @@ err_uninit: | |||
| 4840 | dev->netdev_ops->ndo_uninit(dev); | 4868 | dev->netdev_ops->ndo_uninit(dev); |
| 4841 | goto out; | 4869 | goto out; |
| 4842 | } | 4870 | } |
| 4871 | EXPORT_SYMBOL(register_netdevice); | ||
| 4843 | 4872 | ||
| 4844 | /** | 4873 | /** |
| 4845 | * init_dummy_netdev - init a dummy network device for NAPI | 4874 | * init_dummy_netdev - init a dummy network device for NAPI |
| @@ -5126,6 +5155,8 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | |||
| 5126 | } | 5155 | } |
| 5127 | 5156 | ||
| 5128 | dev = PTR_ALIGN(p, NETDEV_ALIGN); | 5157 | dev = PTR_ALIGN(p, NETDEV_ALIGN); |
| 5158 | pr_err("%s dev=%p queue_count=%d tx=%p\n", name, dev, queue_count, tx); | ||
| 5159 | WARN_ON(queue_count == 1); | ||
| 5129 | dev->padded = (char *)dev - (char *)p; | 5160 | dev->padded = (char *)dev - (char *)p; |
| 5130 | 5161 | ||
| 5131 | if (dev_addr_init(dev)) | 5162 | if (dev_addr_init(dev)) |
| @@ -5192,6 +5223,7 @@ void free_netdev(struct net_device *dev) | |||
| 5192 | /* will free via device release */ | 5223 | /* will free via device release */ |
| 5193 | put_device(&dev->dev); | 5224 | put_device(&dev->dev); |
| 5194 | } | 5225 | } |
| 5226 | EXPORT_SYMBOL(free_netdev); | ||
| 5195 | 5227 | ||
| 5196 | /** | 5228 | /** |
| 5197 | * synchronize_net - Synchronize with packet receive processing | 5229 | * synchronize_net - Synchronize with packet receive processing |
| @@ -5204,6 +5236,7 @@ void synchronize_net(void) | |||
| 5204 | might_sleep(); | 5236 | might_sleep(); |
| 5205 | synchronize_rcu(); | 5237 | synchronize_rcu(); |
| 5206 | } | 5238 | } |
| 5239 | EXPORT_SYMBOL(synchronize_net); | ||
| 5207 | 5240 | ||
| 5208 | /** | 5241 | /** |
| 5209 | * unregister_netdevice - remove device from the kernel | 5242 | * unregister_netdevice - remove device from the kernel |
| @@ -5224,6 +5257,7 @@ void unregister_netdevice(struct net_device *dev) | |||
| 5224 | /* Finish processing unregister after unlock */ | 5257 | /* Finish processing unregister after unlock */ |
| 5225 | net_set_todo(dev); | 5258 | net_set_todo(dev); |
| 5226 | } | 5259 | } |
| 5260 | EXPORT_SYMBOL(unregister_netdevice); | ||
| 5227 | 5261 | ||
| 5228 | /** | 5262 | /** |
| 5229 | * unregister_netdev - remove device from the kernel | 5263 | * unregister_netdev - remove device from the kernel |
| @@ -5242,7 +5276,6 @@ void unregister_netdev(struct net_device *dev) | |||
| 5242 | unregister_netdevice(dev); | 5276 | unregister_netdevice(dev); |
| 5243 | rtnl_unlock(); | 5277 | rtnl_unlock(); |
| 5244 | } | 5278 | } |
| 5245 | |||
| 5246 | EXPORT_SYMBOL(unregister_netdev); | 5279 | EXPORT_SYMBOL(unregister_netdev); |
| 5247 | 5280 | ||
| 5248 | /** | 5281 | /** |
| @@ -5432,7 +5465,7 @@ unsigned long netdev_increment_features(unsigned long all, unsigned long one, | |||
| 5432 | unsigned long mask) | 5465 | unsigned long mask) |
| 5433 | { | 5466 | { |
| 5434 | /* If device needs checksumming, downgrade to it. */ | 5467 | /* If device needs checksumming, downgrade to it. */ |
| 5435 | if (all & NETIF_F_NO_CSUM && !(one & NETIF_F_NO_CSUM)) | 5468 | if (all & NETIF_F_NO_CSUM && !(one & NETIF_F_NO_CSUM)) |
| 5436 | all ^= NETIF_F_NO_CSUM | (one & NETIF_F_ALL_CSUM); | 5469 | all ^= NETIF_F_NO_CSUM | (one & NETIF_F_ALL_CSUM); |
| 5437 | else if (mask & NETIF_F_ALL_CSUM) { | 5470 | else if (mask & NETIF_F_ALL_CSUM) { |
| 5438 | /* If one device supports v4/v6 checksumming, set for all. */ | 5471 | /* If one device supports v4/v6 checksumming, set for all. */ |
| @@ -5658,41 +5691,3 @@ static int __init initialize_hashrnd(void) | |||
| 5658 | 5691 | ||
| 5659 | late_initcall_sync(initialize_hashrnd); | 5692 | late_initcall_sync(initialize_hashrnd); |
| 5660 | 5693 | ||
| 5661 | EXPORT_SYMBOL(__dev_get_by_index); | ||
| 5662 | EXPORT_SYMBOL(__dev_get_by_name); | ||
| 5663 | EXPORT_SYMBOL(__dev_remove_pack); | ||
| 5664 | EXPORT_SYMBOL(dev_valid_name); | ||
| 5665 | EXPORT_SYMBOL(dev_add_pack); | ||
| 5666 | EXPORT_SYMBOL(dev_alloc_name); | ||
| 5667 | EXPORT_SYMBOL(dev_close); | ||
| 5668 | EXPORT_SYMBOL(dev_get_by_flags); | ||
| 5669 | EXPORT_SYMBOL(dev_get_by_index); | ||
| 5670 | EXPORT_SYMBOL(dev_get_by_name); | ||
| 5671 | EXPORT_SYMBOL(dev_open); | ||
| 5672 | EXPORT_SYMBOL(dev_queue_xmit); | ||
| 5673 | EXPORT_SYMBOL(dev_remove_pack); | ||
| 5674 | EXPORT_SYMBOL(dev_set_allmulti); | ||
| 5675 | EXPORT_SYMBOL(dev_set_promiscuity); | ||
| 5676 | EXPORT_SYMBOL(dev_change_flags); | ||
| 5677 | EXPORT_SYMBOL(dev_set_mtu); | ||
| 5678 | EXPORT_SYMBOL(dev_set_mac_address); | ||
| 5679 | EXPORT_SYMBOL(free_netdev); | ||
| 5680 | EXPORT_SYMBOL(netdev_boot_setup_check); | ||
| 5681 | EXPORT_SYMBOL(netdev_set_master); | ||
| 5682 | EXPORT_SYMBOL(netdev_state_change); | ||
| 5683 | EXPORT_SYMBOL(netif_receive_skb); | ||
| 5684 | EXPORT_SYMBOL(netif_rx); | ||
| 5685 | EXPORT_SYMBOL(register_gifconf); | ||
| 5686 | EXPORT_SYMBOL(register_netdevice); | ||
| 5687 | EXPORT_SYMBOL(register_netdevice_notifier); | ||
| 5688 | EXPORT_SYMBOL(skb_checksum_help); | ||
| 5689 | EXPORT_SYMBOL(synchronize_net); | ||
| 5690 | EXPORT_SYMBOL(unregister_netdevice); | ||
| 5691 | EXPORT_SYMBOL(unregister_netdevice_notifier); | ||
| 5692 | EXPORT_SYMBOL(net_enable_timestamp); | ||
| 5693 | EXPORT_SYMBOL(net_disable_timestamp); | ||
| 5694 | EXPORT_SYMBOL(dev_get_flags); | ||
| 5695 | |||
| 5696 | EXPORT_SYMBOL(dev_load); | ||
| 5697 | |||
| 5698 | EXPORT_PER_CPU_SYMBOL(softnet_data); | ||
