diff options
Diffstat (limited to 'net/bridge/br_sysfs_br.c')
-rw-r--r-- | net/bridge/br_sysfs_br.c | 287 |
1 files changed, 284 insertions, 3 deletions
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c index ee4820aa1843..dd321e39e621 100644 --- a/net/bridge/br_sysfs_br.c +++ b/net/bridge/br_sysfs_br.c | |||
@@ -316,9 +316,9 @@ static ssize_t store_group_addr(struct device *d, | |||
316 | if (new_addr[5] & ~0xf) | 316 | if (new_addr[5] & ~0xf) |
317 | return -EINVAL; | 317 | return -EINVAL; |
318 | 318 | ||
319 | if (new_addr[5] == 1 /* 802.3x Pause address */ | 319 | if (new_addr[5] == 1 || /* 802.3x Pause address */ |
320 | || new_addr[5] == 2 /* 802.3ad Slow protocols */ | 320 | new_addr[5] == 2 || /* 802.3ad Slow protocols */ |
321 | || new_addr[5] == 3) /* 802.1X PAE address */ | 321 | new_addr[5] == 3) /* 802.1X PAE address */ |
322 | return -EINVAL; | 322 | return -EINVAL; |
323 | 323 | ||
324 | spin_lock_bh(&br->lock); | 324 | spin_lock_bh(&br->lock); |
@@ -345,6 +345,273 @@ static ssize_t store_flush(struct device *d, | |||
345 | } | 345 | } |
346 | static DEVICE_ATTR(flush, S_IWUSR, NULL, store_flush); | 346 | static DEVICE_ATTR(flush, S_IWUSR, NULL, store_flush); |
347 | 347 | ||
348 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING | ||
349 | static ssize_t show_multicast_router(struct device *d, | ||
350 | struct device_attribute *attr, char *buf) | ||
351 | { | ||
352 | struct net_bridge *br = to_bridge(d); | ||
353 | return sprintf(buf, "%d\n", br->multicast_router); | ||
354 | } | ||
355 | |||
356 | static ssize_t store_multicast_router(struct device *d, | ||
357 | struct device_attribute *attr, | ||
358 | const char *buf, size_t len) | ||
359 | { | ||
360 | return store_bridge_parm(d, buf, len, br_multicast_set_router); | ||
361 | } | ||
362 | static DEVICE_ATTR(multicast_router, S_IRUGO | S_IWUSR, show_multicast_router, | ||
363 | store_multicast_router); | ||
364 | |||
365 | static ssize_t show_multicast_snooping(struct device *d, | ||
366 | struct device_attribute *attr, | ||
367 | char *buf) | ||
368 | { | ||
369 | struct net_bridge *br = to_bridge(d); | ||
370 | return sprintf(buf, "%d\n", !br->multicast_disabled); | ||
371 | } | ||
372 | |||
373 | static ssize_t store_multicast_snooping(struct device *d, | ||
374 | struct device_attribute *attr, | ||
375 | const char *buf, size_t len) | ||
376 | { | ||
377 | return store_bridge_parm(d, buf, len, br_multicast_toggle); | ||
378 | } | ||
379 | static DEVICE_ATTR(multicast_snooping, S_IRUGO | S_IWUSR, | ||
380 | show_multicast_snooping, store_multicast_snooping); | ||
381 | |||
382 | static ssize_t show_hash_elasticity(struct device *d, | ||
383 | struct device_attribute *attr, char *buf) | ||
384 | { | ||
385 | struct net_bridge *br = to_bridge(d); | ||
386 | return sprintf(buf, "%u\n", br->hash_elasticity); | ||
387 | } | ||
388 | |||
389 | static int set_elasticity(struct net_bridge *br, unsigned long val) | ||
390 | { | ||
391 | br->hash_elasticity = val; | ||
392 | return 0; | ||
393 | } | ||
394 | |||
395 | static ssize_t store_hash_elasticity(struct device *d, | ||
396 | struct device_attribute *attr, | ||
397 | const char *buf, size_t len) | ||
398 | { | ||
399 | return store_bridge_parm(d, buf, len, set_elasticity); | ||
400 | } | ||
401 | static DEVICE_ATTR(hash_elasticity, S_IRUGO | S_IWUSR, show_hash_elasticity, | ||
402 | store_hash_elasticity); | ||
403 | |||
404 | static ssize_t show_hash_max(struct device *d, struct device_attribute *attr, | ||
405 | char *buf) | ||
406 | { | ||
407 | struct net_bridge *br = to_bridge(d); | ||
408 | return sprintf(buf, "%u\n", br->hash_max); | ||
409 | } | ||
410 | |||
411 | static ssize_t store_hash_max(struct device *d, struct device_attribute *attr, | ||
412 | const char *buf, size_t len) | ||
413 | { | ||
414 | return store_bridge_parm(d, buf, len, br_multicast_set_hash_max); | ||
415 | } | ||
416 | static DEVICE_ATTR(hash_max, S_IRUGO | S_IWUSR, show_hash_max, | ||
417 | store_hash_max); | ||
418 | |||
419 | static ssize_t show_multicast_last_member_count(struct device *d, | ||
420 | struct device_attribute *attr, | ||
421 | char *buf) | ||
422 | { | ||
423 | struct net_bridge *br = to_bridge(d); | ||
424 | return sprintf(buf, "%u\n", br->multicast_last_member_count); | ||
425 | } | ||
426 | |||
427 | static int set_last_member_count(struct net_bridge *br, unsigned long val) | ||
428 | { | ||
429 | br->multicast_last_member_count = val; | ||
430 | return 0; | ||
431 | } | ||
432 | |||
433 | static ssize_t store_multicast_last_member_count(struct device *d, | ||
434 | struct device_attribute *attr, | ||
435 | const char *buf, size_t len) | ||
436 | { | ||
437 | return store_bridge_parm(d, buf, len, set_last_member_count); | ||
438 | } | ||
439 | static DEVICE_ATTR(multicast_last_member_count, S_IRUGO | S_IWUSR, | ||
440 | show_multicast_last_member_count, | ||
441 | store_multicast_last_member_count); | ||
442 | |||
443 | static ssize_t show_multicast_startup_query_count( | ||
444 | struct device *d, struct device_attribute *attr, char *buf) | ||
445 | { | ||
446 | struct net_bridge *br = to_bridge(d); | ||
447 | return sprintf(buf, "%u\n", br->multicast_startup_query_count); | ||
448 | } | ||
449 | |||
450 | static int set_startup_query_count(struct net_bridge *br, unsigned long val) | ||
451 | { | ||
452 | br->multicast_startup_query_count = val; | ||
453 | return 0; | ||
454 | } | ||
455 | |||
456 | static ssize_t store_multicast_startup_query_count( | ||
457 | struct device *d, struct device_attribute *attr, const char *buf, | ||
458 | size_t len) | ||
459 | { | ||
460 | return store_bridge_parm(d, buf, len, set_startup_query_count); | ||
461 | } | ||
462 | static DEVICE_ATTR(multicast_startup_query_count, S_IRUGO | S_IWUSR, | ||
463 | show_multicast_startup_query_count, | ||
464 | store_multicast_startup_query_count); | ||
465 | |||
466 | static ssize_t show_multicast_last_member_interval( | ||
467 | struct device *d, struct device_attribute *attr, char *buf) | ||
468 | { | ||
469 | struct net_bridge *br = to_bridge(d); | ||
470 | return sprintf(buf, "%lu\n", | ||
471 | jiffies_to_clock_t(br->multicast_last_member_interval)); | ||
472 | } | ||
473 | |||
474 | static int set_last_member_interval(struct net_bridge *br, unsigned long val) | ||
475 | { | ||
476 | br->multicast_last_member_interval = clock_t_to_jiffies(val); | ||
477 | return 0; | ||
478 | } | ||
479 | |||
480 | static ssize_t store_multicast_last_member_interval( | ||
481 | struct device *d, struct device_attribute *attr, const char *buf, | ||
482 | size_t len) | ||
483 | { | ||
484 | return store_bridge_parm(d, buf, len, set_last_member_interval); | ||
485 | } | ||
486 | static DEVICE_ATTR(multicast_last_member_interval, S_IRUGO | S_IWUSR, | ||
487 | show_multicast_last_member_interval, | ||
488 | store_multicast_last_member_interval); | ||
489 | |||
490 | static ssize_t show_multicast_membership_interval( | ||
491 | struct device *d, struct device_attribute *attr, char *buf) | ||
492 | { | ||
493 | struct net_bridge *br = to_bridge(d); | ||
494 | return sprintf(buf, "%lu\n", | ||
495 | jiffies_to_clock_t(br->multicast_membership_interval)); | ||
496 | } | ||
497 | |||
498 | static int set_membership_interval(struct net_bridge *br, unsigned long val) | ||
499 | { | ||
500 | br->multicast_membership_interval = clock_t_to_jiffies(val); | ||
501 | return 0; | ||
502 | } | ||
503 | |||
504 | static ssize_t store_multicast_membership_interval( | ||
505 | struct device *d, struct device_attribute *attr, const char *buf, | ||
506 | size_t len) | ||
507 | { | ||
508 | return store_bridge_parm(d, buf, len, set_membership_interval); | ||
509 | } | ||
510 | static DEVICE_ATTR(multicast_membership_interval, S_IRUGO | S_IWUSR, | ||
511 | show_multicast_membership_interval, | ||
512 | store_multicast_membership_interval); | ||
513 | |||
514 | static ssize_t show_multicast_querier_interval(struct device *d, | ||
515 | struct device_attribute *attr, | ||
516 | char *buf) | ||
517 | { | ||
518 | struct net_bridge *br = to_bridge(d); | ||
519 | return sprintf(buf, "%lu\n", | ||
520 | jiffies_to_clock_t(br->multicast_querier_interval)); | ||
521 | } | ||
522 | |||
523 | static int set_querier_interval(struct net_bridge *br, unsigned long val) | ||
524 | { | ||
525 | br->multicast_querier_interval = clock_t_to_jiffies(val); | ||
526 | return 0; | ||
527 | } | ||
528 | |||
529 | static ssize_t store_multicast_querier_interval(struct device *d, | ||
530 | struct device_attribute *attr, | ||
531 | const char *buf, size_t len) | ||
532 | { | ||
533 | return store_bridge_parm(d, buf, len, set_querier_interval); | ||
534 | } | ||
535 | static DEVICE_ATTR(multicast_querier_interval, S_IRUGO | S_IWUSR, | ||
536 | show_multicast_querier_interval, | ||
537 | store_multicast_querier_interval); | ||
538 | |||
539 | static ssize_t show_multicast_query_interval(struct device *d, | ||
540 | struct device_attribute *attr, | ||
541 | char *buf) | ||
542 | { | ||
543 | struct net_bridge *br = to_bridge(d); | ||
544 | return sprintf(buf, "%lu\n", | ||
545 | jiffies_to_clock_t(br->multicast_query_interval)); | ||
546 | } | ||
547 | |||
548 | static int set_query_interval(struct net_bridge *br, unsigned long val) | ||
549 | { | ||
550 | br->multicast_query_interval = clock_t_to_jiffies(val); | ||
551 | return 0; | ||
552 | } | ||
553 | |||
554 | static ssize_t store_multicast_query_interval(struct device *d, | ||
555 | struct device_attribute *attr, | ||
556 | const char *buf, size_t len) | ||
557 | { | ||
558 | return store_bridge_parm(d, buf, len, set_query_interval); | ||
559 | } | ||
560 | static DEVICE_ATTR(multicast_query_interval, S_IRUGO | S_IWUSR, | ||
561 | show_multicast_query_interval, | ||
562 | store_multicast_query_interval); | ||
563 | |||
564 | static ssize_t show_multicast_query_response_interval( | ||
565 | struct device *d, struct device_attribute *attr, char *buf) | ||
566 | { | ||
567 | struct net_bridge *br = to_bridge(d); | ||
568 | return sprintf( | ||
569 | buf, "%lu\n", | ||
570 | jiffies_to_clock_t(br->multicast_query_response_interval)); | ||
571 | } | ||
572 | |||
573 | static int set_query_response_interval(struct net_bridge *br, unsigned long val) | ||
574 | { | ||
575 | br->multicast_query_response_interval = clock_t_to_jiffies(val); | ||
576 | return 0; | ||
577 | } | ||
578 | |||
579 | static ssize_t store_multicast_query_response_interval( | ||
580 | struct device *d, struct device_attribute *attr, const char *buf, | ||
581 | size_t len) | ||
582 | { | ||
583 | return store_bridge_parm(d, buf, len, set_query_response_interval); | ||
584 | } | ||
585 | static DEVICE_ATTR(multicast_query_response_interval, S_IRUGO | S_IWUSR, | ||
586 | show_multicast_query_response_interval, | ||
587 | store_multicast_query_response_interval); | ||
588 | |||
589 | static ssize_t show_multicast_startup_query_interval( | ||
590 | struct device *d, struct device_attribute *attr, char *buf) | ||
591 | { | ||
592 | struct net_bridge *br = to_bridge(d); | ||
593 | return sprintf( | ||
594 | buf, "%lu\n", | ||
595 | jiffies_to_clock_t(br->multicast_startup_query_interval)); | ||
596 | } | ||
597 | |||
598 | static int set_startup_query_interval(struct net_bridge *br, unsigned long val) | ||
599 | { | ||
600 | br->multicast_startup_query_interval = clock_t_to_jiffies(val); | ||
601 | return 0; | ||
602 | } | ||
603 | |||
604 | static ssize_t store_multicast_startup_query_interval( | ||
605 | struct device *d, struct device_attribute *attr, const char *buf, | ||
606 | size_t len) | ||
607 | { | ||
608 | return store_bridge_parm(d, buf, len, set_startup_query_interval); | ||
609 | } | ||
610 | static DEVICE_ATTR(multicast_startup_query_interval, S_IRUGO | S_IWUSR, | ||
611 | show_multicast_startup_query_interval, | ||
612 | store_multicast_startup_query_interval); | ||
613 | #endif | ||
614 | |||
348 | static struct attribute *bridge_attrs[] = { | 615 | static struct attribute *bridge_attrs[] = { |
349 | &dev_attr_forward_delay.attr, | 616 | &dev_attr_forward_delay.attr, |
350 | &dev_attr_hello_time.attr, | 617 | &dev_attr_hello_time.attr, |
@@ -364,6 +631,20 @@ static struct attribute *bridge_attrs[] = { | |||
364 | &dev_attr_gc_timer.attr, | 631 | &dev_attr_gc_timer.attr, |
365 | &dev_attr_group_addr.attr, | 632 | &dev_attr_group_addr.attr, |
366 | &dev_attr_flush.attr, | 633 | &dev_attr_flush.attr, |
634 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING | ||
635 | &dev_attr_multicast_router.attr, | ||
636 | &dev_attr_multicast_snooping.attr, | ||
637 | &dev_attr_hash_elasticity.attr, | ||
638 | &dev_attr_hash_max.attr, | ||
639 | &dev_attr_multicast_last_member_count.attr, | ||
640 | &dev_attr_multicast_startup_query_count.attr, | ||
641 | &dev_attr_multicast_last_member_interval.attr, | ||
642 | &dev_attr_multicast_membership_interval.attr, | ||
643 | &dev_attr_multicast_querier_interval.attr, | ||
644 | &dev_attr_multicast_query_interval.attr, | ||
645 | &dev_attr_multicast_query_response_interval.attr, | ||
646 | &dev_attr_multicast_startup_query_interval.attr, | ||
647 | #endif | ||
367 | NULL | 648 | NULL |
368 | }; | 649 | }; |
369 | 650 | ||