Lines Matching +full:mcast +full:- +full:groups

1 // SPDX-License-Identifier: GPL-2.0
62 if (query->is_multicast) { in qeth_l3_find_addr_by_ip()
63 hash_for_each_possible(card->rx_mode_addrs, addr, hnode, key) in qeth_l3_find_addr_by_ip()
67 hash_for_each_possible(card->ip_htable, addr, hnode, key) in qeth_l3_find_addr_by_ip()
81 for (j = 7; j >= 0; --j) { in qeth_l3_convert_addr_to_bits()
96 if (!card->ipato.enabled) in qeth_l3_is_addr_covered_by_ipato()
98 if (addr->type != QETH_IP_TYPE_NORMAL) in qeth_l3_is_addr_covered_by_ipato()
101 qeth_l3_convert_addr_to_bits((u8 *) &addr->u, addr_bits, in qeth_l3_is_addr_covered_by_ipato()
102 (addr->proto == QETH_PROT_IPV4) ? 4 : 16); in qeth_l3_is_addr_covered_by_ipato()
103 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { in qeth_l3_is_addr_covered_by_ipato()
104 if (addr->proto != ipatoe->proto) in qeth_l3_is_addr_covered_by_ipato()
106 qeth_l3_convert_addr_to_bits(ipatoe->addr, ipatoe_bits, in qeth_l3_is_addr_covered_by_ipato()
107 (ipatoe->proto == QETH_PROT_IPV4) ? in qeth_l3_is_addr_covered_by_ipato()
109 rc = !memcmp(addr_bits, ipatoe_bits, ipatoe->mask_bits); in qeth_l3_is_addr_covered_by_ipato()
114 if ((addr->proto == QETH_PROT_IPV4) && card->ipato.invert4) in qeth_l3_is_addr_covered_by_ipato()
116 else if ((addr->proto == QETH_PROT_IPV6) && card->ipato.invert6) in qeth_l3_is_addr_covered_by_ipato()
128 if (tmp_addr->type == QETH_IP_TYPE_RXIP) in qeth_l3_delete_ip()
130 else if (tmp_addr->type == QETH_IP_TYPE_VIPA) in qeth_l3_delete_ip()
135 if (tmp_addr->proto == QETH_PROT_IPV4) in qeth_l3_delete_ip()
136 QETH_CARD_HEX(card, 4, &tmp_addr->u.a4.addr, 4); in qeth_l3_delete_ip()
138 QETH_CARD_HEX(card, 4, &tmp_addr->u.a6.addr, 8); in qeth_l3_delete_ip()
139 QETH_CARD_HEX(card, 4, ((char *)&tmp_addr->u.a6.addr) + 8, 8); in qeth_l3_delete_ip()
144 return -ENOENT; in qeth_l3_delete_ip()
146 addr->ref_counter--; in qeth_l3_delete_ip()
147 if (addr->type == QETH_IP_TYPE_NORMAL && addr->ref_counter > 0) in qeth_l3_delete_ip()
153 hash_del(&addr->hnode); in qeth_l3_delete_ip()
165 if (tmp_addr->type == QETH_IP_TYPE_RXIP) in qeth_l3_add_ip()
167 else if (tmp_addr->type == QETH_IP_TYPE_VIPA) in qeth_l3_add_ip()
172 if (tmp_addr->proto == QETH_PROT_IPV4) in qeth_l3_add_ip()
173 QETH_CARD_HEX(card, 4, &tmp_addr->u.a4.addr, 4); in qeth_l3_add_ip()
175 QETH_CARD_HEX(card, 4, &tmp_addr->u.a6.addr, 8); in qeth_l3_add_ip()
176 QETH_CARD_HEX(card, 4, ((char *)&tmp_addr->u.a6.addr) + 8, 8); in qeth_l3_add_ip()
181 if (tmp_addr->type != QETH_IP_TYPE_NORMAL) in qeth_l3_add_ip()
182 return -EADDRINUSE; in qeth_l3_add_ip()
184 addr->ref_counter++; in qeth_l3_add_ip()
187 qeth_l3_ipaddr_to_string(tmp_addr->proto, (u8 *)&tmp_addr->u, in qeth_l3_add_ip()
189 dev_warn(&card->gdev->dev, in qeth_l3_add_ip()
191 return -EADDRINUSE; in qeth_l3_add_ip()
195 return -ENOMEM; in qeth_l3_add_ip()
199 addr->ipato = 1; in qeth_l3_add_ip()
201 hash_add(card->ip_htable, &addr->hnode, in qeth_l3_add_ip()
205 addr->disp_flag = QETH_DISP_ADDR_ADD; in qeth_l3_add_ip()
211 if (!rc || rc == -EADDRINUSE || rc == -ENETDOWN) { in qeth_l3_add_ip()
212 addr->disp_flag = QETH_DISP_ADDR_DO_NOTHING; in qeth_l3_add_ip()
214 hash_del(&addr->hnode); in qeth_l3_add_ip()
226 mutex_lock(&card->ip_lock); in qeth_l3_modify_ip()
228 mutex_unlock(&card->ip_lock); in qeth_l3_modify_ip()
239 hash_for_each_safe(card->rx_mode_addrs, i, tmp, addr, hnode) { in qeth_l3_drain_rx_mode_cache()
240 hash_del(&addr->hnode); in qeth_l3_drain_rx_mode_cache()
253 mutex_lock(&card->ip_lock); in qeth_l3_clear_ip_htable()
255 hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) { in qeth_l3_clear_ip_htable()
257 hash_del(&addr->hnode); in qeth_l3_clear_ip_htable()
261 addr->disp_flag = QETH_DISP_ADDR_ADD; in qeth_l3_clear_ip_htable()
265 mutex_unlock(&card->ip_lock); in qeth_l3_clear_ip_htable()
277 mutex_lock(&card->ip_lock); in qeth_l3_recover_ip()
279 hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) { in qeth_l3_recover_ip()
280 if (addr->disp_flag == QETH_DISP_ADDR_ADD) { in qeth_l3_recover_ip()
283 if (!rc || rc == -EADDRINUSE || rc == -ENETDOWN) { in qeth_l3_recover_ip()
285 addr->disp_flag = QETH_DISP_ADDR_DO_NOTHING; in qeth_l3_recover_ip()
288 hash_del(&addr->hnode); in qeth_l3_recover_ip()
294 mutex_unlock(&card->ip_lock); in qeth_l3_recover_ip()
302 switch (cmd->hdr.return_code) { in qeth_l3_setdelip_cb()
306 return -EADDRINUSE; in qeth_l3_setdelip_cb()
308 return -ENOENT; in qeth_l3_setdelip_cb()
310 return -ENETDOWN; in qeth_l3_setdelip_cb()
312 return -EIO; in qeth_l3_setdelip_cb()
325 iob = qeth_ipa_alloc_cmd(card, ipacmd, addr->proto, in qeth_l3_send_setdelmc()
328 return -ENOMEM; in qeth_l3_send_setdelmc()
330 if (addr->proto == QETH_PROT_IPV6) { in qeth_l3_send_setdelmc()
331 cmd->data.setdelipm.ip = addr->u.a6.addr; in qeth_l3_send_setdelmc()
332 ipv6_eth_mc_map(&addr->u.a6.addr, cmd->data.setdelipm.mac); in qeth_l3_send_setdelmc()
334 cmd->data.setdelipm.ip.s6_addr32[3] = addr->u.a4.addr; in qeth_l3_send_setdelmc()
335 ip_eth_mc_map(addr->u.a4.addr, cmd->data.setdelipm.mac); in qeth_l3_send_setdelmc()
348 prefix->s6_addr32[i] = inet_make_mask(mask_len); in qeth_l3_set_ipv6_prefix()
349 len -= mask_len; in qeth_l3_set_ipv6_prefix()
356 switch (addr->type) { in qeth_l3_get_setdelip_flags()
363 return (set && addr->ipato) ? QETH_IPA_SETIP_TAKEOVER_FLAG : 0; in qeth_l3_get_setdelip_flags()
377 iob = qeth_ipa_alloc_cmd(card, ipacmd, addr->proto, in qeth_l3_send_setdelip()
380 return -ENOMEM; in qeth_l3_send_setdelip()
386 if (addr->proto == QETH_PROT_IPV6) { in qeth_l3_send_setdelip()
387 cmd->data.setdelip6.addr = addr->u.a6.addr; in qeth_l3_send_setdelip()
388 qeth_l3_set_ipv6_prefix(&cmd->data.setdelip6.prefix, in qeth_l3_send_setdelip()
389 addr->u.a6.pfxlen); in qeth_l3_send_setdelip()
390 cmd->data.setdelip6.flags = flags; in qeth_l3_send_setdelip()
392 cmd->data.setdelip4.addr = addr->u.a4.addr; in qeth_l3_send_setdelip()
393 cmd->data.setdelip4.mask = addr->u.a4.mask; in qeth_l3_send_setdelip()
394 cmd->data.setdelip4.flags = flags; in qeth_l3_send_setdelip()
411 return -ENOMEM; in qeth_l3_send_setrouting()
413 cmd->data.setrtg.type = (type); in qeth_l3_send_setrouting()
449 return -EINVAL; in qeth_l3_correct_routing_type()
458 rc = qeth_l3_correct_routing_type(card, &card->options.route4.type, in qeth_l3_setrouting_v4()
463 rc = qeth_l3_send_setrouting(card, card->options.route4.type, in qeth_l3_setrouting_v4()
466 card->options.route4.type = NO_ROUTER; in qeth_l3_setrouting_v4()
481 rc = qeth_l3_correct_routing_type(card, &card->options.route6.type, in qeth_l3_setrouting_v6()
486 rc = qeth_l3_send_setrouting(card, card->options.route6.type, in qeth_l3_setrouting_v6()
489 card->options.route6.type = NO_ROUTER; in qeth_l3_setrouting_v6()
501 * qeth_l3_update_ipato() - Update 'takeover' property, for all NORMAL IPs.
510 hash_for_each(card->ip_htable, i, addr, hnode) { in qeth_l3_update_ipato()
511 if (addr->type != QETH_IP_TYPE_NORMAL) in qeth_l3_update_ipato()
513 addr->ipato = qeth_l3_is_addr_covered_by_ipato(card, addr); in qeth_l3_update_ipato()
521 mutex_lock(&card->ip_lock); in qeth_l3_clear_ipato_list()
523 list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) { in qeth_l3_clear_ipato_list()
524 list_del(&ipatoe->entry); in qeth_l3_clear_ipato_list()
529 mutex_unlock(&card->ip_lock); in qeth_l3_clear_ipato_list()
540 mutex_lock(&card->ip_lock); in qeth_l3_add_ipato_entry()
542 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { in qeth_l3_add_ipato_entry()
543 if (ipatoe->proto != new->proto) in qeth_l3_add_ipato_entry()
545 if (!memcmp(ipatoe->addr, new->addr, in qeth_l3_add_ipato_entry()
546 (ipatoe->proto == QETH_PROT_IPV4) ? 4 : 16) && in qeth_l3_add_ipato_entry()
547 (ipatoe->mask_bits == new->mask_bits)) { in qeth_l3_add_ipato_entry()
548 rc = -EEXIST; in qeth_l3_add_ipato_entry()
554 list_add_tail(&new->entry, &card->ipato.entries); in qeth_l3_add_ipato_entry()
558 mutex_unlock(&card->ip_lock); in qeth_l3_add_ipato_entry()
568 int rc = -ENOENT; in qeth_l3_del_ipato_entry()
572 mutex_lock(&card->ip_lock); in qeth_l3_del_ipato_entry()
574 list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) { in qeth_l3_del_ipato_entry()
575 if (ipatoe->proto != proto) in qeth_l3_del_ipato_entry()
577 if (!memcmp(ipatoe->addr, addr, in qeth_l3_del_ipato_entry()
579 (ipatoe->mask_bits == mask_bits)) { in qeth_l3_del_ipato_entry()
580 list_del(&ipatoe->entry); in qeth_l3_del_ipato_entry()
587 mutex_unlock(&card->ip_lock); in qeth_l3_del_ipato_entry()
616 addr.u.a6.addr.s6_addr[8+i] = card->options.hsuid[i]; in qeth_l3_modify_hsuid()
628 if (card->options.sniffer) in qeth_l3_register_addr_entry()
631 if (addr->proto == QETH_PROT_IPV4) { in qeth_l3_register_addr_entry()
633 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); in qeth_l3_register_addr_entry()
634 } else if (addr->proto == QETH_PROT_IPV6) { in qeth_l3_register_addr_entry()
636 QETH_CARD_HEX(card, 3, &addr->u.a6.addr, 8); in qeth_l3_register_addr_entry()
637 QETH_CARD_HEX(card, 3, ((char *)&addr->u.a6.addr) + 8, 8); in qeth_l3_register_addr_entry()
643 if (addr->is_multicast) in qeth_l3_register_addr_entry()
649 } while ((--cnt > 0) && rc); in qeth_l3_register_addr_entry()
652 qeth_l3_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf); in qeth_l3_register_addr_entry()
653 dev_warn(&card->gdev->dev, in qeth_l3_register_addr_entry()
664 if (card->options.sniffer) in qeth_l3_deregister_addr_entry()
667 if (addr->proto == QETH_PROT_IPV4) { in qeth_l3_deregister_addr_entry()
669 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); in qeth_l3_deregister_addr_entry()
670 } else if (addr->proto == QETH_PROT_IPV6) { in qeth_l3_deregister_addr_entry()
672 QETH_CARD_HEX(card, 3, &addr->u.a6.addr, 8); in qeth_l3_deregister_addr_entry()
673 QETH_CARD_HEX(card, 3, ((char *)&addr->u.a6.addr) + 8, 8); in qeth_l3_deregister_addr_entry()
678 if (addr->is_multicast) in qeth_l3_deregister_addr_entry()
697 dev_warn(&card->gdev->dev, "Reading the adapter MAC" in qeth_l3_setadapter_parms()
711 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_arp_processing()
713 netdev_name(card->dev)); in qeth_l3_start_ipa_arp_processing()
719 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_arp_processing()
721 netdev_name(card->dev)); in qeth_l3_start_ipa_arp_processing()
733 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_source_mac()
734 "Inbound source MAC-address not supported on %s\n", in qeth_l3_start_ipa_source_mac()
735 netdev_name(card->dev)); in qeth_l3_start_ipa_source_mac()
736 return -EOPNOTSUPP; in qeth_l3_start_ipa_source_mac()
742 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_source_mac()
743 "Starting source MAC-address support for %s failed\n", in qeth_l3_start_ipa_source_mac()
744 netdev_name(card->dev)); in qeth_l3_start_ipa_source_mac()
755 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_vlan()
756 "VLAN not supported on %s\n", netdev_name(card->dev)); in qeth_l3_start_ipa_vlan()
757 return -EOPNOTSUPP; in qeth_l3_start_ipa_vlan()
763 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_vlan()
765 netdev_name(card->dev)); in qeth_l3_start_ipa_vlan()
767 dev_info(&card->gdev->dev, "VLAN enabled\n"); in qeth_l3_start_ipa_vlan()
779 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_multicast()
781 netdev_name(card->dev)); in qeth_l3_start_ipa_multicast()
782 return -EOPNOTSUPP; in qeth_l3_start_ipa_multicast()
788 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_multicast()
790 netdev_name(card->dev)); in qeth_l3_start_ipa_multicast()
792 dev_info(&card->gdev->dev, "Multicast enabled\n"); in qeth_l3_start_ipa_multicast()
793 card->dev->flags |= IFF_MULTICAST; in qeth_l3_start_ipa_multicast()
811 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
813 netdev_name(card->dev)); in qeth_l3_softsetup_ipv6()
819 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
821 netdev_name(card->dev)); in qeth_l3_softsetup_ipv6()
827 dev_warn(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
829 netdev_name(card->dev)); in qeth_l3_softsetup_ipv6()
833 dev_info(&card->gdev->dev, "IPV6 enabled\n"); in qeth_l3_softsetup_ipv6()
842 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_ipv6()
843 "IPv6 not supported on %s\n", netdev_name(card->dev)); in qeth_l3_start_ipa_ipv6()
855 card->info.broadcast_capable = 0; in qeth_l3_start_ipa_broadcast()
857 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
859 netdev_name(card->dev)); in qeth_l3_start_ipa_broadcast()
860 rc = -EOPNOTSUPP; in qeth_l3_start_ipa_broadcast()
866 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
868 netdev_name(card->dev)); in qeth_l3_start_ipa_broadcast()
875 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
877 netdev_name(card->dev)); in qeth_l3_start_ipa_broadcast()
880 card->info.broadcast_capable = QETH_BROADCAST_WITH_ECHO; in qeth_l3_start_ipa_broadcast()
881 dev_info(&card->gdev->dev, "Broadcast enabled\n"); in qeth_l3_start_ipa_broadcast()
885 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
887 netdev_name(card->dev)); in qeth_l3_start_ipa_broadcast()
890 card->info.broadcast_capable = QETH_BROADCAST_WITHOUT_ECHO; in qeth_l3_start_ipa_broadcast()
892 if (card->info.broadcast_capable) in qeth_l3_start_ipa_broadcast()
893 card->dev->flags |= IFF_BROADCAST; in qeth_l3_start_ipa_broadcast()
895 card->dev->flags &= ~IFF_BROADCAST; in qeth_l3_start_ipa_broadcast()
916 if (cmd->hdr.return_code) in qeth_l3_iqd_read_initial_mac_cb()
917 return -EIO; in qeth_l3_iqd_read_initial_mac_cb()
918 if (!is_valid_ether_addr(cmd->data.create_destroy_addr.mac_addr)) in qeth_l3_iqd_read_initial_mac_cb()
919 return -EADDRNOTAVAIL; in qeth_l3_iqd_read_initial_mac_cb()
921 eth_hw_addr_set(card->dev, cmd->data.create_destroy_addr.mac_addr); in qeth_l3_iqd_read_initial_mac_cb()
935 return -ENOMEM; in qeth_l3_iqd_read_initial_mac()
946 u16 *uid = reply->param; in qeth_l3_get_unique_id_cb()
948 if (cmd->hdr.return_code == 0) { in qeth_l3_get_unique_id_cb()
949 *uid = cmd->data.create_destroy_addr.uid; in qeth_l3_get_unique_id_cb()
953 dev_warn(&card->gdev->dev, "The network adapter failed to generate a unique ID\n"); in qeth_l3_get_unique_id_cb()
954 return -EIO; in qeth_l3_get_unique_id_cb()
971 __ipa_cmd(iob)->data.create_destroy_addr.uid = uid; in qeth_l3_get_unique_id()
988 rc = cmd->hdr.return_code; in qeth_diags_trace_cb()
991 switch (cmd->data.diagass.action) { in qeth_diags_trace_cb()
998 card->info.promisc_mode = SET_PROMISC_MODE_OFF; in qeth_diags_trace_cb()
999 dev_info(&card->gdev->dev, "The HiperSockets network " in qeth_diags_trace_cb()
1009 card->info.promisc_mode = SET_PROMISC_MODE_ON; in qeth_diags_trace_cb()
1010 dev_info(&card->gdev->dev, "The HiperSockets network " in qeth_diags_trace_cb()
1014 dev_warn(&card->gdev->dev, "The device is not " in qeth_diags_trace_cb()
1019 dev_warn(&card->gdev->dev, "A HiperSockets " in qeth_diags_trace_cb()
1029 cmd->data.diagass.action, CARD_DEVID(card)); in qeth_diags_trace_cb()
1032 return rc ? -EIO : 0; in qeth_diags_trace_cb()
1045 return -ENOMEM; in qeth_diags_trace()
1047 cmd->data.diagass.type = QETH_DIAGS_TYPE_HIPERSOCKET; in qeth_diags_trace()
1048 cmd->data.diagass.action = diags_cmd; in qeth_diags_trace()
1064 if (!dev || !(dev->flags & IFF_UP)) in qeth_l3_add_mcast_rtnl()
1075 for (im4 = rtnl_dereference(in4_dev->mc_list); im4 != NULL; in qeth_l3_add_mcast_rtnl()
1076 im4 = rtnl_dereference(im4->next_rcu)) { in qeth_l3_add_mcast_rtnl()
1077 tmp.u.a4.addr = im4->multiaddr; in qeth_l3_add_mcast_rtnl()
1081 /* for mcast, by-IP match means full match */ in qeth_l3_add_mcast_rtnl()
1082 ipm->disp_flag = QETH_DISP_ADDR_DO_NOTHING; in qeth_l3_add_mcast_rtnl()
1090 hash_add(card->rx_mode_addrs, &ipm->hnode, in qeth_l3_add_mcast_rtnl()
1106 for (im6 = rtnl_dereference(in6_dev->mc_list); in qeth_l3_add_mcast_rtnl()
1108 im6 = rtnl_dereference(im6->next)) { in qeth_l3_add_mcast_rtnl()
1109 tmp.u.a6.addr = im6->mca_addr; in qeth_l3_add_mcast_rtnl()
1113 /* for mcast, by-IP match means full match */ in qeth_l3_add_mcast_rtnl()
1114 ipm->disp_flag = QETH_DISP_ADDR_DO_NOTHING; in qeth_l3_add_mcast_rtnl()
1122 hash_add(card->rx_mode_addrs, &ipm->hnode, in qeth_l3_add_mcast_rtnl()
1133 bool enable = card->dev->flags & IFF_PROMISC; in qeth_l3_set_promisc_mode()
1135 if (card->info.promisc_mode == enable) in qeth_l3_set_promisc_mode()
1141 } else if (card->options.sniffer && /* HiperSockets trace */ in qeth_l3_set_promisc_mode()
1147 QETH_CARD_TEXT(card, 3, "-promisc"); in qeth_l3_set_promisc_mode()
1163 if (!card->options.sniffer) { in qeth_l3_rx_mode_work()
1165 qeth_l3_add_mcast_rtnl(card->dev, 0, card); in qeth_l3_rx_mode_work()
1167 vlan_for_each(card->dev, qeth_l3_add_mcast_rtnl, card); in qeth_l3_rx_mode_work()
1170 hash_for_each_safe(card->rx_mode_addrs, i, tmp, addr, hnode) { in qeth_l3_rx_mode_work()
1171 switch (addr->disp_flag) { in qeth_l3_rx_mode_work()
1174 if (!rc || rc == -ENOENT) { in qeth_l3_rx_mode_work()
1175 hash_del(&addr->hnode); in qeth_l3_rx_mode_work()
1181 if (rc && rc != -ENETDOWN) { in qeth_l3_rx_mode_work()
1182 hash_del(&addr->hnode); in qeth_l3_rx_mode_work()
1189 addr->disp_flag = QETH_DISP_ADDR_DELETE; in qeth_l3_rx_mode_work()
1204 return -EOPNOTSUPP; in qeth_l3_arp_makerc()
1206 return -EINVAL; in qeth_l3_arp_makerc()
1208 return -ENOENT; in qeth_l3_arp_makerc()
1210 return -EIO; in qeth_l3_arp_makerc()
1220 return qeth_l3_arp_makerc(cmd->hdr.return_code); in qeth_l3_arp_cmd_cb()
1236 return -EOPNOTSUPP; in qeth_l3_arp_set_no_entries()
1238 return -EOPNOTSUPP; in qeth_l3_arp_set_no_entries()
1246 return -ENOMEM; in qeth_l3_arp_set_no_entries()
1248 __ipa_cmd(iob)->data.setassparms.data.flags_32bit = (u32) no_entries; in qeth_l3_arp_set_no_entries()
1263 is_hsi = qdata->reply_bits == 5; in get_arp_entry_size()
1264 if (type->ip == QETHARP_IP_ADDR_V4) { in get_arp_entry_size()
1273 } else if (type->ip == QETHARP_IP_ADDR_V6) { in get_arp_entry_size()
1294 return (type->ip == QETHARP_IP_ADDR_V4 && prot == QETH_PROT_IPV4) || in arpentry_matches_prot()
1295 (type->ip == QETHARP_IP_ADDR_V6 && prot == QETH_PROT_IPV6); in arpentry_matches_prot()
1311 qinfo = (struct qeth_arp_query_info *) reply->param; in qeth_l3_arp_query_cb()
1313 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.prot_version); in qeth_l3_arp_query_cb()
1314 if (cmd->hdr.return_code) { in qeth_l3_arp_query_cb()
1316 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.return_code); in qeth_l3_arp_query_cb()
1317 return qeth_l3_arp_makerc(cmd->hdr.return_code); in qeth_l3_arp_query_cb()
1319 if (cmd->data.setassparms.hdr.return_code) { in qeth_l3_arp_query_cb()
1320 cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code; in qeth_l3_arp_query_cb()
1322 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.return_code); in qeth_l3_arp_query_cb()
1323 return qeth_l3_arp_makerc(cmd->hdr.return_code); in qeth_l3_arp_query_cb()
1325 qdata = &cmd->data.setassparms.data.query_arp; in qeth_l3_arp_query_cb()
1326 QETH_CARD_TEXT_(card, 4, "anoen%i", qdata->no_entries); in qeth_l3_arp_query_cb()
1328 do_strip_entries = (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES) > 0; in qeth_l3_arp_query_cb()
1331 for (e = 0; e < qdata->no_entries; ++e) { in qeth_l3_arp_query_cb()
1336 cur_entry = &qdata->data + entrybytes_done; in qeth_l3_arp_query_cb()
1337 etype = &((struct qeth_arp_qi_entry5 *) cur_entry)->type; in qeth_l3_arp_query_cb()
1338 if (!arpentry_matches_prot(etype, cmd->hdr.prot_version)) { in qeth_l3_arp_query_cb()
1340 QETH_CARD_TEXT_(card, 4, "%i", etype->ip); in qeth_l3_arp_query_cb()
1349 if ((qinfo->udata_len - qinfo->udata_offset) < esize) { in qeth_l3_arp_query_cb()
1350 QETH_CARD_TEXT_(card, 4, "qaer3%i", -ENOSPC); in qeth_l3_arp_query_cb()
1351 memset(qinfo->udata, 0, 4); in qeth_l3_arp_query_cb()
1352 return -ENOSPC; in qeth_l3_arp_query_cb()
1355 memcpy(qinfo->udata + qinfo->udata_offset, in qeth_l3_arp_query_cb()
1356 &qdata->data + entrybytes_done + stripped_bytes, in qeth_l3_arp_query_cb()
1359 qinfo->udata_offset += esize; in qeth_l3_arp_query_cb()
1360 ++qinfo->no_entries; in qeth_l3_arp_query_cb()
1363 if (cmd->data.setassparms.hdr.seq_no < in qeth_l3_arp_query_cb()
1364 cmd->data.setassparms.hdr.number_of_replies) in qeth_l3_arp_query_cb()
1366 QETH_CARD_TEXT_(card, 4, "nove%i", qinfo->no_entries); in qeth_l3_arp_query_cb()
1367 memcpy(qinfo->udata, &qinfo->no_entries, 4); in qeth_l3_arp_query_cb()
1370 if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES) in qeth_l3_arp_query_cb()
1371 qdata->reply_bits |= QETH_QARP_STRIP_ENTRIES; in qeth_l3_arp_query_cb()
1372 memcpy(qinfo->udata + QETH_QARP_MASK_OFFSET, &qdata->reply_bits, 2); in qeth_l3_arp_query_cb()
1391 return -ENOMEM; in qeth_l3_query_arp_cache_info()
1393 cmd->data.setassparms.data.query_arp.request_bits = 0x000F; in qeth_l3_query_arp_cache_info()
1411 rc = -EOPNOTSUPP; in qeth_l3_arp_query()
1414 /* get size of userspace buffer and mask_bits -> 6 bytes */ in qeth_l3_arp_query()
1416 rc = -EFAULT; in qeth_l3_arp_query()
1421 rc = -ENOMEM; in qeth_l3_arp_query()
1428 rc = -EFAULT; in qeth_l3_arp_query()
1437 rc = -EFAULT; in qeth_l3_arp_query()
1467 return -EOPNOTSUPP; in qeth_l3_arp_modify_entry()
1469 return -EOPNOTSUPP; in qeth_l3_arp_modify_entry()
1476 return -ENOMEM; in qeth_l3_arp_modify_entry()
1478 cmd_entry = &__ipa_cmd(iob)->data.setassparms.data.arp_entry; in qeth_l3_arp_modify_entry()
1479 ether_addr_copy(cmd_entry->macaddr, entry->macaddr); in qeth_l3_arp_modify_entry()
1480 memcpy(cmd_entry->ipaddr, entry->ipaddr, 4); in qeth_l3_arp_modify_entry()
1501 return -EOPNOTSUPP; in qeth_l3_arp_flush_cache()
1503 return -EOPNOTSUPP; in qeth_l3_arp_flush_cache()
1510 return -ENOMEM; in qeth_l3_arp_flush_cache()
1522 struct qeth_card *card = dev->ml_priv; in qeth_l3_ndo_siocdevprivate()
1530 rc = -EPERM; in qeth_l3_ndo_siocdevprivate()
1533 rc = qeth_l3_arp_set_no_entries(card, rq->ifr_ifru.ifru_ivalue); in qeth_l3_ndo_siocdevprivate()
1537 rc = -EPERM; in qeth_l3_ndo_siocdevprivate()
1545 return -EPERM; in qeth_l3_ndo_siocdevprivate()
1547 return -EFAULT; in qeth_l3_ndo_siocdevprivate()
1555 rc = -EPERM; in qeth_l3_ndo_siocdevprivate()
1575 int cast_type = n->type; in qeth_l3_get_cast_type_rcu()
1588 if (ipv4_is_lbcast(ip_hdr(skb)->daddr)) in qeth_l3_get_cast_type_rcu()
1590 return ipv4_is_multicast(ip_hdr(skb)->daddr) ? in qeth_l3_get_cast_type_rcu()
1593 return ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) ? in qeth_l3_get_cast_type_rcu()
1631 struct qeth_hdr_layer3 *l3_hdr = &hdr->hdr.l3; in qeth_l3_fill_header()
1633 struct qeth_card *card = queue->card; in qeth_l3_fill_header()
1637 hdr->hdr.l3.length = data_len; in qeth_l3_fill_header()
1640 hdr->hdr.l3.id = QETH_HEADER_TYPE_L3_TSO; in qeth_l3_fill_header()
1642 hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3; in qeth_l3_fill_header()
1644 if (skb->ip_summed == CHECKSUM_PARTIAL) { in qeth_l3_fill_header()
1645 qeth_tx_csum(skb, &hdr->hdr.l3.ext_flags, proto); in qeth_l3_fill_header()
1648 hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_HDR_REQ; in qeth_l3_fill_header()
1655 hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_VLAN_FRAME; in qeth_l3_fill_header()
1656 hdr->hdr.l3.vlan_id = skb_vlan_tag_get(skb); in qeth_l3_fill_header()
1658 } else if (veth->h_vlan_proto == htons(ETH_P_8021Q)) { in qeth_l3_fill_header()
1659 hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_INCLUDE_VLAN_TAG; in qeth_l3_fill_header()
1660 hdr->hdr.l3.vlan_id = ntohs(veth->h_vlan_TCI); in qeth_l3_fill_header()
1670 l3_hdr->flags |= qeth_l3_cast_type_to_flag(cast_type); in qeth_l3_fill_header()
1674 l3_hdr->next_hop.addr.s6_addr32[3] = in qeth_l3_fill_header()
1678 l3_hdr->next_hop.addr = *qeth_next_hop_v6_rcu(skb, dst); in qeth_l3_fill_header()
1680 hdr->hdr.l3.flags |= QETH_HDR_IPV6; in qeth_l3_fill_header()
1682 hdr->hdr.l3.flags |= QETH_HDR_PASSTHRU; in qeth_l3_fill_header()
1685 l3_hdr->next_hop.addr.s6_addr16[0] = htons(0xfe80); in qeth_l3_fill_header()
1686 memcpy(&l3_hdr->next_hop.addr.s6_addr32[2], in qeth_l3_fill_header()
1687 iucv_trans_hdr(skb)->destUserID, 8); in qeth_l3_fill_header()
1688 l3_hdr->flags |= QETH_HDR_IPV6; in qeth_l3_fill_header()
1692 l3_hdr->flags |= QETH_HDR_PASSTHRU; in qeth_l3_fill_header()
1702 if (skb->ip_summed == CHECKSUM_PARTIAL) in qeth_l3_fixup_headers()
1703 iph->check = 0; in qeth_l3_fixup_headers()
1705 iph->tot_len = 0; in qeth_l3_fixup_headers()
1706 tcp_hdr(skb)->check = ~tcp_v4_check(0, iph->saddr, in qeth_l3_fixup_headers()
1707 iph->daddr, 0); in qeth_l3_fixup_headers()
1717 /* re-use the L2 header area for the HW header: */ in qeth_l3_xmit()
1720 rc = skb_cow_head(skb, hw_hdr_len - ETH_HLEN); in qeth_l3_xmit()
1732 struct qeth_card *card = dev->ml_priv; in qeth_l3_hard_start_xmit()
1739 qdisc_skb_cb(skb)->pkt_len = skb->len; in qeth_l3_hard_start_xmit()
1741 queue = card->qdio.out_qs[qeth_iqd_translate_txq(dev, txq)]; in qeth_l3_hard_start_xmit()
1743 if (card->options.sniffer) in qeth_l3_hard_start_xmit()
1748 if (card->options.cq != QETH_CQ_ENABLED) in qeth_l3_hard_start_xmit()
1753 if (card->options.cq == QETH_CQ_ENABLED) in qeth_l3_hard_start_xmit()
1760 queue = card->qdio.out_qs[txq]; in qeth_l3_hard_start_xmit()
1763 if (!(dev->flags & IFF_BROADCAST) && in qeth_l3_hard_start_xmit()
1783 struct qeth_card *card = dev->ml_priv; in qeth_l3_set_rx_mode()
1785 schedule_work(&card->rx_mode_work); in qeth_l3_set_rx_mode()
1797 n->nud_state = NUD_NOARP; in qeth_l3_neigh_setup_noarp()
1798 memcpy(n->ha, "FAKELL", 6); in qeth_l3_neigh_setup_noarp()
1799 n->output = n->ops->connected_output; in qeth_l3_neigh_setup_noarp()
1806 if (np->tbl->family == AF_INET) in qeth_l3_neigh_setup()
1807 np->neigh_setup = qeth_l3_neigh_setup_noarp; in qeth_l3_neigh_setup()
1864 struct net_device *dev = card->dev; in qeth_l3_setup_netdev()
1869 card->dev->netdev_ops = &qeth_l3_osa_netdev_ops; in qeth_l3_setup_netdev()
1872 dev->dev_id = qeth_l3_get_unique_id(card, dev->dev_id); in qeth_l3_setup_netdev()
1875 card->dev->features |= NETIF_F_SG; in qeth_l3_setup_netdev()
1876 card->dev->hw_features |= NETIF_F_TSO | in qeth_l3_setup_netdev()
1878 card->dev->vlan_features |= NETIF_F_TSO | in qeth_l3_setup_netdev()
1883 card->dev->hw_features |= NETIF_F_IPV6_CSUM; in qeth_l3_setup_netdev()
1884 card->dev->vlan_features |= NETIF_F_IPV6_CSUM; in qeth_l3_setup_netdev()
1887 card->dev->hw_features |= NETIF_F_TSO6; in qeth_l3_setup_netdev()
1888 card->dev->vlan_features |= NETIF_F_TSO6; in qeth_l3_setup_netdev()
1891 /* allow for de-acceleration of NETIF_F_HW_VLAN_CTAG_TX: */ in qeth_l3_setup_netdev()
1892 if (card->dev->hw_features & NETIF_F_TSO6) in qeth_l3_setup_netdev()
1894 else if (card->dev->hw_features & NETIF_F_TSO) in qeth_l3_setup_netdev()
1899 card->dev->flags |= IFF_NOARP; in qeth_l3_setup_netdev()
1900 card->dev->netdev_ops = &qeth_l3_netdev_ops; in qeth_l3_setup_netdev()
1901 headroom = sizeof(struct qeth_hdr) - ETH_HLEN; in qeth_l3_setup_netdev()
1907 return -ENODEV; in qeth_l3_setup_netdev()
1909 card->dev->needed_headroom = headroom; in qeth_l3_setup_netdev()
1910 card->dev->features |= NETIF_F_HW_VLAN_CTAG_TX | in qeth_l3_setup_netdev()
1913 netif_keep_dst(card->dev); in qeth_l3_setup_netdev()
1914 if (card->dev->hw_features & (NETIF_F_TSO | NETIF_F_TSO6)) in qeth_l3_setup_netdev()
1915 netif_set_tso_max_size(card->dev, in qeth_l3_setup_netdev()
1916 PAGE_SIZE * (QETH_MAX_BUFFER_ELEMENTS(card) - 1)); in qeth_l3_setup_netdev()
1918 netif_napi_add(card->dev, &card->napi, qeth_poll); in qeth_l3_setup_netdev()
1919 return register_netdev(card->dev); in qeth_l3_setup_netdev()
1924 .groups = qeth_l3_attr_groups,
1929 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_probe_device()
1932 hash_init(card->ip_htable); in qeth_l3_probe_device()
1933 mutex_init(&card->ip_lock); in qeth_l3_probe_device()
1934 card->cmd_wq = alloc_ordered_workqueue("%s_cmd", 0, in qeth_l3_probe_device()
1935 dev_name(&gdev->dev)); in qeth_l3_probe_device()
1936 if (!card->cmd_wq) in qeth_l3_probe_device()
1937 return -ENOMEM; in qeth_l3_probe_device()
1939 if (gdev->dev.type) { in qeth_l3_probe_device()
1940 rc = device_add_groups(&gdev->dev, qeth_l3_attr_groups); in qeth_l3_probe_device()
1942 destroy_workqueue(card->cmd_wq); in qeth_l3_probe_device()
1946 gdev->dev.type = &qeth_l3_devtype; in qeth_l3_probe_device()
1949 INIT_WORK(&card->rx_mode_work, qeth_l3_rx_mode_work); in qeth_l3_probe_device()
1955 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); in qeth_l3_remove_device()
1957 if (cgdev->dev.type != &qeth_l3_devtype) in qeth_l3_remove_device()
1958 device_remove_groups(&cgdev->dev, qeth_l3_attr_groups); in qeth_l3_remove_device()
1961 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l3_remove_device()
1963 if (cgdev->state == CCWGROUP_ONLINE) in qeth_l3_remove_device()
1964 qeth_set_offline(card, card->discipline, false); in qeth_l3_remove_device()
1966 if (card->dev->reg_state == NETREG_REGISTERED) in qeth_l3_remove_device()
1967 unregister_netdev(card->dev); in qeth_l3_remove_device()
1969 destroy_workqueue(card->cmd_wq); in qeth_l3_remove_device()
1976 struct net_device *dev = card->dev; in qeth_l3_set_online()
1985 if (!card->options.sniffer) { in qeth_l3_set_online()
1996 card->state = CARD_STATE_SOFTSETUP; in qeth_l3_set_online()
2001 if (dev->reg_state != NETREG_REGISTERED) { in qeth_l3_set_online()
2027 napi_schedule(&card->napi); in qeth_l3_set_online()
2028 /* kick-start the NAPI softirq: */ in qeth_l3_set_online()
2038 card->state = CARD_STATE_DOWN; in qeth_l3_set_online()
2048 if (card->options.sniffer && in qeth_l3_set_offline()
2049 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) in qeth_l3_set_offline()
2052 if (card->state == CARD_STATE_SOFTSETUP) { in qeth_l3_set_offline()
2053 card->state = CARD_STATE_DOWN; in qeth_l3_set_offline()
2102 qeth_l3_modify_ip(ip_work->card, &ip_work->addr, true); in qeth_l3_add_ip_worker()
2110 qeth_l3_modify_ip(ip_work->card, &ip_work->addr, false); in qeth_l3_delete_ip_worker()
2118 if (dev->netdev_ops == &qeth_l3_osa_netdev_ops || in qeth_l3_get_card_from_dev()
2119 dev->netdev_ops == &qeth_l3_netdev_ops) in qeth_l3_get_card_from_dev()
2120 return (struct qeth_card *) dev->ml_priv; in qeth_l3_get_card_from_dev()
2128 struct net_device *dev = ifa->ifa_dev->dev; in qeth_l3_ip_event()
2138 addr.u.a4.addr = ifa->ifa_address; in qeth_l3_ip_event()
2139 addr.u.a4.mask = ifa->ifa_mask; in qeth_l3_ip_event()
2153 struct net_device *dev = ifa->idev->dev; in qeth_l3_ip6_event()
2172 INIT_WORK(&ip_work->work, qeth_l3_add_ip_worker); in qeth_l3_ip6_event()
2174 INIT_WORK(&ip_work->work, qeth_l3_delete_ip_worker); in qeth_l3_ip6_event()
2176 ip_work->card = card; in qeth_l3_ip6_event()
2177 qeth_l3_init_ipaddr(&ip_work->addr, QETH_IP_TYPE_NORMAL, in qeth_l3_ip6_event()
2179 ip_work->addr.u.a6.addr = ifa->addr; in qeth_l3_ip6_event()
2180 ip_work->addr.u.a6.pfxlen = ifa->prefix_len; in qeth_l3_ip6_event()
2182 queue_work(card->cmd_wq, &ip_work->work); in qeth_l3_ip6_event()