1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright IBM Corp. 2007
4 * Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
5 * Frank Pavlic <fpavlic@de.ibm.com>,
6 * Thomas Spatzier <tspat@de.ibm.com>,
7 * Frank Blaschka <frank.blaschka@de.ibm.com>
10 #include <linux/slab.h>
11 #include <asm/ebcdic.h>
12 #include <linux/hashtable.h>
13 #include <linux/inet.h>
16 #define QETH_DEVICE_ATTR(_id, _name, _mode, _show, _store) \
17 struct device_attribute dev_attr_##_id = __ATTR(_name, _mode, _show, _store)
19 static int qeth_l3_string_to_ipaddr(const char *buf,
20 enum qeth_prot_versions proto, u8 *addr)
24 if ((proto == QETH_PROT_IPV4 && !in4_pton(buf, -1, addr, -1, &end)) ||
25 (proto == QETH_PROT_IPV6 && !in6_pton(buf, -1, addr, -1, &end)))
30 static ssize_t qeth_l3_dev_route_show(struct qeth_card *card,
31 struct qeth_routing_info *route, char *buf)
33 switch (route->type) {
35 return sprintf(buf, "%s\n", "primary router");
36 case SECONDARY_ROUTER:
37 return sprintf(buf, "%s\n", "secondary router");
38 case MULTICAST_ROUTER:
39 if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
40 return sprintf(buf, "%s\n", "multicast router+");
42 return sprintf(buf, "%s\n", "multicast router");
43 case PRIMARY_CONNECTOR:
44 if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
45 return sprintf(buf, "%s\n", "primary connector+");
47 return sprintf(buf, "%s\n", "primary connector");
48 case SECONDARY_CONNECTOR:
49 if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
50 return sprintf(buf, "%s\n", "secondary connector+");
52 return sprintf(buf, "%s\n", "secondary connector");
54 return sprintf(buf, "%s\n", "no");
58 static ssize_t qeth_l3_dev_route4_show(struct device *dev,
59 struct device_attribute *attr, char *buf)
61 struct qeth_card *card = dev_get_drvdata(dev);
66 return qeth_l3_dev_route_show(card, &card->options.route4, buf);
69 static ssize_t qeth_l3_dev_route_store(struct qeth_card *card,
70 struct qeth_routing_info *route, enum qeth_prot_versions prot,
71 const char *buf, size_t count)
73 enum qeth_routing_types old_route_type = route->type;
76 mutex_lock(&card->conf_mutex);
77 if (sysfs_streq(buf, "no_router")) {
78 route->type = NO_ROUTER;
79 } else if (sysfs_streq(buf, "primary_connector")) {
80 route->type = PRIMARY_CONNECTOR;
81 } else if (sysfs_streq(buf, "secondary_connector")) {
82 route->type = SECONDARY_CONNECTOR;
83 } else if (sysfs_streq(buf, "primary_router")) {
84 route->type = PRIMARY_ROUTER;
85 } else if (sysfs_streq(buf, "secondary_router")) {
86 route->type = SECONDARY_ROUTER;
87 } else if (sysfs_streq(buf, "multicast_router")) {
88 route->type = MULTICAST_ROUTER;
93 if (qeth_card_hw_is_reachable(card) &&
94 (old_route_type != route->type)) {
95 if (prot == QETH_PROT_IPV4)
96 rc = qeth_l3_setrouting_v4(card);
97 else if (prot == QETH_PROT_IPV6)
98 rc = qeth_l3_setrouting_v6(card);
102 route->type = old_route_type;
103 mutex_unlock(&card->conf_mutex);
104 return rc ? rc : count;
107 static ssize_t qeth_l3_dev_route4_store(struct device *dev,
108 struct device_attribute *attr, const char *buf, size_t count)
110 struct qeth_card *card = dev_get_drvdata(dev);
115 return qeth_l3_dev_route_store(card, &card->options.route4,
116 QETH_PROT_IPV4, buf, count);
119 static DEVICE_ATTR(route4, 0644, qeth_l3_dev_route4_show,
120 qeth_l3_dev_route4_store);
122 static ssize_t qeth_l3_dev_route6_show(struct device *dev,
123 struct device_attribute *attr, char *buf)
125 struct qeth_card *card = dev_get_drvdata(dev);
130 return qeth_l3_dev_route_show(card, &card->options.route6, buf);
133 static ssize_t qeth_l3_dev_route6_store(struct device *dev,
134 struct device_attribute *attr, const char *buf, size_t count)
136 struct qeth_card *card = dev_get_drvdata(dev);
141 return qeth_l3_dev_route_store(card, &card->options.route6,
142 QETH_PROT_IPV6, buf, count);
145 static DEVICE_ATTR(route6, 0644, qeth_l3_dev_route6_show,
146 qeth_l3_dev_route6_store);
148 static ssize_t qeth_l3_dev_fake_broadcast_show(struct device *dev,
149 struct device_attribute *attr, char *buf)
151 struct qeth_card *card = dev_get_drvdata(dev);
156 return sprintf(buf, "%i\n", card->options.fake_broadcast? 1:0);
159 static ssize_t qeth_l3_dev_fake_broadcast_store(struct device *dev,
160 struct device_attribute *attr, const char *buf, size_t count)
162 struct qeth_card *card = dev_get_drvdata(dev);
169 mutex_lock(&card->conf_mutex);
170 if (card->state != CARD_STATE_DOWN) {
175 i = simple_strtoul(buf, &tmp, 16);
176 if ((i == 0) || (i == 1))
177 card->options.fake_broadcast = i;
181 mutex_unlock(&card->conf_mutex);
182 return rc ? rc : count;
185 static DEVICE_ATTR(fake_broadcast, 0644, qeth_l3_dev_fake_broadcast_show,
186 qeth_l3_dev_fake_broadcast_store);
188 static ssize_t qeth_l3_dev_sniffer_show(struct device *dev,
189 struct device_attribute *attr, char *buf)
191 struct qeth_card *card = dev_get_drvdata(dev);
196 return sprintf(buf, "%i\n", card->options.sniffer ? 1 : 0);
199 static ssize_t qeth_l3_dev_sniffer_store(struct device *dev,
200 struct device_attribute *attr, const char *buf, size_t count)
202 struct qeth_card *card = dev_get_drvdata(dev);
209 if (card->info.type != QETH_CARD_TYPE_IQD)
211 if (card->options.cq == QETH_CQ_ENABLED)
214 mutex_lock(&card->conf_mutex);
215 if (card->state != CARD_STATE_DOWN) {
220 rc = kstrtoul(buf, 16, &i);
227 card->options.sniffer = i;
230 qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd);
231 if (card->ssqd.qdioac2 & QETH_SNIFF_AVAIL) {
232 card->options.sniffer = i;
233 if (card->qdio.init_pool.buf_count !=
234 QETH_IN_BUF_COUNT_MAX)
235 qeth_realloc_buffer_pool(card,
236 QETH_IN_BUF_COUNT_MAX);
244 mutex_unlock(&card->conf_mutex);
245 return rc ? rc : count;
248 static DEVICE_ATTR(sniffer, 0644, qeth_l3_dev_sniffer_show,
249 qeth_l3_dev_sniffer_store);
252 static ssize_t qeth_l3_dev_hsuid_show(struct device *dev,
253 struct device_attribute *attr, char *buf)
255 struct qeth_card *card = dev_get_drvdata(dev);
261 if (card->info.type != QETH_CARD_TYPE_IQD)
264 memcpy(tmp_hsuid, card->options.hsuid, sizeof(tmp_hsuid));
265 EBCASC(tmp_hsuid, 8);
266 return sprintf(buf, "%s\n", tmp_hsuid);
269 static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
270 struct device_attribute *attr, const char *buf, size_t count)
272 struct qeth_card *card = dev_get_drvdata(dev);
279 if (card->info.type != QETH_CARD_TYPE_IQD)
281 if (card->state != CARD_STATE_DOWN)
283 if (card->options.sniffer)
285 if (card->options.cq == QETH_CQ_NOTAVAILABLE)
288 tmp = strsep((char **)&buf, "\n");
292 if (card->options.hsuid[0])
293 /* delete old ip address */
294 qeth_l3_modify_hsuid(card, false);
296 if (strlen(tmp) == 0) {
297 /* delete ip address only */
298 card->options.hsuid[0] = '\0';
299 memcpy(card->dev->perm_addr, card->options.hsuid, 9);
300 qeth_configure_cq(card, QETH_CQ_DISABLED);
304 if (qeth_configure_cq(card, QETH_CQ_ENABLED))
307 snprintf(card->options.hsuid, sizeof(card->options.hsuid),
309 ASCEBC(card->options.hsuid, 8);
310 memcpy(card->dev->perm_addr, card->options.hsuid, 9);
312 rc = qeth_l3_modify_hsuid(card, true);
314 return rc ? rc : count;
317 static DEVICE_ATTR(hsuid, 0644, qeth_l3_dev_hsuid_show,
318 qeth_l3_dev_hsuid_store);
321 static struct attribute *qeth_l3_device_attrs[] = {
322 &dev_attr_route4.attr,
323 &dev_attr_route6.attr,
324 &dev_attr_fake_broadcast.attr,
325 &dev_attr_sniffer.attr,
326 &dev_attr_hsuid.attr,
330 static const struct attribute_group qeth_l3_device_attr_group = {
331 .attrs = qeth_l3_device_attrs,
334 static ssize_t qeth_l3_dev_ipato_enable_show(struct device *dev,
335 struct device_attribute *attr, char *buf)
337 struct qeth_card *card = dev_get_drvdata(dev);
342 return sprintf(buf, "%i\n", card->ipato.enabled? 1:0);
345 static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev,
346 struct device_attribute *attr, const char *buf, size_t count)
348 struct qeth_card *card = dev_get_drvdata(dev);
355 mutex_lock(&card->conf_mutex);
356 if (card->state != CARD_STATE_DOWN) {
361 if (sysfs_streq(buf, "toggle")) {
362 enable = !card->ipato.enabled;
363 } else if (kstrtobool(buf, &enable)) {
368 if (card->ipato.enabled != enable) {
369 card->ipato.enabled = enable;
370 mutex_lock(&card->ip_lock);
371 qeth_l3_update_ipato(card);
372 mutex_unlock(&card->ip_lock);
375 mutex_unlock(&card->conf_mutex);
376 return rc ? rc : count;
379 static QETH_DEVICE_ATTR(ipato_enable, enable, 0644,
380 qeth_l3_dev_ipato_enable_show,
381 qeth_l3_dev_ipato_enable_store);
383 static ssize_t qeth_l3_dev_ipato_invert4_show(struct device *dev,
384 struct device_attribute *attr, char *buf)
386 struct qeth_card *card = dev_get_drvdata(dev);
391 return sprintf(buf, "%i\n", card->ipato.invert4? 1:0);
394 static ssize_t qeth_l3_dev_ipato_invert4_store(struct device *dev,
395 struct device_attribute *attr,
396 const char *buf, size_t count)
398 struct qeth_card *card = dev_get_drvdata(dev);
405 mutex_lock(&card->conf_mutex);
406 if (sysfs_streq(buf, "toggle")) {
407 invert = !card->ipato.invert4;
408 } else if (kstrtobool(buf, &invert)) {
413 if (card->ipato.invert4 != invert) {
414 card->ipato.invert4 = invert;
415 mutex_lock(&card->ip_lock);
416 qeth_l3_update_ipato(card);
417 mutex_unlock(&card->ip_lock);
420 mutex_unlock(&card->conf_mutex);
421 return rc ? rc : count;
424 static QETH_DEVICE_ATTR(ipato_invert4, invert4, 0644,
425 qeth_l3_dev_ipato_invert4_show,
426 qeth_l3_dev_ipato_invert4_store);
428 static ssize_t qeth_l3_dev_ipato_add_show(char *buf, struct qeth_card *card,
429 enum qeth_prot_versions proto)
431 struct qeth_ipato_entry *ipatoe;
433 int entry_len; /* length of 1 entry string, differs between v4 and v6 */
436 entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
437 /* add strlen for "/<mask>\n" */
438 entry_len += (proto == QETH_PROT_IPV4)? 5 : 6;
439 mutex_lock(&card->ip_lock);
440 list_for_each_entry(ipatoe, &card->ipato.entries, entry) {
441 if (ipatoe->proto != proto)
443 /* String must not be longer than PAGE_SIZE. So we check if
444 * string length gets near PAGE_SIZE. Then we can savely display
445 * the next IPv6 address (worst case, compared to IPv4) */
446 if ((PAGE_SIZE - i) <= entry_len)
448 qeth_l3_ipaddr_to_string(proto, ipatoe->addr, addr_str);
449 i += snprintf(buf + i, PAGE_SIZE - i,
450 "%s/%i\n", addr_str, ipatoe->mask_bits);
452 mutex_unlock(&card->ip_lock);
453 i += snprintf(buf + i, PAGE_SIZE - i, "\n");
458 static ssize_t qeth_l3_dev_ipato_add4_show(struct device *dev,
459 struct device_attribute *attr, char *buf)
461 struct qeth_card *card = dev_get_drvdata(dev);
466 return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV4);
469 static int qeth_l3_parse_ipatoe(const char *buf, enum qeth_prot_versions proto,
470 u8 *addr, int *mask_bits)
472 const char *start, *end;
474 char buffer[40] = {0, };
477 /* get address string */
478 end = strchr(start, '/');
479 if (!end || (end - start >= 40)) {
482 strncpy(buffer, start, end - start);
483 if (qeth_l3_string_to_ipaddr(buffer, proto, addr)) {
487 *mask_bits = simple_strtoul(start, &tmp, 10);
488 if (!strlen(start) ||
490 (*mask_bits > ((proto == QETH_PROT_IPV4) ? 32 : 128))) {
496 static ssize_t qeth_l3_dev_ipato_add_store(const char *buf, size_t count,
497 struct qeth_card *card, enum qeth_prot_versions proto)
499 struct qeth_ipato_entry *ipatoe;
504 mutex_lock(&card->conf_mutex);
505 rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
509 ipatoe = kzalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL);
514 ipatoe->proto = proto;
515 memcpy(ipatoe->addr, addr, (proto == QETH_PROT_IPV4)? 4:16);
516 ipatoe->mask_bits = mask_bits;
518 rc = qeth_l3_add_ipato_entry(card, ipatoe);
522 mutex_unlock(&card->conf_mutex);
523 return rc ? rc : count;
526 static ssize_t qeth_l3_dev_ipato_add4_store(struct device *dev,
527 struct device_attribute *attr, const char *buf, size_t count)
529 struct qeth_card *card = dev_get_drvdata(dev);
534 return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV4);
537 static QETH_DEVICE_ATTR(ipato_add4, add4, 0644,
538 qeth_l3_dev_ipato_add4_show,
539 qeth_l3_dev_ipato_add4_store);
541 static ssize_t qeth_l3_dev_ipato_del_store(const char *buf, size_t count,
542 struct qeth_card *card, enum qeth_prot_versions proto)
548 mutex_lock(&card->conf_mutex);
549 rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
551 rc = qeth_l3_del_ipato_entry(card, proto, addr, mask_bits);
552 mutex_unlock(&card->conf_mutex);
553 return rc ? rc : count;
556 static ssize_t qeth_l3_dev_ipato_del4_store(struct device *dev,
557 struct device_attribute *attr, const char *buf, size_t count)
559 struct qeth_card *card = dev_get_drvdata(dev);
564 return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV4);
567 static QETH_DEVICE_ATTR(ipato_del4, del4, 0200, NULL,
568 qeth_l3_dev_ipato_del4_store);
570 static ssize_t qeth_l3_dev_ipato_invert6_show(struct device *dev,
571 struct device_attribute *attr, char *buf)
573 struct qeth_card *card = dev_get_drvdata(dev);
578 return sprintf(buf, "%i\n", card->ipato.invert6? 1:0);
581 static ssize_t qeth_l3_dev_ipato_invert6_store(struct device *dev,
582 struct device_attribute *attr, const char *buf, size_t count)
584 struct qeth_card *card = dev_get_drvdata(dev);
591 mutex_lock(&card->conf_mutex);
592 if (sysfs_streq(buf, "toggle")) {
593 invert = !card->ipato.invert6;
594 } else if (kstrtobool(buf, &invert)) {
599 if (card->ipato.invert6 != invert) {
600 card->ipato.invert6 = invert;
601 mutex_lock(&card->ip_lock);
602 qeth_l3_update_ipato(card);
603 mutex_unlock(&card->ip_lock);
606 mutex_unlock(&card->conf_mutex);
607 return rc ? rc : count;
610 static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644,
611 qeth_l3_dev_ipato_invert6_show,
612 qeth_l3_dev_ipato_invert6_store);
615 static ssize_t qeth_l3_dev_ipato_add6_show(struct device *dev,
616 struct device_attribute *attr, char *buf)
618 struct qeth_card *card = dev_get_drvdata(dev);
623 return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV6);
626 static ssize_t qeth_l3_dev_ipato_add6_store(struct device *dev,
627 struct device_attribute *attr, const char *buf, size_t count)
629 struct qeth_card *card = dev_get_drvdata(dev);
634 return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV6);
637 static QETH_DEVICE_ATTR(ipato_add6, add6, 0644,
638 qeth_l3_dev_ipato_add6_show,
639 qeth_l3_dev_ipato_add6_store);
641 static ssize_t qeth_l3_dev_ipato_del6_store(struct device *dev,
642 struct device_attribute *attr, const char *buf, size_t count)
644 struct qeth_card *card = dev_get_drvdata(dev);
649 return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV6);
652 static QETH_DEVICE_ATTR(ipato_del6, del6, 0200, NULL,
653 qeth_l3_dev_ipato_del6_store);
655 static struct attribute *qeth_ipato_device_attrs[] = {
656 &dev_attr_ipato_enable.attr,
657 &dev_attr_ipato_invert4.attr,
658 &dev_attr_ipato_add4.attr,
659 &dev_attr_ipato_del4.attr,
660 &dev_attr_ipato_invert6.attr,
661 &dev_attr_ipato_add6.attr,
662 &dev_attr_ipato_del6.attr,
666 static const struct attribute_group qeth_device_ipato_group = {
667 .name = "ipa_takeover",
668 .attrs = qeth_ipato_device_attrs,
671 static ssize_t qeth_l3_dev_ip_add_show(struct device *dev, char *buf,
672 enum qeth_prot_versions proto,
673 enum qeth_ip_types type)
675 struct qeth_card *card = dev_get_drvdata(dev);
676 struct qeth_ipaddr *ipaddr;
679 int entry_len; /* length of 1 entry string, differs between v4 and v6 */
685 entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
686 entry_len += 2; /* \n + terminator */
687 mutex_lock(&card->ip_lock);
688 hash_for_each(card->ip_htable, i, ipaddr, hnode) {
689 if (ipaddr->proto != proto || ipaddr->type != type)
691 /* String must not be longer than PAGE_SIZE. So we check if
692 * string length gets near PAGE_SIZE. Then we can savely display
693 * the next IPv6 address (worst case, compared to IPv4) */
694 if ((PAGE_SIZE - str_len) <= entry_len)
696 qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u,
698 str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "%s\n",
701 mutex_unlock(&card->ip_lock);
702 str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "\n");
707 static ssize_t qeth_l3_dev_vipa_add4_show(struct device *dev,
708 struct device_attribute *attr,
711 return qeth_l3_dev_ip_add_show(dev, buf, QETH_PROT_IPV4,
715 static int qeth_l3_parse_vipae(const char *buf, enum qeth_prot_versions proto,
718 if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
724 static ssize_t qeth_l3_dev_vipa_add_store(const char *buf, size_t count,
725 struct qeth_card *card, enum qeth_prot_versions proto)
730 mutex_lock(&card->conf_mutex);
731 rc = qeth_l3_parse_vipae(buf, proto, addr);
733 rc = qeth_l3_modify_rxip_vipa(card, true, addr,
734 QETH_IP_TYPE_VIPA, proto);
735 mutex_unlock(&card->conf_mutex);
736 return rc ? rc : count;
739 static ssize_t qeth_l3_dev_vipa_add4_store(struct device *dev,
740 struct device_attribute *attr, const char *buf, size_t count)
742 struct qeth_card *card = dev_get_drvdata(dev);
747 return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV4);
750 static QETH_DEVICE_ATTR(vipa_add4, add4, 0644,
751 qeth_l3_dev_vipa_add4_show,
752 qeth_l3_dev_vipa_add4_store);
754 static ssize_t qeth_l3_dev_vipa_del_store(const char *buf, size_t count,
755 struct qeth_card *card, enum qeth_prot_versions proto)
760 mutex_lock(&card->conf_mutex);
761 rc = qeth_l3_parse_vipae(buf, proto, addr);
763 rc = qeth_l3_modify_rxip_vipa(card, false, addr,
764 QETH_IP_TYPE_VIPA, proto);
765 mutex_unlock(&card->conf_mutex);
766 return rc ? rc : count;
769 static ssize_t qeth_l3_dev_vipa_del4_store(struct device *dev,
770 struct device_attribute *attr, const char *buf, size_t count)
772 struct qeth_card *card = dev_get_drvdata(dev);
777 return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV4);
780 static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL,
781 qeth_l3_dev_vipa_del4_store);
783 static ssize_t qeth_l3_dev_vipa_add6_show(struct device *dev,
784 struct device_attribute *attr,
787 return qeth_l3_dev_ip_add_show(dev, buf, QETH_PROT_IPV6,
791 static ssize_t qeth_l3_dev_vipa_add6_store(struct device *dev,
792 struct device_attribute *attr, const char *buf, size_t count)
794 struct qeth_card *card = dev_get_drvdata(dev);
799 return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV6);
802 static QETH_DEVICE_ATTR(vipa_add6, add6, 0644,
803 qeth_l3_dev_vipa_add6_show,
804 qeth_l3_dev_vipa_add6_store);
806 static ssize_t qeth_l3_dev_vipa_del6_store(struct device *dev,
807 struct device_attribute *attr, const char *buf, size_t count)
809 struct qeth_card *card = dev_get_drvdata(dev);
814 return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV6);
817 static QETH_DEVICE_ATTR(vipa_del6, del6, 0200, NULL,
818 qeth_l3_dev_vipa_del6_store);
820 static struct attribute *qeth_vipa_device_attrs[] = {
821 &dev_attr_vipa_add4.attr,
822 &dev_attr_vipa_del4.attr,
823 &dev_attr_vipa_add6.attr,
824 &dev_attr_vipa_del6.attr,
828 static const struct attribute_group qeth_device_vipa_group = {
830 .attrs = qeth_vipa_device_attrs,
833 static ssize_t qeth_l3_dev_rxip_add4_show(struct device *dev,
834 struct device_attribute *attr,
837 return qeth_l3_dev_ip_add_show(dev, buf, QETH_PROT_IPV4,
841 static int qeth_l3_parse_rxipe(const char *buf, enum qeth_prot_versions proto,
845 struct in6_addr ipv6_addr;
847 if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
850 if (proto == QETH_PROT_IPV4) {
851 memcpy(&ipv4_addr, addr, sizeof(ipv4_addr));
852 if (ipv4_is_multicast(ipv4_addr)) {
853 QETH_DBF_MESSAGE(2, "multicast rxip not supported.\n");
856 } else if (proto == QETH_PROT_IPV6) {
857 memcpy(&ipv6_addr, addr, sizeof(ipv6_addr));
858 if (ipv6_addr_is_multicast(&ipv6_addr)) {
859 QETH_DBF_MESSAGE(2, "multicast rxip not supported.\n");
867 static ssize_t qeth_l3_dev_rxip_add_store(const char *buf, size_t count,
868 struct qeth_card *card, enum qeth_prot_versions proto)
873 mutex_lock(&card->conf_mutex);
874 rc = qeth_l3_parse_rxipe(buf, proto, addr);
876 rc = qeth_l3_modify_rxip_vipa(card, true, addr,
877 QETH_IP_TYPE_RXIP, proto);
878 mutex_unlock(&card->conf_mutex);
879 return rc ? rc : count;
882 static ssize_t qeth_l3_dev_rxip_add4_store(struct device *dev,
883 struct device_attribute *attr, const char *buf, size_t count)
885 struct qeth_card *card = dev_get_drvdata(dev);
890 return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV4);
893 static QETH_DEVICE_ATTR(rxip_add4, add4, 0644,
894 qeth_l3_dev_rxip_add4_show,
895 qeth_l3_dev_rxip_add4_store);
897 static ssize_t qeth_l3_dev_rxip_del_store(const char *buf, size_t count,
898 struct qeth_card *card, enum qeth_prot_versions proto)
903 mutex_lock(&card->conf_mutex);
904 rc = qeth_l3_parse_rxipe(buf, proto, addr);
906 rc = qeth_l3_modify_rxip_vipa(card, false, addr,
907 QETH_IP_TYPE_RXIP, proto);
908 mutex_unlock(&card->conf_mutex);
909 return rc ? rc : count;
912 static ssize_t qeth_l3_dev_rxip_del4_store(struct device *dev,
913 struct device_attribute *attr, const char *buf, size_t count)
915 struct qeth_card *card = dev_get_drvdata(dev);
920 return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV4);
923 static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL,
924 qeth_l3_dev_rxip_del4_store);
926 static ssize_t qeth_l3_dev_rxip_add6_show(struct device *dev,
927 struct device_attribute *attr,
930 return qeth_l3_dev_ip_add_show(dev, buf, QETH_PROT_IPV6,
934 static ssize_t qeth_l3_dev_rxip_add6_store(struct device *dev,
935 struct device_attribute *attr, const char *buf, size_t count)
937 struct qeth_card *card = dev_get_drvdata(dev);
942 return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV6);
945 static QETH_DEVICE_ATTR(rxip_add6, add6, 0644,
946 qeth_l3_dev_rxip_add6_show,
947 qeth_l3_dev_rxip_add6_store);
949 static ssize_t qeth_l3_dev_rxip_del6_store(struct device *dev,
950 struct device_attribute *attr, const char *buf, size_t count)
952 struct qeth_card *card = dev_get_drvdata(dev);
957 return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV6);
960 static QETH_DEVICE_ATTR(rxip_del6, del6, 0200, NULL,
961 qeth_l3_dev_rxip_del6_store);
963 static struct attribute *qeth_rxip_device_attrs[] = {
964 &dev_attr_rxip_add4.attr,
965 &dev_attr_rxip_del4.attr,
966 &dev_attr_rxip_add6.attr,
967 &dev_attr_rxip_del6.attr,
971 static const struct attribute_group qeth_device_rxip_group = {
973 .attrs = qeth_rxip_device_attrs,
976 static const struct attribute_group *qeth_l3_only_attr_groups[] = {
977 &qeth_l3_device_attr_group,
978 &qeth_device_ipato_group,
979 &qeth_device_vipa_group,
980 &qeth_device_rxip_group,
984 int qeth_l3_create_device_attributes(struct device *dev)
986 return sysfs_create_groups(&dev->kobj, qeth_l3_only_attr_groups);
989 void qeth_l3_remove_device_attributes(struct device *dev)
991 sysfs_remove_groups(&dev->kobj, qeth_l3_only_attr_groups);
994 const struct attribute_group *qeth_l3_attr_groups[] = {
995 &qeth_device_attr_group,
996 &qeth_device_blkt_group,
997 /* l3 specific, see qeth_l3_only_attr_groups: */
998 &qeth_l3_device_attr_group,
999 &qeth_device_ipato_group,
1000 &qeth_device_vipa_group,
1001 &qeth_device_rxip_group,