From b9ab7150bfee7a46a5e2d920d30607c365b39b18 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 10 Mar 2020 20:09:48 +0100 Subject: virtphy: Delay response between L1SAP_PM_REQ and L1SAP_PM_CONF Change-Id: I443b5512c4966c232107aeb73e1fd8b83335d63d --- src/host/virt_phy/include/virtphy/virt_l1_model.h | 6 +++++ src/host/virt_phy/src/virt_prim_pm.c | 31 ++++++++++++++++------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/host/virt_phy/include/virtphy/virt_l1_model.h b/src/host/virt_phy/include/virtphy/virt_l1_model.h index 99ad39f3..ffed7082 100644 --- a/src/host/virt_phy/include/virtphy/virt_l1_model.h +++ b/src/host/virt_phy/include/virtphy/virt_l1_model.h @@ -100,6 +100,12 @@ struct l1_state_ms { uint8_t arfcn_sig_lev_red_dbm[1024]; struct osmo_timer_list arfcn_sig_lev_timers[1024]; } meas; + struct { + uint16_t band_arfcn_from; + uint16_t band_arfcn_to; + /* timer between receiving PM_REQ and responding with PM_CONF */ + struct osmo_timer_list timer; + } req; } pm; }; diff --git a/src/host/virt_phy/src/virt_prim_pm.c b/src/host/virt_phy/src/virt_prim_pm.c index 6d11f494..561f6ce9 100644 --- a/src/host/virt_phy/src/virt_prim_pm.c +++ b/src/host/virt_phy/src/virt_prim_pm.c @@ -84,25 +84,36 @@ void l1ctl_rx_pm_req(struct l1_model_ms *ms, struct msgb *msg) struct l1_state_ms *l1s = &ms->state; struct l1ctl_hdr *l1h = (struct l1ctl_hdr *) msg->data; struct l1ctl_pm_req *pm_req = (struct l1ctl_pm_req *) l1h->data; - struct msgb *resp_msg = l1ctl_msgb_alloc(L1CTL_PM_CONF); - uint16_t arfcn_next; - /* convert to host order */ - pm_req->range.band_arfcn_from = ntohs(pm_req->range.band_arfcn_from); - pm_req->range.band_arfcn_to = ntohs(pm_req->range.band_arfcn_to); + /* just parse the data from the request here */ + l1s->pm.req.band_arfcn_from = ntohs(pm_req->range.band_arfcn_from); + l1s->pm.req.band_arfcn_to = ntohs(pm_req->range.band_arfcn_to); LOGPMS(DL1C, LOGL_INFO, ms, "Rx L1CTL_PM_REQ TYPE=%u, FROM=%d, TO=%d\n", - pm_req->type, pm_req->range.band_arfcn_from, pm_req->range.band_arfcn_to); + pm_req->type, l1s->pm.req.band_arfcn_from, l1s->pm.req.band_arfcn_to); + + /* generating the response will happen delayed in a timer, as otherwise + * we will respond too fast, and 'mobile' will run havoc in a busy loop issuing + * endless PM_REQ until a cell eventually isfound */ + osmo_timer_schedule(&l1s->pm.req.timer, 0, 300000); +} + +static void pm_conf_timer_cb(void *data) +{ + struct l1_model_ms *ms = data; + struct l1_state_ms *l1s = &ms->state; + struct msgb *resp_msg = l1ctl_msgb_alloc(L1CTL_PM_CONF); + uint16_t arfcn_next; - for (arfcn_next = pm_req->range.band_arfcn_from; - arfcn_next <= pm_req->range.band_arfcn_to; ++arfcn_next) { + for (arfcn_next = l1s->pm.req.band_arfcn_from; + arfcn_next <= l1s->pm.req.band_arfcn_to; ++arfcn_next) { struct l1ctl_pm_conf *pm_conf = (struct l1ctl_pm_conf *) msgb_put(resp_msg, sizeof(*pm_conf)); pm_conf->band_arfcn = htons(arfcn_next); /* set min and max to the value calculated for that * arfcn (IGNORE UPLINKK AND PCS AND OTHER FLAGS) */ pm_conf->pm[0] = dbm2rxlev(l1s->pm.meas.arfcn_sig_lev_dbm[arfcn_next & ARFCN_NO_FLAGS_MASK]); pm_conf->pm[1] = dbm2rxlev(l1s->pm.meas.arfcn_sig_lev_dbm[arfcn_next & ARFCN_NO_FLAGS_MASK]); - if (arfcn_next == pm_req->range.band_arfcn_to) { + if (arfcn_next == l1s->pm.req.band_arfcn_to) { struct l1ctl_hdr *resp_l1h = msgb_l1(resp_msg); resp_l1h->flags |= L1CTL_F_DONE; } @@ -137,6 +148,7 @@ void prim_pm_init(struct l1_model_ms *model) l1s->pm.meas.arfcn_sig_lev_timers[i].cb = prim_pm_timer_cb; l1s->pm.meas.arfcn_sig_lev_timers[i].data = &l1s->pm.meas.arfcn_sig_lev_dbm[i]; } + osmo_timer_setup(&l1s->pm.req.timer, pm_conf_timer_cb, model); } void prim_pm_exit(struct l1_model_ms *model) @@ -146,4 +158,5 @@ void prim_pm_exit(struct l1_model_ms *model) for (i = 0; i < 1024; ++i) osmo_timer_del(&l1s->pm.meas.arfcn_sig_lev_timers[i]); + osmo_timer_del(&l1s->pm.req.timer); } -- cgit v1.2.3