diff options
Diffstat (limited to 'src/osmo-bts-virtual/scheduler_virtbts.c')
-rw-r--r-- | src/osmo-bts-virtual/scheduler_virtbts.c | 69 |
1 files changed, 7 insertions, 62 deletions
diff --git a/src/osmo-bts-virtual/scheduler_virtbts.c b/src/osmo-bts-virtual/scheduler_virtbts.c index 9d2adfc3..87596a79 100644 --- a/src/osmo-bts-virtual/scheduler_virtbts.c +++ b/src/osmo-bts-virtual/scheduler_virtbts.c @@ -14,7 +14,7 @@ * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. @@ -102,8 +102,6 @@ static void _tx_to_virt_um(struct l1sched_ts *l1ts, if (rc < 0) LOGL1SB(DL1P, LOGL_ERROR, l1ts, br, "GSMTAP msg could not send to virtual Um: %s\n", strerror(-rc)); - else if (rc == 0) - bts_shutdown(trx->bts, "VirtPHY write socket died\n"); else LOGL1SB(DL1P, LOGL_DEBUG, l1ts, br, "Sending GSMTAP message to virtual Um\n"); @@ -237,61 +235,13 @@ int tx_pdtch_fn(struct l1sched_ts *l1ts, struct trx_dl_burst_req *br) static void tx_tch_common(struct l1sched_ts *l1ts, const struct trx_dl_burst_req *br, - struct msgb **_msg_tch, struct msgb **_msg_facch, - int codec_mode_request) + struct msgb **_msg_tch, struct msgb **_msg_facch) { struct msgb *msg1, *msg2, *msg_tch = NULL, *msg_facch = NULL; struct l1sched_chan_state *chan_state = &l1ts->chan_state[br->chan]; uint8_t rsl_cmode = chan_state->rsl_cmode; uint8_t tch_mode = chan_state->tch_mode; struct osmo_phsap_prim *l1sap; -#if 0 - /* handle loss detection of received TCH frames */ - if (rsl_cmode == RSL_CMOD_SPD_SPEECH - && ++(chan_state->lost_frames) > 5) { - uint8_t tch_data[GSM_FR_BYTES]; - int len; - - LOGL1SB(DL1P, LOGL_NOTICE, l1ts, br, "Missing TCH bursts detected, sending " - "BFI for %s\n", trx_chan_desc[br->chan].name); - - /* indicate bad frame */ - switch (tch_mode) { - case GSM48_CMODE_SPEECH_V1: /* FR / HR */ - if (br->chan != TRXC_TCHF) { /* HR */ - tch_data[0] = 0x70; /* F = 0, FT = 111 */ - memset(tch_data + 1, 0, 14); - len = 15; - break; - } - memset(tch_data, 0, GSM_FR_BYTES); - len = GSM_FR_BYTES; - break; - case GSM48_CMODE_SPEECH_EFR: /* EFR */ - if (br->chan != TRXC_TCHF) - goto inval_mode1; - memset(tch_data, 0, GSM_EFR_BYTES); - len = GSM_EFR_BYTES; - break; - case GSM48_CMODE_SPEECH_AMR: /* AMR */ - len = amr_compose_payload(tch_data, - chan_state->codec[chan_state->dl_cmr], - chan_state->codec[chan_state->dl_ft], 1); - if (len < 2) - break; - memset(tch_data + 2, 0, len - 2); - _sched_compose_tch_ind(l1ts, 0, br->chan, tch_data, len); - break; - default: -inval_mode1: - LOGP(DL1P, LOGL_ERROR, "TCH mode invalid, please " - "fix!\n"); - len = 0; - } - if (len) - _sched_compose_tch_ind(l1ts, 0, br->chan, tch_data, len); - } -#endif /* get frame and unlink from queue */ msg1 = _sched_dequeue_prim(l1ts, br); @@ -419,7 +369,7 @@ int tx_tchf_fn(struct l1sched_ts *l1ts, struct trx_dl_burst_req *br) if (br->bid > 0) return 0; - tx_tch_common(l1ts, br, &msg_tch, &msg_facch, (((br->fn + 4) % 26) >> 2) & 1); + tx_tch_common(l1ts, br, &msg_tch, &msg_facch); /* no message at all */ if (!msg_tch && !msg_facch) { @@ -447,15 +397,7 @@ int tx_tchh_fn(struct l1sched_ts *l1ts, struct trx_dl_burst_req *br) return 0; /* get TCH and/or FACCH */ - tx_tch_common(l1ts, br, &msg_tch, &msg_facch, (((br->fn + 4) % 26) >> 2) & 1); - - /* check for FACCH alignment */ - if (msg_facch && ((((br->fn + 4) % 26) >> 2) & 1)) { - LOGL1SB(DL1P, LOGL_ERROR, l1ts, br, "Cannot transmit FACCH starting on " - "even frames, please fix RTS!\n"); - msgb_free(msg_facch); - msg_facch = NULL; - } + tx_tch_common(l1ts, br, &msg_tch, &msg_facch); /* no message at all */ if (!msg_tch && !msg_facch && !chan_state->dl_ongoing_facch) { @@ -597,6 +539,9 @@ int vbts_sched_start(struct gsm_bts *bts) struct bts_virt_priv *bts_virt = (struct bts_virt_priv *)bts->model_priv; LOGP(DL1P, LOGL_NOTICE, "starting VBTS scheduler\n"); + if (!bts_virt) + return -EINVAL; + memset(&bts_virt->fn_timer, 0, sizeof(bts_virt->fn_timer)); bts_virt->fn_timer.cb = vbts_fn_timer_cb; bts_virt->fn_timer.data = bts; |