aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-01-04 13:33:57 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-01-17 11:27:01 +0100
commit0f833b084bfe1bb37d3300cf78bc7cbe7a363110 (patch)
treee360992ab23b743d09ec956d5649233d4d9aac15
parent85e17d1224b7599f936264ca8d6d3824452842c8 (diff)
mtp: take the linkset down when the last link is failing
-rw-r--r--include/bsc_data.h2
-rw-r--r--src/links.c29
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)