From 0f833b084bfe1bb37d3300cf78bc7cbe7a363110 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 4 Jan 2011 13:33:57 +0100 Subject: mtp: take the linkset down when the last link is failing --- include/bsc_data.h | 2 ++ src/links.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/bsc_data.h b/include/bsc_data.h index b2fd29f..fa04c3a 100644 --- a/include/bsc_data.h +++ b/include/bsc_data.h @@ -63,6 +63,8 @@ struct link_data { struct bsc_data *bsc; struct mtp_link_set *the_link; + int available; + struct timer_list link_activate; int (*start)(struct link_data *); diff --git a/src/links.c b/src/links.c index 6764b54..023a7f4 100644 --- a/src/links.c +++ b/src/links.c @@ -29,17 +29,42 @@ extern struct bsc_data bsc; +int is_one_up(struct mtp_link_set *set) +{ + struct link_data *entry; + + llist_for_each_entry(entry, &set->links, entry) + if (entry->available) + return 1; + return 0; +} + void mtp_link_down(struct link_data *link) { - mtp_linkset_down(link->the_link); + int one_up; + int was_up; + + was_up = link->available; + link->available = 0; + one_up = is_one_up(link->the_link); + + /* our linkset is now unsuable */ + if (was_up && !one_up) + mtp_linkset_down(link->the_link); link->clear_queue(link); mtp_link_set_init_slc(link->the_link); } void mtp_link_up(struct link_data *link) { - mtp_linkset_up(link->the_link); + int one_up; + + one_up = is_one_up(link->the_link); + link->available = 1; + mtp_link_set_init_slc(link->the_link); + if (!one_up) + mtp_linkset_up(link->the_link); } void mtp_link_set_sccp_down(struct mtp_link_set *link) -- cgit v1.2.3