aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-09-14 13:37:28 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-09-14 13:37:28 -0400
commitd7e9660ad9d5e0845f52848bce31bcf5cdcdea6b (patch)
treec6c67d145771187b194d79d603742b31090a59d6 /net/core/dev.c
parentb8cb48aae1b8c50b37dcb7710363aa69a7a0d9ca (diff)
parent13af7a6ea502fcdd4c0e3d7de6e332b102309491 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1623 commits) netxen: update copyright netxen: fix tx timeout recovery netxen: fix file firmware leak netxen: improve pci memory access netxen: change firmware write size tg3: Fix return ring size breakage netxen: build fix for INET=n cdc-phonet: autoconfigure Phonet address Phonet: back-end for autoconfigured addresses Phonet: fix netlink address dump error handling ipv6: Add IFA_F_DADFAILED flag net: Add DEVTYPE support for Ethernet based devices mv643xx_eth.c: remove unused txq_set_wrr() ucc_geth: Fix hangs after switching from full to half duplex ucc_geth: Rearrange some code to avoid forward declarations phy/marvell: Make non-aneg speed/duplex forcing work for 88E1111 PHYs drivers/net/phy: introduce missing kfree drivers/net/wan: introduce missing kfree net: force bridge module(s) to be GPL Subject: [PATCH] appletalk: Fix skb leak when ipddp interface is not loaded ... Fixed up trivial conflicts: - arch/x86/include/asm/socket.h converted to <asm-generic/socket.h> in the x86 tree. The generic header has the same new #define's, so that works out fine. - drivers/net/tun.c fix conflict between 89f56d1e9 ("tun: reuse struct sock fields") that switched over to using 'tun->socket.sk' instead of the redundantly available (and thus removed) 'tun->sk', and 2b980dbd ("lsm: Add hooks to the TUN driver") which added a new 'tun->sk' use. Noted in 'next' by Stephen Rothwell.
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c656
1 files changed, 337 insertions, 319 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 278d489aad3b..84945470ab38 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 */
193DEFINE_RWLOCK(dev_base_lock); 193DEFINE_RWLOCK(dev_base_lock);
194
195EXPORT_SYMBOL(dev_base_lock); 194EXPORT_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
250DEFINE_PER_CPU(struct softnet_data, softnet_data); 249DEFINE_PER_CPU(struct softnet_data, softnet_data);
250EXPORT_PER_CPU_SYMBOL(softnet_data);
251 251
252#ifdef CONFIG_LOCKDEP 252#ifdef CONFIG_LOCKDEP
253/* 253/*
@@ -269,10 +269,10 @@ static const unsigned short netdev_lock_type[] =
269 ARPHRD_IRDA, ARPHRD_FCPP, ARPHRD_FCAL, ARPHRD_FCPL, 269 ARPHRD_IRDA, ARPHRD_FCPP, ARPHRD_FCAL, ARPHRD_FCPL,
270 ARPHRD_FCFABRIC, ARPHRD_IEEE802_TR, ARPHRD_IEEE80211, 270 ARPHRD_FCFABRIC, ARPHRD_IEEE802_TR, ARPHRD_IEEE80211,
271 ARPHRD_IEEE80211_PRISM, ARPHRD_IEEE80211_RADIOTAP, ARPHRD_PHONET, 271 ARPHRD_IEEE80211_PRISM, ARPHRD_IEEE80211_RADIOTAP, ARPHRD_PHONET,
272 ARPHRD_PHONET_PIPE, ARPHRD_IEEE802154, ARPHRD_IEEE802154_PHY, 272 ARPHRD_PHONET_PIPE, ARPHRD_IEEE802154,
273 ARPHRD_VOID, ARPHRD_NONE}; 273 ARPHRD_VOID, ARPHRD_NONE};
274 274
275static const char *netdev_lock_name[] = 275static const char *const netdev_lock_name[] =
276 {"_xmit_NETROM", "_xmit_ETHER", "_xmit_EETHER", "_xmit_AX25", 276 {"_xmit_NETROM", "_xmit_ETHER", "_xmit_EETHER", "_xmit_AX25",
277 "_xmit_PRONET", "_xmit_CHAOS", "_xmit_IEEE802", "_xmit_ARCNET", 277 "_xmit_PRONET", "_xmit_CHAOS", "_xmit_IEEE802", "_xmit_ARCNET",
278 "_xmit_APPLETLK", "_xmit_DLCI", "_xmit_ATM", "_xmit_METRICOM", 278 "_xmit_APPLETLK", "_xmit_DLCI", "_xmit_ATM", "_xmit_METRICOM",
@@ -287,7 +287,7 @@ static const char *netdev_lock_name[] =
287 "_xmit_IRDA", "_xmit_FCPP", "_xmit_FCAL", "_xmit_FCPL", 287 "_xmit_IRDA", "_xmit_FCPP", "_xmit_FCAL", "_xmit_FCPL",
288 "_xmit_FCFABRIC", "_xmit_IEEE802_TR", "_xmit_IEEE80211", 288 "_xmit_FCFABRIC", "_xmit_IEEE802_TR", "_xmit_IEEE80211",
289 "_xmit_IEEE80211_PRISM", "_xmit_IEEE80211_RADIOTAP", "_xmit_PHONET", 289 "_xmit_IEEE80211_PRISM", "_xmit_IEEE80211_RADIOTAP", "_xmit_PHONET",
290 "_xmit_PHONET_PIPE", "_xmit_IEEE802154", "_xmit_IEEE802154_PHY", 290 "_xmit_PHONET_PIPE", "_xmit_IEEE802154",
291 "_xmit_VOID", "_xmit_NONE"}; 291 "_xmit_VOID", "_xmit_NONE"};
292 292
293static struct lock_class_key netdev_xmit_lock_key[ARRAY_SIZE(netdev_lock_type)]; 293static struct lock_class_key netdev_xmit_lock_key[ARRAY_SIZE(netdev_lock_type)];
@@ -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}
384EXPORT_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)
418out: 419out:
419 spin_unlock_bh(&ptype_lock); 420 spin_unlock_bh(&ptype_lock);
420} 421}
422EXPORT_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}
442EXPORT_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}
506EXPORT_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}
599EXPORT_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}
624EXPORT_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}
650EXPORT_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}
675EXPORT_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
697EXPORT_SYMBOL(dev_getbyhwaddr); 705EXPORT_SYMBOL(dev_getbyhwaddr);
698 706
699struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type) 707struct 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
711EXPORT_SYMBOL(__dev_getfirstbyhwtype); 718EXPORT_SYMBOL(__dev_getfirstbyhwtype);
712 719
713struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type) 720struct 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
725EXPORT_SYMBOL(dev_getfirstbyhwtype); 731EXPORT_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
739struct net_device * dev_get_by_flags(struct net *net, unsigned short if_flags, unsigned short mask) 745struct 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}
762EXPORT_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}
788EXPORT_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}
882EXPORT_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}
1018EXPORT_SYMBOL(netdev_state_change);
1009 1019
1010void netdev_bonding_change(struct net_device *dev) 1020void 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_NET_ADMIN)) 1044 if (!dev && capable(CAP_NET_ADMIN))
1035 request_module("%s", name); 1045 request_module("%s", name);
1036} 1046}
1047EXPORT_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}
1132EXPORT_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}
1199EXPORT_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}
1295EXPORT_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}
1316EXPORT_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}
1339EXPORT_SYMBOL(net_enable_timestamp);
1324 1340
1325void net_disable_timestamp(void) 1341void net_disable_timestamp(void)
1326{ 1342{
1327 atomic_dec(&netstamp_needed); 1343 atomic_dec(&netstamp_needed);
1328} 1344}
1345EXPORT_SYMBOL(net_disable_timestamp);
1329 1346
1330static inline void net_timestamp(struct sk_buff *skb) 1347static 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:
1527out: 1544out:
1528 return ret; 1545 return ret;
1529} 1546}
1547EXPORT_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
1593EXPORT_SYMBOL(skb_gso_segment); 1610EXPORT_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. */
@@ -1704,7 +1721,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
1704 skb_dst_drop(skb); 1721 skb_dst_drop(skb);
1705 1722
1706 rc = ops->ndo_start_xmit(skb, dev); 1723 rc = ops->ndo_start_xmit(skb, dev);
1707 if (rc == 0) 1724 if (rc == NETDEV_TX_OK)
1708 txq_trans_update(txq); 1725 txq_trans_update(txq);
1709 /* 1726 /*
1710 * TODO: if skb_orphan() was called by 1727 * TODO: if skb_orphan() was called by
@@ -1730,7 +1747,7 @@ gso:
1730 skb->next = nskb->next; 1747 skb->next = nskb->next;
1731 nskb->next = NULL; 1748 nskb->next = NULL;
1732 rc = ops->ndo_start_xmit(nskb, dev); 1749 rc = ops->ndo_start_xmit(nskb, dev);
1733 if (unlikely(rc)) { 1750 if (unlikely(rc != NETDEV_TX_OK)) {
1734 nskb->next = skb->next; 1751 nskb->next = skb->next;
1735 skb->next = nskb; 1752 skb->next = nskb;
1736 return rc; 1753 return rc;
@@ -1744,7 +1761,7 @@ gso:
1744 1761
1745out_kfree_skb: 1762out_kfree_skb:
1746 kfree_skb(skb); 1763 kfree_skb(skb);
1747 return 0; 1764 return NETDEV_TX_OK;
1748} 1765}
1749 1766
1750static u32 skb_tx_hashrnd; 1767static u32 skb_tx_hashrnd;
@@ -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 }
@@ -1786,6 +1803,40 @@ static struct netdev_queue *dev_pick_tx(struct net_device *dev,
1786 return netdev_get_tx_queue(dev, queue_index); 1803 return netdev_get_tx_queue(dev, queue_index);
1787} 1804}
1788 1805
1806static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q,
1807 struct net_device *dev,
1808 struct netdev_queue *txq)
1809{
1810 spinlock_t *root_lock = qdisc_lock(q);
1811 int rc;
1812
1813 spin_lock(root_lock);
1814 if (unlikely(test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) {
1815 kfree_skb(skb);
1816 rc = NET_XMIT_DROP;
1817 } else if ((q->flags & TCQ_F_CAN_BYPASS) && !qdisc_qlen(q) &&
1818 !test_and_set_bit(__QDISC_STATE_RUNNING, &q->state)) {
1819 /*
1820 * This is a work-conserving queue; there are no old skbs
1821 * waiting to be sent out; and the qdisc is not running -
1822 * xmit the skb directly.
1823 */
1824 __qdisc_update_bstats(q, skb->len);
1825 if (sch_direct_xmit(skb, q, dev, txq, root_lock))
1826 __qdisc_run(q);
1827 else
1828 clear_bit(__QDISC_STATE_RUNNING, &q->state);
1829
1830 rc = NET_XMIT_SUCCESS;
1831 } else {
1832 rc = qdisc_enqueue_root(skb, q);
1833 qdisc_run(q);
1834 }
1835 spin_unlock(root_lock);
1836
1837 return rc;
1838}
1839
1789/** 1840/**
1790 * dev_queue_xmit - transmit a buffer 1841 * dev_queue_xmit - transmit a buffer
1791 * @skb: buffer to transmit 1842 * @skb: buffer to transmit
@@ -1856,22 +1907,10 @@ gso:
1856 q = rcu_dereference(txq->qdisc); 1907 q = rcu_dereference(txq->qdisc);
1857 1908
1858#ifdef CONFIG_NET_CLS_ACT 1909#ifdef CONFIG_NET_CLS_ACT
1859 skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_EGRESS); 1910 skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_EGRESS);
1860#endif 1911#endif
1861 if (q->enqueue) { 1912 if (q->enqueue) {
1862 spinlock_t *root_lock = qdisc_lock(q); 1913 rc = __dev_xmit_skb(skb, q, dev, txq);
1863
1864 spin_lock(root_lock);
1865
1866 if (unlikely(test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) {
1867 kfree_skb(skb);
1868 rc = NET_XMIT_DROP;
1869 } else {
1870 rc = qdisc_enqueue_root(skb, q);
1871 qdisc_run(q);
1872 }
1873 spin_unlock(root_lock);
1874
1875 goto out; 1914 goto out;
1876 } 1915 }
1877 1916
@@ -1895,7 +1934,7 @@ gso:
1895 HARD_TX_LOCK(dev, txq, cpu); 1934 HARD_TX_LOCK(dev, txq, cpu);
1896 1935
1897 if (!netif_tx_queue_stopped(txq)) { 1936 if (!netif_tx_queue_stopped(txq)) {
1898 rc = 0; 1937 rc = NET_XMIT_SUCCESS;
1899 if (!dev_hard_start_xmit(skb, dev, txq)) { 1938 if (!dev_hard_start_xmit(skb, dev, txq)) {
1900 HARD_TX_UNLOCK(dev, txq); 1939 HARD_TX_UNLOCK(dev, txq);
1901 goto out; 1940 goto out;
@@ -1924,6 +1963,7 @@ out:
1924 rcu_read_unlock_bh(); 1963 rcu_read_unlock_bh();
1925 return rc; 1964 return rc;
1926} 1965}
1966EXPORT_SYMBOL(dev_queue_xmit);
1927 1967
1928 1968
1929/*======================================================================= 1969/*=======================================================================
@@ -1990,6 +2030,7 @@ enqueue:
1990 kfree_skb(skb); 2030 kfree_skb(skb);
1991 return NET_RX_DROP; 2031 return NET_RX_DROP;
1992} 2032}
2033EXPORT_SYMBOL(netif_rx);
1993 2034
1994int netif_rx_ni(struct sk_buff *skb) 2035int netif_rx_ni(struct sk_buff *skb)
1995{ 2036{
@@ -2003,7 +2044,6 @@ int netif_rx_ni(struct sk_buff *skb)
2003 2044
2004 return err; 2045 return err;
2005} 2046}
2006
2007EXPORT_SYMBOL(netif_rx_ni); 2047EXPORT_SYMBOL(netif_rx_ni);
2008 2048
2009static void net_tx_action(struct softirq_action *h) 2049static void net_tx_action(struct softirq_action *h)
@@ -2076,7 +2116,7 @@ static inline int deliver_skb(struct sk_buff *skb,
2076/* This hook is defined here for ATM LANE */ 2116/* This hook is defined here for ATM LANE */
2077int (*br_fdb_test_addr_hook)(struct net_device *dev, 2117int (*br_fdb_test_addr_hook)(struct net_device *dev,
2078 unsigned char *addr) __read_mostly; 2118 unsigned char *addr) __read_mostly;
2079EXPORT_SYMBOL(br_fdb_test_addr_hook); 2119EXPORT_SYMBOL_GPL(br_fdb_test_addr_hook);
2080#endif 2120#endif
2081 2121
2082/* 2122/*
@@ -2085,7 +2125,7 @@ EXPORT_SYMBOL(br_fdb_test_addr_hook);
2085 */ 2125 */
2086struct sk_buff *(*br_handle_frame_hook)(struct net_bridge_port *p, 2126struct sk_buff *(*br_handle_frame_hook)(struct net_bridge_port *p,
2087 struct sk_buff *skb) __read_mostly; 2127 struct sk_buff *skb) __read_mostly;
2088EXPORT_SYMBOL(br_handle_frame_hook); 2128EXPORT_SYMBOL_GPL(br_handle_frame_hook);
2089 2129
2090static inline struct sk_buff *handle_bridge(struct sk_buff *skb, 2130static inline struct sk_buff *handle_bridge(struct sk_buff *skb,
2091 struct packet_type **pt_prev, int *ret, 2131 struct packet_type **pt_prev, int *ret,
@@ -2336,6 +2376,7 @@ out:
2336 rcu_read_unlock(); 2376 rcu_read_unlock();
2337 return ret; 2377 return ret;
2338} 2378}
2379EXPORT_SYMBOL(netif_receive_skb);
2339 2380
2340/* Network device is going away, flush any packets still pending */ 2381/* Network device is going away, flush any packets still pending */
2341static void flush_backlog(void *arg) 2382static void flush_backlog(void *arg)
@@ -2852,7 +2893,7 @@ softnet_break:
2852 goto out; 2893 goto out;
2853} 2894}
2854 2895
2855static gifconf_func_t * gifconf_list [NPROTO]; 2896static gifconf_func_t *gifconf_list[NPROTO];
2856 2897
2857/** 2898/**
2858 * register_gifconf - register a SIOCGIF handler 2899 * register_gifconf - register a SIOCGIF handler
@@ -2863,13 +2904,14 @@ static gifconf_func_t * gifconf_list [NPROTO];
2863 * 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
2864 * by another handler. 2905 * by another handler.
2865 */ 2906 */
2866int register_gifconf(unsigned int family, gifconf_func_t * gifconf) 2907int register_gifconf(unsigned int family, gifconf_func_t *gifconf)
2867{ 2908{
2868 if (family >= NPROTO) 2909 if (family >= NPROTO)
2869 return -EINVAL; 2910 return -EINVAL;
2870 gifconf_list[family] = gifconf; 2911 gifconf_list[family] = gifconf;
2871 return 0; 2912 return 0;
2872} 2913}
2914EXPORT_SYMBOL(register_gifconf);
2873 2915
2874 2916
2875/* 2917/*
@@ -3080,7 +3122,7 @@ static int softnet_seq_show(struct seq_file *seq, void *v)
3080 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",
3081 s->total, s->dropped, s->time_squeeze, 0, 3123 s->total, s->dropped, s->time_squeeze, 0,
3082 0, 0, 0, 0, /* was fastroute */ 3124 0, 0, 0, 0, /* was fastroute */
3083 s->cpu_collision ); 3125 s->cpu_collision);
3084 return 0; 3126 return 0;
3085} 3127}
3086 3128
@@ -3316,6 +3358,7 @@ int netdev_set_master(struct net_device *slave, struct net_device *master)
3316 rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE); 3358 rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE);
3317 return 0; 3359 return 0;
3318} 3360}
3361EXPORT_SYMBOL(netdev_set_master);
3319 3362
3320static void dev_change_rx_flags(struct net_device *dev, int flags) 3363static void dev_change_rx_flags(struct net_device *dev, int flags)
3321{ 3364{
@@ -3394,6 +3437,7 @@ int dev_set_promiscuity(struct net_device *dev, int inc)
3394 dev_set_rx_mode(dev); 3437 dev_set_rx_mode(dev);
3395 return err; 3438 return err;
3396} 3439}
3440EXPORT_SYMBOL(dev_set_promiscuity);
3397 3441
3398/** 3442/**
3399 * dev_set_allmulti - update allmulti count on a device 3443 * dev_set_allmulti - update allmulti count on a device
@@ -3437,6 +3481,7 @@ int dev_set_allmulti(struct net_device *dev, int inc)
3437 } 3481 }
3438 return 0; 3482 return 0;
3439} 3483}
3484EXPORT_SYMBOL(dev_set_allmulti);
3440 3485
3441/* 3486/*
3442 * Upload unicast and multicast address lists to device and 3487 * Upload unicast and multicast address lists to device and
@@ -3927,6 +3972,7 @@ int __dev_addr_sync(struct dev_addr_list **to, int *to_count,
3927 } 3972 }
3928 return err; 3973 return err;
3929} 3974}
3975EXPORT_SYMBOL_GPL(__dev_addr_sync);
3930 3976
3931void __dev_addr_unsync(struct dev_addr_list **to, int *to_count, 3977void __dev_addr_unsync(struct dev_addr_list **to, int *to_count,
3932 struct dev_addr_list **from, int *from_count) 3978 struct dev_addr_list **from, int *from_count)
@@ -3946,6 +3992,7 @@ void __dev_addr_unsync(struct dev_addr_list **to, int *to_count,
3946 da = next; 3992 da = next;
3947 } 3993 }
3948} 3994}
3995EXPORT_SYMBOL_GPL(__dev_addr_unsync);
3949 3996
3950/** 3997/**
3951 * dev_unicast_sync - Synchronize device's unicast list to another device 3998 * dev_unicast_sync - Synchronize device's unicast list to another device
@@ -4064,6 +4111,7 @@ unsigned dev_get_flags(const struct net_device *dev)
4064 4111
4065 return flags; 4112 return flags;
4066} 4113}
4114EXPORT_SYMBOL(dev_get_flags);
4067 4115
4068/** 4116/**
4069 * dev_change_flags - change device settings 4117 * dev_change_flags - change device settings
@@ -4114,12 +4162,13 @@ int dev_change_flags(struct net_device *dev, unsigned flags)
4114 } 4162 }
4115 4163
4116 if (dev->flags & IFF_UP && 4164 if (dev->flags & IFF_UP &&
4117 ((old_flags ^ dev->flags) &~ (IFF_UP | IFF_PROMISC | IFF_ALLMULTI | 4165 ((old_flags ^ dev->flags) & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
4118 IFF_VOLATILE))) 4166 IFF_VOLATILE)))
4119 call_netdevice_notifiers(NETDEV_CHANGE, dev); 4167 call_netdevice_notifiers(NETDEV_CHANGE, dev);
4120 4168
4121 if ((flags ^ dev->gflags) & IFF_PROMISC) { 4169 if ((flags ^ dev->gflags) & IFF_PROMISC) {
4122 int inc = (flags & IFF_PROMISC) ? +1 : -1; 4170 int inc = (flags & IFF_PROMISC) ? 1 : -1;
4171
4123 dev->gflags ^= IFF_PROMISC; 4172 dev->gflags ^= IFF_PROMISC;
4124 dev_set_promiscuity(dev, inc); 4173 dev_set_promiscuity(dev, inc);
4125 } 4174 }
@@ -4129,7 +4178,8 @@ int dev_change_flags(struct net_device *dev, unsigned flags)
4129 IFF_ALLMULTI is requested not asking us and not reporting. 4178 IFF_ALLMULTI is requested not asking us and not reporting.
4130 */ 4179 */
4131 if ((flags ^ dev->gflags) & IFF_ALLMULTI) { 4180 if ((flags ^ dev->gflags) & IFF_ALLMULTI) {
4132 int inc = (flags & IFF_ALLMULTI) ? +1 : -1; 4181 int inc = (flags & IFF_ALLMULTI) ? 1 : -1;
4182
4133 dev->gflags ^= IFF_ALLMULTI; 4183 dev->gflags ^= IFF_ALLMULTI;
4134 dev_set_allmulti(dev, inc); 4184 dev_set_allmulti(dev, inc);
4135 } 4185 }
@@ -4141,6 +4191,7 @@ int dev_change_flags(struct net_device *dev, unsigned flags)
4141 4191
4142 return ret; 4192 return ret;
4143} 4193}
4194EXPORT_SYMBOL(dev_change_flags);
4144 4195
4145/** 4196/**
4146 * dev_set_mtu - Change maximum transfer unit 4197 * dev_set_mtu - Change maximum transfer unit
@@ -4174,6 +4225,7 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
4174 call_netdevice_notifiers(NETDEV_CHANGEMTU, dev); 4225 call_netdevice_notifiers(NETDEV_CHANGEMTU, dev);
4175 return err; 4226 return err;
4176} 4227}
4228EXPORT_SYMBOL(dev_set_mtu);
4177 4229
4178/** 4230/**
4179 * dev_set_mac_address - Change Media Access Control Address 4231 * dev_set_mac_address - Change Media Access Control Address
@@ -4198,6 +4250,7 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa)
4198 call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); 4250 call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
4199 return err; 4251 return err;
4200} 4252}
4253EXPORT_SYMBOL(dev_set_mac_address);
4201 4254
4202/* 4255/*
4203 * Perform the SIOCxIFxxx calls, inside read_lock(dev_base_lock) 4256 * Perform the SIOCxIFxxx calls, inside read_lock(dev_base_lock)
@@ -4211,56 +4264,56 @@ static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cm
4211 return -ENODEV; 4264 return -ENODEV;
4212 4265
4213 switch (cmd) { 4266 switch (cmd) {
4214 case SIOCGIFFLAGS: /* Get interface flags */ 4267 case SIOCGIFFLAGS: /* Get interface flags */
4215 ifr->ifr_flags = (short) dev_get_flags(dev); 4268 ifr->ifr_flags = (short) dev_get_flags(dev);
4216 return 0; 4269 return 0;
4217 4270
4218 case SIOCGIFMETRIC: /* Get the metric on the interface 4271 case SIOCGIFMETRIC: /* Get the metric on the interface
4219 (currently unused) */ 4272 (currently unused) */
4220 ifr->ifr_metric = 0; 4273 ifr->ifr_metric = 0;
4221 return 0; 4274 return 0;
4222 4275
4223 case SIOCGIFMTU: /* Get the MTU of a device */ 4276 case SIOCGIFMTU: /* Get the MTU of a device */
4224 ifr->ifr_mtu = dev->mtu; 4277 ifr->ifr_mtu = dev->mtu;
4225 return 0; 4278 return 0;
4226 4279
4227 case SIOCGIFHWADDR: 4280 case SIOCGIFHWADDR:
4228 if (!dev->addr_len) 4281 if (!dev->addr_len)
4229 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);
4230 else 4283 else
4231 memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, 4284 memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr,
4232 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));
4233 ifr->ifr_hwaddr.sa_family = dev->type; 4286 ifr->ifr_hwaddr.sa_family = dev->type;
4234 return 0; 4287 return 0;
4235 4288
4236 case SIOCGIFSLAVE: 4289 case SIOCGIFSLAVE:
4237 err = -EINVAL; 4290 err = -EINVAL;
4238 break; 4291 break;
4239 4292
4240 case SIOCGIFMAP: 4293 case SIOCGIFMAP:
4241 ifr->ifr_map.mem_start = dev->mem_start; 4294 ifr->ifr_map.mem_start = dev->mem_start;
4242 ifr->ifr_map.mem_end = dev->mem_end; 4295 ifr->ifr_map.mem_end = dev->mem_end;
4243 ifr->ifr_map.base_addr = dev->base_addr; 4296 ifr->ifr_map.base_addr = dev->base_addr;
4244 ifr->ifr_map.irq = dev->irq; 4297 ifr->ifr_map.irq = dev->irq;
4245 ifr->ifr_map.dma = dev->dma; 4298 ifr->ifr_map.dma = dev->dma;
4246 ifr->ifr_map.port = dev->if_port; 4299 ifr->ifr_map.port = dev->if_port;
4247 return 0; 4300 return 0;
4248 4301
4249 case SIOCGIFINDEX: 4302 case SIOCGIFINDEX:
4250 ifr->ifr_ifindex = dev->ifindex; 4303 ifr->ifr_ifindex = dev->ifindex;
4251 return 0; 4304 return 0;
4252 4305
4253 case SIOCGIFTXQLEN: 4306 case SIOCGIFTXQLEN:
4254 ifr->ifr_qlen = dev->tx_queue_len; 4307 ifr->ifr_qlen = dev->tx_queue_len;
4255 return 0; 4308 return 0;
4256 4309
4257 default: 4310 default:
4258 /* dev_ioctl() should ensure this case 4311 /* dev_ioctl() should ensure this case
4259 * is never reached 4312 * is never reached
4260 */ 4313 */
4261 WARN_ON(1); 4314 WARN_ON(1);
4262 err = -EINVAL; 4315 err = -EINVAL;
4263 break; 4316 break;
4264 4317
4265 } 4318 }
4266 return err; 4319 return err;
@@ -4281,92 +4334,91 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd)
4281 ops = dev->netdev_ops; 4334 ops = dev->netdev_ops;
4282 4335
4283 switch (cmd) { 4336 switch (cmd) {
4284 case SIOCSIFFLAGS: /* Set interface flags */ 4337 case SIOCSIFFLAGS: /* Set interface flags */
4285 return dev_change_flags(dev, ifr->ifr_flags); 4338 return dev_change_flags(dev, ifr->ifr_flags);
4286
4287 case SIOCSIFMETRIC: /* Set the metric on the interface
4288 (currently unused) */
4289 return -EOPNOTSUPP;
4290 4339
4291 case SIOCSIFMTU: /* Set the MTU of a device */ 4340 case SIOCSIFMETRIC: /* Set the metric on the interface
4292 return dev_set_mtu(dev, ifr->ifr_mtu); 4341 (currently unused) */
4342 return -EOPNOTSUPP;
4293 4343
4294 case SIOCSIFHWADDR: 4344 case SIOCSIFMTU: /* Set the MTU of a device */
4295 return dev_set_mac_address(dev, &ifr->ifr_hwaddr); 4345 return dev_set_mtu(dev, ifr->ifr_mtu);
4296 4346
4297 case SIOCSIFHWBROADCAST: 4347 case SIOCSIFHWADDR:
4298 if (ifr->ifr_hwaddr.sa_family != dev->type) 4348 return dev_set_mac_address(dev, &ifr->ifr_hwaddr);
4299 return -EINVAL;
4300 memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data,
4301 min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len));
4302 call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
4303 return 0;
4304 4349
4305 case SIOCSIFMAP: 4350 case SIOCSIFHWBROADCAST:
4306 if (ops->ndo_set_config) { 4351 if (ifr->ifr_hwaddr.sa_family != dev->type)
4307 if (!netif_device_present(dev)) 4352 return -EINVAL;
4308 return -ENODEV; 4353 memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data,
4309 return ops->ndo_set_config(dev, &ifr->ifr_map); 4354 min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len));
4310 } 4355 call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
4311 return -EOPNOTSUPP; 4356 return 0;
4312
4313 case SIOCADDMULTI:
4314 if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) ||
4315 ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
4316 return -EINVAL;
4317 if (!netif_device_present(dev))
4318 return -ENODEV;
4319 return dev_mc_add(dev, ifr->ifr_hwaddr.sa_data,
4320 dev->addr_len, 1);
4321 4357
4322 case SIOCDELMULTI: 4358 case SIOCSIFMAP:
4323 if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || 4359 if (ops->ndo_set_config) {
4324 ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
4325 return -EINVAL;
4326 if (!netif_device_present(dev)) 4360 if (!netif_device_present(dev))
4327 return -ENODEV; 4361 return -ENODEV;
4328 return dev_mc_delete(dev, ifr->ifr_hwaddr.sa_data, 4362 return ops->ndo_set_config(dev, &ifr->ifr_map);
4329 dev->addr_len, 1); 4363 }
4364 return -EOPNOTSUPP;
4330 4365
4331 case SIOCSIFTXQLEN: 4366 case SIOCADDMULTI:
4332 if (ifr->ifr_qlen < 0) 4367 if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) ||
4333 return -EINVAL; 4368 ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
4334 dev->tx_queue_len = ifr->ifr_qlen; 4369 return -EINVAL;
4335 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);
4336 4383
4337 case SIOCSIFNAME: 4384 case SIOCSIFTXQLEN:
4338 ifr->ifr_newname[IFNAMSIZ-1] = '\0'; 4385 if (ifr->ifr_qlen < 0)
4339 return dev_change_name(dev, ifr->ifr_newname); 4386 return -EINVAL;
4387 dev->tx_queue_len = ifr->ifr_qlen;
4388 return 0;
4340 4389
4341 /* 4390 case SIOCSIFNAME:
4342 * Unknown or private ioctl 4391 ifr->ifr_newname[IFNAMSIZ-1] = '\0';
4343 */ 4392 return dev_change_name(dev, ifr->ifr_newname);
4344 4393
4345 default: 4394 /*
4346 if ((cmd >= SIOCDEVPRIVATE && 4395 * Unknown or private ioctl
4347 cmd <= SIOCDEVPRIVATE + 15) || 4396 */
4348 cmd == SIOCBONDENSLAVE || 4397 default:
4349 cmd == SIOCBONDRELEASE || 4398 if ((cmd >= SIOCDEVPRIVATE &&
4350 cmd == SIOCBONDSETHWADDR || 4399 cmd <= SIOCDEVPRIVATE + 15) ||
4351 cmd == SIOCBONDSLAVEINFOQUERY || 4400 cmd == SIOCBONDENSLAVE ||
4352 cmd == SIOCBONDINFOQUERY || 4401 cmd == SIOCBONDRELEASE ||
4353 cmd == SIOCBONDCHANGEACTIVE || 4402 cmd == SIOCBONDSETHWADDR ||
4354 cmd == SIOCGMIIPHY || 4403 cmd == SIOCBONDSLAVEINFOQUERY ||
4355 cmd == SIOCGMIIREG || 4404 cmd == SIOCBONDINFOQUERY ||
4356 cmd == SIOCSMIIREG || 4405 cmd == SIOCBONDCHANGEACTIVE ||
4357 cmd == SIOCBRADDIF || 4406 cmd == SIOCGMIIPHY ||
4358 cmd == SIOCBRDELIF || 4407 cmd == SIOCGMIIREG ||
4359 cmd == SIOCSHWTSTAMP || 4408 cmd == SIOCSMIIREG ||
4360 cmd == SIOCWANDEV) { 4409 cmd == SIOCBRADDIF ||
4361 err = -EOPNOTSUPP; 4410 cmd == SIOCBRDELIF ||
4362 if (ops->ndo_do_ioctl) { 4411 cmd == SIOCSHWTSTAMP ||
4363 if (netif_device_present(dev)) 4412 cmd == SIOCWANDEV) {
4364 err = ops->ndo_do_ioctl(dev, ifr, cmd); 4413 err = -EOPNOTSUPP;
4365 else 4414 if (ops->ndo_do_ioctl) {
4366 err = -ENODEV; 4415 if (netif_device_present(dev))
4367 } 4416 err = ops->ndo_do_ioctl(dev, ifr, cmd);
4368 } else 4417 else
4369 err = -EINVAL; 4418 err = -ENODEV;
4419 }
4420 } else
4421 err = -EINVAL;
4370 4422
4371 } 4423 }
4372 return err; 4424 return err;
@@ -4423,135 +4475,135 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
4423 */ 4475 */
4424 4476
4425 switch (cmd) { 4477 switch (cmd) {
4426 /* 4478 /*
4427 * These ioctl calls: 4479 * These ioctl calls:
4428 * - can be done by all. 4480 * - can be done by all.
4429 * - atomic and do not require locking. 4481 * - atomic and do not require locking.
4430 * - return a value 4482 * - return a value
4431 */ 4483 */
4432 case SIOCGIFFLAGS: 4484 case SIOCGIFFLAGS:
4433 case SIOCGIFMETRIC: 4485 case SIOCGIFMETRIC:
4434 case SIOCGIFMTU: 4486 case SIOCGIFMTU:
4435 case SIOCGIFHWADDR: 4487 case SIOCGIFHWADDR:
4436 case SIOCGIFSLAVE: 4488 case SIOCGIFSLAVE:
4437 case SIOCGIFMAP: 4489 case SIOCGIFMAP:
4438 case SIOCGIFINDEX: 4490 case SIOCGIFINDEX:
4439 case SIOCGIFTXQLEN: 4491 case SIOCGIFTXQLEN:
4440 dev_load(net, ifr.ifr_name); 4492 dev_load(net, ifr.ifr_name);
4441 read_lock(&dev_base_lock); 4493 read_lock(&dev_base_lock);
4442 ret = dev_ifsioc_locked(net, &ifr, cmd); 4494 ret = dev_ifsioc_locked(net, &ifr, cmd);
4443 read_unlock(&dev_base_lock); 4495 read_unlock(&dev_base_lock);
4444 if (!ret) { 4496 if (!ret) {
4445 if (colon) 4497 if (colon)
4446 *colon = ':'; 4498 *colon = ':';
4447 if (copy_to_user(arg, &ifr, 4499 if (copy_to_user(arg, &ifr,
4448 sizeof(struct ifreq))) 4500 sizeof(struct ifreq)))
4449 ret = -EFAULT; 4501 ret = -EFAULT;
4450 } 4502 }
4451 return ret; 4503 return ret;
4452 4504
4453 case SIOCETHTOOL: 4505 case SIOCETHTOOL:
4454 dev_load(net, ifr.ifr_name); 4506 dev_load(net, ifr.ifr_name);
4455 rtnl_lock(); 4507 rtnl_lock();
4456 ret = dev_ethtool(net, &ifr); 4508 ret = dev_ethtool(net, &ifr);
4457 rtnl_unlock(); 4509 rtnl_unlock();
4458 if (!ret) { 4510 if (!ret) {
4459 if (colon) 4511 if (colon)
4460 *colon = ':'; 4512 *colon = ':';
4461 if (copy_to_user(arg, &ifr, 4513 if (copy_to_user(arg, &ifr,
4462 sizeof(struct ifreq))) 4514 sizeof(struct ifreq)))
4463 ret = -EFAULT; 4515 ret = -EFAULT;
4464 } 4516 }
4465 return ret; 4517 return ret;
4466 4518
4467 /* 4519 /*
4468 * These ioctl calls: 4520 * These ioctl calls:
4469 * - require superuser power. 4521 * - require superuser power.
4470 * - require strict serialization. 4522 * - require strict serialization.
4471 * - return a value 4523 * - return a value
4472 */ 4524 */
4473 case SIOCGMIIPHY: 4525 case SIOCGMIIPHY:
4474 case SIOCGMIIREG: 4526 case SIOCGMIIREG:
4475 case SIOCSIFNAME: 4527 case SIOCSIFNAME:
4476 if (!capable(CAP_NET_ADMIN)) 4528 if (!capable(CAP_NET_ADMIN))
4477 return -EPERM; 4529 return -EPERM;
4478 dev_load(net, ifr.ifr_name); 4530 dev_load(net, ifr.ifr_name);
4479 rtnl_lock(); 4531 rtnl_lock();
4480 ret = dev_ifsioc(net, &ifr, cmd); 4532 ret = dev_ifsioc(net, &ifr, cmd);
4481 rtnl_unlock(); 4533 rtnl_unlock();
4482 if (!ret) { 4534 if (!ret) {
4483 if (colon) 4535 if (colon)
4484 *colon = ':'; 4536 *colon = ':';
4485 if (copy_to_user(arg, &ifr, 4537 if (copy_to_user(arg, &ifr,
4486 sizeof(struct ifreq))) 4538 sizeof(struct ifreq)))
4487 ret = -EFAULT; 4539 ret = -EFAULT;
4488 } 4540 }
4489 return ret; 4541 return ret;
4490 4542
4491 /* 4543 /*
4492 * These ioctl calls: 4544 * These ioctl calls:
4493 * - require superuser power. 4545 * - require superuser power.
4494 * - require strict serialization. 4546 * - require strict serialization.
4495 * - do not return a value 4547 * - do not return a value
4496 */ 4548 */
4497 case SIOCSIFFLAGS: 4549 case SIOCSIFFLAGS:
4498 case SIOCSIFMETRIC: 4550 case SIOCSIFMETRIC:
4499 case SIOCSIFMTU: 4551 case SIOCSIFMTU:
4500 case SIOCSIFMAP: 4552 case SIOCSIFMAP:
4501 case SIOCSIFHWADDR: 4553 case SIOCSIFHWADDR:
4502 case SIOCSIFSLAVE: 4554 case SIOCSIFSLAVE:
4503 case SIOCADDMULTI: 4555 case SIOCADDMULTI:
4504 case SIOCDELMULTI: 4556 case SIOCDELMULTI:
4505 case SIOCSIFHWBROADCAST: 4557 case SIOCSIFHWBROADCAST:
4506 case SIOCSIFTXQLEN: 4558 case SIOCSIFTXQLEN:
4507 case SIOCSMIIREG: 4559 case SIOCSMIIREG:
4508 case SIOCBONDENSLAVE: 4560 case SIOCBONDENSLAVE:
4509 case SIOCBONDRELEASE: 4561 case SIOCBONDRELEASE:
4510 case SIOCBONDSETHWADDR: 4562 case SIOCBONDSETHWADDR:
4511 case SIOCBONDCHANGEACTIVE: 4563 case SIOCBONDCHANGEACTIVE:
4512 case SIOCBRADDIF: 4564 case SIOCBRADDIF:
4513 case SIOCBRDELIF: 4565 case SIOCBRDELIF:
4514 case SIOCSHWTSTAMP: 4566 case SIOCSHWTSTAMP:
4515 if (!capable(CAP_NET_ADMIN)) 4567 if (!capable(CAP_NET_ADMIN))
4516 return -EPERM; 4568 return -EPERM;
4517 /* fall through */ 4569 /* fall through */
4518 case SIOCBONDSLAVEINFOQUERY: 4570 case SIOCBONDSLAVEINFOQUERY:
4519 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)) {
4520 dev_load(net, ifr.ifr_name); 4594 dev_load(net, ifr.ifr_name);
4521 rtnl_lock(); 4595 rtnl_lock();
4522 ret = dev_ifsioc(net, &ifr, cmd); 4596 ret = dev_ifsioc(net, &ifr, cmd);
4523 rtnl_unlock(); 4597 rtnl_unlock();
4598 if (!ret && copy_to_user(arg, &ifr,
4599 sizeof(struct ifreq)))
4600 ret = -EFAULT;
4524 return ret; 4601 return ret;
4525 4602 }
4526 case SIOCGIFMEM: 4603 /* Take care of Wireless Extensions */
4527 /* Get the per device memory space. We can add this but 4604 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST)
4528 * currently do not support it */ 4605 return wext_handle_ioctl(net, &ifr, cmd, arg);
4529 case SIOCSIFMEM: 4606 return -EINVAL;
4530 /* Set the per device memory buffer space.
4531 * Not applicable in our case */
4532 case SIOCSIFLINK:
4533 return -EINVAL;
4534
4535 /*
4536 * Unknown or private ioctl.
4537 */
4538 default:
4539 if (cmd == SIOCWANDEV ||
4540 (cmd >= SIOCDEVPRIVATE &&
4541 cmd <= SIOCDEVPRIVATE + 15)) {
4542 dev_load(net, ifr.ifr_name);
4543 rtnl_lock();
4544 ret = dev_ifsioc(net, &ifr, cmd);
4545 rtnl_unlock();
4546 if (!ret && copy_to_user(arg, &ifr,
4547 sizeof(struct ifreq)))
4548 ret = -EFAULT;
4549 return ret;
4550 }
4551 /* Take care of Wireless Extensions */
4552 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST)
4553 return wext_handle_ioctl(net, &ifr, cmd, arg);
4554 return -EINVAL;
4555 } 4607 }
4556} 4608}
4557 4609
@@ -4816,6 +4868,7 @@ err_uninit:
4816 dev->netdev_ops->ndo_uninit(dev); 4868 dev->netdev_ops->ndo_uninit(dev);
4817 goto out; 4869 goto out;
4818} 4870}
4871EXPORT_SYMBOL(register_netdevice);
4819 4872
4820/** 4873/**
4821 * init_dummy_netdev - init a dummy network device for NAPI 4874 * init_dummy_netdev - init a dummy network device for NAPI
@@ -5168,6 +5221,7 @@ void free_netdev(struct net_device *dev)
5168 /* will free via device release */ 5221 /* will free via device release */
5169 put_device(&dev->dev); 5222 put_device(&dev->dev);
5170} 5223}
5224EXPORT_SYMBOL(free_netdev);
5171 5225
5172/** 5226/**
5173 * synchronize_net - Synchronize with packet receive processing 5227 * synchronize_net - Synchronize with packet receive processing
@@ -5180,6 +5234,7 @@ void synchronize_net(void)
5180 might_sleep(); 5234 might_sleep();
5181 synchronize_rcu(); 5235 synchronize_rcu();
5182} 5236}
5237EXPORT_SYMBOL(synchronize_net);
5183 5238
5184/** 5239/**
5185 * unregister_netdevice - remove device from the kernel 5240 * unregister_netdevice - remove device from the kernel
@@ -5200,6 +5255,7 @@ void unregister_netdevice(struct net_device *dev)
5200 /* Finish processing unregister after unlock */ 5255 /* Finish processing unregister after unlock */
5201 net_set_todo(dev); 5256 net_set_todo(dev);
5202} 5257}
5258EXPORT_SYMBOL(unregister_netdevice);
5203 5259
5204/** 5260/**
5205 * unregister_netdev - remove device from the kernel 5261 * unregister_netdev - remove device from the kernel
@@ -5218,7 +5274,6 @@ void unregister_netdev(struct net_device *dev)
5218 unregister_netdevice(dev); 5274 unregister_netdevice(dev);
5219 rtnl_unlock(); 5275 rtnl_unlock();
5220} 5276}
5221
5222EXPORT_SYMBOL(unregister_netdev); 5277EXPORT_SYMBOL(unregister_netdev);
5223 5278
5224/** 5279/**
@@ -5347,6 +5402,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
5347out: 5402out:
5348 return err; 5403 return err;
5349} 5404}
5405EXPORT_SYMBOL_GPL(dev_change_net_namespace);
5350 5406
5351static int dev_cpu_callback(struct notifier_block *nfb, 5407static int dev_cpu_callback(struct notifier_block *nfb,
5352 unsigned long action, 5408 unsigned long action,
@@ -5407,7 +5463,7 @@ unsigned long netdev_increment_features(unsigned long all, unsigned long one,
5407 unsigned long mask) 5463 unsigned long mask)
5408{ 5464{
5409 /* If device needs checksumming, downgrade to it. */ 5465 /* If device needs checksumming, downgrade to it. */
5410 if (all & NETIF_F_NO_CSUM && !(one & NETIF_F_NO_CSUM)) 5466 if (all & NETIF_F_NO_CSUM && !(one & NETIF_F_NO_CSUM))
5411 all ^= NETIF_F_NO_CSUM | (one & NETIF_F_ALL_CSUM); 5467 all ^= NETIF_F_NO_CSUM | (one & NETIF_F_ALL_CSUM);
5412 else if (mask & NETIF_F_ALL_CSUM) { 5468 else if (mask & NETIF_F_ALL_CSUM) {
5413 /* If one device supports v4/v6 checksumming, set for all. */ 5469 /* If one device supports v4/v6 checksumming, set for all. */
@@ -5633,41 +5689,3 @@ static int __init initialize_hashrnd(void)
5633 5689
5634late_initcall_sync(initialize_hashrnd); 5690late_initcall_sync(initialize_hashrnd);
5635 5691
5636EXPORT_SYMBOL(__dev_get_by_index);
5637EXPORT_SYMBOL(__dev_get_by_name);
5638EXPORT_SYMBOL(__dev_remove_pack);
5639EXPORT_SYMBOL(dev_valid_name);
5640EXPORT_SYMBOL(dev_add_pack);
5641EXPORT_SYMBOL(dev_alloc_name);
5642EXPORT_SYMBOL(dev_close);
5643EXPORT_SYMBOL(dev_get_by_flags);
5644EXPORT_SYMBOL(dev_get_by_index);
5645EXPORT_SYMBOL(dev_get_by_name);
5646EXPORT_SYMBOL(dev_open);
5647EXPORT_SYMBOL(dev_queue_xmit);
5648EXPORT_SYMBOL(dev_remove_pack);
5649EXPORT_SYMBOL(dev_set_allmulti);
5650EXPORT_SYMBOL(dev_set_promiscuity);
5651EXPORT_SYMBOL(dev_change_flags);
5652EXPORT_SYMBOL(dev_set_mtu);
5653EXPORT_SYMBOL(dev_set_mac_address);
5654EXPORT_SYMBOL(free_netdev);
5655EXPORT_SYMBOL(netdev_boot_setup_check);
5656EXPORT_SYMBOL(netdev_set_master);
5657EXPORT_SYMBOL(netdev_state_change);
5658EXPORT_SYMBOL(netif_receive_skb);
5659EXPORT_SYMBOL(netif_rx);
5660EXPORT_SYMBOL(register_gifconf);
5661EXPORT_SYMBOL(register_netdevice);
5662EXPORT_SYMBOL(register_netdevice_notifier);
5663EXPORT_SYMBOL(skb_checksum_help);
5664EXPORT_SYMBOL(synchronize_net);
5665EXPORT_SYMBOL(unregister_netdevice);
5666EXPORT_SYMBOL(unregister_netdevice_notifier);
5667EXPORT_SYMBOL(net_enable_timestamp);
5668EXPORT_SYMBOL(net_disable_timestamp);
5669EXPORT_SYMBOL(dev_get_flags);
5670
5671EXPORT_SYMBOL(dev_load);
5672
5673EXPORT_PER_CPU_SYMBOL(softnet_data);