diff options
author | Harald Welte (local) <laflocal@hanuman.gnumonks.org> | 2009-12-27 18:12:29 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2009-12-28 13:41:16 +0100 |
commit | 3e46031f52535651e07ba5333914d83e1cffcf73 (patch) | |
tree | b684ef164b5a634c603d62e3c7bfd950a000ff92 /openbsc/src/chan_alloc.c | |
parent | ccd8845449bbeacf9d4e787be7995cef84f5db4b (diff) |
Introduce new ACT_REQ state to prevent race condition during channel allocation
When we allocate a channel, we send the RSL CHAN ACT REQ and wait until we get
a CHAN ACT ACK. Only the ACK will change the state, so there is a race where
we allocate that same channel to a different channel request before we get
the ACT ACK.
Introducing a new ACT_REQ state resolves this issue.
Diffstat (limited to 'openbsc/src/chan_alloc.c')
-rw-r--r-- | openbsc/src/chan_alloc.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/openbsc/src/chan_alloc.c b/openbsc/src/chan_alloc.c index 4bdf722b0..abf4de891 100644 --- a/openbsc/src/chan_alloc.c +++ b/openbsc/src/chan_alloc.c @@ -175,7 +175,8 @@ _lc_find_trx(struct gsm_bts_trx *trx, enum gsm_phys_chan_config pchan) /* check if all sub-slots are allocated yet */ for (ss = 0; ss < subslots_per_pchan[pchan]; ss++) { struct gsm_lchan *lc = &ts->lchan[ss]; - if (lc->type == GSM_LCHAN_NONE) + if (lc->type == GSM_LCHAN_NONE && + lc->state == LCHAN_S_NONE) return lc; } } |