gbproxy/test: Add expect_msg checks to test_gbproxy_keep_info

This patch adds assertions to check the LLC/GMM message received from
the gbproxy by the test framework within the function
test_gbproxy_keep_info.

It also fixes the source address of the DETACH ACC messages.

Sponsored-by: On-Waves ehf
diff --git a/openbsc/tests/gbproxy/gbproxy_test.c b/openbsc/tests/gbproxy/gbproxy_test.c
index 16dbf5b..350c9f0 100644
--- a/openbsc/tests/gbproxy/gbproxy_test.c
+++ b/openbsc/tests/gbproxy/gbproxy_test.c
@@ -3247,6 +3247,8 @@
 	unsigned bss_nu = 0;
 	unsigned sgsn_nu = 0;
 
+	LLIST_HEAD(rcv_list);
+
 	OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
 
 	bssgp_nsi = nsi;
@@ -3288,11 +3290,15 @@
 
 	printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
 
+	received_messages = &rcv_list;
+
 	send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
 		       foreign_tlli, &rai_bss, cell_id,
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_req, sizeof(dtap_attach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
@@ -3306,6 +3312,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_identity_resp, sizeof(dtap_identity_resp));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
@@ -3318,6 +3326,8 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_identity_req, sizeof(dtap_identity_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
@@ -3325,6 +3335,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_identity_resp, sizeof(dtap_identity_resp));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
@@ -3337,6 +3349,8 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_attach_acc, sizeof(dtap_attach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
@@ -3344,6 +3358,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_complete, sizeof(dtap_attach_complete));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
@@ -3351,6 +3367,8 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_gmm_information, sizeof(dtap_gmm_information));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
@@ -3362,6 +3380,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_detach_req, sizeof(dtap_detach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
+
 	link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
 	OSMO_ASSERT(link_info);
 
@@ -3372,6 +3392,8 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_detach_acc, sizeof(dtap_detach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
@@ -3379,12 +3401,16 @@
 	OSMO_ASSERT(link_info);
 	OSMO_ASSERT(link_info->is_deregistered);
 
+	OSMO_ASSERT(!expect_msg());
+
 	/* Re-Attach */
 	send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
 		       foreign_tlli, &rai_bss, cell_id,
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_req3, sizeof(dtap_attach_req3));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
@@ -3400,6 +3426,8 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_attach_acc, sizeof(dtap_attach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
@@ -3407,6 +3435,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_complete, sizeof(dtap_attach_complete));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	/* Detach (MT) */
@@ -3415,16 +3445,21 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
 	OSMO_ASSERT(link_info);
 
-	send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
+	send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
 		       local_tlli, &rai_bss, cell_id,
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
+	OSMO_ASSERT(!expect_msg());
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
@@ -3438,6 +3473,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_req3, sizeof(dtap_attach_req3));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
@@ -3453,6 +3490,8 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_attach_acc, sizeof(dtap_attach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
@@ -3460,6 +3499,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_complete, sizeof(dtap_attach_complete));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	/* Detach (MT) */
@@ -3468,16 +3509,21 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
 	OSMO_ASSERT(link_info);
 
-	send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
+	send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
 		       local_tlli, &rai_bss, cell_id,
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
+	OSMO_ASSERT(!expect_msg());
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
@@ -3491,6 +3537,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_req3, sizeof(dtap_attach_req3));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
@@ -3506,6 +3554,8 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_attach_acc, sizeof(dtap_attach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
@@ -3513,6 +3563,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_complete, sizeof(dtap_attach_complete));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	/* RA update procedure (reject -> Detach) */
@@ -3521,11 +3573,16 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
+
 	send_llc_dl_ui(nsi, "RA UDP REJ", &sgsn_peer, 0x1002,
 		       local_tlli, 1, imsi, sizeof(imsi),
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
+	OSMO_ASSERT(!expect_msg());
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
@@ -3539,6 +3596,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_req, sizeof(dtap_attach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
@@ -3554,6 +3613,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_identity_resp, sizeof(dtap_identity_resp));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
@@ -3569,6 +3630,8 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_attach_acc, sizeof(dtap_attach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
@@ -3582,6 +3645,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_complete, sizeof(dtap_attach_complete));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	/* Detach (MT) */
@@ -3590,16 +3655,20 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
 	OSMO_ASSERT(link_info);
 
-	send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
+	send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
 		       local_tlli, &rai_bss, cell_id,
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
@@ -3607,6 +3676,8 @@
 	OSMO_ASSERT(link_info);
 	OSMO_ASSERT(link_info->is_deregistered);
 
+	OSMO_ASSERT(!expect_msg());
+
 	/* Attach rejected */
 
 	gbproxy_delete_link_infos(peer);
@@ -3616,6 +3687,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_req, sizeof(dtap_attach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
@@ -3629,6 +3702,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_identity_resp, sizeof(dtap_identity_resp));
 
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
@@ -3644,10 +3719,14 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_attach_rej7, sizeof(dtap_attach_rej7));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
 
+	OSMO_ASSERT(!expect_msg());
+
 	/* Attach (incomplete) and Detach (MO) */
 
 	gbproxy_delete_link_infos(peer);
@@ -3657,6 +3736,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_req, sizeof(dtap_attach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
@@ -3670,8 +3751,12 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_detach_req, sizeof(dtap_detach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
+	OSMO_ASSERT(!expect_msg());
+
 	/* Attach (incomplete) and Detach (MT) */
 
 	gbproxy_delete_link_infos(peer);
@@ -3681,6 +3766,8 @@
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_attach_req, sizeof(dtap_attach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
@@ -3694,16 +3781,23 @@
 		       GPRS_SAPI_GMM, sgsn_nu++,
 		       dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
 
+	OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
 	OSMO_ASSERT(link_info);
 
-	send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
+	send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
 		       foreign_tlli, &rai_bss, cell_id,
 		       GPRS_SAPI_GMM, bss_nu++,
 		       dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
 
+	/* TODO: The stored messaged should be cleaned when receiving a Detach
+	 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
+	OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
+
 	dump_peers(stdout, 0, 0, &gbcfg);
 
 	OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
@@ -3711,6 +3805,9 @@
 	OSMO_ASSERT(link_info);
 	OSMO_ASSERT(link_info->is_deregistered);
 
+	OSMO_ASSERT(!expect_msg());
+	received_messages = NULL;
+
 	dump_global(stdout, 0);
 
 	gbprox_reset(&gbcfg);