misc: Add an option exit/quit when the BSSGP is supposed to be destroyed
The PCU does not properly re-set the state when the connection to the BTS is lost (and the SGSN potentially is re-started during that). This results in the BSSGP BVCI > 1 remaining blocked and no data will be accepted by the SGSN. Add the '-e' option and exit the PCU when the BSSGP/NS are getting destroyed.
This commit is contained in:
parent
51c57045e5
commit
a30f47613a
|
@ -27,6 +27,7 @@ struct bssgp_bvc_ctx *bctx = NULL;
|
|||
struct gprs_nsvc *nsvc = NULL;
|
||||
static int bvc_sig_reset = 0, bvc_reset = 0, bvc_unblocked = 0;
|
||||
extern uint16_t spoof_mcc, spoof_mnc;
|
||||
static int exit_on_destroy = 0;
|
||||
|
||||
struct osmo_timer_list bvc_timer;
|
||||
|
||||
|
@ -640,8 +641,13 @@ int gprs_bssgp_create(uint16_t local_port, uint32_t sgsn_ip,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void gprs_bssgp_destroy(void)
|
||||
void gprs_bssgp_destroy_or_exit(void)
|
||||
{
|
||||
if (exit_on_destroy) {
|
||||
LOGP(DBSSGP, LOGL_NOTICE, "Exiting on BSSGP destruction.\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (!bssgp_nsi)
|
||||
return;
|
||||
|
||||
|
@ -662,3 +668,8 @@ void gprs_bssgp_destroy(void)
|
|||
bssgp_nsi = NULL;
|
||||
}
|
||||
|
||||
void gprs_bssgp_exit_on_destroy(void)
|
||||
{
|
||||
LOGP(DBSSGP, LOGL_NOTICE, "Going to quit on BSSGP destruction\n");
|
||||
exit_on_destroy = 1;
|
||||
}
|
||||
|
|
|
@ -56,6 +56,7 @@ int gprs_bssgp_create(uint16_t local_port, uint32_t sgsn_ip, uint16_t
|
|||
uint16_t mcc, uint16_t mnc, uint16_t lac, uint16_t rac,
|
||||
uint16_t cell_id);
|
||||
|
||||
void gprs_bssgp_destroy(void);
|
||||
void gprs_bssgp_exit_on_destroy(void);
|
||||
void gprs_bssgp_destroy_or_exit(void);
|
||||
|
||||
#endif // GPRS_BSSGP_PCU_H
|
||||
|
|
|
@ -179,7 +179,7 @@ int pcu_l1if_open()
|
|||
|
||||
void pcu_l1if_close(void)
|
||||
{
|
||||
gprs_bssgp_destroy();
|
||||
gprs_bssgp_destroy_or_exit();
|
||||
|
||||
/* FIXME: cleanup l1if */
|
||||
talloc_free(l1fh->fl1h);
|
||||
|
|
|
@ -369,7 +369,7 @@ bssgp_failed:
|
|||
trx, ts);
|
||||
}
|
||||
}
|
||||
gprs_bssgp_destroy();
|
||||
gprs_bssgp_destroy_or_exit();
|
||||
return 0;
|
||||
}
|
||||
LOGP(DL1IF, LOGL_INFO, "BTS available\n");
|
||||
|
|
|
@ -60,6 +60,7 @@ static void print_help()
|
|||
"provided by BTS\n"
|
||||
" -r --realtime PRIO Use SCHED_RR with the specified "
|
||||
"priority\n"
|
||||
" -e --exit Exit the application on disconnect\n"
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -75,10 +76,11 @@ static void handle_options(int argc, char **argv)
|
|||
{ "mnc", 1, 0, 'n' },
|
||||
{ "version", 0, 0, 'V' },
|
||||
{ "realtime", 1, 0, 'r' },
|
||||
{ "exit", 0, 0, 'e' },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
c = getopt_long(argc, argv, "hc:m:n:Vr:",
|
||||
c = getopt_long(argc, argv, "hc:m:n:Vr:e",
|
||||
long_options, &option_idx);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
@ -105,6 +107,9 @@ static void handle_options(int argc, char **argv)
|
|||
case 'r':
|
||||
rt_prio = atoi(optarg);
|
||||
break;
|
||||
case 'e':
|
||||
gprs_bssgp_exit_on_destroy();
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Unknown option '%c'\n", c);
|
||||
exit(0);
|
||||
|
|
|
@ -117,7 +117,7 @@ static void pcu_sock_close(struct pcu_sock_state *state, int lost)
|
|||
}
|
||||
}
|
||||
|
||||
gprs_bssgp_destroy();
|
||||
gprs_bssgp_destroy_or_exit();
|
||||
|
||||
if (lost) {
|
||||
state->timer.cb = pcu_sock_timeout;
|
||||
|
|
Loading…
Reference in New Issue