pespin has uploaded this change for review.
oml: Integrate signal S_NM_IPACC_SET_ATTR_ACK inside S_NM_IPACC_ACK
It makes no sense to have duplicate signals. Let's simply clean up
S_NM_IPACC_ACK and pass the required info for higher layers to do
whatever is needed based on the information.
This allows reusing same signal infrastructure for different types of
messages instead of having to implement new signals for each message
(which can be done at a higher point in the stack).
Change-Id: I18ae3d320d00077fc13bb9903903de2a17767302
---
M include/osmocom/bsc/signal.h
M src/ipaccess/ipaccess-config.c
M src/osmo-bsc/abis_nm.c
M src/osmo-bsc/bts_ipaccess_nanobts.c
4 files changed, 53 insertions(+), 29 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/63/29363/1
diff --git a/include/osmocom/bsc/signal.h b/include/osmocom/bsc/signal.h
index 300bd55..4d5080d 100644
--- a/include/osmocom/bsc/signal.h
+++ b/include/osmocom/bsc/signal.h
@@ -65,7 +65,6 @@
S_NM_NACK, /* GSM 12.21 various NM_MT_*_NACK happened */
S_NM_IPACC_NACK, /* GSM 12.21 nanoBTS extensions NM_MT_IPACC_*_*_NACK happened */
S_NM_IPACC_ACK, /* GSM 12.21 nanoBTS extensions NM_MT_IPACC_*_*_ACK happened */
- S_NM_IPACC_SET_ATTR_ACK,/* GSM 12.21 nanoBTS extensions NM_MT_IPACC_SET_ATTR_ACK happened */
S_NM_IPACC_RESTART_ACK, /* nanoBTS has send a restart ack */
S_NM_IPACC_RESTART_NACK,/* nanoBTS has send a restart ack */
S_NM_TEST_REP, /* GSM 12.21 Test Report */
@@ -121,8 +120,10 @@
};
struct ipacc_ack_signal_data {
- struct gsm_bts_trx *trx;
- uint8_t msg_type;
+ /* The BTS which sent the ACK/NACK to us: */
+ struct gsm_bts *bts;
+ /* messge header containing msg_type, obj_class, obj_inst: */
+ struct abis_om_fom_hdr *foh;
};
struct abis_om2k_mo;
diff --git a/src/ipaccess/ipaccess-config.c b/src/ipaccess/ipaccess-config.c
index 1d8675e..7c8d486 100644
--- a/src/ipaccess/ipaccess-config.c
+++ b/src/ipaccess/ipaccess-config.c
@@ -191,6 +191,9 @@
static int ipacc_msg_ack(uint8_t mt, struct gsm_bts_trx *trx)
{
+ if (mt != NM_MT_IPACC_SET_NVATTR_ACK && mt != NM_MT_IPACC_SET_ATTR_ACK)
+ return 0;
+
if (sw_load_state == 1) {
fprintf(stderr, "The new software is activated.\n");
check_restart_or_exit(trx);
@@ -352,14 +355,23 @@
struct ipacc_ack_signal_data *ipacc_data;
struct nm_statechg_signal_data *nsd;
struct msgb *oml_msg;
+ struct gsm_bts_trx *trx;
switch (signal) {
case S_NM_IPACC_NACK:
ipacc_data = signal_data;
- return ipacc_msg_nack(ipacc_data->msg_type);
+ return ipacc_msg_nack(ipacc_data->foh->msg_type);
case S_NM_IPACC_ACK:
ipacc_data = signal_data;
- return ipacc_msg_ack(ipacc_data->msg_type, ipacc_data->trx);
+ switch (ipacc_data->foh->obj_class) {
+ case NM_OC_BASEB_TRANSC:
+ case NM_OC_RADIO_CARRIER:
+ trx = gsm_bts_trx_num(ipacc_data->bts,
+ ipacc_data->foh->obj_inst.trx_nr);
+ return ipacc_msg_ack(ipacc_data->foh->msg_type, trx);
+ default:
+ return 0;
+ }
case S_NM_IPACC_RESTART_ACK:
if (!quiet)
printf("The BTS has acked the restart. Exiting.\n");
diff --git a/src/osmo-bsc/abis_nm.c b/src/osmo-bsc/abis_nm.c
index 8eeba89..b151f36 100644
--- a/src/osmo-bsc/abis_nm.c
+++ b/src/osmo-bsc/abis_nm.c
@@ -2865,6 +2865,7 @@
struct tlv_parsed tp;
struct ipacc_ack_signal_data signal;
struct e1inp_sign_link *sign_link = msg->dst;
+ struct gsm_bts *bts = sign_link->trx->bts;
struct gsm_bts_trx *trx;
foh = (struct abis_om_fom_hdr *) (oh->data + 1 + idstrlen);
@@ -2874,14 +2875,14 @@
return -EINVAL;
}
- if (abis_nm_tlv_parse(&tp, sign_link->trx->bts, foh->data, oh->length - sizeof(*foh)) < 0) {
+ if (abis_nm_tlv_parse(&tp, bts, foh->data, oh->length - sizeof(*foh)) < 0) {
LOGPFOH(DNM, LOGL_ERROR, foh, "%s(): tlv_parse failed\n", __func__);
return -EINVAL;
}
/* The message might be received over the main OML link, so we cannot
* just use sign_link->trx. Resolve it by number from the FOM header. */
- trx = gsm_bts_trx_num(sign_link->trx->bts, foh->obj_inst.trx_nr);
+ trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr);
DEBUGPFOH(DNM, foh, "Rx IPACCESS(0x%02x): %s\n", foh->msg_type,
osmo_hexdump(foh->data, oh->length - sizeof(*foh)));
@@ -2961,21 +2962,15 @@
case NM_MT_IPACC_RSL_CONNECT_NACK:
case NM_MT_IPACC_SET_NVATTR_NACK:
case NM_MT_IPACC_GET_NVATTR_NACK:
- if (!trx)
- goto obj_inst_error;
- signal.trx = trx;
- signal.msg_type = foh->msg_type;
+ signal.bts = bts;
+ signal.foh = foh;
osmo_signal_dispatch(SS_NM, S_NM_IPACC_NACK, &signal);
break;
case NM_MT_IPACC_SET_NVATTR_ACK:
- if (!trx)
- goto obj_inst_error;
- signal.trx = trx;
- signal.msg_type = foh->msg_type;
- osmo_signal_dispatch(SS_NM, S_NM_IPACC_ACK, &signal);
- break;
case NM_MT_IPACC_SET_ATTR_ACK:
- osmo_signal_dispatch(SS_NM, S_NM_IPACC_SET_ATTR_ACK, msg);
+ signal.bts = bts;
+ signal.foh = foh;
+ osmo_signal_dispatch(SS_NM, S_NM_IPACC_ACK, &signal);
break;
default:
break;
@@ -3041,8 +3036,17 @@
LOG_TRX(trx, DRSL, LOGL_NOTICE, "RSL connection request timed out\n");
/* Fake an RSL CONNECT NACK message from the BTS. */
- signal.trx = trx;
- signal.msg_type = NM_MT_IPACC_RSL_CONNECT_NACK;
+ struct abis_om_fom_hdr foh = {
+ .msg_type = NM_MT_IPACC_RSL_CONNECT_NACK,
+ .obj_class = NM_OC_BASEB_TRANSC,
+ .obj_inst = {
+ .bts_nr = trx->bts->bts_nr,
+ .trx_nr = trx->nr,
+ .ts_nr = 0xff,
+ },
+ };
+ signal.foh = &foh;
+ signal.bts = trx->bts;
osmo_signal_dispatch(SS_NM, S_NM_IPACC_NACK, &signal);
}
diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c
index 8a63e16..0af5a28 100644
--- a/src/osmo-bsc/bts_ipaccess_nanobts.c
+++ b/src/osmo-bsc/bts_ipaccess_nanobts.c
@@ -413,19 +413,15 @@
osmo_fsm_inst_dispatch(ts->mo.fi, NM_EV_SET_ATTR_ACK, NULL);
}
-static void nm_rx_ipacc_set_attr_ack(struct msgb *oml_msg)
+static void nm_rx_ipacc_set_attr_ack(struct ipacc_ack_signal_data *sig_data)
{
- struct e1inp_sign_link *sign_link = oml_msg->dst;
- struct gsm_bts *bts = sign_link->trx->bts;
- struct abis_om_hdr *oh = msgb_l2(oml_msg);
- uint8_t idstrlen = oh->data[0];
- struct abis_om_fom_hdr *foh;
+ struct gsm_bts *bts = sig_data->bts;
+ struct abis_om_fom_hdr *foh = sig_data->foh;
void *obj;
struct gsm_gprs_nse *nse;
struct gsm_gprs_cell *cell;
struct gsm_gprs_nsvc *nsvc;
- foh = (struct abis_om_fom_hdr *) (oh->data + 1 + idstrlen);
obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst);
switch (foh->obj_class) {
@@ -447,6 +443,17 @@
}
}
+static void nm_rx_ipacc_ack(struct ipacc_ack_signal_data *sig_data)
+{
+ switch (sig_data->foh->msg_type) {
+ case NM_MT_IPACC_SET_ATTR_ACK:
+ nm_rx_ipacc_set_attr_ack(sig_data);
+ break;
+ default:
+ break;
+ }
+}
+
/* Callback function to be called every time we receive a signal from NM */
static int bts_ipa_nm_sig_cb(unsigned int subsys, unsigned int signal,
void *handler_data, void *signal_data)
@@ -477,8 +484,8 @@
case S_NM_SET_CHAN_ATTR_ACK:
nm_rx_set_chan_attr_ack(signal_data);
return 0;
- case S_NM_IPACC_SET_ATTR_ACK:
- nm_rx_ipacc_set_attr_ack(signal_data);
+ case S_NM_IPACC_ACK:
+ nm_rx_ipacc_ack(signal_data);
return 0;
default:
break;
To view, visit change 29363. To unsubscribe, or for help writing mail filters, visit settings.