<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13843">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">nat: Allocate bsc_nat_parsed  on the stack instead of heap<br><br>There's no real need to allocate it using talloc. Allocating it on the<br>stack simplifies the code, avoids mem leaks and makes it faster.<br><br>Change-Id: I66c44890952339f15131081e2f629a2824b6d3ba<br>---<br>M openbsc/include/openbsc/bsc_nat.h<br>M openbsc/src/osmo-bsc_nat/bsc_filter.c<br>M openbsc/src/osmo-bsc_nat/bsc_nat.c<br>M openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c<br>M openbsc/src/osmo-bsc_nat/bsc_ussd.c<br>M openbsc/tests/bsc-nat/bsc_nat_test.c<br>6 files changed, 129 insertions(+), 169 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/43/13843/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h</span><br><span>index 3eba70d..7d0e969 100644</span><br><span>--- a/openbsc/include/openbsc/bsc_nat.h</span><br><span>+++ b/openbsc/include/openbsc/bsc_nat.h</span><br><span>@@ -359,7 +359,7 @@</span><br><span> /**</span><br><span>  * parse the given message into the above structure</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_nat_parsed *bsc_nat_parse(struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_nat_parse(struct msgb *msg, struct bsc_nat_parsed *parsed);</span><br><span> </span><br><span> /**</span><br><span>  * filter based on IP Access header in both directions</span><br><span>diff --git a/openbsc/src/osmo-bsc_nat/bsc_filter.c b/openbsc/src/osmo-bsc_nat/bsc_filter.c</span><br><span>index 432529e..852156b 100644</span><br><span>--- a/openbsc/src/osmo-bsc_nat/bsc_filter.c</span><br><span>+++ b/openbsc/src/osmo-bsc_nat/bsc_filter.c</span><br><span>@@ -72,19 +72,19 @@</span><br><span>     { IPAC_PROTO_MGCP_OLD, ALLOW_ANY, ALLOW_ANY, ALLOW_ANY, FILTER_TO_BOTH },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_nat_parsed *bsc_nat_parse(struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_nat_parse(struct msgb *msg, struct bsc_nat_parsed *parsed)</span><br><span> {</span><br><span>   struct sccp_parse_result result;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct bsc_nat_parsed *parsed;</span><br><span>       struct ipaccess_head *hh;</span><br><span> </span><br><span>        /* quick fail */</span><br><span>     if (msg->len < 4)</span><br><span style="color: hsl(0, 100%, 40%);">-         return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  parsed = talloc_zero(msg, struct bsc_nat_parsed);</span><br><span>    if (!parsed)</span><br><span style="color: hsl(0, 100%, 40%);">-            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  memset(parsed, 0, sizeof(*parsed));</span><br><span> </span><br><span>      /* more init */</span><br><span>      parsed->ipa_proto = parsed->called_ssn = parsed->calling_ssn = -1;</span><br><span>@@ -99,22 +99,19 @@</span><br><span>    /* do a size check on the input */</span><br><span>   if (ntohs(hh->len) != msgb_l2len(msg)) {</span><br><span>          LOGP(DLINP, LOGL_ERROR, "Wrong input length?\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             talloc_free(parsed);</span><br><span style="color: hsl(0, 100%, 40%);">-            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span>   }</span><br><span> </span><br><span>        /* analyze sccp down here */</span><br><span>         if (parsed->ipa_proto == IPAC_PROTO_SCCP) {</span><br><span>               memset(&result, 0, sizeof(result));</span><br><span>              if (sccp_parse_header(msg, &result) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 talloc_free(parsed);</span><br><span style="color: hsl(0, 100%, 40%);">-                    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -1;</span><br><span>           }</span><br><span> </span><br><span>                if (msg->l3h && msgb_l3len(msg) < 3) {</span><br><span>                         LOGP(DNAT, LOGL_ERROR, "Not enough space or GSM payload\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                  talloc_free(parsed);</span><br><span style="color: hsl(0, 100%, 40%);">-                    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -1;</span><br><span>           }</span><br><span> </span><br><span>                parsed->sccp_type = sccp_determine_msg_type(msg);</span><br><span>@@ -132,7 +129,7 @@</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        return 0;</span><br><span> }</span><br><span> </span><br><span> /* Returns 0 if message is whitelisted (has to beforwarded by bsc-nat), 1 if</span><br><span>diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat.c b/openbsc/src/osmo-bsc_nat/bsc_nat.c</span><br><span>index 30e4b34..02496f6 100644</span><br><span>--- a/openbsc/src/osmo-bsc_nat/bsc_nat.c</span><br><span>+++ b/openbsc/src/osmo-bsc_nat/bsc_nat.c</span><br><span>@@ -696,24 +696,23 @@</span><br><span> {</span><br><span>         struct nat_sccp_connection *con = NULL;</span><br><span>      struct bsc_connection *bsc;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        int proto;</span><br><span> </span><br><span>       /* filter, drop, patch the message? */</span><br><span style="color: hsl(0, 100%, 40%);">-  parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                LOGP(DNAT, LOGL_ERROR, "Can not parse msg from BSC.\n");</span><br><span>           return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (bsc_nat_filter_ipa(DIR_BSC, msg, parsed))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bsc_nat_filter_ipa(DIR_BSC, msg, &parsed))</span><br><span>           goto exit;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  proto = parsed->ipa_proto;</span><br><span style="color: hsl(120, 100%, 40%);">+ proto = parsed.ipa_proto;</span><br><span> </span><br><span>        /* Route and modify the SCCP packet */</span><br><span>       if (proto == IPAC_PROTO_SCCP) {</span><br><span style="color: hsl(0, 100%, 40%);">-         switch (parsed->sccp_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+               switch (parsed.sccp_type) {</span><br><span>          case SCCP_MSG_TYPE_UDT:</span><br><span>                      /* forward UDT messages to every BSC */</span><br><span>                      goto send_to_all;</span><br><span>@@ -722,8 +721,8 @@</span><br><span>              case SCCP_MSG_TYPE_CREF:</span><br><span>             case SCCP_MSG_TYPE_DT1:</span><br><span>              case SCCP_MSG_TYPE_IT:</span><br><span style="color: hsl(0, 100%, 40%);">-                  con = patch_sccp_src_ref_to_bsc(msg, parsed, nat);</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (parsed->gsm_type == BSS_MAP_MSG_ASSIGMENT_RQST) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      con = patch_sccp_src_ref_to_bsc(msg, &parsed, nat);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (parsed.gsm_type == BSS_MAP_MSG_ASSIGMENT_RQST) {</span><br><span>                                 osmo_counter_inc(nat->stats.sccp.calls);</span><br><span> </span><br><span>                              if (con) {</span><br><span>@@ -735,14 +734,14 @@</span><br><span>                           } else</span><br><span>                                       LOGP(DNAT, LOGL_ERROR, "Assignment command but no BSC.\n");</span><br><span>                        } else if (con && con->con_local == NAT_CON_END_USSD &&</span><br><span style="color: hsl(0, 100%, 40%);">-                                 parsed->gsm_type == BSS_MAP_MSG_CLEAR_CMD) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               parsed.gsm_type == BSS_MAP_MSG_CLEAR_CMD) {</span><br><span>                               LOGP(DNAT, LOGL_NOTICE, "Clear Command for USSD Connection. Ignoring.\n");</span><br><span>                                 con = NULL;</span><br><span>                  }</span><br><span>                    break;</span><br><span>               case SCCP_MSG_TYPE_CC:</span><br><span style="color: hsl(0, 100%, 40%);">-                  con = patch_sccp_src_ref_to_bsc(msg, parsed, nat);</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (!con || update_sccp_src_ref(con, parsed) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                    con = patch_sccp_src_ref_to_bsc(msg, &parsed, nat);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (!con || update_sccp_src_ref(con, &parsed) != 0)</span><br><span>                              goto exit;</span><br><span>                   break;</span><br><span>               case SCCP_MSG_TYPE_RLC:</span><br><span>@@ -755,27 +754,24 @@</span><br><span>                      goto exit;</span><br><span>           }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           if (!con && parsed->sccp_type == SCCP_MSG_TYPE_RLSD) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!con && parsed.sccp_type == SCCP_MSG_TYPE_RLSD) {</span><br><span>                        LOGP(DNAT, LOGL_NOTICE, "Sending fake RLC on RLSD message to network.\n");</span><br><span>                         /* Exchange src/dest for the reply */</span><br><span style="color: hsl(0, 100%, 40%);">-                   nat_send_rlc(msc_con, &parsed->original_dest_ref,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        parsed->src_local_ref);</span><br><span style="color: hsl(120, 100%, 40%);">+                    nat_send_rlc(msc_con, &parsed.original_dest_ref,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  parsed.src_local_ref);</span><br><span>               } else if (!con)</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DNAT, LOGL_ERROR, "Unknown connection for msg type: 0x%x from the MSC.\n", parsed->sccp_type);</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DNAT, LOGL_ERROR, "Unknown connection for msg type: 0x%x from the MSC.\n", parsed.sccp_type);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!con) {</span><br><span style="color: hsl(0, 100%, 40%);">-             talloc_free(parsed);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!con)</span><br><span>            return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!con->bsc->authenticated) {</span><br><span style="color: hsl(0, 100%, 40%);">-           talloc_free(parsed);</span><br><span>                 LOGP(DNAT, LOGL_ERROR, "Selected BSC not authenticated.\n");</span><br><span>               return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   update_con_authorize(con, parsed, msg);</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(parsed);</span><br><span style="color: hsl(120, 100%, 40%);">+  update_con_authorize(con, &parsed, msg);</span><br><span> </span><br><span>     bsc_send_data(con->bsc, msg->l2h, msgb_l2len(msg), proto);</span><br><span>     return 0;</span><br><span>@@ -786,7 +782,7 @@</span><br><span>       * Command to every BSC in our network. We will analys the PAGING</span><br><span>     * message and then send it to the authenticated messages...</span><br><span>          */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (parsed->ipa_proto == IPAC_PROTO_SCCP && parsed->gsm_type == BSS_MAP_MSG_PAGING) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (parsed.ipa_proto == IPAC_PROTO_SCCP && parsed.gsm_type == BSS_MAP_MSG_PAGING) {</span><br><span>          bsc_nat_handle_paging(nat, msg);</span><br><span>             goto exit;</span><br><span>   }</span><br><span>@@ -795,11 +791,10 @@</span><br><span>            if (!bsc->authenticated)</span><br><span>                  continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           bsc_send_data(bsc, msg->l2h, msgb_l2len(msg), parsed->ipa_proto);</span><br><span style="color: hsl(120, 100%, 40%);">+               bsc_send_data(bsc, msg->l2h, msgb_l2len(msg), parsed.ipa_proto);</span><br><span>  }</span><br><span> </span><br><span> exit:</span><br><span style="color: hsl(0, 100%, 40%);">-  talloc_free(parsed);</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -1130,19 +1125,19 @@</span><br><span>         struct bsc_msc_connection *con_msc = NULL;</span><br><span>   struct bsc_connection *con_bsc = NULL;</span><br><span>       int con_type;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        struct bsc_filter_reject_cause cause;</span><br><span>        *bsc_conn_closed = false;</span><br><span> </span><br><span>        /* Parse and filter messages */</span><br><span style="color: hsl(0, 100%, 40%);">- parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        bool parsed_ok = !!bsc_nat_parse(msg, &parsed);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!parsed_ok) {</span><br><span>            LOGP(DNAT, LOGL_ERROR, "Can not parse msg from BSC.\n");</span><br><span>           msgb_free(msg);</span><br><span>              return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (bsc_nat_filter_ipa(DIR_MSC, msg, parsed))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bsc_nat_filter_ipa(DIR_MSC, msg, &parsed))</span><br><span>           goto exit;</span><br><span> </span><br><span>       /*</span><br><span>@@ -1157,32 +1152,32 @@</span><br><span> </span><br><span> </span><br><span>         /* modify the SCCP entries */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (parsed->ipa_proto == IPAC_PROTO_SCCP) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (parsed.ipa_proto == IPAC_PROTO_SCCP) {</span><br><span>           int filter;</span><br><span>          struct nat_sccp_connection *con;</span><br><span style="color: hsl(0, 100%, 40%);">-                switch (parsed->sccp_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+               switch (parsed.sccp_type) {</span><br><span>          case SCCP_MSG_TYPE_CR:</span><br><span>                       memset(&cause, 0, sizeof(cause));</span><br><span style="color: hsl(0, 100%, 40%);">-                   filter = bsc_nat_filter_sccp_cr(bsc, msg, parsed,</span><br><span style="color: hsl(120, 100%, 40%);">+                     filter = bsc_nat_filter_sccp_cr(bsc, msg, &parsed,</span><br><span>                                               &con_type, &imsi, &cause);</span><br><span>                       if (filter < 0) {</span><br><span>                                 if (imsi)</span><br><span>                                    bsc_nat_inform_reject(bsc, imsi);</span><br><span>                            bsc_stat_reject(filter, bsc, 0);</span><br><span>                             /* send a SCCP Connection Refused */</span><br><span style="color: hsl(0, 100%, 40%);">-                            bsc_send_con_refuse(bsc, parsed, con_type, &cause);</span><br><span style="color: hsl(120, 100%, 40%);">+                               bsc_send_con_refuse(bsc, &parsed, con_type, &cause);</span><br><span>                                 goto exit2;</span><br><span>                  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   if (!create_sccp_src_ref(bsc, parsed))</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (!create_sccp_src_ref(bsc, &parsed))</span><br><span>                          goto exit2;</span><br><span style="color: hsl(0, 100%, 40%);">-                     con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);</span><br><span style="color: hsl(120, 100%, 40%);">+                    con = patch_sccp_src_ref_to_msc(msg, &parsed, bsc);</span><br><span>                      OSMO_ASSERT(con);</span><br><span>                    con->msc_con = bsc->nat->msc_con;</span><br><span>                   con_msc = con->msc_con;</span><br><span>                   con->filter_state.con_type = con_type;</span><br><span>                    con->filter_state.imsi_checked = filter;</span><br><span style="color: hsl(0, 100%, 40%);">-                     bsc_nat_extract_lac(bsc, con, parsed, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                   bsc_nat_extract_lac(bsc, con, &parsed, msg);</span><br><span>                     if (imsi)</span><br><span>                            con->filter_state.imsi = talloc_steal(con, imsi);</span><br><span>                         imsi = NULL;</span><br><span>@@ -1194,13 +1189,13 @@</span><br><span>               case SCCP_MSG_TYPE_DT1:</span><br><span>              case SCCP_MSG_TYPE_CC:</span><br><span>               case SCCP_MSG_TYPE_IT:</span><br><span style="color: hsl(0, 100%, 40%);">-                  con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);</span><br><span style="color: hsl(120, 100%, 40%);">+                    con = patch_sccp_src_ref_to_msc(msg, &parsed, bsc);</span><br><span>                      if (con) {</span><br><span>                           /* only filter non local connections */</span><br><span>                              if (!con->con_local) {</span><br><span>                                    memset(&cause, 0, sizeof(cause));</span><br><span>                                        filter = bsc_nat_filter_dt(bsc, msg,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    con, parsed, &cause);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     con, &parsed, &cause);</span><br><span>                                       if (filter < 0) {</span><br><span>                                                 if (con->filter_state.imsi)</span><br><span>                                                       bsc_nat_inform_reject(bsc,</span><br><span>@@ -1212,7 +1207,7 @@</span><br><span>                                   }</span><br><span> </span><br><span>                                        /* hand data to a side channel */</span><br><span style="color: hsl(0, 100%, 40%);">-                                       if (bsc_ussd_check(con, parsed, msg) == 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                                    if (bsc_ussd_check(con, &parsed, msg) == 1)</span><br><span>                                              con->con_local = NAT_CON_END_USSD;</span><br><span> </span><br><span>                                    /*</span><br><span>@@ -1220,12 +1215,11 @@</span><br><span>                                          * replace the msg and the parsed structure becomes</span><br><span>                                   * invalid.</span><br><span>                                   */</span><br><span style="color: hsl(0, 100%, 40%);">-                                     msg = bsc_nat_rewrite_msg(bsc->nat, msg, parsed,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   msg = bsc_nat_rewrite_msg(bsc->nat, msg, &parsed,</span><br><span>                                                                     con->filter_state.imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-                                     talloc_free(parsed);</span><br><span style="color: hsl(0, 100%, 40%);">-                                    parsed = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                                        parsed_ok = false;</span><br><span>                           } else if (con->con_local == NAT_CON_END_USSD) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     bsc_ussd_check(con, parsed, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                                     bsc_ussd_check(con, &parsed, msg);</span><br><span>                               }</span><br><span> </span><br><span>                                con_bsc = con->bsc;</span><br><span>@@ -1235,13 +1229,13 @@</span><br><span> </span><br><span>                         break;</span><br><span>               case SCCP_MSG_TYPE_RLC:</span><br><span style="color: hsl(0, 100%, 40%);">-                 con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);</span><br><span style="color: hsl(120, 100%, 40%);">+                    con = patch_sccp_src_ref_to_msc(msg, &parsed, bsc);</span><br><span>                      if (con) {</span><br><span>                           con_bsc = con->bsc;</span><br><span>                               con_msc = con->msc_con;</span><br><span>                           con_filter = con->con_local;</span><br><span>                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       remove_sccp_src_ref(bsc, msg, parsed);</span><br><span style="color: hsl(120, 100%, 40%);">+                        remove_sccp_src_ref(bsc, msg, &parsed);</span><br><span>                  *bsc_conn_closed = bsc_maybe_close(bsc);</span><br><span>                     break;</span><br><span>               case SCCP_MSG_TYPE_UDT:</span><br><span>@@ -1249,16 +1243,16 @@</span><br><span>                    con = NULL;</span><br><span>                  break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DNAT, LOGL_ERROR, "Not forwarding to msc sccp type: 0x%x\n", parsed->sccp_type);</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGP(DNAT, LOGL_ERROR, "Not forwarding to msc sccp type: 0x%x\n", parsed.sccp_type);</span><br><span>                       con = NULL;</span><br><span>                  goto exit2;</span><br><span>                  break;</span><br><span>               }</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (parsed->ipa_proto == IPAC_PROTO_MGCP_OLD) {</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (parsed.ipa_proto == IPAC_PROTO_MGCP_OLD) {</span><br><span>                 bsc_mgcp_forward(bsc, msg);</span><br><span>                 goto exit2;</span><br><span>      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DNAT, LOGL_ERROR, "Not forwarding unknown stream id: 0x%x\n", parsed->ipa_proto);</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DNAT, LOGL_ERROR, "Not forwarding unknown stream id: 0x%x\n", parsed.ipa_proto);</span><br><span>              goto exit2;</span><br><span>  }</span><br><span> </span><br><span>@@ -1275,22 +1269,21 @@</span><br><span>      if (!con_msc) {</span><br><span>              LOGP(DNAT, LOGL_ERROR, "Not forwarding data bsc_nr: %d ipa: %d type: 0x%x\n",</span><br><span>                      bsc->cfg->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                     parsed ? parsed->ipa_proto : -1,</span><br><span style="color: hsl(0, 100%, 40%);">-                     parsed ? parsed->sccp_type : -1);</span><br><span style="color: hsl(120, 100%, 40%);">+                  parsed_ok ? parsed.ipa_proto : -1,</span><br><span style="color: hsl(120, 100%, 40%);">+                    parsed_ok ? parsed.sccp_type : -1);</span><br><span>          goto exit2;</span><br><span>  }</span><br><span> </span><br><span>        /* send the non-filtered but maybe modified msg */</span><br><span style="color: hsl(0, 100%, 40%);">-      talloc_free(parsed);</span><br><span>         queue_for_msc(con_msc, msg);</span><br><span> </span><br><span>     return 0;</span><br><span> </span><br><span> exit:</span><br><span>       /* if we filter out the reset send an ack to the BSC */</span><br><span style="color: hsl(0, 100%, 40%);">- if (parsed->bssap == 0 && parsed->gsm_type == BSS_MAP_MSG_RESET) {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (parsed.bssap == 0 && parsed.gsm_type == BSS_MAP_MSG_RESET) {</span><br><span>             send_reset_ack(bsc);</span><br><span style="color: hsl(0, 100%, 40%);">-    } else if (parsed->ipa_proto == IPAC_PROTO_IPACCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (parsed.ipa_proto == IPAC_PROTO_IPACCESS) {</span><br><span>                /* do we know who is handling this? */</span><br><span>               if (msg->l2h[0] == IPAC_MSGT_ID_RESP && msgb_l2len(msg) > 2) {</span><br><span>                         struct tlv_parsed tvp;</span><br><span>@@ -1315,7 +1308,6 @@</span><br><span> exit2:</span><br><span>     if (imsi)</span><br><span>            talloc_free(imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-      talloc_free(parsed);</span><br><span>         msgb_free(msg);</span><br><span>      return -1;</span><br><span> }</span><br><span>diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c b/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c</span><br><span>index e7c387c..1dd2ada 100644</span><br><span>--- a/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c</span><br><span>+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c</span><br><span>@@ -618,8 +618,6 @@</span><br><span> </span><br><span>       ipa_prepend_header(sccp, IPAC_PROTO_SCCP);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* the parsed hangs off from msg but it needs to survive */</span><br><span style="color: hsl(0, 100%, 40%);">-     talloc_steal(sccp, parsed);</span><br><span>  msgb_free(msg);</span><br><span>      return sccp;</span><br><span> }</span><br><span>diff --git a/openbsc/src/osmo-bsc_nat/bsc_ussd.c b/openbsc/src/osmo-bsc_nat/bsc_ussd.c</span><br><span>index dea1807..d44b1b2 100644</span><br><span>--- a/openbsc/src/osmo-bsc_nat/bsc_ussd.c</span><br><span>+++ b/openbsc/src/osmo-bsc_nat/bsc_ussd.c</span><br><span>@@ -90,30 +90,27 @@</span><br><span> static int forward_sccp(struct bsc_nat *nat, struct msgb *msg)</span><br><span> {</span><br><span>      struct nat_sccp_connection *con;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                LOGP(DNAT, LOGL_ERROR, "Can not parse msg from USSD.\n");</span><br><span>          msgb_free(msg);</span><br><span>              return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!parsed->dest_local_ref) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!parsed.dest_local_ref) {</span><br><span>                LOGP(DNAT, LOGL_ERROR, "No destination local reference.\n");</span><br><span>               msgb_free(msg);</span><br><span>              return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   con = bsc_nat_find_con_by_bsc(nat, parsed->dest_local_ref);</span><br><span style="color: hsl(120, 100%, 40%);">+        con = bsc_nat_find_con_by_bsc(nat, parsed.dest_local_ref);</span><br><span>   if (!con || !con->bsc) {</span><br><span>          LOGP(DNAT, LOGL_ERROR, "No active connection found.\n");</span><br><span>           msgb_free(msg);</span><br><span>              return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   talloc_free(parsed);</span><br><span>         bsc_write_msg(&con->bsc->write_queue, msg);</span><br><span>        return 0;</span><br><span> }</span><br><span>diff --git a/openbsc/tests/bsc-nat/bsc_nat_test.c b/openbsc/tests/bsc-nat/bsc_nat_test.c</span><br><span>index e0d0051..4bee60d 100644</span><br><span>--- a/openbsc/tests/bsc-nat/bsc_nat_test.c</span><br><span>+++ b/openbsc/tests/bsc-nat/bsc_nat_test.c</span><br><span>@@ -235,20 +235,19 @@</span><br><span>  printf("Testing BSS Filtering.\n");</span><br><span>        for (i = 0; i < ARRAY_SIZE(results); ++i) {</span><br><span>               int result;</span><br><span style="color: hsl(0, 100%, 40%);">-             struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+                struct bsc_nat_parsed parsed;</span><br><span>                struct msgb *msg = msgb_alloc(4096, "test-message");</span><br><span> </span><br><span>           printf("Going to test item: %d\n", i);</span><br><span>             memcpy(msg->data, results[i].data, results[i].length);</span><br><span>            msg->l2h = msgb_put(msg, results[i].length);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                        printf("FAIL: Failed to parse the message\n");</span><br><span>                     continue;</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           result = bsc_nat_filter_ipa(results[i].dir, msg, parsed);</span><br><span style="color: hsl(120, 100%, 40%);">+             result = bsc_nat_filter_ipa(results[i].dir, msg, &parsed);</span><br><span>               if (result != results[i].result) {</span><br><span>                   printf("FAIL: Not the expected result got: %d wanted: %d\n",</span><br><span>                               result, results[i].result);</span><br><span>@@ -310,7 +309,7 @@</span><br><span>    struct bsc_connection *con;</span><br><span>  struct nat_sccp_connection *con_found;</span><br><span>       struct nat_sccp_connection *rc_con;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        struct msgb *msg;</span><br><span> </span><br><span>        printf("Testing connection tracking.\n");</span><br><span>@@ -326,19 +325,19 @@</span><br><span> </span><br><span>      /* 1.) create a connection */</span><br><span>        copy_to_msg(msg, bsc_cr, sizeof(bsc_cr));</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    con_found = patch_sccp_src_ref_to_msc(msg, &parsed, con);</span><br><span>        if (con_found != NULL) {</span><br><span>             printf("Con should not exist realref(%u)\n",</span><br><span>                      sccp_src_ref_to_int(&con_found->real_ref));</span><br><span>            abort();</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       rc_con = create_sccp_src_ref(con, parsed);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc_con = create_sccp_src_ref(con, &parsed);</span><br><span>      if (!rc_con) {</span><br><span>               printf("Failed to create a ref\n");</span><br><span>                abort();</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);</span><br><span style="color: hsl(120, 100%, 40%);">+      con_found = patch_sccp_src_ref_to_msc(msg, &parsed, con);</span><br><span>        if (!con_found) {</span><br><span>            printf("Failed to find connection.\n");</span><br><span>            abort();</span><br><span>@@ -356,40 +355,39 @@</span><br><span>             printf("Failed to patch the BSC CR msg.\n");</span><br><span>               abort();</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(parsed);</span><br><span> </span><br><span>     /* 2.) get the cc */</span><br><span>         copy_to_msg(msg, msc_cc, sizeof(msc_cc));</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    con_found = patch_sccp_src_ref_to_bsc(msg, &parsed, nat);</span><br><span>        VERIFY(con_found, con, msg, msc_cc_patched, "MSC CC");</span><br><span style="color: hsl(0, 100%, 40%);">-        if (update_sccp_src_ref(con_found, parsed) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (update_sccp_src_ref(con_found, &parsed) != 0) {</span><br><span>              printf("Failed to update the SCCP con.\n");</span><br><span>                abort();</span><br><span>     }</span><br><span> </span><br><span>        /* 3.) send some data */</span><br><span>     copy_to_msg(msg, bsc_dtap, sizeof(bsc_dtap));</span><br><span style="color: hsl(0, 100%, 40%);">-   parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    con_found = patch_sccp_src_ref_to_msc(msg, &parsed, con);</span><br><span>        VERIFY(con_found, con, msg, bsc_dtap_patched, "BSC DTAP");</span><br><span> </span><br><span>     /* 4.) receive some data */</span><br><span>  copy_to_msg(msg, msc_dtap, sizeof(msc_dtap));</span><br><span style="color: hsl(0, 100%, 40%);">-   parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    con_found = patch_sccp_src_ref_to_bsc(msg, &parsed, nat);</span><br><span>        VERIFY(con_found, con, msg, msc_dtap_patched, "MSC DTAP");</span><br><span> </span><br><span>     /* 5.) close the connection */</span><br><span>       copy_to_msg(msg, msc_rlsd, sizeof(msc_rlsd));</span><br><span style="color: hsl(0, 100%, 40%);">-   parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    con_found = patch_sccp_src_ref_to_bsc(msg, &parsed, nat);</span><br><span>        VERIFY(con_found, con, msg, msc_rlsd_patched, "MSC RLSD");</span><br><span> </span><br><span>     /* 6.) confirm the connection close */</span><br><span>       copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    con_found = patch_sccp_src_ref_to_msc(msg, &parsed, con);</span><br><span>        if (!con_found) {</span><br><span>            printf("Failed to find connection.\n");</span><br><span>            abort();</span><br><span>@@ -403,12 +401,11 @@</span><br><span>             printf("Failed to patch the BSC CR msg.\n");</span><br><span>               abort();</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       remove_sccp_src_ref(con, msg, parsed);</span><br><span style="color: hsl(0, 100%, 40%);">-  talloc_free(parsed);</span><br><span style="color: hsl(120, 100%, 40%);">+  remove_sccp_src_ref(con, msg, &parsed);</span><br><span> </span><br><span>      copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    con_found = patch_sccp_src_ref_to_msc(msg, &parsed, con);</span><br><span> </span><br><span>    /* verify that it is gone */</span><br><span>         if (con_found != NULL) {</span><br><span>@@ -416,8 +413,6 @@</span><br><span>                      sccp_src_ref_to_int(&con_found->real_ref));</span><br><span>            abort();</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(parsed);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span>     bsc_config_free(con->cfg);</span><br><span>        bsc_nat_free(nat);</span><br><span>@@ -507,7 +502,7 @@</span><br><span>     struct bsc_connection *bsc;</span><br><span>  struct bsc_nat *nat;</span><br><span>         struct nat_sccp_connection con;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        struct msgb *msg;</span><br><span> </span><br><span>        printf("Testing MGCP.\n");</span><br><span>@@ -529,7 +524,7 @@</span><br><span> </span><br><span>       msg = msgb_alloc(4096, "foo");</span><br><span>     copy_to_msg(msg, ass_cmd, sizeof(ass_cmd));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span> </span><br><span>       if (msg->l2h[16] != 0 ||</span><br><span>      msg->l2h[17] != 0x1) {</span><br><span>@@ -568,8 +563,6 @@</span><br><span>          abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   talloc_free(parsed);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         bsc_mgcp_dlcx(&con);</span><br><span>     if (con.bsc_endp != -1 || con.msc_endp != -1 ||</span><br><span>          con.bsc->_endpoint_status[1] != 0 || con.bsc->last_endpoint != 0x1) {</span><br><span>@@ -867,7 +860,7 @@</span><br><span> {</span><br><span>   int i, res, contype;</span><br><span>         struct msgb *msg = msgb_alloc(4096, "test_cr_filter");</span><br><span style="color: hsl(0, 100%, 40%);">-        struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        struct bsc_msg_acc_lst *nat_lst, *bsc_lst;</span><br><span>   struct bsc_msg_acc_lst_entry *nat_entry, *bsc_entry;</span><br><span>         struct bsc_filter_reject_cause cause;</span><br><span>@@ -912,14 +905,13 @@</span><br><span>                              &cr_filter[i].bsc_imsi_deny) != 0)</span><br><span>                         abort();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                        printf("FAIL: Failed to parse the message\n");</span><br><span>                     abort();</span><br><span>             }</span><br><span> </span><br><span>                memset(&cause, 0, sizeof(cause));</span><br><span style="color: hsl(0, 100%, 40%);">-           res = bsc_nat_filter_sccp_cr(bsc, msg, parsed, &contype, &imsi, &cause);</span><br><span style="color: hsl(120, 100%, 40%);">+          res = bsc_nat_filter_sccp_cr(bsc, msg, &parsed, &contype, &imsi, &cause);</span><br><span>            if (res != cr_filter[i].result) {</span><br><span>                    printf("FAIL: Wrong result %d for test %d.\n", res, i);</span><br><span>                    abort();</span><br><span>@@ -934,8 +926,7 @@</span><br><span>                       abort();</span><br><span>             }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           talloc_steal(parsed, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-             talloc_free(parsed);</span><br><span style="color: hsl(120, 100%, 40%);">+          talloc_free(imsi);</span><br><span>   }</span><br><span> </span><br><span>        msgb_free(msg);</span><br><span>@@ -946,7 +937,7 @@</span><br><span> {</span><br><span>   int i;</span><br><span>       struct msgb *msg = msgb_alloc(4096, "test_dt_filter");</span><br><span style="color: hsl(0, 100%, 40%);">-        struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        struct bsc_filter_reject_cause cause;</span><br><span> </span><br><span>    struct bsc_nat *nat = bsc_nat_alloc();</span><br><span>@@ -960,26 +951,25 @@</span><br><span>       msgb_reset(msg);</span><br><span>     copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp\n");</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (parsed->bssap != BSSAP_MSG_DTAP) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (parsed.bssap != BSSAP_MSG_DTAP) {</span><br><span>                printf("FAIL: It should be dtap\n");</span><br><span>               abort();</span><br><span>     }</span><br><span> </span><br><span>        /* gsm_type is actually the size of the dtap */</span><br><span style="color: hsl(0, 100%, 40%);">- if (parsed->gsm_type < msgb_l3len(msg) - 3) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (parsed.gsm_type < msgb_l3len(msg) - 3) {</span><br><span>              printf("FAIL: Not enough space for the content\n");</span><br><span>                abort();</span><br><span>     }</span><br><span> </span><br><span>        memset(&cause, 0, sizeof(cause));</span><br><span>        OSMO_ASSERT(!con->filter_state.imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (bsc_nat_filter_dt(bsc, msg, con, parsed, &cause) != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (bsc_nat_filter_dt(bsc, msg, con, &parsed, &cause) != 1) {</span><br><span>                printf("FAIL: Should have passed..\n");</span><br><span>            abort();</span><br><span>     }</span><br><span>@@ -991,13 +981,13 @@</span><br><span>            msgb_reset(msg);</span><br><span>             copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!parsed)</span><br><span style="color: hsl(120, 100%, 40%);">+          if (bsc_nat_parse(msg, &parsed) < 0)</span><br><span>                  continue;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>              con->filter_state.imsi_checked = 0;</span><br><span>               memset(&cause, 0, sizeof(cause));</span><br><span style="color: hsl(0, 100%, 40%);">-           bsc_nat_filter_dt(bsc, msg, con, parsed, &cause);</span><br><span style="color: hsl(120, 100%, 40%);">+         bsc_nat_filter_dt(bsc, msg, con, &parsed, &cause);</span><br><span>   }</span><br><span> </span><br><span>        msgb_free(msg);</span><br><span>@@ -1008,7 +998,7 @@</span><br><span> {</span><br><span>  struct msgb *msg = msgb_alloc(4096, "test_dt_filter");</span><br><span>     struct msgb *out;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        const char *imsi = "27408000001234";</span><br><span> </span><br><span>   struct bsc_nat *nat = bsc_nat_alloc();</span><br><span>@@ -1028,31 +1018,28 @@</span><br><span>     /* verify that nothing changed */</span><br><span>    msgb_reset(msg);</span><br><span>     copy_to_msg(msg, cc_setup_international, ARRAY_SIZE(cc_setup_international));</span><br><span style="color: hsl(0, 100%, 40%);">-   parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp\n");</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (msg != out) {</span><br><span>            printf("FAIL: The message should not have been changed\n");</span><br><span>                abort();</span><br><span>     }</span><br><span> </span><br><span>        verify_msg(out, cc_setup_international, ARRAY_SIZE(cc_setup_international));</span><br><span style="color: hsl(0, 100%, 40%);">-    talloc_free(parsed);</span><br><span> </span><br><span>     /* verify that something in the message changes */</span><br><span>   msgb_reset(msg);</span><br><span>     copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp\n");</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (!out) {</span><br><span>          printf("FAIL: A new message should be created.\n");</span><br><span>                abort();</span><br><span>@@ -1071,13 +1058,12 @@</span><br><span>   bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);</span><br><span>      msg = msgb_alloc(4096, "test_dt_filter");</span><br><span>  copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp\n");</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (!out) {</span><br><span>          printf("FAIL: A new message should be created.\n");</span><br><span>                abort();</span><br><span>@@ -1096,13 +1082,12 @@</span><br><span>   bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);</span><br><span>      msg = msgb_alloc(4096, "test_dt_filter");</span><br><span>  copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp\n");</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (out != msg) {</span><br><span>            printf("FAIL: The message should be unchanged.\n");</span><br><span>                abort();</span><br><span>@@ -1118,13 +1103,12 @@</span><br><span>   bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);</span><br><span>      msg = msgb_alloc(4096, "test_dt_filter");</span><br><span>  copy_to_msg(msg, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp %d\n", __LINE__);</span><br><span>            abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (!out) {</span><br><span>          printf("FAIL: A new message should be created %d.\n", __LINE__);</span><br><span>           abort();</span><br><span>@@ -1146,13 +1130,12 @@</span><br><span>   bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);</span><br><span>      msg = msgb_alloc(4096, "test_dt_filter");</span><br><span>  copy_to_msg(msg, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp %d\n", __LINE__);</span><br><span>            abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (!out) {</span><br><span>          printf("FAIL: A new message should be created %d.\n", __LINE__);</span><br><span>           abort();</span><br><span>@@ -1174,7 +1157,7 @@</span><br><span> {</span><br><span>        struct msgb *msg = msgb_alloc(4096, "test_dt_filter");</span><br><span>     struct msgb *out;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        const char *imsi = "27408000001234";</span><br><span> </span><br><span>   struct bsc_nat *nat = bsc_nat_alloc();</span><br><span>@@ -1195,13 +1178,12 @@</span><br><span> </span><br><span>         msgb_reset(msg);</span><br><span>     copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp\n");</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (!out) {</span><br><span>          printf("FAIL: A new message should be created.\n");</span><br><span>                abort();</span><br><span>@@ -1223,7 +1205,7 @@</span><br><span> {</span><br><span>        struct msgb *msg = msgb_alloc(4096, "test_dt_filter");</span><br><span>     struct msgb *out;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        const char *imsi = "27408000001234";</span><br><span> </span><br><span>   struct bsc_nat *nat = bsc_nat_alloc();</span><br><span>@@ -1255,13 +1237,12 @@</span><br><span> </span><br><span>         msgb_reset(msg);</span><br><span>     copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));</span><br><span style="color: hsl(0, 100%, 40%);">-     parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse ID resp\n");</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (!out) {</span><br><span>          printf("FAIL: A new message should be created.\n");</span><br><span>                abort();</span><br><span>@@ -1281,7 +1262,7 @@</span><br><span> static void test_sms_smsc_rewrite()</span><br><span> {</span><br><span>         struct msgb *msg = msgb_alloc(4096, "SMSC rewrite"), *out;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        const char *imsi = "515039900406700";</span><br><span> </span><br><span>  struct bsc_nat *nat = bsc_nat_alloc();</span><br><span>@@ -1317,13 +1298,12 @@</span><br><span>      * Check if the SMSC address is changed</span><br><span>       */</span><br><span>  copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse SMS\n");</span><br><span>             abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (out == msg) {</span><br><span>            printf("FAIL: This should have changed.\n");</span><br><span>               abort();</span><br><span>@@ -1337,13 +1317,12 @@</span><br><span>   bsc_nat_num_rewr_entry_adapt(nat, &nat->smsc_rewr, NULL);</span><br><span>     msg = msgb_alloc(4096, "SMSC rewrite");</span><br><span>    copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse SMS\n");</span><br><span>             abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (out == msg) {</span><br><span>            printf("FAIL: This should have changed.\n");</span><br><span>               abort();</span><br><span>@@ -1357,13 +1336,12 @@</span><br><span>   bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_clear_tp_srr, NULL);</span><br><span>      msg = msgb_alloc(4096, "SMSC rewrite");</span><br><span>    copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse SMS\n");</span><br><span>             abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (out != msg) {</span><br><span>            printf("FAIL: This should not have changed.\n");</span><br><span>           abort();</span><br><span>@@ -1377,7 +1355,7 @@</span><br><span> static void test_sms_number_rewrite(void)</span><br><span> {</span><br><span>   struct msgb *msg, *out;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        const char *imsi = "515039900406700";</span><br><span> </span><br><span>  struct bsc_nat *nat = bsc_nat_alloc();</span><br><span>@@ -1401,13 +1379,12 @@</span><br><span>      */</span><br><span>          msg = msgb_alloc(4096, "SMSC rewrite");</span><br><span>    copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse SMS\n");</span><br><span>             abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (out == msg) {</span><br><span>            printf("FAIL: This should have changed.\n");</span><br><span>               abort();</span><br><span>@@ -1429,13 +1406,12 @@</span><br><span> </span><br><span>       msg = msgb_alloc(4096, "SMSC rewrite");</span><br><span>    copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!parsed) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bsc_nat_parse(msg, &parsed) < 0) {</span><br><span>                printf("FAIL: Could not parse SMS\n");</span><br><span>             abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    out = bsc_nat_rewrite_msg(nat, msg, &parsed, imsi);</span><br><span>      if (out == msg) {</span><br><span>            printf("FAIL: This should have changed.\n");</span><br><span>               abort();</span><br><span>@@ -1520,7 +1496,7 @@</span><br><span>     struct bsc_connection *bsc;</span><br><span>  struct bsc_nat *nat;</span><br><span>         struct nat_sccp_connection con;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_nat_parsed *parsed;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_nat_parsed parsed;</span><br><span>        struct msgb *msg = msgb_alloc(4096, "test-message");</span><br><span> </span><br><span>   printf("Testing LAC extraction from SCCP CR\n");</span><br><span>@@ -1538,8 +1514,8 @@</span><br><span>   memcpy(msg->l2h, bssmap_cr, ARRAY_SIZE(bssmap_cr));</span><br><span> </span><br><span>   /* parse it and pass it on */</span><br><span style="color: hsl(0, 100%, 40%);">-   parsed = bsc_nat_parse(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    res = bsc_nat_extract_lac(bsc, &con, parsed, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(bsc_nat_parse(msg, &parsed) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    res = bsc_nat_extract_lac(bsc, &con, &parsed, msg);</span><br><span>  OSMO_ASSERT(res == 0);</span><br><span> </span><br><span>   /* verify the LAC */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13843">change 13843</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13843"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: openbsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I66c44890952339f15131081e2f629a2824b6d3ba </div>
<div style="display:none"> Gerrit-Change-Number: 13843 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>