gprs_gmm: introduce a GMM Attach Request FSM

The old GMM Attach Request handling used a recursive function
which can not handle certain states and is quite complex and hard to
extend.

The new FSM handles such request in a FSM and can be called multiple
times.

Change-Id: I58b9c17be9776a03bb2a5b21e99135cfefc8c912
diff --git a/include/osmocom/sgsn/gprs_sgsn.h b/include/osmocom/sgsn/gprs_sgsn.h
index 6f16dc7..a5ca959 100644
--- a/include/osmocom/sgsn/gprs_sgsn.h
+++ b/include/osmocom/sgsn/gprs_sgsn.h
@@ -4,6 +4,7 @@
 #include <stdint.h>
 #include <netinet/in.h>
 
+#include <osmocom/core/fsm.h>
 #include <osmocom/core/timer.h>
 
 #include <osmocom/gsm/gsm48.h>
@@ -168,6 +169,15 @@
 		struct ranap_ue_conn_ctx	*ue_ctx;
 		struct service_info	service;
 	} iu;
+	struct {
+		struct osmo_fsm_inst *fsm;
+
+		/* when a second attach req arrives while in this procedure,
+		 * the fsm needs to compare it against old to decide what to do */
+		struct msgb *attach_req;
+		uint32_t id_type;
+		bool auth_reattempt;
+	} gmm_att_req;
 	/* VLR number */
 	uint32_t		new_sgsn_addr;
 	/* Authentication Triplet */