From dfafe68a05069f0e0a21dfb5a200c38462031963 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sat, 2 Jul 2011 14:32:32 +0200 Subject: ipaccess: put the ID_GET logic for the BTS mode into the driver This patch moves the ID_GET logic from the example file to the ipaccess driver in BTS mode. --- include/osmocom/abis/e1_input.h | 1 + include/osmocom/abis/ipaccess.h | 7 ++ src/input/ipaccess.c | 131 +++++++++++++++++++++++++++++++++-- tests/e1inp_ipa_bts_test.c | 149 ++++------------------------------------ 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, -- cgit v1.2.3-55-g7522