ta: Move timing advance related code into the ta.cpp file
diff --git a/src/Makefile.am b/src/Makefile.am
index ab72aa3..3c2c78c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -45,7 +45,8 @@
 	tbf.cpp \
 	bts.cpp \
 	poll_controller.cpp \
-	encoding.cpp
+	encoding.cpp \
+	ta.cpp
 
 if ENABLE_SYSMOBTS
 libgprs_la_SOURCES += \
diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp
index da48b6b..d1d9bd9 100644
--- a/src/gprs_rlcmac.cpp
+++ b/src/gprs_rlcmac.cpp
@@ -313,105 +313,3 @@
 }
 
 
-/*
- * timing advance memory
- */
-
-/* enable to debug timing advance memory */
-//#define DEBUG_TA
-
-static LLIST_HEAD(gprs_rlcmac_ta_list);
-static int gprs_rlcmac_ta_num = 0;
-
-struct gprs_rlcmac_ta {
-	struct llist_head	list;
-	uint32_t		tlli;
-	uint8_t			ta;
-};
-
-/* remember timing advance of a given TLLI */
-int remember_timing_advance(uint32_t tlli, uint8_t ta)
-{
-	struct gprs_rlcmac_ta *ta_entry;
-
-	/* check for existing entry */
-	llist_for_each_entry(ta_entry, &gprs_rlcmac_ta_list, list) {
-		if (ta_entry->tlli == tlli) {
-#ifdef DEBUG_TA
-			fprintf(stderr, "update %08x %d\n", tlli, ta);
-#endif
-			ta_entry->ta = ta;
-			/* relink to end of list */
-			llist_del(&ta_entry->list);
-			llist_add_tail(&ta_entry->list, &gprs_rlcmac_ta_list);
-			return 0;
-		}
-	}
-
-#ifdef DEBUG_TA
-	fprintf(stderr, "remember %08x %d\n", tlli, ta);
-#endif
-	/* if list is full, remove oldest entry */
-	if (gprs_rlcmac_ta_num == 30) {
-		ta_entry = llist_entry(gprs_rlcmac_ta_list.next,
-			struct gprs_rlcmac_ta, list);
-	        llist_del(&ta_entry->list);
-		talloc_free(ta_entry);
-		gprs_rlcmac_ta_num--;
-	}
-
-	/* create new TA entry */
-	ta_entry = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ta);
-	if (!ta_entry)
-		return -ENOMEM;
-
-	ta_entry->tlli = tlli;
-	ta_entry->ta = ta;
-	llist_add_tail(&ta_entry->list, &gprs_rlcmac_ta_list);
-	gprs_rlcmac_ta_num++;
-
-	return 0;
-}
-
-int recall_timing_advance(uint32_t tlli)
-{
-	struct gprs_rlcmac_ta *ta_entry;
-	uint8_t ta;
-
-	llist_for_each_entry(ta_entry, &gprs_rlcmac_ta_list, list) {
-		if (ta_entry->tlli == tlli) {
-			ta = ta_entry->ta;
-#ifdef DEBUG_TA
-			fprintf(stderr, "recall %08x %d\n", tlli, ta);
-#endif
-			return ta;
-		}
-	}
-#ifdef DEBUG_TA
-	fprintf(stderr, "no entry for %08x\n", tlli);
-#endif
-
-	return -EINVAL;
-}
-
-int flush_timing_advance(void)
-{
-	struct gprs_rlcmac_ta *ta_entry;
-	int count = 0;
-
-	while (!llist_empty(&gprs_rlcmac_ta_list)) {
-		ta_entry = llist_entry(gprs_rlcmac_ta_list.next,
-			struct gprs_rlcmac_ta, list);
-#ifdef DEBUG_TA
-		fprintf(stderr, "flush entry %08x %d\n", ta_entry->tlli,
-			ta_entry->ta);
-#endif
-	        llist_del(&ta_entry->list);
-		talloc_free(ta_entry);
-		count++;
-	}
-	gprs_rlcmac_ta_num = 0;
-
-	return count;
-}
-
diff --git a/src/ta.cpp b/src/ta.cpp
new file mode 100644
index 0000000..7aef867
--- /dev/null
+++ b/src/ta.cpp
@@ -0,0 +1,133 @@
+/*
+ * ta.cpp timing advance handling
+ * Copyright (C) 2012 Ivan Klyuchnikov
+ * Copyright (C) 2012 Andreas Eversberg <jolly@eversberg.eu>
+ * Copyright (C) 2013 by Holger Hans Peter Freyther
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#include <gprs_rlcmac.h>
+
+extern "C" {
+	#include <osmocom/core/talloc.h>
+}
+
+#include <errno.h>
+
+extern void *tall_pcu_ctx;
+
+/*
+ * timing advance memory
+ */
+
+/* enable to debug timing advance memory */
+//#define DEBUG_TA
+
+static LLIST_HEAD(gprs_rlcmac_ta_list);
+static int gprs_rlcmac_ta_num = 0;
+
+struct gprs_rlcmac_ta {
+	struct llist_head	list;
+	uint32_t		tlli;
+	uint8_t			ta;
+};
+
+/* remember timing advance of a given TLLI */
+int remember_timing_advance(uint32_t tlli, uint8_t ta)
+{
+	struct gprs_rlcmac_ta *ta_entry;
+
+	/* check for existing entry */
+	llist_for_each_entry(ta_entry, &gprs_rlcmac_ta_list, list) {
+		if (ta_entry->tlli == tlli) {
+#ifdef DEBUG_TA
+			fprintf(stderr, "update %08x %d\n", tlli, ta);
+#endif
+			ta_entry->ta = ta;
+			/* relink to end of list */
+			llist_del(&ta_entry->list);
+			llist_add_tail(&ta_entry->list, &gprs_rlcmac_ta_list);
+			return 0;
+		}
+	}
+
+#ifdef DEBUG_TA
+	fprintf(stderr, "remember %08x %d\n", tlli, ta);
+#endif
+	/* if list is full, remove oldest entry */
+	if (gprs_rlcmac_ta_num == 30) {
+		ta_entry = llist_entry(gprs_rlcmac_ta_list.next,
+			struct gprs_rlcmac_ta, list);
+	        llist_del(&ta_entry->list);
+		talloc_free(ta_entry);
+		gprs_rlcmac_ta_num--;
+	}
+
+	/* create new TA entry */
+	ta_entry = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ta);
+	if (!ta_entry)
+		return -ENOMEM;
+
+	ta_entry->tlli = tlli;
+	ta_entry->ta = ta;
+	llist_add_tail(&ta_entry->list, &gprs_rlcmac_ta_list);
+	gprs_rlcmac_ta_num++;
+
+	return 0;
+}
+
+int recall_timing_advance(uint32_t tlli)
+{
+	struct gprs_rlcmac_ta *ta_entry;
+	uint8_t ta;
+
+	llist_for_each_entry(ta_entry, &gprs_rlcmac_ta_list, list) {
+		if (ta_entry->tlli == tlli) {
+			ta = ta_entry->ta;
+#ifdef DEBUG_TA
+			fprintf(stderr, "recall %08x %d\n", tlli, ta);
+#endif
+			return ta;
+		}
+	}
+#ifdef DEBUG_TA
+	fprintf(stderr, "no entry for %08x\n", tlli);
+#endif
+
+	return -EINVAL;
+}
+
+int flush_timing_advance(void)
+{
+	struct gprs_rlcmac_ta *ta_entry;
+	int count = 0;
+
+	while (!llist_empty(&gprs_rlcmac_ta_list)) {
+		ta_entry = llist_entry(gprs_rlcmac_ta_list.next,
+			struct gprs_rlcmac_ta, list);
+#ifdef DEBUG_TA
+		fprintf(stderr, "flush entry %08x %d\n", ta_entry->tlli,
+			ta_entry->ta);
+#endif
+	        llist_del(&ta_entry->list);
+		talloc_free(ta_entry);
+		count++;
+	}
+	gprs_rlcmac_ta_num = 0;
+
+	return count;
+}
+