xref: /linux/drivers/s390/net/qeth_l3_sys.c (revision fa84cf094ef9667e2b91c104b0a788fd1896f482)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
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>
8  */
9 
10 #include <linux/slab.h>
11 #include <asm/ebcdic.h>
12 #include <linux/hashtable.h>
13 #include <linux/inet.h>
14 #include "qeth_l3.h"
15 
16 #define QETH_DEVICE_ATTR(_id, _name, _mode, _show, _store) \
17 struct device_attribute dev_attr_##_id = __ATTR(_name, _mode, _show, _store)
18 
19 static int qeth_l3_string_to_ipaddr(const char *buf,
20 				    enum qeth_prot_versions proto, u8 *addr)
21 {
22 	const char *end;
23 
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)))
26 		return -EINVAL;
27 	return 0;
28 }
29 
30 static ssize_t qeth_l3_dev_route_show(struct qeth_card *card,
31 			struct qeth_routing_info *route, char *buf)
32 {
33 	switch (route->type) {
34 	case PRIMARY_ROUTER:
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+");
41 		else
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+");
46 		else
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+");
51 		else
52 			return sprintf(buf, "%s\n", "secondary connector");
53 	default:
54 		return sprintf(buf, "%s\n", "no");
55 	}
56 }
57 
58 static ssize_t qeth_l3_dev_route4_show(struct device *dev,
59 			struct device_attribute *attr, char *buf)
60 {
61 	struct qeth_card *card = dev_get_drvdata(dev);
62 
63 	if (!card)
64 		return -EINVAL;
65 
66 	return qeth_l3_dev_route_show(card, &card->options.route4, buf);
67 }
68 
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)
72 {
73 	enum qeth_routing_types old_route_type = route->type;
74 	int rc = 0;
75 
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;
89 	} else {
90 		rc = -EINVAL;
91 		goto out;
92 	}
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);
99 	}
100 out:
101 	if (rc)
102 		route->type = old_route_type;
103 	mutex_unlock(&card->conf_mutex);
104 	return rc ? rc : count;
105 }
106 
107 static ssize_t qeth_l3_dev_route4_store(struct device *dev,
108 		struct device_attribute *attr, const char *buf, size_t count)
109 {
110 	struct qeth_card *card = dev_get_drvdata(dev);
111 
112 	if (!card)
113 		return -EINVAL;
114 
115 	return qeth_l3_dev_route_store(card, &card->options.route4,
116 				QETH_PROT_IPV4, buf, count);
117 }
118 
119 static DEVICE_ATTR(route4, 0644, qeth_l3_dev_route4_show,
120 			qeth_l3_dev_route4_store);
121 
122 static ssize_t qeth_l3_dev_route6_show(struct device *dev,
123 			struct device_attribute *attr, char *buf)
124 {
125 	struct qeth_card *card = dev_get_drvdata(dev);
126 
127 	if (!card)
128 		return -EINVAL;
129 
130 	return qeth_l3_dev_route_show(card, &card->options.route6, buf);
131 }
132 
133 static ssize_t qeth_l3_dev_route6_store(struct device *dev,
134 		struct device_attribute *attr, const char *buf, size_t count)
135 {
136 	struct qeth_card *card = dev_get_drvdata(dev);
137 
138 	if (!card)
139 		return -EINVAL;
140 
141 	return qeth_l3_dev_route_store(card, &card->options.route6,
142 				QETH_PROT_IPV6, buf, count);
143 }
144 
145 static DEVICE_ATTR(route6, 0644, qeth_l3_dev_route6_show,
146 			qeth_l3_dev_route6_store);
147 
148 static ssize_t qeth_l3_dev_fake_broadcast_show(struct device *dev,
149 			struct device_attribute *attr, char *buf)
150 {
151 	struct qeth_card *card = dev_get_drvdata(dev);
152 
153 	if (!card)
154 		return -EINVAL;
155 
156 	return sprintf(buf, "%i\n", card->options.fake_broadcast? 1:0);
157 }
158 
159 static ssize_t qeth_l3_dev_fake_broadcast_store(struct device *dev,
160 		struct device_attribute *attr, const char *buf, size_t count)
161 {
162 	struct qeth_card *card = dev_get_drvdata(dev);
163 	char *tmp;
164 	int i, rc = 0;
165 
166 	if (!card)
167 		return -EINVAL;
168 
169 	mutex_lock(&card->conf_mutex);
170 	if ((card->state != CARD_STATE_DOWN) &&
171 	    (card->state != CARD_STATE_RECOVER)) {
172 		rc = -EPERM;
173 		goto out;
174 	}
175 
176 	i = simple_strtoul(buf, &tmp, 16);
177 	if ((i == 0) || (i == 1))
178 		card->options.fake_broadcast = i;
179 	else
180 		rc = -EINVAL;
181 out:
182 	mutex_unlock(&card->conf_mutex);
183 	return rc ? rc : count;
184 }
185 
186 static DEVICE_ATTR(fake_broadcast, 0644, qeth_l3_dev_fake_broadcast_show,
187 		   qeth_l3_dev_fake_broadcast_store);
188 
189 static ssize_t qeth_l3_dev_sniffer_show(struct device *dev,
190 		struct device_attribute *attr, char *buf)
191 {
192 	struct qeth_card *card = dev_get_drvdata(dev);
193 
194 	if (!card)
195 		return -EINVAL;
196 
197 	return sprintf(buf, "%i\n", card->options.sniffer ? 1 : 0);
198 }
199 
200 static ssize_t qeth_l3_dev_sniffer_store(struct device *dev,
201 		struct device_attribute *attr, const char *buf, size_t count)
202 {
203 	struct qeth_card *card = dev_get_drvdata(dev);
204 	int rc = 0;
205 	unsigned long i;
206 
207 	if (!card)
208 		return -EINVAL;
209 
210 	if (card->info.type != QETH_CARD_TYPE_IQD)
211 		return -EPERM;
212 	if (card->options.cq == QETH_CQ_ENABLED)
213 		return -EPERM;
214 
215 	mutex_lock(&card->conf_mutex);
216 	if ((card->state != CARD_STATE_DOWN) &&
217 	    (card->state != CARD_STATE_RECOVER)) {
218 		rc = -EPERM;
219 		goto out;
220 	}
221 
222 	rc = kstrtoul(buf, 16, &i);
223 	if (rc) {
224 		rc = -EINVAL;
225 		goto out;
226 	}
227 	switch (i) {
228 	case 0:
229 		card->options.sniffer = i;
230 		break;
231 	case 1:
232 		qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd);
233 		if (card->ssqd.qdioac2 & QETH_SNIFF_AVAIL) {
234 			card->options.sniffer = i;
235 			if (card->qdio.init_pool.buf_count !=
236 					QETH_IN_BUF_COUNT_MAX)
237 				qeth_realloc_buffer_pool(card,
238 					QETH_IN_BUF_COUNT_MAX);
239 		} else
240 			rc = -EPERM;
241 		break;
242 	default:
243 		rc = -EINVAL;
244 	}
245 out:
246 	mutex_unlock(&card->conf_mutex);
247 	return rc ? rc : count;
248 }
249 
250 static DEVICE_ATTR(sniffer, 0644, qeth_l3_dev_sniffer_show,
251 		qeth_l3_dev_sniffer_store);
252 
253 
254 static ssize_t qeth_l3_dev_hsuid_show(struct device *dev,
255 		struct device_attribute *attr, char *buf)
256 {
257 	struct qeth_card *card = dev_get_drvdata(dev);
258 	char tmp_hsuid[9];
259 
260 	if (!card)
261 		return -EINVAL;
262 
263 	if (card->info.type != QETH_CARD_TYPE_IQD)
264 		return -EPERM;
265 
266 	memcpy(tmp_hsuid, card->options.hsuid, sizeof(tmp_hsuid));
267 	EBCASC(tmp_hsuid, 8);
268 	return sprintf(buf, "%s\n", tmp_hsuid);
269 }
270 
271 static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
272 		struct device_attribute *attr, const char *buf, size_t count)
273 {
274 	struct qeth_card *card = dev_get_drvdata(dev);
275 	char *tmp;
276 	int rc;
277 
278 	if (!card)
279 		return -EINVAL;
280 
281 	if (card->info.type != QETH_CARD_TYPE_IQD)
282 		return -EPERM;
283 	if (card->state != CARD_STATE_DOWN &&
284 	    card->state != CARD_STATE_RECOVER)
285 		return -EPERM;
286 	if (card->options.sniffer)
287 		return -EPERM;
288 	if (card->options.cq == QETH_CQ_NOTAVAILABLE)
289 		return -EPERM;
290 
291 	tmp = strsep((char **)&buf, "\n");
292 	if (strlen(tmp) > 8)
293 		return -EINVAL;
294 
295 	if (card->options.hsuid[0])
296 		/* delete old ip address */
297 		qeth_l3_modify_hsuid(card, false);
298 
299 	if (strlen(tmp) == 0) {
300 		/* delete ip address only */
301 		card->options.hsuid[0] = '\0';
302 		if (card->dev)
303 			memcpy(card->dev->perm_addr, card->options.hsuid, 9);
304 		qeth_configure_cq(card, QETH_CQ_DISABLED);
305 		return count;
306 	}
307 
308 	if (qeth_configure_cq(card, QETH_CQ_ENABLED))
309 		return -EPERM;
310 
311 	snprintf(card->options.hsuid, sizeof(card->options.hsuid),
312 		 "%-8s", tmp);
313 	ASCEBC(card->options.hsuid, 8);
314 	if (card->dev)
315 		memcpy(card->dev->perm_addr, card->options.hsuid, 9);
316 
317 	rc = qeth_l3_modify_hsuid(card, true);
318 
319 	return rc ? rc : count;
320 }
321 
322 static DEVICE_ATTR(hsuid, 0644, qeth_l3_dev_hsuid_show,
323 		   qeth_l3_dev_hsuid_store);
324 
325 
326 static struct attribute *qeth_l3_device_attrs[] = {
327 	&dev_attr_route4.attr,
328 	&dev_attr_route6.attr,
329 	&dev_attr_fake_broadcast.attr,
330 	&dev_attr_sniffer.attr,
331 	&dev_attr_hsuid.attr,
332 	NULL,
333 };
334 
335 static const struct attribute_group qeth_l3_device_attr_group = {
336 	.attrs = qeth_l3_device_attrs,
337 };
338 
339 static ssize_t qeth_l3_dev_ipato_enable_show(struct device *dev,
340 			struct device_attribute *attr, char *buf)
341 {
342 	struct qeth_card *card = dev_get_drvdata(dev);
343 
344 	if (!card)
345 		return -EINVAL;
346 
347 	return sprintf(buf, "%i\n", card->ipato.enabled? 1:0);
348 }
349 
350 static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev,
351 		struct device_attribute *attr, const char *buf, size_t count)
352 {
353 	struct qeth_card *card = dev_get_drvdata(dev);
354 	bool enable;
355 	int rc = 0;
356 
357 	if (!card)
358 		return -EINVAL;
359 
360 	mutex_lock(&card->conf_mutex);
361 	if ((card->state != CARD_STATE_DOWN) &&
362 	    (card->state != CARD_STATE_RECOVER)) {
363 		rc = -EPERM;
364 		goto out;
365 	}
366 
367 	if (sysfs_streq(buf, "toggle")) {
368 		enable = !card->ipato.enabled;
369 	} else if (kstrtobool(buf, &enable)) {
370 		rc = -EINVAL;
371 		goto out;
372 	}
373 
374 	if (card->ipato.enabled != enable) {
375 		card->ipato.enabled = enable;
376 		spin_lock_bh(&card->ip_lock);
377 		qeth_l3_update_ipato(card);
378 		spin_unlock_bh(&card->ip_lock);
379 	}
380 out:
381 	mutex_unlock(&card->conf_mutex);
382 	return rc ? rc : count;
383 }
384 
385 static QETH_DEVICE_ATTR(ipato_enable, enable, 0644,
386 			qeth_l3_dev_ipato_enable_show,
387 			qeth_l3_dev_ipato_enable_store);
388 
389 static ssize_t qeth_l3_dev_ipato_invert4_show(struct device *dev,
390 				struct device_attribute *attr, char *buf)
391 {
392 	struct qeth_card *card = dev_get_drvdata(dev);
393 
394 	if (!card)
395 		return -EINVAL;
396 
397 	return sprintf(buf, "%i\n", card->ipato.invert4? 1:0);
398 }
399 
400 static ssize_t qeth_l3_dev_ipato_invert4_store(struct device *dev,
401 				struct device_attribute *attr,
402 				const char *buf, size_t count)
403 {
404 	struct qeth_card *card = dev_get_drvdata(dev);
405 	bool invert;
406 	int rc = 0;
407 
408 	if (!card)
409 		return -EINVAL;
410 
411 	mutex_lock(&card->conf_mutex);
412 	if (sysfs_streq(buf, "toggle")) {
413 		invert = !card->ipato.invert4;
414 	} else if (kstrtobool(buf, &invert)) {
415 		rc = -EINVAL;
416 		goto out;
417 	}
418 
419 	if (card->ipato.invert4 != invert) {
420 		card->ipato.invert4 = invert;
421 		spin_lock_bh(&card->ip_lock);
422 		qeth_l3_update_ipato(card);
423 		spin_unlock_bh(&card->ip_lock);
424 	}
425 out:
426 	mutex_unlock(&card->conf_mutex);
427 	return rc ? rc : count;
428 }
429 
430 static QETH_DEVICE_ATTR(ipato_invert4, invert4, 0644,
431 			qeth_l3_dev_ipato_invert4_show,
432 			qeth_l3_dev_ipato_invert4_store);
433 
434 static ssize_t qeth_l3_dev_ipato_add_show(char *buf, struct qeth_card *card,
435 			enum qeth_prot_versions proto)
436 {
437 	struct qeth_ipato_entry *ipatoe;
438 	char addr_str[40];
439 	int entry_len; /* length of 1 entry string, differs between v4 and v6 */
440 	int i = 0;
441 
442 	entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
443 	/* add strlen for "/<mask>\n" */
444 	entry_len += (proto == QETH_PROT_IPV4)? 5 : 6;
445 	spin_lock_bh(&card->ip_lock);
446 	list_for_each_entry(ipatoe, &card->ipato.entries, entry) {
447 		if (ipatoe->proto != proto)
448 			continue;
449 		/* String must not be longer than PAGE_SIZE. So we check if
450 		 * string length gets near PAGE_SIZE. Then we can savely display
451 		 * the next IPv6 address (worst case, compared to IPv4) */
452 		if ((PAGE_SIZE - i) <= entry_len)
453 			break;
454 		qeth_l3_ipaddr_to_string(proto, ipatoe->addr, addr_str);
455 		i += snprintf(buf + i, PAGE_SIZE - i,
456 			      "%s/%i\n", addr_str, ipatoe->mask_bits);
457 	}
458 	spin_unlock_bh(&card->ip_lock);
459 	i += snprintf(buf + i, PAGE_SIZE - i, "\n");
460 
461 	return i;
462 }
463 
464 static ssize_t qeth_l3_dev_ipato_add4_show(struct device *dev,
465 				struct device_attribute *attr, char *buf)
466 {
467 	struct qeth_card *card = dev_get_drvdata(dev);
468 
469 	if (!card)
470 		return -EINVAL;
471 
472 	return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV4);
473 }
474 
475 static int qeth_l3_parse_ipatoe(const char *buf, enum qeth_prot_versions proto,
476 		  u8 *addr, int *mask_bits)
477 {
478 	const char *start, *end;
479 	char *tmp;
480 	char buffer[40] = {0, };
481 
482 	start = buf;
483 	/* get address string */
484 	end = strchr(start, '/');
485 	if (!end || (end - start >= 40)) {
486 		return -EINVAL;
487 	}
488 	strncpy(buffer, start, end - start);
489 	if (qeth_l3_string_to_ipaddr(buffer, proto, addr)) {
490 		return -EINVAL;
491 	}
492 	start = end + 1;
493 	*mask_bits = simple_strtoul(start, &tmp, 10);
494 	if (!strlen(start) ||
495 	    (tmp == start) ||
496 	    (*mask_bits > ((proto == QETH_PROT_IPV4) ? 32 : 128))) {
497 		return -EINVAL;
498 	}
499 	return 0;
500 }
501 
502 static ssize_t qeth_l3_dev_ipato_add_store(const char *buf, size_t count,
503 			 struct qeth_card *card, enum qeth_prot_versions proto)
504 {
505 	struct qeth_ipato_entry *ipatoe;
506 	u8 addr[16];
507 	int mask_bits;
508 	int rc = 0;
509 
510 	mutex_lock(&card->conf_mutex);
511 	rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
512 	if (rc)
513 		goto out;
514 
515 	ipatoe = kzalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL);
516 	if (!ipatoe) {
517 		rc = -ENOMEM;
518 		goto out;
519 	}
520 	ipatoe->proto = proto;
521 	memcpy(ipatoe->addr, addr, (proto == QETH_PROT_IPV4)? 4:16);
522 	ipatoe->mask_bits = mask_bits;
523 
524 	rc = qeth_l3_add_ipato_entry(card, ipatoe);
525 	if (rc)
526 		kfree(ipatoe);
527 out:
528 	mutex_unlock(&card->conf_mutex);
529 	return rc ? rc : count;
530 }
531 
532 static ssize_t qeth_l3_dev_ipato_add4_store(struct device *dev,
533 		struct device_attribute *attr, const char *buf, size_t count)
534 {
535 	struct qeth_card *card = dev_get_drvdata(dev);
536 
537 	if (!card)
538 		return -EINVAL;
539 
540 	return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV4);
541 }
542 
543 static QETH_DEVICE_ATTR(ipato_add4, add4, 0644,
544 			qeth_l3_dev_ipato_add4_show,
545 			qeth_l3_dev_ipato_add4_store);
546 
547 static ssize_t qeth_l3_dev_ipato_del_store(const char *buf, size_t count,
548 			 struct qeth_card *card, enum qeth_prot_versions proto)
549 {
550 	u8 addr[16];
551 	int mask_bits;
552 	int rc = 0;
553 
554 	mutex_lock(&card->conf_mutex);
555 	rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
556 	if (!rc)
557 		rc = qeth_l3_del_ipato_entry(card, proto, addr, mask_bits);
558 	mutex_unlock(&card->conf_mutex);
559 	return rc ? rc : count;
560 }
561 
562 static ssize_t qeth_l3_dev_ipato_del4_store(struct device *dev,
563 		struct device_attribute *attr, const char *buf, size_t count)
564 {
565 	struct qeth_card *card = dev_get_drvdata(dev);
566 
567 	if (!card)
568 		return -EINVAL;
569 
570 	return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV4);
571 }
572 
573 static QETH_DEVICE_ATTR(ipato_del4, del4, 0200, NULL,
574 			qeth_l3_dev_ipato_del4_store);
575 
576 static ssize_t qeth_l3_dev_ipato_invert6_show(struct device *dev,
577 		struct device_attribute *attr, char *buf)
578 {
579 	struct qeth_card *card = dev_get_drvdata(dev);
580 
581 	if (!card)
582 		return -EINVAL;
583 
584 	return sprintf(buf, "%i\n", card->ipato.invert6? 1:0);
585 }
586 
587 static ssize_t qeth_l3_dev_ipato_invert6_store(struct device *dev,
588 		struct device_attribute *attr, const char *buf, size_t count)
589 {
590 	struct qeth_card *card = dev_get_drvdata(dev);
591 	bool invert;
592 	int rc = 0;
593 
594 	if (!card)
595 		return -EINVAL;
596 
597 	mutex_lock(&card->conf_mutex);
598 	if (sysfs_streq(buf, "toggle")) {
599 		invert = !card->ipato.invert6;
600 	} else if (kstrtobool(buf, &invert)) {
601 		rc = -EINVAL;
602 		goto out;
603 	}
604 
605 	if (card->ipato.invert6 != invert) {
606 		card->ipato.invert6 = invert;
607 		spin_lock_bh(&card->ip_lock);
608 		qeth_l3_update_ipato(card);
609 		spin_unlock_bh(&card->ip_lock);
610 	}
611 out:
612 	mutex_unlock(&card->conf_mutex);
613 	return rc ? rc : count;
614 }
615 
616 static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644,
617 			qeth_l3_dev_ipato_invert6_show,
618 			qeth_l3_dev_ipato_invert6_store);
619 
620 
621 static ssize_t qeth_l3_dev_ipato_add6_show(struct device *dev,
622 				struct device_attribute *attr, char *buf)
623 {
624 	struct qeth_card *card = dev_get_drvdata(dev);
625 
626 	if (!card)
627 		return -EINVAL;
628 
629 	return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV6);
630 }
631 
632 static ssize_t qeth_l3_dev_ipato_add6_store(struct device *dev,
633 		struct device_attribute *attr, const char *buf, size_t count)
634 {
635 	struct qeth_card *card = dev_get_drvdata(dev);
636 
637 	if (!card)
638 		return -EINVAL;
639 
640 	return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV6);
641 }
642 
643 static QETH_DEVICE_ATTR(ipato_add6, add6, 0644,
644 			qeth_l3_dev_ipato_add6_show,
645 			qeth_l3_dev_ipato_add6_store);
646 
647 static ssize_t qeth_l3_dev_ipato_del6_store(struct device *dev,
648 		struct device_attribute *attr, const char *buf, size_t count)
649 {
650 	struct qeth_card *card = dev_get_drvdata(dev);
651 
652 	if (!card)
653 		return -EINVAL;
654 
655 	return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV6);
656 }
657 
658 static QETH_DEVICE_ATTR(ipato_del6, del6, 0200, NULL,
659 			qeth_l3_dev_ipato_del6_store);
660 
661 static struct attribute *qeth_ipato_device_attrs[] = {
662 	&dev_attr_ipato_enable.attr,
663 	&dev_attr_ipato_invert4.attr,
664 	&dev_attr_ipato_add4.attr,
665 	&dev_attr_ipato_del4.attr,
666 	&dev_attr_ipato_invert6.attr,
667 	&dev_attr_ipato_add6.attr,
668 	&dev_attr_ipato_del6.attr,
669 	NULL,
670 };
671 
672 static const struct attribute_group qeth_device_ipato_group = {
673 	.name = "ipa_takeover",
674 	.attrs = qeth_ipato_device_attrs,
675 };
676 
677 static ssize_t qeth_l3_dev_ip_add_show(struct device *dev, char *buf,
678 				       enum qeth_prot_versions proto,
679 				       enum qeth_ip_types type)
680 {
681 	struct qeth_card *card = dev_get_drvdata(dev);
682 	struct qeth_ipaddr *ipaddr;
683 	char addr_str[40];
684 	int str_len = 0;
685 	int entry_len; /* length of 1 entry string, differs between v4 and v6 */
686 	int i;
687 
688 	if (!card)
689 		return -EINVAL;
690 
691 	entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
692 	entry_len += 2; /* \n + terminator */
693 	spin_lock_bh(&card->ip_lock);
694 	hash_for_each(card->ip_htable, i, ipaddr, hnode) {
695 		if (ipaddr->proto != proto || ipaddr->type != type)
696 			continue;
697 		/* String must not be longer than PAGE_SIZE. So we check if
698 		 * string length gets near PAGE_SIZE. Then we can savely display
699 		 * the next IPv6 address (worst case, compared to IPv4) */
700 		if ((PAGE_SIZE - str_len) <= entry_len)
701 			break;
702 		qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u,
703 			addr_str);
704 		str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "%s\n",
705 				    addr_str);
706 	}
707 	spin_unlock_bh(&card->ip_lock);
708 	str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "\n");
709 
710 	return str_len;
711 }
712 
713 static ssize_t qeth_l3_dev_vipa_add4_show(struct device *dev,
714 					  struct device_attribute *attr,
715 					  char *buf)
716 {
717 	return qeth_l3_dev_ip_add_show(dev, buf, QETH_PROT_IPV4,
718 				       QETH_IP_TYPE_VIPA);
719 }
720 
721 static int qeth_l3_parse_vipae(const char *buf, enum qeth_prot_versions proto,
722 		 u8 *addr)
723 {
724 	if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
725 		return -EINVAL;
726 	}
727 	return 0;
728 }
729 
730 static ssize_t qeth_l3_dev_vipa_add_store(const char *buf, size_t count,
731 			struct qeth_card *card, enum qeth_prot_versions proto)
732 {
733 	u8 addr[16] = {0, };
734 	int rc;
735 
736 	mutex_lock(&card->conf_mutex);
737 	rc = qeth_l3_parse_vipae(buf, proto, addr);
738 	if (!rc)
739 		rc = qeth_l3_modify_rxip_vipa(card, true, addr,
740 					      QETH_IP_TYPE_VIPA, proto);
741 	mutex_unlock(&card->conf_mutex);
742 	return rc ? rc : count;
743 }
744 
745 static ssize_t qeth_l3_dev_vipa_add4_store(struct device *dev,
746 		struct device_attribute *attr, const char *buf, size_t count)
747 {
748 	struct qeth_card *card = dev_get_drvdata(dev);
749 
750 	if (!card)
751 		return -EINVAL;
752 
753 	return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV4);
754 }
755 
756 static QETH_DEVICE_ATTR(vipa_add4, add4, 0644,
757 			qeth_l3_dev_vipa_add4_show,
758 			qeth_l3_dev_vipa_add4_store);
759 
760 static ssize_t qeth_l3_dev_vipa_del_store(const char *buf, size_t count,
761 			 struct qeth_card *card, enum qeth_prot_versions proto)
762 {
763 	u8 addr[16];
764 	int rc;
765 
766 	mutex_lock(&card->conf_mutex);
767 	rc = qeth_l3_parse_vipae(buf, proto, addr);
768 	if (!rc)
769 		rc = qeth_l3_modify_rxip_vipa(card, false, addr,
770 					      QETH_IP_TYPE_VIPA, proto);
771 	mutex_unlock(&card->conf_mutex);
772 	return rc ? rc : count;
773 }
774 
775 static ssize_t qeth_l3_dev_vipa_del4_store(struct device *dev,
776 		struct device_attribute *attr, const char *buf, size_t count)
777 {
778 	struct qeth_card *card = dev_get_drvdata(dev);
779 
780 	if (!card)
781 		return -EINVAL;
782 
783 	return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV4);
784 }
785 
786 static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL,
787 			qeth_l3_dev_vipa_del4_store);
788 
789 static ssize_t qeth_l3_dev_vipa_add6_show(struct device *dev,
790 					  struct device_attribute *attr,
791 					  char *buf)
792 {
793 	return qeth_l3_dev_ip_add_show(dev, buf, QETH_PROT_IPV6,
794 				       QETH_IP_TYPE_VIPA);
795 }
796 
797 static ssize_t qeth_l3_dev_vipa_add6_store(struct device *dev,
798 		struct device_attribute *attr, const char *buf, size_t count)
799 {
800 	struct qeth_card *card = dev_get_drvdata(dev);
801 
802 	if (!card)
803 		return -EINVAL;
804 
805 	return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV6);
806 }
807 
808 static QETH_DEVICE_ATTR(vipa_add6, add6, 0644,
809 			qeth_l3_dev_vipa_add6_show,
810 			qeth_l3_dev_vipa_add6_store);
811 
812 static ssize_t qeth_l3_dev_vipa_del6_store(struct device *dev,
813 		struct device_attribute *attr, const char *buf, size_t count)
814 {
815 	struct qeth_card *card = dev_get_drvdata(dev);
816 
817 	if (!card)
818 		return -EINVAL;
819 
820 	return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV6);
821 }
822 
823 static QETH_DEVICE_ATTR(vipa_del6, del6, 0200, NULL,
824 			qeth_l3_dev_vipa_del6_store);
825 
826 static struct attribute *qeth_vipa_device_attrs[] = {
827 	&dev_attr_vipa_add4.attr,
828 	&dev_attr_vipa_del4.attr,
829 	&dev_attr_vipa_add6.attr,
830 	&dev_attr_vipa_del6.attr,
831 	NULL,
832 };
833 
834 static const struct attribute_group qeth_device_vipa_group = {
835 	.name = "vipa",
836 	.attrs = qeth_vipa_device_attrs,
837 };
838 
839 static ssize_t qeth_l3_dev_rxip_add4_show(struct device *dev,
840 					  struct device_attribute *attr,
841 					  char *buf)
842 {
843 	return qeth_l3_dev_ip_add_show(dev, buf, QETH_PROT_IPV4,
844 				       QETH_IP_TYPE_RXIP);
845 }
846 
847 static int qeth_l3_parse_rxipe(const char *buf, enum qeth_prot_versions proto,
848 		 u8 *addr)
849 {
850 	__be32 ipv4_addr;
851 	struct in6_addr ipv6_addr;
852 
853 	if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
854 		return -EINVAL;
855 	}
856 	if (proto == QETH_PROT_IPV4) {
857 		memcpy(&ipv4_addr, addr, sizeof(ipv4_addr));
858 		if (ipv4_is_multicast(ipv4_addr)) {
859 			QETH_DBF_MESSAGE(2, "multicast rxip not supported.\n");
860 			return -EINVAL;
861 		}
862 	} else if (proto == QETH_PROT_IPV6) {
863 		memcpy(&ipv6_addr, addr, sizeof(ipv6_addr));
864 		if (ipv6_addr_is_multicast(&ipv6_addr)) {
865 			QETH_DBF_MESSAGE(2, "multicast rxip not supported.\n");
866 			return -EINVAL;
867 		}
868 	}
869 
870 	return 0;
871 }
872 
873 static ssize_t qeth_l3_dev_rxip_add_store(const char *buf, size_t count,
874 			struct qeth_card *card, enum qeth_prot_versions proto)
875 {
876 	u8 addr[16] = {0, };
877 	int rc;
878 
879 	mutex_lock(&card->conf_mutex);
880 	rc = qeth_l3_parse_rxipe(buf, proto, addr);
881 	if (!rc)
882 		rc = qeth_l3_modify_rxip_vipa(card, true, addr,
883 					      QETH_IP_TYPE_RXIP, proto);
884 	mutex_unlock(&card->conf_mutex);
885 	return rc ? rc : count;
886 }
887 
888 static ssize_t qeth_l3_dev_rxip_add4_store(struct device *dev,
889 		struct device_attribute *attr, const char *buf, size_t count)
890 {
891 	struct qeth_card *card = dev_get_drvdata(dev);
892 
893 	if (!card)
894 		return -EINVAL;
895 
896 	return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV4);
897 }
898 
899 static QETH_DEVICE_ATTR(rxip_add4, add4, 0644,
900 			qeth_l3_dev_rxip_add4_show,
901 			qeth_l3_dev_rxip_add4_store);
902 
903 static ssize_t qeth_l3_dev_rxip_del_store(const char *buf, size_t count,
904 			struct qeth_card *card, enum qeth_prot_versions proto)
905 {
906 	u8 addr[16];
907 	int rc;
908 
909 	mutex_lock(&card->conf_mutex);
910 	rc = qeth_l3_parse_rxipe(buf, proto, addr);
911 	if (!rc)
912 		rc = qeth_l3_modify_rxip_vipa(card, false, addr,
913 					      QETH_IP_TYPE_RXIP, proto);
914 	mutex_unlock(&card->conf_mutex);
915 	return rc ? rc : count;
916 }
917 
918 static ssize_t qeth_l3_dev_rxip_del4_store(struct device *dev,
919 		struct device_attribute *attr, const char *buf, size_t count)
920 {
921 	struct qeth_card *card = dev_get_drvdata(dev);
922 
923 	if (!card)
924 		return -EINVAL;
925 
926 	return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV4);
927 }
928 
929 static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL,
930 			qeth_l3_dev_rxip_del4_store);
931 
932 static ssize_t qeth_l3_dev_rxip_add6_show(struct device *dev,
933 					  struct device_attribute *attr,
934 					  char *buf)
935 {
936 	return qeth_l3_dev_ip_add_show(dev, buf, QETH_PROT_IPV6,
937 				       QETH_IP_TYPE_RXIP);
938 }
939 
940 static ssize_t qeth_l3_dev_rxip_add6_store(struct device *dev,
941 		struct device_attribute *attr, const char *buf, size_t count)
942 {
943 	struct qeth_card *card = dev_get_drvdata(dev);
944 
945 	if (!card)
946 		return -EINVAL;
947 
948 	return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV6);
949 }
950 
951 static QETH_DEVICE_ATTR(rxip_add6, add6, 0644,
952 			qeth_l3_dev_rxip_add6_show,
953 			qeth_l3_dev_rxip_add6_store);
954 
955 static ssize_t qeth_l3_dev_rxip_del6_store(struct device *dev,
956 		struct device_attribute *attr, const char *buf, size_t count)
957 {
958 	struct qeth_card *card = dev_get_drvdata(dev);
959 
960 	if (!card)
961 		return -EINVAL;
962 
963 	return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV6);
964 }
965 
966 static QETH_DEVICE_ATTR(rxip_del6, del6, 0200, NULL,
967 			qeth_l3_dev_rxip_del6_store);
968 
969 static struct attribute *qeth_rxip_device_attrs[] = {
970 	&dev_attr_rxip_add4.attr,
971 	&dev_attr_rxip_del4.attr,
972 	&dev_attr_rxip_add6.attr,
973 	&dev_attr_rxip_del6.attr,
974 	NULL,
975 };
976 
977 static const struct attribute_group qeth_device_rxip_group = {
978 	.name = "rxip",
979 	.attrs = qeth_rxip_device_attrs,
980 };
981 
982 static const struct attribute_group *qeth_l3_only_attr_groups[] = {
983 	&qeth_l3_device_attr_group,
984 	&qeth_device_ipato_group,
985 	&qeth_device_vipa_group,
986 	&qeth_device_rxip_group,
987 	NULL,
988 };
989 
990 int qeth_l3_create_device_attributes(struct device *dev)
991 {
992 	return sysfs_create_groups(&dev->kobj, qeth_l3_only_attr_groups);
993 }
994 
995 void qeth_l3_remove_device_attributes(struct device *dev)
996 {
997 	sysfs_remove_groups(&dev->kobj, qeth_l3_only_attr_groups);
998 }
999 
1000 const struct attribute_group *qeth_l3_attr_groups[] = {
1001 	&qeth_device_attr_group,
1002 	&qeth_device_blkt_group,
1003 	/* l3 specific, see qeth_l3_only_attr_groups: */
1004 	&qeth_l3_device_attr_group,
1005 	&qeth_device_ipato_group,
1006 	&qeth_device_vipa_group,
1007 	&qeth_device_rxip_group,
1008 	NULL,
1009 };
1010