1 /* 2 * drivers/s390/net/qeth_l3_sys.c 3 * 4 * Copyright IBM Corp. 2007 5 * Author(s): Utz Bacher <utz.bacher@de.ibm.com>, 6 * Frank Pavlic <fpavlic@de.ibm.com>, 7 * Thomas Spatzier <tspat@de.ibm.com>, 8 * Frank Blaschka <frank.blaschka@de.ibm.com> 9 */ 10 11 #include <linux/slab.h> 12 13 #include "qeth_l3.h" 14 15 #define QETH_DEVICE_ATTR(_id, _name, _mode, _show, _store) \ 16 struct device_attribute dev_attr_##_id = __ATTR(_name, _mode, _show, _store) 17 18 static const char *qeth_l3_get_checksum_str(struct qeth_card *card) 19 { 20 if (card->options.checksum_type == SW_CHECKSUMMING) 21 return "sw"; 22 else if (card->options.checksum_type == HW_CHECKSUMMING) 23 return "hw"; 24 else 25 return "no"; 26 } 27 28 static ssize_t qeth_l3_dev_route_show(struct qeth_card *card, 29 struct qeth_routing_info *route, char *buf) 30 { 31 switch (route->type) { 32 case PRIMARY_ROUTER: 33 return sprintf(buf, "%s\n", "primary router"); 34 case SECONDARY_ROUTER: 35 return sprintf(buf, "%s\n", "secondary router"); 36 case MULTICAST_ROUTER: 37 if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO) 38 return sprintf(buf, "%s\n", "multicast router+"); 39 else 40 return sprintf(buf, "%s\n", "multicast router"); 41 case PRIMARY_CONNECTOR: 42 if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO) 43 return sprintf(buf, "%s\n", "primary connector+"); 44 else 45 return sprintf(buf, "%s\n", "primary connector"); 46 case SECONDARY_CONNECTOR: 47 if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO) 48 return sprintf(buf, "%s\n", "secondary connector+"); 49 else 50 return sprintf(buf, "%s\n", "secondary connector"); 51 default: 52 return sprintf(buf, "%s\n", "no"); 53 } 54 } 55 56 static ssize_t qeth_l3_dev_route4_show(struct device *dev, 57 struct device_attribute *attr, char *buf) 58 { 59 struct qeth_card *card = dev_get_drvdata(dev); 60 61 if (!card) 62 return -EINVAL; 63 64 return qeth_l3_dev_route_show(card, &card->options.route4, buf); 65 } 66 67 static ssize_t qeth_l3_dev_route_store(struct qeth_card *card, 68 struct qeth_routing_info *route, enum qeth_prot_versions prot, 69 const char *buf, size_t count) 70 { 71 enum qeth_routing_types old_route_type = route->type; 72 char *tmp; 73 int rc = 0; 74 75 tmp = strsep((char **) &buf, "\n"); 76 mutex_lock(&card->conf_mutex); 77 if (!strcmp(tmp, "no_router")) { 78 route->type = NO_ROUTER; 79 } else if (!strcmp(tmp, "primary_connector")) { 80 route->type = PRIMARY_CONNECTOR; 81 } else if (!strcmp(tmp, "secondary_connector")) { 82 route->type = SECONDARY_CONNECTOR; 83 } else if (!strcmp(tmp, "primary_router")) { 84 route->type = PRIMARY_ROUTER; 85 } else if (!strcmp(tmp, "secondary_router")) { 86 route->type = SECONDARY_ROUTER; 87 } else if (!strcmp(tmp, "multicast_router")) { 88 route->type = MULTICAST_ROUTER; 89 } else { 90 rc = -EINVAL; 91 goto out; 92 } 93 if (((card->state == CARD_STATE_SOFTSETUP) || 94 (card->state == CARD_STATE_UP)) && 95 (old_route_type != route->type)) { 96 if (prot == QETH_PROT_IPV4) 97 rc = qeth_l3_setrouting_v4(card); 98 else if (prot == QETH_PROT_IPV6) 99 rc = qeth_l3_setrouting_v6(card); 100 } 101 out: 102 mutex_unlock(&card->conf_mutex); 103 return rc ? rc : count; 104 } 105 106 static ssize_t qeth_l3_dev_route4_store(struct device *dev, 107 struct device_attribute *attr, const char *buf, size_t count) 108 { 109 struct qeth_card *card = dev_get_drvdata(dev); 110 111 if (!card) 112 return -EINVAL; 113 114 return qeth_l3_dev_route_store(card, &card->options.route4, 115 QETH_PROT_IPV4, buf, count); 116 } 117 118 static DEVICE_ATTR(route4, 0644, qeth_l3_dev_route4_show, 119 qeth_l3_dev_route4_store); 120 121 static ssize_t qeth_l3_dev_route6_show(struct device *dev, 122 struct device_attribute *attr, char *buf) 123 { 124 struct qeth_card *card = dev_get_drvdata(dev); 125 126 if (!card) 127 return -EINVAL; 128 129 return qeth_l3_dev_route_show(card, &card->options.route6, buf); 130 } 131 132 static ssize_t qeth_l3_dev_route6_store(struct device *dev, 133 struct device_attribute *attr, const char *buf, size_t count) 134 { 135 struct qeth_card *card = dev_get_drvdata(dev); 136 137 if (!card) 138 return -EINVAL; 139 140 return qeth_l3_dev_route_store(card, &card->options.route6, 141 QETH_PROT_IPV6, buf, count); 142 } 143 144 static DEVICE_ATTR(route6, 0644, qeth_l3_dev_route6_show, 145 qeth_l3_dev_route6_store); 146 147 static ssize_t qeth_l3_dev_fake_broadcast_show(struct device *dev, 148 struct device_attribute *attr, char *buf) 149 { 150 struct qeth_card *card = dev_get_drvdata(dev); 151 152 if (!card) 153 return -EINVAL; 154 155 return sprintf(buf, "%i\n", card->options.fake_broadcast? 1:0); 156 } 157 158 static ssize_t qeth_l3_dev_fake_broadcast_store(struct device *dev, 159 struct device_attribute *attr, const char *buf, size_t count) 160 { 161 struct qeth_card *card = dev_get_drvdata(dev); 162 char *tmp; 163 int i, rc = 0; 164 165 if (!card) 166 return -EINVAL; 167 168 mutex_lock(&card->conf_mutex); 169 if ((card->state != CARD_STATE_DOWN) && 170 (card->state != CARD_STATE_RECOVER)) { 171 rc = -EPERM; 172 goto out; 173 } 174 175 i = simple_strtoul(buf, &tmp, 16); 176 if ((i == 0) || (i == 1)) 177 card->options.fake_broadcast = i; 178 else 179 rc = -EINVAL; 180 out: 181 mutex_unlock(&card->conf_mutex); 182 return rc ? rc : count; 183 } 184 185 static DEVICE_ATTR(fake_broadcast, 0644, qeth_l3_dev_fake_broadcast_show, 186 qeth_l3_dev_fake_broadcast_store); 187 188 static ssize_t qeth_l3_dev_broadcast_mode_show(struct device *dev, 189 struct device_attribute *attr, char *buf) 190 { 191 struct qeth_card *card = dev_get_drvdata(dev); 192 193 if (!card) 194 return -EINVAL; 195 196 if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) || 197 (card->info.link_type == QETH_LINK_TYPE_LANE_TR))) 198 return sprintf(buf, "n/a\n"); 199 200 return sprintf(buf, "%s\n", (card->options.broadcast_mode == 201 QETH_TR_BROADCAST_ALLRINGS)? 202 "all rings":"local"); 203 } 204 205 static ssize_t qeth_l3_dev_broadcast_mode_store(struct device *dev, 206 struct device_attribute *attr, const char *buf, size_t count) 207 { 208 struct qeth_card *card = dev_get_drvdata(dev); 209 char *tmp; 210 int rc = 0; 211 212 if (!card) 213 return -EINVAL; 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 if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) || 223 (card->info.link_type == QETH_LINK_TYPE_LANE_TR))) { 224 rc = -EINVAL; 225 goto out; 226 } 227 228 tmp = strsep((char **) &buf, "\n"); 229 230 if (!strcmp(tmp, "local")) 231 card->options.broadcast_mode = QETH_TR_BROADCAST_LOCAL; 232 else if (!strcmp(tmp, "all_rings")) 233 card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS; 234 else 235 rc = -EINVAL; 236 out: 237 mutex_unlock(&card->conf_mutex); 238 return rc ? rc : count; 239 } 240 241 static DEVICE_ATTR(broadcast_mode, 0644, qeth_l3_dev_broadcast_mode_show, 242 qeth_l3_dev_broadcast_mode_store); 243 244 static ssize_t qeth_l3_dev_canonical_macaddr_show(struct device *dev, 245 struct device_attribute *attr, char *buf) 246 { 247 struct qeth_card *card = dev_get_drvdata(dev); 248 249 if (!card) 250 return -EINVAL; 251 252 if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) || 253 (card->info.link_type == QETH_LINK_TYPE_LANE_TR))) 254 return sprintf(buf, "n/a\n"); 255 256 return sprintf(buf, "%i\n", (card->options.macaddr_mode == 257 QETH_TR_MACADDR_CANONICAL)? 1:0); 258 } 259 260 static ssize_t qeth_l3_dev_canonical_macaddr_store(struct device *dev, 261 struct device_attribute *attr, const char *buf, size_t count) 262 { 263 struct qeth_card *card = dev_get_drvdata(dev); 264 char *tmp; 265 int i, rc = 0; 266 267 if (!card) 268 return -EINVAL; 269 270 mutex_lock(&card->conf_mutex); 271 if ((card->state != CARD_STATE_DOWN) && 272 (card->state != CARD_STATE_RECOVER)) { 273 rc = -EPERM; 274 goto out; 275 } 276 277 if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) || 278 (card->info.link_type == QETH_LINK_TYPE_LANE_TR))) { 279 rc = -EINVAL; 280 goto out; 281 } 282 283 i = simple_strtoul(buf, &tmp, 16); 284 if ((i == 0) || (i == 1)) 285 card->options.macaddr_mode = i? 286 QETH_TR_MACADDR_CANONICAL : 287 QETH_TR_MACADDR_NONCANONICAL; 288 else 289 rc = -EINVAL; 290 out: 291 mutex_unlock(&card->conf_mutex); 292 return rc ? rc : count; 293 } 294 295 static DEVICE_ATTR(canonical_macaddr, 0644, qeth_l3_dev_canonical_macaddr_show, 296 qeth_l3_dev_canonical_macaddr_store); 297 298 static ssize_t qeth_l3_dev_checksum_show(struct device *dev, 299 struct device_attribute *attr, char *buf) 300 { 301 struct qeth_card *card = dev_get_drvdata(dev); 302 303 if (!card) 304 return -EINVAL; 305 306 return sprintf(buf, "%s checksumming\n", 307 qeth_l3_get_checksum_str(card)); 308 } 309 310 static ssize_t qeth_l3_dev_checksum_store(struct device *dev, 311 struct device_attribute *attr, const char *buf, size_t count) 312 { 313 struct qeth_card *card = dev_get_drvdata(dev); 314 enum qeth_checksum_types csum_type; 315 char *tmp; 316 int rc = 0; 317 318 if (!card) 319 return -EINVAL; 320 321 mutex_lock(&card->conf_mutex); 322 tmp = strsep((char **) &buf, "\n"); 323 if (!strcmp(tmp, "sw_checksumming")) 324 csum_type = SW_CHECKSUMMING; 325 else if (!strcmp(tmp, "hw_checksumming")) 326 csum_type = HW_CHECKSUMMING; 327 else if (!strcmp(tmp, "no_checksumming")) 328 csum_type = NO_CHECKSUMMING; 329 else { 330 rc = -EINVAL; 331 goto out; 332 } 333 334 rc = qeth_l3_set_rx_csum(card, csum_type); 335 out: 336 mutex_unlock(&card->conf_mutex); 337 return rc ? rc : count; 338 } 339 340 static DEVICE_ATTR(checksumming, 0644, qeth_l3_dev_checksum_show, 341 qeth_l3_dev_checksum_store); 342 343 static ssize_t qeth_l3_dev_sniffer_show(struct device *dev, 344 struct device_attribute *attr, char *buf) 345 { 346 struct qeth_card *card = dev_get_drvdata(dev); 347 348 if (!card) 349 return -EINVAL; 350 351 return sprintf(buf, "%i\n", card->options.sniffer ? 1 : 0); 352 } 353 354 static ssize_t qeth_l3_dev_sniffer_store(struct device *dev, 355 struct device_attribute *attr, const char *buf, size_t count) 356 { 357 struct qeth_card *card = dev_get_drvdata(dev); 358 int rc = 0; 359 unsigned long i; 360 361 if (!card) 362 return -EINVAL; 363 364 if (card->info.type != QETH_CARD_TYPE_IQD) 365 return -EPERM; 366 367 mutex_lock(&card->conf_mutex); 368 if ((card->state != CARD_STATE_DOWN) && 369 (card->state != CARD_STATE_RECOVER)) { 370 rc = -EPERM; 371 goto out; 372 } 373 374 rc = strict_strtoul(buf, 16, &i); 375 if (rc) { 376 rc = -EINVAL; 377 goto out; 378 } 379 switch (i) { 380 case 0: 381 card->options.sniffer = i; 382 break; 383 case 1: 384 qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd); 385 if (card->ssqd.qdioac2 & QETH_SNIFF_AVAIL) { 386 card->options.sniffer = i; 387 if (card->qdio.init_pool.buf_count != 388 QETH_IN_BUF_COUNT_MAX) 389 qeth_realloc_buffer_pool(card, 390 QETH_IN_BUF_COUNT_MAX); 391 break; 392 } else 393 rc = -EPERM; 394 default: /* fall through */ 395 rc = -EINVAL; 396 } 397 out: 398 mutex_unlock(&card->conf_mutex); 399 return rc ? rc : count; 400 } 401 402 static DEVICE_ATTR(sniffer, 0644, qeth_l3_dev_sniffer_show, 403 qeth_l3_dev_sniffer_store); 404 405 static ssize_t qeth_l3_dev_large_send_show(struct device *dev, 406 struct device_attribute *attr, char *buf) 407 { 408 struct qeth_card *card = dev_get_drvdata(dev); 409 410 if (!card) 411 return -EINVAL; 412 413 switch (card->options.large_send) { 414 case QETH_LARGE_SEND_NO: 415 return sprintf(buf, "%s\n", "no"); 416 case QETH_LARGE_SEND_TSO: 417 return sprintf(buf, "%s\n", "TSO"); 418 default: 419 return sprintf(buf, "%s\n", "N/A"); 420 } 421 } 422 423 static ssize_t qeth_l3_dev_large_send_store(struct device *dev, 424 struct device_attribute *attr, const char *buf, size_t count) 425 { 426 struct qeth_card *card = dev_get_drvdata(dev); 427 enum qeth_large_send_types type; 428 int rc = 0; 429 char *tmp; 430 431 if (!card) 432 return -EINVAL; 433 tmp = strsep((char **) &buf, "\n"); 434 if (!strcmp(tmp, "no")) 435 type = QETH_LARGE_SEND_NO; 436 else if (!strcmp(tmp, "TSO")) 437 type = QETH_LARGE_SEND_TSO; 438 else 439 return -EINVAL; 440 441 mutex_lock(&card->conf_mutex); 442 if (card->options.large_send != type) 443 rc = qeth_l3_set_large_send(card, type); 444 mutex_unlock(&card->conf_mutex); 445 return rc ? rc : count; 446 } 447 448 static DEVICE_ATTR(large_send, 0644, qeth_l3_dev_large_send_show, 449 qeth_l3_dev_large_send_store); 450 451 static struct attribute *qeth_l3_device_attrs[] = { 452 &dev_attr_route4.attr, 453 &dev_attr_route6.attr, 454 &dev_attr_fake_broadcast.attr, 455 &dev_attr_broadcast_mode.attr, 456 &dev_attr_canonical_macaddr.attr, 457 &dev_attr_checksumming.attr, 458 &dev_attr_sniffer.attr, 459 &dev_attr_large_send.attr, 460 NULL, 461 }; 462 463 static struct attribute_group qeth_l3_device_attr_group = { 464 .attrs = qeth_l3_device_attrs, 465 }; 466 467 static ssize_t qeth_l3_dev_ipato_enable_show(struct device *dev, 468 struct device_attribute *attr, char *buf) 469 { 470 struct qeth_card *card = dev_get_drvdata(dev); 471 472 if (!card) 473 return -EINVAL; 474 475 return sprintf(buf, "%i\n", card->ipato.enabled? 1:0); 476 } 477 478 static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev, 479 struct device_attribute *attr, const char *buf, size_t count) 480 { 481 struct qeth_card *card = dev_get_drvdata(dev); 482 struct qeth_ipaddr *tmpipa, *t; 483 char *tmp; 484 int rc = 0; 485 486 if (!card) 487 return -EINVAL; 488 489 mutex_lock(&card->conf_mutex); 490 if ((card->state != CARD_STATE_DOWN) && 491 (card->state != CARD_STATE_RECOVER)) { 492 rc = -EPERM; 493 goto out; 494 } 495 496 tmp = strsep((char **) &buf, "\n"); 497 if (!strcmp(tmp, "toggle")) { 498 card->ipato.enabled = (card->ipato.enabled)? 0 : 1; 499 } else if (!strcmp(tmp, "1")) { 500 card->ipato.enabled = 1; 501 list_for_each_entry_safe(tmpipa, t, card->ip_tbd_list, entry) { 502 if ((tmpipa->type == QETH_IP_TYPE_NORMAL) && 503 qeth_l3_is_addr_covered_by_ipato(card, tmpipa)) 504 tmpipa->set_flags |= 505 QETH_IPA_SETIP_TAKEOVER_FLAG; 506 } 507 508 } else if (!strcmp(tmp, "0")) { 509 card->ipato.enabled = 0; 510 list_for_each_entry_safe(tmpipa, t, card->ip_tbd_list, entry) { 511 if (tmpipa->set_flags & 512 QETH_IPA_SETIP_TAKEOVER_FLAG) 513 tmpipa->set_flags &= 514 ~QETH_IPA_SETIP_TAKEOVER_FLAG; 515 } 516 } else 517 rc = -EINVAL; 518 out: 519 mutex_unlock(&card->conf_mutex); 520 return rc ? rc : count; 521 } 522 523 static QETH_DEVICE_ATTR(ipato_enable, enable, 0644, 524 qeth_l3_dev_ipato_enable_show, 525 qeth_l3_dev_ipato_enable_store); 526 527 static ssize_t qeth_l3_dev_ipato_invert4_show(struct device *dev, 528 struct device_attribute *attr, char *buf) 529 { 530 struct qeth_card *card = dev_get_drvdata(dev); 531 532 if (!card) 533 return -EINVAL; 534 535 return sprintf(buf, "%i\n", card->ipato.invert4? 1:0); 536 } 537 538 static ssize_t qeth_l3_dev_ipato_invert4_store(struct device *dev, 539 struct device_attribute *attr, 540 const char *buf, size_t count) 541 { 542 struct qeth_card *card = dev_get_drvdata(dev); 543 char *tmp; 544 int rc = 0; 545 546 if (!card) 547 return -EINVAL; 548 549 mutex_lock(&card->conf_mutex); 550 tmp = strsep((char **) &buf, "\n"); 551 if (!strcmp(tmp, "toggle")) { 552 card->ipato.invert4 = (card->ipato.invert4)? 0 : 1; 553 } else if (!strcmp(tmp, "1")) { 554 card->ipato.invert4 = 1; 555 } else if (!strcmp(tmp, "0")) { 556 card->ipato.invert4 = 0; 557 } else 558 rc = -EINVAL; 559 mutex_unlock(&card->conf_mutex); 560 return rc ? rc : count; 561 } 562 563 static QETH_DEVICE_ATTR(ipato_invert4, invert4, 0644, 564 qeth_l3_dev_ipato_invert4_show, 565 qeth_l3_dev_ipato_invert4_store); 566 567 static ssize_t qeth_l3_dev_ipato_add_show(char *buf, struct qeth_card *card, 568 enum qeth_prot_versions proto) 569 { 570 struct qeth_ipato_entry *ipatoe; 571 unsigned long flags; 572 char addr_str[40]; 573 int entry_len; /* length of 1 entry string, differs between v4 and v6 */ 574 int i = 0; 575 576 entry_len = (proto == QETH_PROT_IPV4)? 12 : 40; 577 /* add strlen for "/<mask>\n" */ 578 entry_len += (proto == QETH_PROT_IPV4)? 5 : 6; 579 spin_lock_irqsave(&card->ip_lock, flags); 580 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { 581 if (ipatoe->proto != proto) 582 continue; 583 /* String must not be longer than PAGE_SIZE. So we check if 584 * string length gets near PAGE_SIZE. Then we can savely display 585 * the next IPv6 address (worst case, compared to IPv4) */ 586 if ((PAGE_SIZE - i) <= entry_len) 587 break; 588 qeth_l3_ipaddr_to_string(proto, ipatoe->addr, addr_str); 589 i += snprintf(buf + i, PAGE_SIZE - i, 590 "%s/%i\n", addr_str, ipatoe->mask_bits); 591 } 592 spin_unlock_irqrestore(&card->ip_lock, flags); 593 i += snprintf(buf + i, PAGE_SIZE - i, "\n"); 594 595 return i; 596 } 597 598 static ssize_t qeth_l3_dev_ipato_add4_show(struct device *dev, 599 struct device_attribute *attr, char *buf) 600 { 601 struct qeth_card *card = dev_get_drvdata(dev); 602 603 if (!card) 604 return -EINVAL; 605 606 return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV4); 607 } 608 609 static int qeth_l3_parse_ipatoe(const char *buf, enum qeth_prot_versions proto, 610 u8 *addr, int *mask_bits) 611 { 612 const char *start, *end; 613 char *tmp; 614 char buffer[40] = {0, }; 615 616 start = buf; 617 /* get address string */ 618 end = strchr(start, '/'); 619 if (!end || (end - start >= 40)) { 620 return -EINVAL; 621 } 622 strncpy(buffer, start, end - start); 623 if (qeth_l3_string_to_ipaddr(buffer, proto, addr)) { 624 return -EINVAL; 625 } 626 start = end + 1; 627 *mask_bits = simple_strtoul(start, &tmp, 10); 628 if (!strlen(start) || 629 (tmp == start) || 630 (*mask_bits > ((proto == QETH_PROT_IPV4) ? 32 : 128))) { 631 return -EINVAL; 632 } 633 return 0; 634 } 635 636 static ssize_t qeth_l3_dev_ipato_add_store(const char *buf, size_t count, 637 struct qeth_card *card, enum qeth_prot_versions proto) 638 { 639 struct qeth_ipato_entry *ipatoe; 640 u8 addr[16]; 641 int mask_bits; 642 int rc = 0; 643 644 mutex_lock(&card->conf_mutex); 645 rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits); 646 if (rc) 647 goto out; 648 649 ipatoe = kzalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL); 650 if (!ipatoe) { 651 rc = -ENOMEM; 652 goto out; 653 } 654 ipatoe->proto = proto; 655 memcpy(ipatoe->addr, addr, (proto == QETH_PROT_IPV4)? 4:16); 656 ipatoe->mask_bits = mask_bits; 657 658 rc = qeth_l3_add_ipato_entry(card, ipatoe); 659 if (rc) 660 kfree(ipatoe); 661 out: 662 mutex_unlock(&card->conf_mutex); 663 return rc ? rc : count; 664 } 665 666 static ssize_t qeth_l3_dev_ipato_add4_store(struct device *dev, 667 struct device_attribute *attr, const char *buf, size_t count) 668 { 669 struct qeth_card *card = dev_get_drvdata(dev); 670 671 if (!card) 672 return -EINVAL; 673 674 return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV4); 675 } 676 677 static QETH_DEVICE_ATTR(ipato_add4, add4, 0644, 678 qeth_l3_dev_ipato_add4_show, 679 qeth_l3_dev_ipato_add4_store); 680 681 static ssize_t qeth_l3_dev_ipato_del_store(const char *buf, size_t count, 682 struct qeth_card *card, enum qeth_prot_versions proto) 683 { 684 u8 addr[16]; 685 int mask_bits; 686 int rc = 0; 687 688 mutex_lock(&card->conf_mutex); 689 rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits); 690 if (!rc) 691 qeth_l3_del_ipato_entry(card, proto, addr, mask_bits); 692 mutex_unlock(&card->conf_mutex); 693 return rc ? rc : count; 694 } 695 696 static ssize_t qeth_l3_dev_ipato_del4_store(struct device *dev, 697 struct device_attribute *attr, const char *buf, size_t count) 698 { 699 struct qeth_card *card = dev_get_drvdata(dev); 700 701 if (!card) 702 return -EINVAL; 703 704 return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV4); 705 } 706 707 static QETH_DEVICE_ATTR(ipato_del4, del4, 0200, NULL, 708 qeth_l3_dev_ipato_del4_store); 709 710 static ssize_t qeth_l3_dev_ipato_invert6_show(struct device *dev, 711 struct device_attribute *attr, char *buf) 712 { 713 struct qeth_card *card = dev_get_drvdata(dev); 714 715 if (!card) 716 return -EINVAL; 717 718 return sprintf(buf, "%i\n", card->ipato.invert6? 1:0); 719 } 720 721 static ssize_t qeth_l3_dev_ipato_invert6_store(struct device *dev, 722 struct device_attribute *attr, const char *buf, size_t count) 723 { 724 struct qeth_card *card = dev_get_drvdata(dev); 725 char *tmp; 726 int rc = 0; 727 728 if (!card) 729 return -EINVAL; 730 731 mutex_lock(&card->conf_mutex); 732 tmp = strsep((char **) &buf, "\n"); 733 if (!strcmp(tmp, "toggle")) { 734 card->ipato.invert6 = (card->ipato.invert6)? 0 : 1; 735 } else if (!strcmp(tmp, "1")) { 736 card->ipato.invert6 = 1; 737 } else if (!strcmp(tmp, "0")) { 738 card->ipato.invert6 = 0; 739 } else 740 rc = -EINVAL; 741 mutex_unlock(&card->conf_mutex); 742 return rc ? rc : count; 743 } 744 745 static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644, 746 qeth_l3_dev_ipato_invert6_show, 747 qeth_l3_dev_ipato_invert6_store); 748 749 750 static ssize_t qeth_l3_dev_ipato_add6_show(struct device *dev, 751 struct device_attribute *attr, char *buf) 752 { 753 struct qeth_card *card = dev_get_drvdata(dev); 754 755 if (!card) 756 return -EINVAL; 757 758 return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV6); 759 } 760 761 static ssize_t qeth_l3_dev_ipato_add6_store(struct device *dev, 762 struct device_attribute *attr, const char *buf, size_t count) 763 { 764 struct qeth_card *card = dev_get_drvdata(dev); 765 766 if (!card) 767 return -EINVAL; 768 769 return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV6); 770 } 771 772 static QETH_DEVICE_ATTR(ipato_add6, add6, 0644, 773 qeth_l3_dev_ipato_add6_show, 774 qeth_l3_dev_ipato_add6_store); 775 776 static ssize_t qeth_l3_dev_ipato_del6_store(struct device *dev, 777 struct device_attribute *attr, const char *buf, size_t count) 778 { 779 struct qeth_card *card = dev_get_drvdata(dev); 780 781 if (!card) 782 return -EINVAL; 783 784 return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV6); 785 } 786 787 static QETH_DEVICE_ATTR(ipato_del6, del6, 0200, NULL, 788 qeth_l3_dev_ipato_del6_store); 789 790 static struct attribute *qeth_ipato_device_attrs[] = { 791 &dev_attr_ipato_enable.attr, 792 &dev_attr_ipato_invert4.attr, 793 &dev_attr_ipato_add4.attr, 794 &dev_attr_ipato_del4.attr, 795 &dev_attr_ipato_invert6.attr, 796 &dev_attr_ipato_add6.attr, 797 &dev_attr_ipato_del6.attr, 798 NULL, 799 }; 800 801 static struct attribute_group qeth_device_ipato_group = { 802 .name = "ipa_takeover", 803 .attrs = qeth_ipato_device_attrs, 804 }; 805 806 static ssize_t qeth_l3_dev_vipa_add_show(char *buf, struct qeth_card *card, 807 enum qeth_prot_versions proto) 808 { 809 struct qeth_ipaddr *ipaddr; 810 char addr_str[40]; 811 int entry_len; /* length of 1 entry string, differs between v4 and v6 */ 812 unsigned long flags; 813 int i = 0; 814 815 entry_len = (proto == QETH_PROT_IPV4)? 12 : 40; 816 entry_len += 2; /* \n + terminator */ 817 spin_lock_irqsave(&card->ip_lock, flags); 818 list_for_each_entry(ipaddr, &card->ip_list, entry) { 819 if (ipaddr->proto != proto) 820 continue; 821 if (ipaddr->type != QETH_IP_TYPE_VIPA) 822 continue; 823 /* String must not be longer than PAGE_SIZE. So we check if 824 * string length gets near PAGE_SIZE. Then we can savely display 825 * the next IPv6 address (worst case, compared to IPv4) */ 826 if ((PAGE_SIZE - i) <= entry_len) 827 break; 828 qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u, 829 addr_str); 830 i += snprintf(buf + i, PAGE_SIZE - i, "%s\n", addr_str); 831 } 832 spin_unlock_irqrestore(&card->ip_lock, flags); 833 i += snprintf(buf + i, PAGE_SIZE - i, "\n"); 834 835 return i; 836 } 837 838 static ssize_t qeth_l3_dev_vipa_add4_show(struct device *dev, 839 struct device_attribute *attr, char *buf) 840 { 841 struct qeth_card *card = dev_get_drvdata(dev); 842 843 if (!card) 844 return -EINVAL; 845 846 return qeth_l3_dev_vipa_add_show(buf, card, QETH_PROT_IPV4); 847 } 848 849 static int qeth_l3_parse_vipae(const char *buf, enum qeth_prot_versions proto, 850 u8 *addr) 851 { 852 if (qeth_l3_string_to_ipaddr(buf, proto, addr)) { 853 return -EINVAL; 854 } 855 return 0; 856 } 857 858 static ssize_t qeth_l3_dev_vipa_add_store(const char *buf, size_t count, 859 struct qeth_card *card, enum qeth_prot_versions proto) 860 { 861 u8 addr[16] = {0, }; 862 int rc; 863 864 mutex_lock(&card->conf_mutex); 865 rc = qeth_l3_parse_vipae(buf, proto, addr); 866 if (!rc) 867 rc = qeth_l3_add_vipa(card, proto, addr); 868 mutex_unlock(&card->conf_mutex); 869 return rc ? rc : count; 870 } 871 872 static ssize_t qeth_l3_dev_vipa_add4_store(struct device *dev, 873 struct device_attribute *attr, const char *buf, size_t count) 874 { 875 struct qeth_card *card = dev_get_drvdata(dev); 876 877 if (!card) 878 return -EINVAL; 879 880 return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV4); 881 } 882 883 static QETH_DEVICE_ATTR(vipa_add4, add4, 0644, 884 qeth_l3_dev_vipa_add4_show, 885 qeth_l3_dev_vipa_add4_store); 886 887 static ssize_t qeth_l3_dev_vipa_del_store(const char *buf, size_t count, 888 struct qeth_card *card, enum qeth_prot_versions proto) 889 { 890 u8 addr[16]; 891 int rc; 892 893 mutex_lock(&card->conf_mutex); 894 rc = qeth_l3_parse_vipae(buf, proto, addr); 895 if (!rc) 896 qeth_l3_del_vipa(card, proto, addr); 897 mutex_unlock(&card->conf_mutex); 898 return rc ? rc : count; 899 } 900 901 static ssize_t qeth_l3_dev_vipa_del4_store(struct device *dev, 902 struct device_attribute *attr, const char *buf, size_t count) 903 { 904 struct qeth_card *card = dev_get_drvdata(dev); 905 906 if (!card) 907 return -EINVAL; 908 909 return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV4); 910 } 911 912 static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL, 913 qeth_l3_dev_vipa_del4_store); 914 915 static ssize_t qeth_l3_dev_vipa_add6_show(struct device *dev, 916 struct device_attribute *attr, char *buf) 917 { 918 struct qeth_card *card = dev_get_drvdata(dev); 919 920 if (!card) 921 return -EINVAL; 922 923 return qeth_l3_dev_vipa_add_show(buf, card, QETH_PROT_IPV6); 924 } 925 926 static ssize_t qeth_l3_dev_vipa_add6_store(struct device *dev, 927 struct device_attribute *attr, const char *buf, size_t count) 928 { 929 struct qeth_card *card = dev_get_drvdata(dev); 930 931 if (!card) 932 return -EINVAL; 933 934 return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV6); 935 } 936 937 static QETH_DEVICE_ATTR(vipa_add6, add6, 0644, 938 qeth_l3_dev_vipa_add6_show, 939 qeth_l3_dev_vipa_add6_store); 940 941 static ssize_t qeth_l3_dev_vipa_del6_store(struct device *dev, 942 struct device_attribute *attr, const char *buf, size_t count) 943 { 944 struct qeth_card *card = dev_get_drvdata(dev); 945 946 if (!card) 947 return -EINVAL; 948 949 return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV6); 950 } 951 952 static QETH_DEVICE_ATTR(vipa_del6, del6, 0200, NULL, 953 qeth_l3_dev_vipa_del6_store); 954 955 static struct attribute *qeth_vipa_device_attrs[] = { 956 &dev_attr_vipa_add4.attr, 957 &dev_attr_vipa_del4.attr, 958 &dev_attr_vipa_add6.attr, 959 &dev_attr_vipa_del6.attr, 960 NULL, 961 }; 962 963 static struct attribute_group qeth_device_vipa_group = { 964 .name = "vipa", 965 .attrs = qeth_vipa_device_attrs, 966 }; 967 968 static ssize_t qeth_l3_dev_rxip_add_show(char *buf, struct qeth_card *card, 969 enum qeth_prot_versions proto) 970 { 971 struct qeth_ipaddr *ipaddr; 972 char addr_str[40]; 973 int entry_len; /* length of 1 entry string, differs between v4 and v6 */ 974 unsigned long flags; 975 int i = 0; 976 977 entry_len = (proto == QETH_PROT_IPV4)? 12 : 40; 978 entry_len += 2; /* \n + terminator */ 979 spin_lock_irqsave(&card->ip_lock, flags); 980 list_for_each_entry(ipaddr, &card->ip_list, entry) { 981 if (ipaddr->proto != proto) 982 continue; 983 if (ipaddr->type != QETH_IP_TYPE_RXIP) 984 continue; 985 /* String must not be longer than PAGE_SIZE. So we check if 986 * string length gets near PAGE_SIZE. Then we can savely display 987 * the next IPv6 address (worst case, compared to IPv4) */ 988 if ((PAGE_SIZE - i) <= entry_len) 989 break; 990 qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u, 991 addr_str); 992 i += snprintf(buf + i, PAGE_SIZE - i, "%s\n", addr_str); 993 } 994 spin_unlock_irqrestore(&card->ip_lock, flags); 995 i += snprintf(buf + i, PAGE_SIZE - i, "\n"); 996 997 return i; 998 } 999 1000 static ssize_t qeth_l3_dev_rxip_add4_show(struct device *dev, 1001 struct device_attribute *attr, char *buf) 1002 { 1003 struct qeth_card *card = dev_get_drvdata(dev); 1004 1005 if (!card) 1006 return -EINVAL; 1007 1008 return qeth_l3_dev_rxip_add_show(buf, card, QETH_PROT_IPV4); 1009 } 1010 1011 static int qeth_l3_parse_rxipe(const char *buf, enum qeth_prot_versions proto, 1012 u8 *addr) 1013 { 1014 if (qeth_l3_string_to_ipaddr(buf, proto, addr)) { 1015 return -EINVAL; 1016 } 1017 return 0; 1018 } 1019 1020 static ssize_t qeth_l3_dev_rxip_add_store(const char *buf, size_t count, 1021 struct qeth_card *card, enum qeth_prot_versions proto) 1022 { 1023 u8 addr[16] = {0, }; 1024 int rc; 1025 1026 mutex_lock(&card->conf_mutex); 1027 rc = qeth_l3_parse_rxipe(buf, proto, addr); 1028 if (!rc) 1029 rc = qeth_l3_add_rxip(card, proto, addr); 1030 mutex_unlock(&card->conf_mutex); 1031 return rc ? rc : count; 1032 } 1033 1034 static ssize_t qeth_l3_dev_rxip_add4_store(struct device *dev, 1035 struct device_attribute *attr, const char *buf, size_t count) 1036 { 1037 struct qeth_card *card = dev_get_drvdata(dev); 1038 1039 if (!card) 1040 return -EINVAL; 1041 1042 return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV4); 1043 } 1044 1045 static QETH_DEVICE_ATTR(rxip_add4, add4, 0644, 1046 qeth_l3_dev_rxip_add4_show, 1047 qeth_l3_dev_rxip_add4_store); 1048 1049 static ssize_t qeth_l3_dev_rxip_del_store(const char *buf, size_t count, 1050 struct qeth_card *card, enum qeth_prot_versions proto) 1051 { 1052 u8 addr[16]; 1053 int rc; 1054 1055 mutex_lock(&card->conf_mutex); 1056 rc = qeth_l3_parse_rxipe(buf, proto, addr); 1057 if (!rc) 1058 qeth_l3_del_rxip(card, proto, addr); 1059 mutex_unlock(&card->conf_mutex); 1060 return rc ? rc : count; 1061 } 1062 1063 static ssize_t qeth_l3_dev_rxip_del4_store(struct device *dev, 1064 struct device_attribute *attr, const char *buf, size_t count) 1065 { 1066 struct qeth_card *card = dev_get_drvdata(dev); 1067 1068 if (!card) 1069 return -EINVAL; 1070 1071 return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV4); 1072 } 1073 1074 static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL, 1075 qeth_l3_dev_rxip_del4_store); 1076 1077 static ssize_t qeth_l3_dev_rxip_add6_show(struct device *dev, 1078 struct device_attribute *attr, char *buf) 1079 { 1080 struct qeth_card *card = dev_get_drvdata(dev); 1081 1082 if (!card) 1083 return -EINVAL; 1084 1085 return qeth_l3_dev_rxip_add_show(buf, card, QETH_PROT_IPV6); 1086 } 1087 1088 static ssize_t qeth_l3_dev_rxip_add6_store(struct device *dev, 1089 struct device_attribute *attr, const char *buf, size_t count) 1090 { 1091 struct qeth_card *card = dev_get_drvdata(dev); 1092 1093 if (!card) 1094 return -EINVAL; 1095 1096 return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV6); 1097 } 1098 1099 static QETH_DEVICE_ATTR(rxip_add6, add6, 0644, 1100 qeth_l3_dev_rxip_add6_show, 1101 qeth_l3_dev_rxip_add6_store); 1102 1103 static ssize_t qeth_l3_dev_rxip_del6_store(struct device *dev, 1104 struct device_attribute *attr, const char *buf, size_t count) 1105 { 1106 struct qeth_card *card = dev_get_drvdata(dev); 1107 1108 if (!card) 1109 return -EINVAL; 1110 1111 return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV6); 1112 } 1113 1114 static QETH_DEVICE_ATTR(rxip_del6, del6, 0200, NULL, 1115 qeth_l3_dev_rxip_del6_store); 1116 1117 static struct attribute *qeth_rxip_device_attrs[] = { 1118 &dev_attr_rxip_add4.attr, 1119 &dev_attr_rxip_del4.attr, 1120 &dev_attr_rxip_add6.attr, 1121 &dev_attr_rxip_del6.attr, 1122 NULL, 1123 }; 1124 1125 static struct attribute_group qeth_device_rxip_group = { 1126 .name = "rxip", 1127 .attrs = qeth_rxip_device_attrs, 1128 }; 1129 1130 int qeth_l3_create_device_attributes(struct device *dev) 1131 { 1132 int ret; 1133 1134 ret = sysfs_create_group(&dev->kobj, &qeth_l3_device_attr_group); 1135 if (ret) 1136 return ret; 1137 1138 ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group); 1139 if (ret) { 1140 sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group); 1141 return ret; 1142 } 1143 1144 ret = sysfs_create_group(&dev->kobj, &qeth_device_vipa_group); 1145 if (ret) { 1146 sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group); 1147 sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group); 1148 return ret; 1149 } 1150 1151 ret = sysfs_create_group(&dev->kobj, &qeth_device_rxip_group); 1152 if (ret) { 1153 sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group); 1154 sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group); 1155 sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group); 1156 return ret; 1157 } 1158 return 0; 1159 } 1160 1161 void qeth_l3_remove_device_attributes(struct device *dev) 1162 { 1163 sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group); 1164 sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group); 1165 sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group); 1166 sysfs_remove_group(&dev->kobj, &qeth_device_rxip_group); 1167 } 1168