diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h index f13b12be8..8b6b4a628 100644 --- a/openbsc/include/openbsc/signal.h +++ b/openbsc/include/openbsc/signal.h @@ -124,6 +124,11 @@ struct scall_signal_data { void *data; }; +struct ipacc_ack_signal_data { + struct gsm_bts *bts; + u_int8_t msg_type; +}; + /* Management */ int register_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data); void unregister_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data); diff --git a/openbsc/src/abis_nm.c b/openbsc/src/abis_nm.c index 9dedcaf5d..8a9670477 100644 --- a/openbsc/src/abis_nm.c +++ b/openbsc/src/abis_nm.c @@ -2721,6 +2721,7 @@ static int abis_nm_rx_ipacc(struct msgb *msg) struct abis_om_fom_hdr *foh; u_int8_t idstrlen = oh->data[0]; struct tlv_parsed tp; + struct ipacc_ack_signal_data signal; if (strncmp((char *)&oh->data[1], ipaccess_magic, idstrlen)) { LOGP(DNM, LOGL_ERROR, "id string is not com.ipaccess !?!\n"); @@ -2803,10 +2804,14 @@ 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: - dispatch_signal(SS_NM, S_NM_IPACC_NACK, &foh->msg_type); + signal.bts = msg->trx->bts; + signal.msg_type = foh->msg_type; + dispatch_signal(SS_NM, S_NM_IPACC_NACK, &signal); break; case NM_MT_IPACC_SET_NVATTR_ACK: - dispatch_signal(SS_NM, S_NM_IPACC_ACK, &foh->msg_type); + signal.bts = msg->trx->bts; + signal.msg_type = foh->msg_type; + dispatch_signal(SS_NM, S_NM_IPACC_ACK, &signal); break; default: break; diff --git a/openbsc/src/ipaccess/ipaccess-config.c b/openbsc/src/ipaccess/ipaccess-config.c index 759161490..29b9a9bf7 100644 --- a/openbsc/src/ipaccess/ipaccess-config.c +++ b/openbsc/src/ipaccess/ipaccess-config.c @@ -55,6 +55,7 @@ static u_int16_t nv_flags; static u_int16_t nv_mask; static char *software = NULL; static int sw_load_state = 0; +static int oml_state = 0; struct sw_load { u_int8_t file_id[255]; @@ -87,11 +88,23 @@ static int ipacc_msg_nack(u_int8_t mt) return 0; } -static int ipacc_msg_ack(u_int8_t mt) +static int ipacc_msg_ack(u_int8_t mt, struct gsm_bts *bts) { if (sw_load_state == 1) { fprintf(stderr, "The new software is activaed.\n"); - exit(0); + + if (restart) { + abis_nm_ipaccess_restart(bts); + } else { + exit(0); + } + } else if (oml_state == 1) { + fprintf(stderr, "Set the primary OML IP.\n"); + if (restart) { + abis_nm_ipaccess_restart(bts); + } else { + exit(0); + } } return 0; @@ -178,15 +191,15 @@ static int test_rep(void *_msg) static int nm_sig_cb(unsigned int subsys, unsigned int signal, void *handler_data, void *signal_data) { - u_int8_t *msg_type; + struct ipacc_ack_signal_data *ipacc_data; switch (signal) { case S_NM_IPACC_NACK: - msg_type = signal_data; - return ipacc_msg_nack(*msg_type); + ipacc_data = signal_data; + return ipacc_msg_nack(ipacc_data->msg_type); case S_NM_IPACC_ACK: - msg_type = signal_data; - return ipacc_msg_ack(*msg_type); + ipacc_data = signal_data; + return ipacc_msg_ack(ipacc_data->msg_type, ipacc_data->bts); case S_NM_TEST_REP: return test_rep(signal_data); default: @@ -315,6 +328,7 @@ static void bootstrap_om(struct gsm_bts *bts) *cur++ = 0; *cur++ = 0; printf("setting primary OML link IP to '%s'\n", inet_ntoa(ia)); + oml_state = 1; abis_nm_ipaccess_set_nvattr(bts, buf, 3+len); } if (nv_mask) { @@ -332,7 +346,7 @@ static void bootstrap_om(struct gsm_bts *bts) abis_nm_ipaccess_set_nvattr(bts, buf, 3+len); } - if (restart) { + if (restart && !prim_oml_ip && !software) { printf("restarting BTS\n"); abis_nm_ipaccess_restart(bts); }