aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-01-22 15:52:07 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-01-22 16:22:18 +0100
commit4c1eb0ee43259bae710b5685ed666210be9712f9 (patch)
tree301658340558a040a479164144d1a74a0f6005d9
parentc5d897e8474e99f2b42202b8ec323484225796ec (diff)
stats: Count packets on a per link level
-rw-r--r--include/mtp_data.h7
-rw-r--r--src/mtp_layer3.c7
-rw-r--r--src/mtp_link.c14
-rw-r--r--src/sctp_m2ua.c11
4 files changed, 32 insertions, 7 deletions
diff --git a/include/mtp_data.h b/include/mtp_data.h
index 9a076d0..e6cd872 100644
--- a/include/mtp_data.h
+++ b/include/mtp_data.h
@@ -96,6 +96,9 @@ struct mtp_link {
struct timer_list t1_timer;
struct timer_list t2_timer;
+ /* statistics */
+ struct rate_ctr_group *ctrg;
+
/* callback's to implement */
int (*start)(struct mtp_link *);
int (*write)(struct mtp_link *, struct msgb *msg);
@@ -113,7 +116,7 @@ int mtp_link_set_submit_sccp_data(struct mtp_link_set *link, int sls, const uint
int mtp_link_set_submit_isup_data(struct mtp_link_set *link, int sls, const uint8_t *data, unsigned int length);
void mtp_link_set_init_slc(struct mtp_link_set *set);
-void mtp_link_set_add_link(struct mtp_link_set *set, struct mtp_link *link);
+int mtp_link_set_add_link(struct mtp_link_set *set, struct mtp_link *link);
/* one time init function */
@@ -129,7 +132,7 @@ void mtp_link_restart(struct mtp_link *link);
void mtp_link_down(struct mtp_link *data);
void mtp_link_up(struct mtp_link *data);
-void mtp_link_init(struct mtp_link *link);
+int mtp_link_init(struct mtp_link *link);
void mtp_link_start_link_test(struct mtp_link *link);
void mtp_link_stop_link_test(struct mtp_link *link);
int mtp_link_slta(struct mtp_link *link, uint16_t l3_len, struct mtp_level_3_mng *mng);
diff --git a/src/mtp_layer3.c b/src/mtp_layer3.c
index 6dee90f..4cbf999 100644
--- a/src/mtp_layer3.c
+++ b/src/mtp_layer3.c
@@ -39,6 +39,7 @@ static int mtp_int_submit(struct mtp_link_set *link, int pc, int sls, int type,
void mtp_link_set_submit(struct mtp_link *link, struct msgb *msg)
{
+ rate_ctr_inc(&link->ctrg->ctr[MTP_LNK_OUT]);
rate_ctr_inc(&link->set->ctrg->ctr[MTP_LSET_TOTA_OUT_MSG]);
link->write(link, msg);
}
@@ -585,12 +586,14 @@ void mtp_link_set_init_slc(struct mtp_link_set *set)
}
}
-void mtp_link_set_add_link(struct mtp_link_set *set, struct mtp_link *lnk)
+int mtp_link_set_add_link(struct mtp_link_set *set, struct mtp_link *lnk)
{
lnk->set = set;
lnk->link_no = set->nr_links++;
- mtp_link_init(lnk);
+ if (mtp_link_init(lnk) != 0)
+ return -1;
llist_add_tail(&lnk->entry, &set->links);
mtp_link_set_init_slc(set);
+ return 0;
}
diff --git a/src/mtp_link.c b/src/mtp_link.c
index 5e5f418..d885738 100644
--- a/src/mtp_link.c
+++ b/src/mtp_link.c
@@ -22,6 +22,7 @@
#include <mtp_data.h>
#include <mtp_level3.h>
#include <cellmgr_debug.h>
+#include <counter.h>
#include <string.h>
@@ -71,6 +72,8 @@ static void mtp_sltm_t1_timeout(void *_link)
{
struct mtp_link *link = (struct mtp_link *) _link;
+ rate_ctr_inc(&link->ctrg->ctr[MTP_LNK_SLTM_TOUT]);
+
if (link->slta_misses == 0) {
LOGP(DINP, LOGL_ERROR, "No SLTM response. Retrying. Link: %p\n", link);
++link->slta_misses;
@@ -103,12 +106,20 @@ static void mtp_sltm_t2_timeout(void *_link)
bsc_schedule_timer(&link->t2_timer, MTP_T2);
}
-void mtp_link_init(struct mtp_link *link)
+int mtp_link_init(struct mtp_link *link)
{
+ link->ctrg = rate_ctr_group_alloc(link,
+ mtp_link_rate_ctr_desc(), link->link_no);
+ if (!link->ctrg) {
+ LOGP(DINP, LOGL_ERROR, "Failed to allocate rate_ctr.\n");
+ return -1;
+ }
+
link->t1_timer.data = link;
link->t1_timer.cb = mtp_sltm_t1_timeout;
link->t2_timer.data = link;
link->t2_timer.cb = mtp_sltm_t2_timeout;
+ return 0;
}
void mtp_link_stop_link_test(struct mtp_link *link)
@@ -153,5 +164,6 @@ int mtp_link_slta(struct mtp_link *link, uint16_t l3_len,
void mtp_link_failure(struct mtp_link *link)
{
LOGP(DINP, LOGL_ERROR, "Link has failed. Resetting it: 0x%p\n", link);
+ rate_ctr_inc(&link->ctrg->ctr[MTP_LNK_ERROR]);
link->reset(link);
}
diff --git a/src/sctp_m2ua.c b/src/sctp_m2ua.c
index a4743fa..d3a64c9 100644
--- a/src/sctp_m2ua.c
+++ b/src/sctp_m2ua.c
@@ -18,6 +18,7 @@
#include <sctp_m2ua.h>
#include <bsc_data.h>
#include <cellmgr_debug.h>
+#include <counter.h>
#include <mtp_data.h>
#include <mtp_pcap.h>
@@ -31,6 +32,12 @@
extern struct bsc_data bsc;
+static void link_down(struct mtp_link *link)
+{
+ rate_ctr_inc(&link->ctrg->ctr[MTP_LNK_ERROR]);
+ mtp_link_down(link);
+}
+
static void m2ua_conn_destroy(struct sctp_m2ua_conn *conn)
{
close(conn->queue.bfd.fd);
@@ -39,7 +46,7 @@ static void m2ua_conn_destroy(struct sctp_m2ua_conn *conn)
llist_del(&conn->entry);
if (conn->asp_up && conn->asp_active && conn->established)
- mtp_link_down(&conn->trans->base);
+ link_down(&conn->trans->base);
talloc_free(conn);
#warning "Notify any other AS(P) for failover scenario"
@@ -286,7 +293,7 @@ static int m2ua_handle_rel_req(struct sctp_m2ua_conn *conn,
conn->established = 0;
LOGP(DINP, LOGL_NOTICE, "M2UA/Link is released.\n");
- mtp_link_down(&conn->trans->base);
+ link_down(&conn->trans->base);
m2ua_msg_free(conf);
return 0;
}