ipaccess: Fix wrong assertion in ipaccess_drop() when used by BTS code

The code wrongly assumed that ipaccess_drop was only called by BSC code,
which is wrong. ipaccess_drop is called by BTS run code path in __handle_ts1_write(),
if send() syscall fails (for instance because BSC becomes unreachable).
In that case, we need to account for the BTS role case which doesn't
store the line pointer into the ofd->data. In BTS case, it's a pointer
to the struct ipa_client_conn, which we leave up to sign_link_down() cb
to do whatever they please with.

Fixes: OS#4864
Change-Id: If763e5f7736921a4360ad9027ba075ef8e118934
diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c
index 48a427c..a370c77 100644
--- a/src/input/ipaccess.c
+++ b/src/input/ipaccess.c
@@ -92,13 +92,23 @@
 		osmo_fd_unregister(bfd);
 		close(bfd->fd);
 		bfd->fd = -1;
-		/* This is BSC code, ipaccess_drop() is only called for
-		   accepted() sockets, hence the bfd holds a reference to
-		   e1inp_line in ->data that needs to be released */
-		OSMO_ASSERT(bfd->data == line);
-		bfd->data = NULL;
-		e1inp_line_put2(line, "ipa_bfd");
-
+		switch (line->ops->cfg.ipa.role) {
+		case E1INP_LINE_R_BSC:
+			/* This is BSC code, ipaccess_drop() is only called for
+			   accepted() sockets, hence the bfd holds a reference to
+			   e1inp_line in ->data that needs to be released */
+			OSMO_ASSERT(bfd->data == line);
+			bfd->data = NULL;
+			e1inp_line_put2(line, "ipa_bfd");
+			break;
+		case E1INP_LINE_R_BTS:
+			/* BTS code: bfd->data contains pointer to struct
+			 * ipa_client_conn. Leave it alive so it reconnects.
+			 */
+			break;
+		default:
+			break;
+		}
 		ret = -ENOENT;
 	} else {
 		LOGPITS(e1i_ts, DLINP, LOGL_ERROR,