mtp: Allocate the MTPLinkSet as a child of the BSC

In preparation of the VTY code change, make the mtp linkset
a child of the bsc.
diff --git a/include/bsc_data.h b/include/bsc_data.h
index 189ddcb..df62493 100644
--- a/include/bsc_data.h
+++ b/include/bsc_data.h
@@ -123,7 +123,6 @@
 	int setup;
 	int pcap_fd;
 	int udp_reset_timeout;
-	struct llist_head links;
 
 	/* udp code */
 	struct mtp_udp_data udp_data;
@@ -145,6 +144,9 @@
 	/* isup handling */
 	int isup_pass;
 
+	/* MTP Links */
+	struct llist_head linksets;
+	int num_linksets;
 
 	/* inject */
 	int allow_inject;
diff --git a/include/mtp_data.h b/include/mtp_data.h
index e8cb79e..3330de6 100644
--- a/include/mtp_data.h
+++ b/include/mtp_data.h
@@ -42,13 +42,15 @@
  */
 struct mtp_link_set {
 	struct llist_head entry;
+	int no;
+	char *name;
+
 
 	/* routing info.. */
 	int dpc, opc, sccp_opc, isup_opc;
 	int ni;
 	int spare;
 
-	const char *name;
 
 	/* internal state */
 	/* the MTP1 link is up */
@@ -120,7 +122,6 @@
 };
 
 
-struct mtp_link_set *mtp_link_set_alloc(void);
 void mtp_link_set_stop(struct mtp_link_set *link);
 void mtp_link_set_reset(struct mtp_link_set *link);
 int mtp_link_set_data(struct mtp_link *link, struct msgb *msg);
@@ -134,9 +135,6 @@
 void mtp_link_unblock(struct mtp_link *link);
 
 
-/* one time init function */
-void mtp_link_set_init(void);
-
 /* to be implemented for MSU sending */
 void mtp_link_submit(struct mtp_link *link, struct msgb *msg);
 void mtp_link_set_forward_sccp(struct mtp_link_set *link, struct msgb *msg, int sls);
@@ -158,4 +156,7 @@
 /* internal routines */
 struct msgb *mtp_msg_alloc(struct mtp_link_set *link);
 
+/* link management */
+struct mtp_link_set *mtp_link_set_alloc(struct bsc_data *bsc);
+
 #endif
diff --git a/src/bsc.c b/src/bsc.c
index c26c6ec..081774d 100644
--- a/src/bsc.c
+++ b/src/bsc.c
@@ -35,7 +35,7 @@
 		return NULL;
 	}
 
-	INIT_LLIST_HEAD(&bsc->links);
+	INIT_LLIST_HEAD(&bsc->linksets);
 	bsc->dpc = 1;
 	bsc->opc = 0;
 	bsc->sccp_opc = -1;
diff --git a/src/links.c b/src/links.c
index b694b8c..b74d843 100644
--- a/src/links.c
+++ b/src/links.c
@@ -106,7 +106,7 @@
 	struct mtp_udp_link *lnk;
 	struct mtp_link_set *set;
 
-	set = mtp_link_set_alloc();
+	set = mtp_link_set_alloc(bsc);
 	set->name = talloc_strdup(set, "MTP");
 	set->dpc = bsc->dpc;
 	set->opc = bsc->opc;
diff --git a/src/main.c b/src/main.c
index d23961f..93e9ee3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -85,7 +85,7 @@
 	printf("Terminating.\n");
 	handled = 1;
 	if (bsc && bsc->setup) {
-		llist_for_each_entry(set, &bsc->links, entry)
+		llist_for_each_entry(set, &bsc->linksets, entry)
 			link_shutdown_all(set);
 	}
 
@@ -175,7 +175,6 @@
 	struct mtp_link_set *set;
 
 
-	mtp_link_set_init();
 	thread_init();
 
 	log_init(&log_info);
@@ -222,7 +221,6 @@
 	if (!set)
 		return -1;
 
-	llist_add(&set->entry, &bsc->links);
 	set->fw = &bsc->msc_forward;
 	bsc->msc_forward.bsc = set;
 
diff --git a/src/main_stp.c b/src/main_stp.c
index 43491b8..a26823d 100644
--- a/src/main_stp.c
+++ b/src/main_stp.c
@@ -112,7 +112,7 @@
 	printf("Terminating.\n");
 	handled = 1;
 	if (bsc && bsc->setup) {
-		llist_for_each_entry(set, &bsc->links, entry)
+		llist_for_each_entry(set, &bsc->linksets, entry)
 			link_shutdown_all(set);
 	}
 	exit(0);
