aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/abis/e1_input.h1
-rw-r--r--include/osmocom/abis/ipaccess.h7
-rw-r--r--src/input/ipaccess.c131
-rw-r--r--tests/e1inp_ipa_bts_test.c149
4 files changed, 147 insertions, 141 deletions
diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h
index d2033ef..f29491a 100644
--- a/include/osmocom/abis/e1_input.h
+++ b/include/osmocom/abis/e1_input.h
@@ -123,6 +123,7 @@ struct e1inp_driver {
struct e1inp_line_ops {
enum e1inp_line_role role;
char *addr;
+ void *data;
struct e1inp_sign_link * (*sign_link_up)(void *unit_info, struct e1inp_line *line, enum e1inp_sign_type type);
void (*sign_link_down)(struct e1inp_line *line);
diff --git a/include/osmocom/abis/ipaccess.h b/include/osmocom/abis/ipaccess.h
index d4174a8..6816d87 100644
--- a/include/osmocom/abis/ipaccess.h
+++ b/include/osmocom/abis/ipaccess.h
@@ -94,6 +94,13 @@ struct ipaccess_unit {
uint16_t site_id;
uint16_t bts_id;
uint16_t trx_id;
+ char *unit_name;
+ char *equipvers;
+ char *swversion;
+ uint8_t mac_addr[6];
+ char *location1;
+ char *location2;
+ char *serno;
};
struct hsl_unit {
diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c
index 74e2071..8004760 100644
--- a/src/input/ipaccess.c
+++ b/src/input/ipaccess.c
@@ -590,6 +590,113 @@ static int ipaccess_bsc_rsl_cb(struct ipa_server_link *link, int fd)
return 0;
}
+static struct msgb *abis_msgb_alloc(int headroom)
+{
+ struct msgb *nmsg;
+
+ headroom += sizeof(struct ipaccess_head);
+
+ nmsg = msgb_alloc_headroom(1200 + headroom, headroom, "dummy BTS");
+ if (!nmsg)
+ return NULL;
+ return nmsg;
+}
+
+static void abis_push_ipa(struct msgb *msg, uint8_t proto)
+{
+ struct ipaccess_head *nhh;
+
+ msg->l2h = msg->data;
+ nhh = (struct ipaccess_head *) msgb_push(msg, sizeof(*nhh));
+ nhh->proto = proto;
+ nhh->len = htons(msgb_l2len(msg));
+}
+
+static struct msgb *
+ipa_bts_id_resp(struct ipaccess_unit *dev, uint8_t *data, int len)
+{
+ struct msgb *nmsg;
+ char str[64];
+ uint8_t *tag;
+
+ nmsg = abis_msgb_alloc(0);
+ if (!nmsg)
+ return NULL;
+
+ *msgb_put(nmsg, 1) = IPAC_MSGT_ID_RESP;
+ while (len) {
+ if (len < 2) {
+ LOGP(DINP, LOGL_NOTICE,
+ "Short read of ipaccess tag\n");
+ msgb_free(nmsg);
+ return NULL;
+ }
+ switch (data[1]) {
+ case IPAC_IDTAG_UNIT:
+ sprintf(str, "%u/%u/%u",
+ dev->site_id, dev->bts_id, dev->trx_id);
+ break;
+ case IPAC_IDTAG_MACADDR:
+ sprintf(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:
+ strcpy(str, dev->location1);
+ break;
+ case IPAC_IDTAG_LOCATION2:
+ strcpy(str, dev->location2);
+ break;
+ case IPAC_IDTAG_EQUIPVERS:
+ strcpy(str, dev->equipvers);
+ break;
+ case IPAC_IDTAG_SWVERSION:
+ strcpy(str, dev->swversion);
+ break;
+ case IPAC_IDTAG_UNITNAME:
+ sprintf(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:
+ strcpy(str, dev->serno);
+ break;
+ default:
+ LOGP(DINP, LOGL_NOTICE,
+ "Unknown ipaccess tag 0x%02x\n", *data);
+ msgb_free(nmsg);
+ return NULL;
+ }
+ LOGP(DINP, 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;
+ }
+ abis_push_ipa(nmsg, IPAC_PROTO_IPACCESS);
+ return nmsg;
+}
+
+static struct msgb *ipa_bts_id_ack(void)
+{
+ struct msgb *nmsg2;
+
+ nmsg2 = abis_msgb_alloc(0);
+ if (!nmsg2)
+ return NULL;
+
+ *msgb_put(nmsg2, 1) = IPAC_MSGT_ID_ACK;
+ abis_push_ipa(nmsg2, IPAC_PROTO_IPACCESS);
+
+ return nmsg2;
+}
+
static int ipaccess_bts_cb(struct ipa_client_link *link, struct msgb *msg)
{
struct ipaccess_head *hh = (struct ipaccess_head *) msg->data;
@@ -605,6 +712,11 @@ static int ipaccess_bts_cb(struct ipa_client_link *link, struct msgb *msg)
/* this is a request for identification from the BSC. */
if (msg_type == IPAC_MSGT_ID_GET) {
+ struct e1inp_sign_link *sign_link;
+ struct msgb *rmsg;
+ uint8_t *data = msgb_l2(msg);
+ int len = msgb_l2len(msg);
+
LOGP(DINP, LOGL_NOTICE, "received ID get\n");
if (!link->line->ops->sign_link_up) {
LOGP(DINP, LOGL_ERROR, "Fix your application, "
@@ -612,14 +724,23 @@ static int ipaccess_bts_cb(struct ipa_client_link *link, struct msgb *msg)
"becomes ready\n");
return -EINVAL;
}
- /*
- * FIXME: parse request here and pass data to callback.
- */
- struct e1inp_sign_link *sign_link;
-
sign_link = link->line->ops->sign_link_up(msg,
link->line,
link->ofd->priv_nr);
+ if (sign_link == NULL) {
+ LOGP(DINP, LOGL_ERROR,
+ "No sign link created\n");
+ return -EINVAL;
+ }
+ rmsg = ipa_bts_id_resp(link->line->ops->data,
+ data + 1, len - 1);
+ ipaccess_send(link->ofd->fd, rmsg->data, rmsg->len);
+ msgb_free(rmsg);
+
+ /* send ID_ACK. */
+ rmsg = ipa_bts_id_ack();
+ ipaccess_send(link->ofd->fd, rmsg->data, rmsg->len);
+ msgb_free(rmsg);
}
return 0;
} else if (link->port == IPA_TCP_PORT_OML)
diff --git a/tests/e1inp_ipa_bts_test.c b/tests/e1inp_ipa_bts_test.c
index 643e898..dbd9e4c 100644
--- a/tests/e1inp_ipa_bts_test.c
+++ b/tests/e1inp_ipa_bts_test.c
@@ -27,134 +27,9 @@ const struct log_info bts_test_log_info = {
.num_cat = ARRAY_SIZE(bts_test_cat),
};
-struct dummy_bts {
- uint16_t bts_id;
- uint16_t site_id;
- uint16_t trx_id;
- uint8_t mac_addr[6];
-} dummy_bts = {
- .site_id = 0,
- .bts_id = 0,
- .trx_id = 0,
- .mac_addr = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-};
-
-char *software_version = "0.1";
-
-static struct msgb *abis_msgb_alloc(int headroom)
-{
- struct msgb *nmsg;
-
- headroom += sizeof(struct ipaccess_head);
-
- nmsg = msgb_alloc_headroom(1200 + headroom, headroom, "dummy BTS");
- if (!nmsg)
- return NULL;
- return nmsg;
-}
-
-static void abis_push_ipa(struct msgb *msg, uint8_t proto)
-{
- struct ipaccess_head *nhh;
-
- msg->l2h = msg->data;
- nhh = (struct ipaccess_head *) msgb_push(msg, sizeof(*nhh));
- nhh->proto = proto;
- nhh->len = htons(msgb_l2len(msg));
-}
-
-/* XXX: we have to do this in input/ipaccess.c, moreover we have to put this
- * information in some data structure that we'll pass to sign_link_up. */
-static struct msgb *ipa_bts_id_resp(uint8_t *data, int len)
-{
- struct msgb *nmsg;
- char str[64];
- uint8_t *tag;
-
- nmsg = abis_msgb_alloc(0);
- if (!nmsg)
- return NULL;
-
- *msgb_put(nmsg, 1) = IPAC_MSGT_ID_RESP;
- while (len) {
- if (len < 2) {
- LOGP(DBTSTEST, LOGL_NOTICE,
- "Short read of ipaccess tag\n");
- msgb_free(nmsg);
- return NULL;
- }
- switch (data[1]) {
- case IPAC_IDTAG_UNIT:
- sprintf(str, "%u/%u/%u",
- dummy_bts.site_id,
- dummy_bts.bts_id,
- dummy_bts.trx_id);
- break;
- case IPAC_IDTAG_MACADDR:
- sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x",
- dummy_bts.mac_addr[0], dummy_bts.mac_addr[1],
- dummy_bts.mac_addr[2], dummy_bts.mac_addr[3],
- dummy_bts.mac_addr[4], dummy_bts.mac_addr[5]);
- break;
- case IPAC_IDTAG_LOCATION1:
- strcpy(str, "osmoBTS");
- break;
- case IPAC_IDTAG_LOCATION2:
- strcpy(str, "osmoBTS");
- break;
- case IPAC_IDTAG_EQUIPVERS:
- case IPAC_IDTAG_SWVERSION:
- strcpy(str, software_version);
- break;
- case IPAC_IDTAG_UNITNAME:
- sprintf(str, "osmoBTS-%02x-%02x-%02x-%02x-%02x-%02x",
- dummy_bts.mac_addr[0], dummy_bts.mac_addr[1],
- dummy_bts.mac_addr[2], dummy_bts.mac_addr[3],
- dummy_bts.mac_addr[4], dummy_bts.mac_addr[5]);
- break;
- case IPAC_IDTAG_SERNR:
- strcpy(str, "");
- break;
- default:
- LOGP(DBTSTEST, LOGL_NOTICE,
- "Unknown ipaccess tag 0x%02x\n", *data);
- msgb_free(nmsg);
- return NULL;
- }
- LOGP(DBTSTEST, 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;
- }
- abis_push_ipa(nmsg, IPAC_PROTO_IPACCESS);
- return nmsg;
-}
-
-static struct msgb *ipa_bts_id_ack(void)
-{
- struct msgb *nmsg2;
-
- nmsg2 = abis_msgb_alloc(0);
- if (!nmsg2)
- return NULL;
-
- *msgb_put(nmsg2, 1) = IPAC_MSGT_ID_ACK;
- abis_push_ipa(nmsg2, IPAC_PROTO_IPACCESS);
-
- return nmsg2;
-}
-
static struct e1inp_sign_link *
sign_link_up(void *unit, struct e1inp_line *line, enum e1inp_sign_type type)
{
- struct msgb *msg = unit;
- struct msgb *rmsg;
- uint8_t *data = msgb_l2(msg);
- int len = msgb_l2len(msg);
struct e1inp_sign_link *sign_link = NULL;
void *dst = NULL;
@@ -187,17 +62,6 @@ sign_link_up(void *unit, struct e1inp_line *line, enum e1inp_sign_type type)
default:
return NULL;
}
-
- /* send ID_RESP. */
- rmsg = ipa_bts_id_resp(data + 1, len - 1);
- rmsg->dst = dst;
- abis_sendmsg(rmsg);
-
- /* send ID_ACK. */
- rmsg = ipa_bts_id_ack();
- rmsg->dst = dst;
- abis_sendmsg(rmsg);
-
return sign_link;
}
@@ -214,6 +78,18 @@ static int sign_link(struct msgb *msg, struct e1inp_sign_link *link)
int main(void)
{
+ struct ipaccess_unit bts_dev_info = {
+ .site_id = 0,
+ .bts_id = 0,
+ .trx_id = 0,
+ .unit_name = "testBTS",
+ .equipvers = "0.1",
+ .swversion = "0.1",
+ .mac_addr = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ .location1 = "testBTS",
+ .location2 = "testBTS",
+ .serno = "",
+ };
struct e1inp_line *line;
tall_test = talloc_named_const(NULL, 1, "e1inp_test");
@@ -224,6 +100,7 @@ int main(void)
struct e1inp_line_ops ops = {
.role = E1INP_LINE_R_BTS,
.addr = "127.0.0.1",
+ .data = &bts_dev_info,
.sign_link_up = sign_link_up,
.sign_link_down = sign_link_down,
.sign_link = sign_link,