From d10002cf8dcdbf3951c3eb36b2c429ae2046880a Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Thu, 7 Jan 2016 12:27:41 +0100 Subject: [PATCH] asn1tostruct: Add memory free functions and use them in HNBAP --- asn1/utils/asn1tostruct.py | 31 ++++++++++++++++++++++++++++++- src/hnbgw_hnbap.c | 8 +++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/asn1/utils/asn1tostruct.py b/asn1/utils/asn1tostruct.py index 862839f4..5b0e7371 100755 --- a/asn1/utils/asn1tostruct.py +++ b/asn1/utils/asn1tostruct.py @@ -333,7 +333,7 @@ for key in iesDefs: 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()))) @@ -344,6 +344,35 @@ for key in iesDefs: f.write(" return decoded;\n") 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 eda51390..971e97ec 100644 --- a/src/hnbgw_hnbap.c +++ b/src/hnbgw_hnbap.c @@ -126,6 +126,7 @@ static int hnbgw_rx_hnb_deregister(struct hnb_context *ctx, ANY_t *in) 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 @@ static int hnbgw_rx_hnb_register_req(struct hnb_context *ctx, ANY_t *in) 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 @@ static int hnbgw_rx_ue_register_req(struct hnb_context *ctx, ANY_t *in) 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 @@ static int hnbgw_rx_ue_deregister(struct hnb_context *ctx, ANY_t *in) if (ue) ue_context_free(ue); + hnbap_free_uede_registeries(&ies); return 0; } @@ -231,6 +236,7 @@ static int hnbgw_rx_err_ind(struct hnb_context *hnb, ANY_t *in) LOGP(DHNBAP, LOGL_NOTICE, "HNBAP ERROR.ind, cause: %s\n", hnbap_cause_str(&ies.cause)); + hnbap_free_errorindicationies(&ies); return 0; }