diff options
Diffstat (limited to 'net/tipc/bearer.c')
| -rw-r--r-- | net/tipc/bearer.c | 53 |
1 files changed, 20 insertions, 33 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 327011fcc407..52ae17b2583e 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
| @@ -45,10 +45,10 @@ | |||
| 45 | 45 | ||
| 46 | #define MAX_ADDR_STR 32 | 46 | #define MAX_ADDR_STR 32 |
| 47 | 47 | ||
| 48 | static struct media *media_list = NULL; | 48 | static struct media media_list[MAX_MEDIA]; |
| 49 | static u32 media_count = 0; | 49 | static u32 media_count = 0; |
| 50 | 50 | ||
| 51 | struct bearer *tipc_bearers = NULL; | 51 | struct bearer tipc_bearers[MAX_BEARERS]; |
| 52 | 52 | ||
| 53 | /** | 53 | /** |
| 54 | * media_name_valid - validate media name | 54 | * media_name_valid - validate media name |
| @@ -108,9 +108,11 @@ int tipc_register_media(u32 media_type, | |||
| 108 | int res = -EINVAL; | 108 | int res = -EINVAL; |
| 109 | 109 | ||
| 110 | write_lock_bh(&tipc_net_lock); | 110 | write_lock_bh(&tipc_net_lock); |
| 111 | if (!media_list) | ||
| 112 | goto exit; | ||
| 113 | 111 | ||
| 112 | if (tipc_mode != TIPC_NET_MODE) { | ||
| 113 | warn("Media <%s> rejected, not in networked mode yet\n", name); | ||
| 114 | goto exit; | ||
| 115 | } | ||
| 114 | if (!media_name_valid(name)) { | 116 | if (!media_name_valid(name)) { |
| 115 | warn("Media <%s> rejected, illegal name\n", name); | 117 | warn("Media <%s> rejected, illegal name\n", name); |
| 116 | goto exit; | 118 | goto exit; |
| @@ -465,6 +467,18 @@ int tipc_bearer_resolve_congestion(struct bearer *b_ptr, struct link *l_ptr) | |||
| 465 | return res; | 467 | return res; |
| 466 | } | 468 | } |
| 467 | 469 | ||
| 470 | /** | ||
| 471 | * tipc_bearer_congested - determines if bearer is currently congested | ||
| 472 | */ | ||
| 473 | |||
| 474 | int tipc_bearer_congested(struct bearer *b_ptr, struct link *l_ptr) | ||
| 475 | { | ||
| 476 | if (unlikely(b_ptr->publ.blocked)) | ||
| 477 | return 1; | ||
| 478 | if (likely(list_empty(&b_ptr->cong_links))) | ||
| 479 | return 0; | ||
| 480 | return !tipc_bearer_resolve_congestion(b_ptr, l_ptr); | ||
| 481 | } | ||
| 468 | 482 | ||
| 469 | /** | 483 | /** |
| 470 | * tipc_enable_bearer - enable bearer with the given name | 484 | * tipc_enable_bearer - enable bearer with the given name |
| @@ -491,7 +505,7 @@ int tipc_enable_bearer(const char *name, u32 bcast_scope, u32 priority) | |||
| 491 | return -EINVAL; | 505 | return -EINVAL; |
| 492 | } | 506 | } |
| 493 | if (!tipc_addr_domain_valid(bcast_scope) || | 507 | if (!tipc_addr_domain_valid(bcast_scope) || |
| 494 | !in_scope(bcast_scope, tipc_own_addr)) { | 508 | !tipc_in_scope(bcast_scope, tipc_own_addr)) { |
| 495 | warn("Bearer <%s> rejected, illegal broadcast scope\n", name); | 509 | warn("Bearer <%s> rejected, illegal broadcast scope\n", name); |
| 496 | return -EINVAL; | 510 | return -EINVAL; |
| 497 | } | 511 | } |
| @@ -569,7 +583,7 @@ restart: | |||
| 569 | spin_lock_init(&b_ptr->publ.lock); | 583 | spin_lock_init(&b_ptr->publ.lock); |
| 570 | write_unlock_bh(&tipc_net_lock); | 584 | write_unlock_bh(&tipc_net_lock); |
| 571 | info("Enabled bearer <%s>, discovery domain %s, priority %u\n", | 585 | info("Enabled bearer <%s>, discovery domain %s, priority %u\n", |
| 572 | name, addr_string_fill(addr_string, bcast_scope), priority); | 586 | name, tipc_addr_string_fill(addr_string, bcast_scope), priority); |
| 573 | return 0; | 587 | return 0; |
| 574 | failed: | 588 | failed: |
| 575 | write_unlock_bh(&tipc_net_lock); | 589 | write_unlock_bh(&tipc_net_lock); |
| @@ -660,33 +674,10 @@ int tipc_disable_bearer(const char *name) | |||
| 660 | 674 | ||
| 661 | 675 | ||
| 662 | 676 | ||
| 663 | int tipc_bearer_init(void) | ||
| 664 | { | ||
| 665 | int res; | ||
| 666 | |||
| 667 | write_lock_bh(&tipc_net_lock); | ||
| 668 | tipc_bearers = kcalloc(MAX_BEARERS, sizeof(struct bearer), GFP_ATOMIC); | ||
| 669 | media_list = kcalloc(MAX_MEDIA, sizeof(struct media), GFP_ATOMIC); | ||
| 670 | if (tipc_bearers && media_list) { | ||
| 671 | res = 0; | ||
| 672 | } else { | ||
| 673 | kfree(tipc_bearers); | ||
| 674 | kfree(media_list); | ||
| 675 | tipc_bearers = NULL; | ||
| 676 | media_list = NULL; | ||
| 677 | res = -ENOMEM; | ||
| 678 | } | ||
| 679 | write_unlock_bh(&tipc_net_lock); | ||
| 680 | return res; | ||
| 681 | } | ||
| 682 | |||
| 683 | void tipc_bearer_stop(void) | 677 | void tipc_bearer_stop(void) |
| 684 | { | 678 | { |
| 685 | u32 i; | 679 | u32 i; |
| 686 | 680 | ||
| 687 | if (!tipc_bearers) | ||
| 688 | return; | ||
| 689 | |||
| 690 | for (i = 0; i < MAX_BEARERS; i++) { | 681 | for (i = 0; i < MAX_BEARERS; i++) { |
| 691 | if (tipc_bearers[i].active) | 682 | if (tipc_bearers[i].active) |
| 692 | tipc_bearers[i].publ.blocked = 1; | 683 | tipc_bearers[i].publ.blocked = 1; |
| @@ -695,10 +686,6 @@ void tipc_bearer_stop(void) | |||
| 695 | if (tipc_bearers[i].active) | 686 | if (tipc_bearers[i].active) |
| 696 | bearer_disable(tipc_bearers[i].publ.name); | 687 | bearer_disable(tipc_bearers[i].publ.name); |
| 697 | } | 688 | } |
| 698 | kfree(tipc_bearers); | ||
| 699 | kfree(media_list); | ||
| 700 | tipc_bearers = NULL; | ||
| 701 | media_list = NULL; | ||
| 702 | media_count = 0; | 689 | media_count = 0; |
| 703 | } | 690 | } |
| 704 | 691 | ||
