aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-05-26 13:11:59 +0200
committerHarald Welte <laforge@gnumonks.org>2017-05-26 13:12:14 +0200
commite416e2e09d50390f79bcd284e6e91cd87fc8344e (patch)
tree2bd92e55e36df1febcf0f7b27db21b0490654965
parentcac78fe9e95d8f7f9eea07f99b910409e10854bc (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.c89
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 "