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
This commit is contained in:
Pau Espin 2022-09-15 17:41:30 +02:00
parent e71af5019b
commit 30bdf9a4c7
4 changed files with 53 additions and 29 deletions

View File

@ -65,7 +65,6 @@ enum signal_nm {
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 @@ enum signal_rf {
};
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;

View File

@ -191,6 +191,9 @@ static void check_restart_or_exit(struct gsm_bts_trx *trx)
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 @@ static int nm_sig_cb(unsigned int subsys, unsigned int signal,
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");

View File

@ -2865,6 +2865,7 @@ static int abis_nm_rx_ipacc(struct msgb *msg)
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 @@ static int abis_nm_rx_ipacc(struct msgb *msg)
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 @@ static int abis_nm_rx_ipacc(struct msgb *msg)
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 @@ static void rsl_connect_timeout(void *data)
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);
}

View File

@ -413,19 +413,15 @@ static void nm_rx_set_chan_attr_ack(struct msgb *oml_msg)
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_set_attr_ack(struct msgb *oml_msg)
}
}
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 @@ static int bts_ipa_nm_sig_cb(unsigned int subsys, unsigned int signal,
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;