filter: Remove bsc_connection from the filter API

Remove the last occurence of NAT datastructures in the filtering
module and add the ctx to the filter request structure.
diff --git a/openbsc/include/openbsc/bsc_msg_filter.h b/openbsc/include/openbsc/bsc_msg_filter.h
index 6489050..b09cd8a 100644
--- a/openbsc/include/openbsc/bsc_msg_filter.h
+++ b/openbsc/include/openbsc/bsc_msg_filter.h
@@ -10,9 +10,6 @@
 struct vty;
 struct gsm48_hdr;
 
-/* TODO: remove */
-struct bsc_connection;
-
 struct bsc_filter_reject_cause {
 	int lu_reject_cause;
 	int cm_reject_cause;
@@ -61,6 +58,15 @@
 	int imsi_checked;
 };
 
+struct bsc_filter_request {
+	void *ctx;
+	struct rb_root *black_list;
+	struct llist_head *access_lists;
+	const char *local_lst_name;
+	const char *global_lst_name;
+	int bsc_nr;
+};
+
 
 int bsc_filter_barr_adapt(void *ctx, struct rb_root *rbtree, const struct osmo_config_list *);
 int bsc_filter_barr_find(struct rb_root *root, const char *imsi, int *cm, int *lu);
@@ -69,11 +75,11 @@
  * Content filtering.
  */
 int bsc_msg_filter_initial(struct gsm48_hdr *hdr, size_t size,
-			struct bsc_connection *bsc,
+			struct bsc_filter_request *req,
 			int *con_type, char **imsi,
 			struct bsc_filter_reject_cause *cause);
 int bsc_msg_filter_data(struct gsm48_hdr *hdr, size_t size,
-			struct bsc_connection *bsc,
+			struct bsc_filter_request *req,
 			struct bsc_filter_state *state,
 			struct bsc_filter_reject_cause *cause);
 
diff --git a/openbsc/src/libfilter/bsc_msg_filter.c b/openbsc/src/libfilter/bsc_msg_filter.c
index 52c71b9..159f6cc 100644
--- a/openbsc/src/libfilter/bsc_msg_filter.c
+++ b/openbsc/src/libfilter/bsc_msg_filter.c
@@ -38,14 +38,6 @@
 
 #include <osmocom/sccp/sccp.h>
 
-struct filter_request {
-	struct rb_root *black_list;
-	struct llist_head *access_lists;
-	const char *local_lst_name;
-	const char *global_lst_name;
-	int bsc_nr;
-};
-
 int bsc_filter_barr_find(struct rb_root *root, const char *imsi, int *cm, int *lu)
 {
 	struct bsc_filter_barr_entry *n;
@@ -150,7 +142,7 @@
 }
 
 /* apply white/black list */
