diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2010-02-27 14:41:52 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-28 03:49:47 -0500 |
commit | d902eee43f1951b358d7347d9165c6af21cf7b1b (patch) | |
tree | 8e3342100e0f7b6c581292e0a7a8b66430400fbc | |
parent | b195167fcf089dbdc650bb874084555035f07f98 (diff) |
bridge: Add multicast count/interval sysfs entries
This patch allows the user to the IGMP parameters related to the
snooping function of the bridge. This includes various time
values and retransmission limits.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/bridge/br_sysfs_br.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c index d2ee53b3ad7d..dd321e39e621 100644 --- a/net/bridge/br_sysfs_br.c +++ b/net/bridge/br_sysfs_br.c | |||
@@ -415,6 +415,201 @@ static ssize_t store_hash_max(struct device *d, struct device_attribute *attr, | |||
415 | } | 415 | } |
416 | static DEVICE_ATTR(hash_max, S_IRUGO | S_IWUSR, show_hash_max, | 416 | static DEVICE_ATTR(hash_max, S_IRUGO | S_IWUSR, show_hash_max, |
417 | store_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); | ||
418 | #endif | 613 | #endif |
419 | 614 | ||
420 | static struct attribute *bridge_attrs[] = { | 615 | static struct attribute *bridge_attrs[] = { |
@@ -441,6 +636,14 @@ static struct attribute *bridge_attrs[] = { | |||
441 | &dev_attr_multicast_snooping.attr, | 636 | &dev_attr_multicast_snooping.attr, |
442 | &dev_attr_hash_elasticity.attr, | 637 | &dev_attr_hash_elasticity.attr, |
443 | &dev_attr_hash_max.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, | ||
444 | #endif | 647 | #endif |
445 | NULL | 648 | NULL |
446 | }; | 649 | }; |