diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-05-26 13:11:59 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-05-26 13:12:14 +0200 |
commit | e416e2e09d50390f79bcd284e6e91cd87fc8344e (patch) | |
tree | 2bd92e55e36df1febcf0f7b27db21b0490654965 | |
parent | cac78fe9e95d8f7f9eea07f99b910409e10854bc (diff) |
Revert "ipacces.c: Remove ipa_bts_id_resp() and use libosmocore"
This reverts commit d517db06ced45bbe0a70799487964e52edd8a375, which for
some reason broke the IPA client functionality. This needs to be
investigated and properly fixed. But until that happens: revert.
Change-Id: Ic168f437c5bf1fcdb7441b0541c80a4805463004
-rw-r--r-- | src/input/ipaccess.c | 89 |
1 files changed, 85 insertions, 4 deletions
diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c index fb2e30d..ac84ffc 100644 --- a/src/input/ipaccess.c +++ b/src/input/ipaccess.c @@ -567,6 +567,90 @@ err_line: return ret; } +#define IPA_STRING_MAX 64 + +static struct msgb * +ipa_bts_id_resp(struct ipaccess_unit *dev, uint8_t *data, int len, int trx_nr) +{ + struct msgb *nmsg; + char str[IPA_STRING_MAX]; + uint8_t *tag; + + memset(str, 0, sizeof(str)); + + nmsg = ipa_msg_alloc(0); + if (!nmsg) + return NULL; + + *msgb_put(nmsg, 1) = IPAC_MSGT_ID_RESP; + while (len) { + if (len < 2) { + LOGP(DLINP, LOGL_NOTICE, + "Short read of ipaccess tag\n"); + msgb_free(nmsg); + return NULL; + } + switch (data[1]) { + case IPAC_IDTAG_UNIT: + snprintf(str, sizeof(str), "%u/%u/%u", + dev->site_id, dev->bts_id, trx_nr); + break; + case IPAC_IDTAG_MACADDR: + snprintf(str, sizeof(str), + "%02x:%02x:%02x:%02x:%02x:%02x", + dev->mac_addr[0], dev->mac_addr[1], + dev->mac_addr[2], dev->mac_addr[3], + dev->mac_addr[4], dev->mac_addr[5]); + break; + case IPAC_IDTAG_LOCATION1: + if (dev->location1) + strncpy(str, dev->location1, IPA_STRING_MAX); + break; + case IPAC_IDTAG_LOCATION2: + if (dev->location2) + strncpy(str, dev->location2, IPA_STRING_MAX); + break; + case IPAC_IDTAG_EQUIPVERS: + if (dev->equipvers) + strncpy(str, dev->equipvers, IPA_STRING_MAX); + break; + case IPAC_IDTAG_SWVERSION: + if (dev->swversion) + strncpy(str, dev->swversion, IPA_STRING_MAX); + break; + case IPAC_IDTAG_UNITNAME: + snprintf(str, sizeof(str), + "%s-%02x-%02x-%02x-%02x-%02x-%02x", + dev->unit_name, + dev->mac_addr[0], dev->mac_addr[1], + dev->mac_addr[2], dev->mac_addr[3], + dev->mac_addr[4], dev->mac_addr[5]); + break; + case IPAC_IDTAG_SERNR: + if (dev->serno) + strncpy(str, dev->serno, IPA_STRING_MAX); + break; + default: + LOGP(DLINP, LOGL_NOTICE, + "Unknown ipaccess tag 0x%02x\n", *data); + msgb_free(nmsg); + return NULL; + } + str[IPA_STRING_MAX-1] = '\0'; + + LOGP(DLINP, LOGL_INFO, " tag %d: %s\n", data[1], str); + tag = msgb_put(nmsg, 3 + strlen(str) + 1); + tag[0] = 0x00; + tag[1] = 1 + strlen(str) + 1; + tag[2] = data[1]; + memcpy(tag + 3, str, strlen(str) + 1); + data += 2; + len -= 2; + } + ipa_msg_push_header(nmsg, IPAC_PROTO_IPACCESS); + return nmsg; +} + static struct msgb *ipa_bts_id_ack(void) { struct msgb *nmsg2; @@ -614,16 +698,13 @@ int ipaccess_bts_handle_ccm(struct ipa_client_conn *link, if (msg_type == IPAC_MSGT_ID_GET) { uint8_t *data = msgb_l2(msg); int len = msgb_l2len(msg); - int old_trx_nr = dev->trx_id; int trx_nr = 0; if (link->ofd->priv_nr >= E1INP_SIGN_RSL) trx_nr = link->ofd->priv_nr - E1INP_SIGN_RSL; LOGP(DLINP, LOGL_NOTICE, "received ID get\n"); - dev->trx_id = trx_nr; - rmsg = ipa_ccm_make_id_resp_from_req(dev, data + 1, len - 1); - dev->trx_id = old_trx_nr; + rmsg = ipa_bts_id_resp(dev, data + 1, len - 1, trx_nr); ret = ipa_send(link->ofd->fd, rmsg->data, rmsg->len); if (ret != rmsg->len) { LOGP(DLINP, LOGL_ERROR, "cannot send ID_RESP " |