-static int auth_imsi(struct filter_request *req,
+static int auth_imsi(struct bsc_filter_request *req,
 		const char *imsi,
 		struct bsc_filter_reject_cause *cause)
 {
@@ -306,7 +298,7 @@
 	return 1;
 }
 
-static int _dt_check_id_resp(void *ctx, struct filter_request *req,
+static int _dt_check_id_resp(struct bsc_filter_request *req,
 			     uint8_t *data, unsigned int length,
 			     struct bsc_filter_state *state,
 			     struct bsc_filter_reject_cause *cause)
@@ -331,18 +323,17 @@
 		return 0;
 
 	state->imsi_checked = 1;
-	state->imsi = talloc_strdup(ctx, mi_string);
+	state->imsi = talloc_strdup(req->ctx, mi_string);
 	return auth_imsi(req, mi_string, cause);
 }
 
 
 /* Filter out CR data... */
 int bsc_msg_filter_initial(struct gsm48_hdr *hdr48, size_t hdr48_len,
-			struct bsc_connection *bsc,
+			struct bsc_filter_request *req,
 			int *con_type,
 			char **imsi, struct bsc_filter_reject_cause *cause)
 {
-	struct filter_request req;
 	int ret = 0;
 	uint8_t msg_type, proto;
 
@@ -356,18 +347,18 @@
 	if (proto == GSM48_PDISC_MM &&
 	    msg_type == GSM48_MT_MM_LOC_UPD_REQUEST) {
 		*con_type = NAT_CON_TYPE_LU;
-		ret = _cr_check_loc_upd(bsc, &hdr48->data[0],
+		ret = _cr_check_loc_upd(req->ctx, &hdr48->data[0],
 					hdr48_len - sizeof(*hdr48), imsi);
 	} else if (proto == GSM48_PDISC_MM &&
 		  msg_type == GSM48_MT_MM_CM_SERV_REQ) {
 		*con_type = NAT_CON_TYPE_CM_SERV_REQ;
-		ret = _cr_check_cm_serv_req(bsc, &hdr48->data[0],
+		ret = _cr_check_cm_serv_req(req->ctx, &hdr48->data[0],
 					     hdr48_len - sizeof(*hdr48),
 					     con_type, imsi);
 	} else if (proto == GSM48_PDISC_RR &&
 		   msg_type == GSM48_MT_RR_PAG_RESP) {
 		*con_type = NAT_CON_TYPE_PAG_RESP;
-		ret = _cr_check_pag_resp(bsc, &hdr48->data[0],
+		ret = _cr_check_pag_resp(req->ctx, &hdr48->data[0],
 					hdr48_len - sizeof(*hdr48), imsi);
 	} else {
 		/* We only want to filter the above, let other things pass */
@@ -384,20 +375,14 @@
 		return -1;
 
 	/* now check the imsi */
-	req.black_list = &bsc->nat->imsi_black_list;
-	req.access_lists = &bsc->nat->access_lists;
-	req.local_lst_name = bsc->cfg->acc_lst_name;
-	req.global_lst_name = bsc->nat->acc_lst_name;
-	req.bsc_nr = bsc->cfg->nr;
-	return auth_imsi(&req, *imsi, cause);
+	return auth_imsi(req, *imsi, cause);
 }
 
 int bsc_msg_filter_data(struct gsm48_hdr *hdr48, size_t len,
-		struct bsc_connection *bsc,
+		struct bsc_filter_request *req,
 		struct bsc_filter_state *state,
 		struct bsc_filter_reject_cause *cause)
 {
-	struct filter_request req;
 	uint8_t msg_type, proto;
 
 	cause->cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
@@ -411,11 +396,6 @@
 	if (proto != GSM48_PDISC_MM || msg_type != GSM48_MT_MM_ID_RESP)
 		return 0;
 
-	req.black_list = &bsc->nat->imsi_black_list;
-	req.access_lists = &bsc->nat->access_lists;
-	req.local_lst_name = bsc->cfg->acc_lst_name;
-	req.global_lst_name = bsc->nat->acc_lst_name;
-	req.bsc_nr = bsc->cfg->nr;
-	return _dt_check_id_resp(bsc, &req, &hdr48->data[0],
+	return _dt_check_id_resp(req, &hdr48->data[0],
 					len - sizeof(*hdr48), state, cause);
 }
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_filter.c b/openbsc/src/osmo-bsc_nat/bsc_nat_filter.c
index af0f7a1..6883d66 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_filter.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_filter.c
@@ -35,6 +35,7 @@
 			struct bsc_nat_parsed *parsed, int *con_type,
 			char **imsi, struct bsc_filter_reject_cause *cause)
 {
+	struct bsc_filter_request req;
 	struct tlv_parsed tp;
 	struct gsm48_hdr *hdr48;
 	int hdr48_len;
@@ -77,7 +78,13 @@
 	}
 
 	hdr48 = (struct gsm48_hdr *) TLVP_VAL(&tp, GSM0808_IE_LAYER_3_INFORMATION);
-	return bsc_msg_filter_initial(hdr48, hdr48_len, bsc, con_type, imsi, cause);
+	req.ctx = bsc;
+	req.black_list = &bsc->nat->imsi_black_list;
+	req.access_lists = &bsc->nat->access_lists;
+	req.local_lst_name = bsc->cfg->acc_lst_name;
+	req.global_lst_name = bsc->nat->acc_lst_name;
+	req.bsc_nr = bsc->cfg->nr;
+	return bsc_msg_filter_initial(hdr48, hdr48_len, &req, con_type, imsi, cause);
 }
 
 int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
@@ -86,6 +93,7 @@
 {
 	uint32_t len;
 	struct gsm48_hdr *hdr48;
+	struct bsc_filter_request req;
 
 	cause->cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
 	cause->lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
@@ -101,5 +109,11 @@
 	if (!hdr48)
 		return -1;
 
-	return bsc_msg_filter_data(hdr48, len, bsc, &con->filter_state, cause);
+	req.ctx = bsc;
+	req.black_list = &bsc->nat->imsi_black_list;
+	req.access_lists = &bsc->nat->access_lists;
+	req.local_lst_name = bsc->cfg->acc_lst_name;
+	req.global_lst_name = bsc->nat->acc_lst_name;
+	req.bsc_nr = bsc->cfg->nr;
+	return bsc_msg_filter_data(hdr48, len, &req, &con->filter_state, cause);
 }