asn1tostruct: Add memory free functions and use them in HNBAP
diff --git a/asn1/utils/asn1tostruct.py b/asn1/utils/asn1tostruct.py
index 862839f..5b0e737 100755
--- a/asn1/utils/asn1tostruct.py
+++ b/asn1/utils/asn1tostruct.py
@@ -333,7 +333,7 @@
             f.write("                    ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
         else:
             f.write("                memcpy(&%s->%s, %s_p, sizeof(%s_t));\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst), ietypeunderscore))
-            f.write("                ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
+            f.write("                FREEMEM(%s_p);\n" % (lowerFirstCamelWord(ietypesubst)))
         f.write("            } break;\n")
     f.write("            default:\n")
     f.write("                %s_DEBUG(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower())))
@@ -345,6 +345,35 @@
     f.write("}\n\n")
 
 for key in iesDefs:
+    keyupperunderscore = re.sub('-', '_', key.upper())
+    keylowerunderscore = re.sub('-', '_', key.lower())
+    structName = re.sub('ies', '', key)
+
+    if len(iesDefs[key]["ies"]) == 0:
+       continue
+
+    f.write("int %s_free_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower())))
+    if len(iesDefs[key]["ies"]) != 0:
+        f.write("    %s_t *%s) {\n\n" % (prefix + re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+
+    for ie in iesDefs[key]["ies"]:
+        ietypeunderscore = prefix + re.sub('-', '_', ie[2])
+        ieupperunderscore = prefix + re.sub('-', '_', ie[2]).upper()
+        if ie[3] != "mandatory":
+            if ie[3] == "optional":
+                f.write("    /* Optional field */\n")
+            elif ie[3] == "conditional":
+                f.write("    /* Conditional field */\n")
+            f.write("    if ((%s->presenceMask & %s_%s_PRESENT)\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore))
+            f.write("        == %s_%s_PRESENT) \n    " % (keyupperunderscore, ieupperunderscore))
+
+        ieunderscore = prefix + re.sub('-', '_', ie[2])
+        iename = re.sub('id-', '', ie[0])
+        ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename))
+        f.write("    ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_%s, &%s->%s);\n" % (ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore))
+    f.write("}\n\n")
+
+for key in iesDefs:
     if key not in ieofielist.values():
         continue
 
diff --git a/src/hnbgw_hnbap.c b/src/hnbgw_hnbap.c
index eda5139..971e97e 100644
--- a/src/hnbgw_hnbap.c
+++ b/src/hnbgw_hnbap.c
@@ -126,6 +126,7 @@
 	DEBUGP(DHNBAP, "HNB-DE-REGSITER cause=%ld\n",
 		ies.cause);
 
+	hnbap_free_hnbde_registeries(&ies);
 	hnb_context_release(ctx);
 
 	return 0;
@@ -153,7 +154,9 @@
 	DEBUGP(DHNBAP, "HNB-REGISTER-REQ from %s\n", ctx->identity_info);
 
 	/* Send HNBRegisterAccept */
-	return hnbgw_tx_hnb_register_acc(ctx);
+	rc = hnbgw_tx_hnb_register_acc(ctx);
+	hnbap_free_hnbregisterrequesties(&ies);
+	return rc;
 }
 
 static int hnbgw_rx_ue_register_req(struct hnb_context *ctx, ANY_t *in)
@@ -192,6 +195,7 @@
 	if (!ue)
 		ue = ue_context_alloc(ctx, imsi);
 
+	hnbap_free_ueregisterrequesties(&ies);
 	/* Send UERegisterAccept */
 	return hnbgw_tx_ue_register_acc(ue);
 }
@@ -216,6 +220,7 @@
 	if (ue)
 		ue_context_free(ue);
 
+	hnbap_free_uede_registeries(&ies);
 	return 0;
 }
 
@@ -231,6 +236,7 @@
 	LOGP(DHNBAP, LOGL_NOTICE, "HNBAP ERROR.ind, cause: %s\n",
 		hnbap_cause_str(&ies.cause));
 
+	hnbap_free_errorindicationies(&ies);
 	return 0;
 }