SGSN: split GEA key management from TLLI

Move GEA key from TLLI assignment into separate function.

Change-Id: I8a0bc907072dc19cd9535a28b5252dc0f05357cc
Related: OS#1582
diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c
index 7f10b07..492c766 100644
--- a/openbsc/src/gprs/gprs_gmm.c
+++ b/openbsc/src/gprs/gprs_gmm.c
@@ -976,8 +976,10 @@
 		ctx->gb.tlli_new = gprs_tmsi2tlli(ctx->p_tmsi, TLLI_LOCAL);
 
 		/* Inform LLC layer about new TLLI but keep old active */
-		gprs_llgmm_assign(ctx->gb.llme, ctx->gb.tlli, ctx->gb.tlli_new,
-				  GPRS_ALGO_GEA0, NULL);
+		if (ctx->is_authenticated)
+			gprs_llme_copy_key(ctx, ctx->gb.llme);
+
+		gprs_llgmm_assign(ctx->gb.llme, ctx->gb.tlli, ctx->gb.tlli_new);
 	}
 
 	ctx->pending_req = GSM48_MT_GMM_ATTACH_REQ;
@@ -1276,8 +1278,7 @@
 
 		/* Inform LLC layer about new TLLI but keep old active */
 		gprs_llgmm_assign(mmctx->gb.llme, mmctx->gb.tlli,
-				  mmctx->gb.tlli_new, GPRS_ALGO_GEA0,
-				  NULL);
+				  mmctx->gb.tlli_new);
 	}
 
 	/* Look at PDP Context Status IE and see if MS's view of
@@ -1412,9 +1413,9 @@
 		if (mmctx->ran_type == MM_CTX_T_GERAN_Gb) {
 			/* Unassign the old TLLI */
 			mmctx->gb.tlli = mmctx->gb.tlli_new;
+			gprs_llme_copy_key(mmctx, mmctx->gb.llme);
 			gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff,
-					  mmctx->gb.tlli_new,
-					  GPRS_ALGO_GEA0, NULL);
+					  mmctx->gb.tlli_new);
 		}
 		mmctx->mm_state = GMM_REGISTERED_NORMAL;
 		rc = 0;
@@ -1435,8 +1436,8 @@
 		if (mmctx->ran_type == MM_CTX_T_GERAN_Gb) {
 			/* Unassign the old TLLI */
 			mmctx->gb.tlli = mmctx->gb.tlli_new;
-			gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff, mmctx->gb.tlli_new,
-					  GPRS_ALGO_GEA0, NULL);
+			gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff,
+					  mmctx->gb.tlli_new);
 		}
 		mmctx->mm_state = GMM_REGISTERED_NORMAL;
 		rc = 0;