aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/net/qeth_l3_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/net/qeth_l3_main.c')
-rw-r--r--drivers/s390/net/qeth_l3_main.c207
1 files changed, 70 insertions, 137 deletions
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index 0b161cc1fd2e..f08b745c2007 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -278,9 +278,6 @@ static void qeth_l3_clear_ip_htable(struct qeth_card *card, int recover)
278 278
279 QETH_CARD_TEXT(card, 4, "clearip"); 279 QETH_CARD_TEXT(card, 4, "clearip");
280 280
281 if (recover && card->options.sniffer)
282 return;
283
284 spin_lock_bh(&card->ip_lock); 281 spin_lock_bh(&card->ip_lock);
285 282
286 hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) { 283 hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) {
@@ -494,9 +491,8 @@ int qeth_l3_setrouting_v4(struct qeth_card *card)
494 QETH_PROT_IPV4); 491 QETH_PROT_IPV4);
495 if (rc) { 492 if (rc) {
496 card->options.route4.type = NO_ROUTER; 493 card->options.route4.type = NO_ROUTER;
497 QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" 494 QETH_DBF_MESSAGE(2, "Error (%#06x) while setting routing type on device %x. Type set to 'no router'.\n",
498 " on %s. Type set to 'no router'.\n", rc, 495 rc, CARD_DEVID(card));
499 QETH_CARD_IFNAME(card));
500 } 496 }
501 return rc; 497 return rc;
502} 498}
@@ -518,9 +514,8 @@ int qeth_l3_setrouting_v6(struct qeth_card *card)
518 QETH_PROT_IPV6); 514 QETH_PROT_IPV6);
519 if (rc) { 515 if (rc) {
520 card->options.route6.type = NO_ROUTER; 516 card->options.route6.type = NO_ROUTER;
521 QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" 517 QETH_DBF_MESSAGE(2, "Error (%#06x) while setting routing type on device %x. Type set to 'no router'.\n",
522 " on %s. Type set to 'no router'.\n", rc, 518 rc, CARD_DEVID(card));
523 QETH_CARD_IFNAME(card));
524 } 519 }
525 return rc; 520 return rc;
526} 521}
@@ -663,6 +658,8 @@ static int qeth_l3_register_addr_entry(struct qeth_card *card,
663 int rc = 0; 658 int rc = 0;
664 int cnt = 3; 659 int cnt = 3;
665 660
661 if (card->options.sniffer)
662 return 0;
666 663
667 if (addr->proto == QETH_PROT_IPV4) { 664 if (addr->proto == QETH_PROT_IPV4) {
668 QETH_CARD_TEXT(card, 2, "setaddr4"); 665 QETH_CARD_TEXT(card, 2, "setaddr4");
@@ -697,6 +694,9 @@ static int qeth_l3_deregister_addr_entry(struct qeth_card *card,
697{ 694{
698 int rc = 0; 695 int rc = 0;
699 696
697 if (card->options.sniffer)
698 return 0;
699
700 if (addr->proto == QETH_PROT_IPV4) { 700 if (addr->proto == QETH_PROT_IPV4) {
701 QETH_CARD_TEXT(card, 2, "deladdr4"); 701 QETH_CARD_TEXT(card, 2, "deladdr4");
702 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); 702 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int));
@@ -1070,8 +1070,8 @@ qeth_diags_trace_cb(struct qeth_card *card, struct qeth_reply *reply,
1070 } 1070 }
1071 break; 1071 break;
1072 default: 1072 default:
1073 QETH_DBF_MESSAGE(2, "Unknown sniffer action (0x%04x) on %s\n", 1073 QETH_DBF_MESSAGE(2, "Unknown sniffer action (%#06x) on device %x\n",
1074 cmd->data.diagass.action, QETH_CARD_IFNAME(card)); 1074 cmd->data.diagass.action, CARD_DEVID(card));
1075 } 1075 }
1076 1076
1077 return 0; 1077 return 0;
@@ -1517,32 +1517,25 @@ static void qeth_l3_set_rx_mode(struct net_device *dev)
1517 qeth_l3_handle_promisc_mode(card); 1517 qeth_l3_handle_promisc_mode(card);
1518} 1518}
1519 1519
1520static const char *qeth_l3_arp_get_error_cause(int *rc) 1520static int qeth_l3_arp_makerc(int rc)
1521{ 1521{
1522 switch (*rc) { 1522 switch (rc) {
1523 case QETH_IPA_ARP_RC_FAILED: 1523 case IPA_RC_SUCCESS:
1524 *rc = -EIO; 1524 return 0;
1525 return "operation failed";
1526 case QETH_IPA_ARP_RC_NOTSUPP: 1525 case QETH_IPA_ARP_RC_NOTSUPP:
1527 *rc = -EOPNOTSUPP;
1528 return "operation not supported";
1529 case QETH_IPA_ARP_RC_OUT_OF_RANGE:
1530 *rc = -EINVAL;
1531 return "argument out of range";
1532 case QETH_IPA_ARP_RC_Q_NOTSUPP: 1526 case QETH_IPA_ARP_RC_Q_NOTSUPP:
1533 *rc = -EOPNOTSUPP; 1527 return -EOPNOTSUPP;
1534 return "query operation not supported"; 1528 case QETH_IPA_ARP_RC_OUT_OF_RANGE:
1529 return -EINVAL;
1535 case QETH_IPA_ARP_RC_Q_NO_DATA: 1530 case QETH_IPA_ARP_RC_Q_NO_DATA:
1536 *rc = -ENOENT; 1531 return -ENOENT;
1537 return "no query data available";
1538 default: 1532 default:
1539 return "unknown error"; 1533 return -EIO;
1540 } 1534 }
1541} 1535}
1542 1536
1543static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) 1537static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries)
1544{ 1538{
1545 int tmp;
1546 int rc; 1539 int rc;
1547 1540
1548 QETH_CARD_TEXT(card, 3, "arpstnoe"); 1541 QETH_CARD_TEXT(card, 3, "arpstnoe");
@@ -1560,13 +1553,10 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries)
1560 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, 1553 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
1561 IPA_CMD_ASS_ARP_SET_NO_ENTRIES, 1554 IPA_CMD_ASS_ARP_SET_NO_ENTRIES,
1562 no_entries); 1555 no_entries);
1563 if (rc) { 1556 if (rc)
1564 tmp = rc; 1557 QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on device %x: %#x\n",
1565 QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on " 1558 CARD_DEVID(card), rc);
1566 "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card), 1559 return qeth_l3_arp_makerc(rc);
1567 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1568 }
1569 return rc;
1570} 1560}
1571 1561
1572static __u32 get_arp_entry_size(struct qeth_card *card, 1562static __u32 get_arp_entry_size(struct qeth_card *card,
@@ -1716,7 +1706,6 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card,
1716{ 1706{
1717 struct qeth_cmd_buffer *iob; 1707 struct qeth_cmd_buffer *iob;
1718 struct qeth_ipa_cmd *cmd; 1708 struct qeth_ipa_cmd *cmd;
1719 int tmp;
1720 int rc; 1709 int rc;
1721 1710
1722 QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot); 1711 QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot);
@@ -1735,15 +1724,10 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card,
1735 rc = qeth_l3_send_ipa_arp_cmd(card, iob, 1724 rc = qeth_l3_send_ipa_arp_cmd(card, iob,
1736 QETH_SETASS_BASE_LEN+QETH_ARP_CMD_LEN, 1725 QETH_SETASS_BASE_LEN+QETH_ARP_CMD_LEN,
1737 qeth_l3_arp_query_cb, (void *)qinfo); 1726 qeth_l3_arp_query_cb, (void *)qinfo);
1738 if (rc) { 1727 if (rc)
1739 tmp = rc; 1728 QETH_DBF_MESSAGE(2, "Error while querying ARP cache on device %x: %#x\n",
1740 QETH_DBF_MESSAGE(2, 1729 CARD_DEVID(card), rc);
1741 "Error while querying ARP cache on %s: %s " 1730 return qeth_l3_arp_makerc(rc);
1742 "(0x%x/%d)\n", QETH_CARD_IFNAME(card),
1743 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1744 }
1745
1746 return rc;
1747} 1731}
1748 1732
1749static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) 1733static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata)
@@ -1793,15 +1777,18 @@ out:
1793 return rc; 1777 return rc;
1794} 1778}
1795 1779
1796static int qeth_l3_arp_add_entry(struct qeth_card *card, 1780static int qeth_l3_arp_modify_entry(struct qeth_card *card,
1797 struct qeth_arp_cache_entry *entry) 1781 struct qeth_arp_cache_entry *entry,
1782 enum qeth_arp_process_subcmds arp_cmd)
1798{ 1783{
1784 struct qeth_arp_cache_entry *cmd_entry;
1799 struct qeth_cmd_buffer *iob; 1785 struct qeth_cmd_buffer *iob;
1800 char buf[16];
1801 int tmp;
1802 int rc; 1786 int rc;
1803 1787
1804 QETH_CARD_TEXT(card, 3, "arpadent"); 1788 if (arp_cmd == IPA_CMD_ASS_ARP_ADD_ENTRY)
1789 QETH_CARD_TEXT(card, 3, "arpadd");
1790 else
1791 QETH_CARD_TEXT(card, 3, "arpdel");
1805 1792
1806 /* 1793 /*
1807 * currently GuestLAN only supports the ARP assist function 1794 * currently GuestLAN only supports the ARP assist function
@@ -1814,71 +1801,25 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card,
1814 return -EOPNOTSUPP; 1801 return -EOPNOTSUPP;
1815 } 1802 }
1816 1803
1817 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, 1804 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, arp_cmd,
1818 IPA_CMD_ASS_ARP_ADD_ENTRY, 1805 sizeof(*cmd_entry), QETH_PROT_IPV4);
1819 sizeof(struct qeth_arp_cache_entry),
1820 QETH_PROT_IPV4);
1821 if (!iob) 1806 if (!iob)
1822 return -ENOMEM; 1807 return -ENOMEM;
1823 rc = qeth_send_setassparms(card, iob,
1824 sizeof(struct qeth_arp_cache_entry),
1825 (unsigned long) entry,
1826 qeth_setassparms_cb, NULL);
1827 if (rc) {
1828 tmp = rc;
1829 qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
1830 QETH_DBF_MESSAGE(2, "Could not add ARP entry for address %s "
1831 "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card),
1832 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1833 }
1834 return rc;
1835}
1836
1837static int qeth_l3_arp_remove_entry(struct qeth_card *card,
1838 struct qeth_arp_cache_entry *entry)
1839{
1840 struct qeth_cmd_buffer *iob;
1841 char buf[16] = {0, };
1842 int tmp;
1843 int rc;
1844 1808
1845 QETH_CARD_TEXT(card, 3, "arprment"); 1809 cmd_entry = &__ipa_cmd(iob)->data.setassparms.data.arp_entry;
1810 ether_addr_copy(cmd_entry->macaddr, entry->macaddr);
1811 memcpy(cmd_entry->ipaddr, entry->ipaddr, 4);
1812 rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_cb, NULL);
1813 if (rc)
1814 QETH_DBF_MESSAGE(2, "Could not modify (cmd: %#x) ARP entry on device %x: %#x\n",
1815 arp_cmd, CARD_DEVID(card), rc);
1846 1816
1847 /* 1817 return qeth_l3_arp_makerc(rc);
1848 * currently GuestLAN only supports the ARP assist function
1849 * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_REMOVE_ENTRY;
1850 * thus we say EOPNOTSUPP for this ARP function
1851 */
1852 if (card->info.guestlan)
1853 return -EOPNOTSUPP;
1854 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
1855 return -EOPNOTSUPP;
1856 }
1857 memcpy(buf, entry, 12);
1858 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
1859 IPA_CMD_ASS_ARP_REMOVE_ENTRY,
1860 12,
1861 QETH_PROT_IPV4);
1862 if (!iob)
1863 return -ENOMEM;
1864 rc = qeth_send_setassparms(card, iob,
1865 12, (unsigned long)buf,
1866 qeth_setassparms_cb, NULL);
1867 if (rc) {
1868 tmp = rc;
1869 memset(buf, 0, 16);
1870 qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
1871 QETH_DBF_MESSAGE(2, "Could not delete ARP entry for address %s"
1872 " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card),
1873 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1874 }
1875 return rc;
1876} 1818}
1877 1819
1878static int qeth_l3_arp_flush_cache(struct qeth_card *card) 1820static int qeth_l3_arp_flush_cache(struct qeth_card *card)
1879{ 1821{
1880 int rc; 1822 int rc;
1881 int tmp;
1882 1823
1883 QETH_CARD_TEXT(card, 3, "arpflush"); 1824 QETH_CARD_TEXT(card, 3, "arpflush");
1884 1825
@@ -1894,19 +1835,17 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card)
1894 } 1835 }
1895 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, 1836 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
1896 IPA_CMD_ASS_ARP_FLUSH_CACHE, 0); 1837 IPA_CMD_ASS_ARP_FLUSH_CACHE, 0);
1897 if (rc) { 1838 if (rc)
1898 tmp = rc; 1839 QETH_DBF_MESSAGE(2, "Could not flush ARP cache on device %x: %#x\n",
1899 QETH_DBF_MESSAGE(2, "Could not flush ARP cache on %s: %s " 1840 CARD_DEVID(card), rc);
1900 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), 1841 return qeth_l3_arp_makerc(rc);
1901 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1902 }
1903 return rc;
1904} 1842}
1905 1843
1906static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 1844static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1907{ 1845{
1908 struct qeth_card *card = dev->ml_priv; 1846 struct qeth_card *card = dev->ml_priv;
1909 struct qeth_arp_cache_entry arp_entry; 1847 struct qeth_arp_cache_entry arp_entry;
1848 enum qeth_arp_process_subcmds arp_cmd;
1910 int rc = 0; 1849 int rc = 0;
1911 1850
1912 switch (cmd) { 1851 switch (cmd) {
@@ -1925,27 +1864,16 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1925 rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); 1864 rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data);
1926 break; 1865 break;
1927 case SIOC_QETH_ARP_ADD_ENTRY: 1866 case SIOC_QETH_ARP_ADD_ENTRY:
1928 if (!capable(CAP_NET_ADMIN)) {
1929 rc = -EPERM;
1930 break;
1931 }
1932 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data,
1933 sizeof(struct qeth_arp_cache_entry)))
1934 rc = -EFAULT;
1935 else
1936 rc = qeth_l3_arp_add_entry(card, &arp_entry);
1937 break;
1938 case SIOC_QETH_ARP_REMOVE_ENTRY: 1867 case SIOC_QETH_ARP_REMOVE_ENTRY:
1939 if (!capable(CAP_NET_ADMIN)) { 1868 if (!capable(CAP_NET_ADMIN))
1940 rc = -EPERM; 1869 return -EPERM;
1941 break; 1870 if (copy_from_user(&arp_entry, rq->ifr_data, sizeof(arp_entry)))
1942 } 1871 return -EFAULT;
1943 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data, 1872
1944 sizeof(struct qeth_arp_cache_entry))) 1873 arp_cmd = (cmd == SIOC_QETH_ARP_ADD_ENTRY) ?
1945 rc = -EFAULT; 1874 IPA_CMD_ASS_ARP_ADD_ENTRY :
1946 else 1875 IPA_CMD_ASS_ARP_REMOVE_ENTRY;
1947 rc = qeth_l3_arp_remove_entry(card, &arp_entry); 1876 return qeth_l3_arp_modify_entry(card, &arp_entry, arp_cmd);
1948 break;
1949 case SIOC_QETH_ARP_FLUSH_CACHE: 1877 case SIOC_QETH_ARP_FLUSH_CACHE:
1950 if (!capable(CAP_NET_ADMIN)) { 1878 if (!capable(CAP_NET_ADMIN)) {
1951 rc = -EPERM; 1879 rc = -EPERM;
@@ -2383,12 +2311,12 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = {
2383 .ndo_neigh_setup = qeth_l3_neigh_setup, 2311 .ndo_neigh_setup = qeth_l3_neigh_setup,
2384}; 2312};
2385 2313
2386static int qeth_l3_setup_netdev(struct qeth_card *card) 2314static int qeth_l3_setup_netdev(struct qeth_card *card, bool carrier_ok)
2387{ 2315{
2388 unsigned int headroom; 2316 unsigned int headroom;
2389 int rc; 2317 int rc;
2390 2318
2391 if (card->dev->netdev_ops) 2319 if (qeth_netdev_is_registered(card->dev))
2392 return 0; 2320 return 0;
2393 2321
2394 if (card->info.type == QETH_CARD_TYPE_OSD || 2322 if (card->info.type == QETH_CARD_TYPE_OSD ||
@@ -2457,6 +2385,9 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
2457 2385
2458 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); 2386 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT);
2459 rc = register_netdev(card->dev); 2387 rc = register_netdev(card->dev);
2388 if (!rc && carrier_ok)
2389 netif_carrier_on(card->dev);
2390
2460out: 2391out:
2461 if (rc) 2392 if (rc)
2462 card->dev->netdev_ops = NULL; 2393 card->dev->netdev_ops = NULL;
@@ -2497,7 +2428,8 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)
2497 if (cgdev->state == CCWGROUP_ONLINE) 2428 if (cgdev->state == CCWGROUP_ONLINE)
2498 qeth_l3_set_offline(cgdev); 2429 qeth_l3_set_offline(cgdev);
2499 2430
2500 unregister_netdev(card->dev); 2431 if (qeth_netdev_is_registered(card->dev))
2432 unregister_netdev(card->dev);
2501 qeth_l3_clear_ip_htable(card, 0); 2433 qeth_l3_clear_ip_htable(card, 0);
2502 qeth_l3_clear_ipato_list(card); 2434 qeth_l3_clear_ipato_list(card);
2503} 2435}
@@ -2507,6 +2439,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
2507 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 2439 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
2508 int rc = 0; 2440 int rc = 0;
2509 enum qeth_card_states recover_flag; 2441 enum qeth_card_states recover_flag;
2442 bool carrier_ok;
2510 2443
2511 mutex_lock(&card->discipline_mutex); 2444 mutex_lock(&card->discipline_mutex);
2512 mutex_lock(&card->conf_mutex); 2445 mutex_lock(&card->conf_mutex);
@@ -2514,14 +2447,14 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
2514 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); 2447 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
2515 2448
2516 recover_flag = card->state; 2449 recover_flag = card->state;
2517 rc = qeth_core_hardsetup_card(card); 2450 rc = qeth_core_hardsetup_card(card, &carrier_ok);
2518 if (rc) { 2451 if (rc) {
2519 QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); 2452 QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
2520 rc = -ENODEV; 2453 rc = -ENODEV;
2521 goto out_remove; 2454 goto out_remove;
2522 } 2455 }
2523 2456
2524 rc = qeth_l3_setup_netdev(card); 2457 rc = qeth_l3_setup_netdev(card, carrier_ok);
2525 if (rc) 2458 if (rc)
2526 goto out_remove; 2459 goto out_remove;
2527 2460