@@ -182,7 +182,7 @@
 {
 	struct mtp_link_set *set;
 
-	llist_for_each_entry(set, &bsc->links, entry)
+	llist_for_each_entry(set, &bsc->linksets, entry)
 		if (strncmp(buf, set->name, len) == 0)
 			return set;
 
@@ -308,7 +308,6 @@
 	struct mtp_link_set *m2ua_set;
 	struct mtp_m2ua_link *lnk;
 
-	mtp_link_set_init();
 	thread_init();
 
 	log_init(&log_info);
@@ -356,9 +355,8 @@
 	set = link_init(bsc);
 	if (!set)
 		return -1;
-	llist_add(&set->entry, &bsc->links);
 
-	m2ua_set = mtp_link_set_alloc();
+	m2ua_set = mtp_link_set_alloc(bsc);
 	m2ua_set->dpc = 92;
 	m2ua_set->opc = 9;
 	m2ua_set->sccp_opc = 9;
@@ -367,7 +365,6 @@
 	m2ua_set->bsc = bsc;
 	m2ua_set->pcap_fd = bsc->pcap_fd;
 	m2ua_set->name = talloc_strdup(m2ua_set, "M2UA");
-	llist_add(&m2ua_set->entry, &bsc->links);
 
 	/* setup things */
 	set->pass_all_isup = bsc->isup_pass;
diff --git a/src/mtp_layer3.c b/src/mtp_layer3.c
index 71db16d..ecc1370 100644
--- a/src/mtp_layer3.c
+++ b/src/mtp_layer3.c
@@ -33,8 +33,6 @@
 
 #include <string.h>
 
-static void *tall_mtp_ctx = NULL;
-
 static int mtp_int_submit(struct mtp_link_set *link, int pc, int sls, int type, const uint8_t *data, unsigned int length);
 
 void mtp_link_submit(struct mtp_link *link, struct msgb *msg)
@@ -185,23 +183,17 @@
 	return out;
 }
 
-void mtp_link_set_init(void)
+struct mtp_link_set *mtp_link_set_alloc(struct bsc_data *bsc)
 {
-	tall_mtp_ctx = talloc_named_const(NULL, 1, "mtp-link");
-}
-
-struct mtp_link_set *mtp_link_set_alloc(void)
-{
-	static int linkset_no = 0;
 	struct mtp_link_set *link;
 
-	link = talloc_zero(tall_mtp_ctx, struct mtp_link_set);
+	link = talloc_zero(bsc, struct mtp_link_set);
 	if (!link)
 		return NULL;
 
 	link->ctrg = rate_ctr_group_alloc(link,
 					  mtp_link_set_rate_ctr_desc(),
-					  linkset_no++);
+					  bsc->num_linksets + 1);
 	if (!link->ctrg) {
 		LOGP(DINP, LOGL_ERROR, "Failed to allocate counter.\n");
 		return NULL;
@@ -211,6 +203,9 @@
 	link->ni = MTP_NI_NATION_NET;
 	INIT_LLIST_HEAD(&link->links);
 
+	link->no = bsc->num_linksets++;
+	llist_add(&link->entry, &bsc->linksets);
+
 	return link;
 }
 
diff --git a/src/vty_interface.c b/src/vty_interface.c
index 3d2b6a6..fbf0200 100644
--- a/src/vty_interface.c
+++ b/src/vty_interface.c
@@ -266,7 +266,7 @@
 
 	bsc->isup_pass = atoi(argv[0]);
 
-	llist_for_each_entry(set, &bsc->links, entry)
+	llist_for_each_entry(set, &bsc->linksets, entry)
 		set->pass_all_isup = bsc->isup_pass;
 
 	return CMD_SUCCESS;
@@ -291,7 +291,7 @@
 {
 	struct mtp_link_set *set;
 
-	llist_for_each_entry(set, &bsc->links, entry)
+	llist_for_each_entry(set, &bsc->linksets, entry)
 		dump_stats(vty, set);
 
 	return CMD_SUCCESS;
@@ -330,7 +330,7 @@
 {
 	struct mtp_link_set *set;
 
-	llist_for_each_entry(set, &bsc->links, entry)
+	llist_for_each_entry(set, &bsc->linksets, entry)
 		dump_state(vty, set);
 	return CMD_SUCCESS;
 }
@@ -365,7 +365,7 @@
 	struct mtp_link_set *set = NULL;
 	int i;
 
-	set = find_link_set(&bsc->links, argv[0]);
+	set = find_link_set(&bsc->linksets, argv[0]);
 
 	if (!set) {
 		vty_out(vty, "Failed to find linkset.%s", VTY_NEWLINE);
@@ -392,7 +392,7 @@
 {
 	struct mtp_link_set *set = NULL;
 
-	set = find_link_set(&bsc->links, argv[0]);
+	set = find_link_set(&bsc->linksets, argv[0]);
 
 	if (!set) {
 		vty_out(vty, "Failed to find linkset.%s", VTY_NEWLINE);
@@ -420,7 +420,7 @@
 {
 	struct mtp_link_set *set = NULL;
 
-	set = find_link_set(&bsc->links, argv[0]);
+	set = find_link_set(&bsc->linksets, argv[0]);
 
 	if (!set) {
 		vty_out(vty, "Failed to find linkset.%s", VTY_NEWLINE);
@@ -436,7 +436,7 @@
 #define FIND_LINK(vty, type, nr) ({						\
 	struct mtp_link_set *set = NULL;					\
 	struct mtp_link *link = NULL, *tmp;					\
-	set = find_link_set(&bsc->links, type);					\
+	set = find_link_set(&bsc->linksets, type);				\
 	if (!set) {								\
 		vty_out(vty, "Unknown linkset %s.%s", type, VTY_NEWLINE);	\
 		return CMD_WARNING;						\