From 87c597abf6ec605ea152a75e5f13d194955cad28 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Sun, 17 Jul 2011 09:36:49 +0200 Subject: [PATCH] [layer23] Adding neighbour cell measurement to L1CTL interface. --- include/l1ctl_proto.h | 20 +++++++++ .../layer23/include/osmocom/bb/common/l1ctl.h | 3 ++ .../include/osmocom/bb/common/osmocom_data.h | 7 +++ src/host/layer23/src/common/l1ctl.c | 43 +++++++++++++++++++ 4 files changed, 73 insertions(+) diff --git a/include/l1ctl_proto.h b/include/l1ctl_proto.h index 9adadfd..2478ff1 100644 --- a/include/l1ctl_proto.h +++ b/include/l1ctl_proto.h @@ -51,6 +51,8 @@ enum { L1CTL_SIM_CONF, L1CTL_TCH_MODE_REQ, L1CTL_TCH_MODE_CONF, + L1CTL_NEIGH_PM_REQ, + L1CTL_NEIGH_PM_IND, }; enum ccch_mode { @@ -59,6 +61,12 @@ enum ccch_mode { CCCH_MODE_COMBINED, }; +enum neigh_mode { + NEIGH_MODE_NONE = 0, + NEIGH_MODE_PM, + NEIGH_MODE_SB, +}; + /* * NOTE: struct size. We do add manual padding out of the believe * that it will avoid some unaligned access. @@ -255,4 +263,16 @@ struct l1ctl_reset { uint8_t pad[3]; } __attribute__((packed)); +struct l1ctl_neigh_pm_req { + uint8_t n; + uint8_t padding[1]; + uint16_t band_arfcn[64]; +} __attribute__((packed)); + +/* neighbour cell measurement results */ +struct l1ctl_neigh_pm_ind { + uint16_t band_arfcn; + uint8_t pm[2]; +} __attribute__((packed)); + #endif /* __L1CTL_PROTO_H__ */ diff --git a/src/host/layer23/include/osmocom/bb/common/l1ctl.h b/src/host/layer23/include/osmocom/bb/common/l1ctl.h index 1703d26..faa12d5 100644 --- a/src/host/layer23/include/osmocom/bb/common/l1ctl.h +++ b/src/host/layer23/include/osmocom/bb/common/l1ctl.h @@ -66,4 +66,7 @@ int l1ctl_tx_sim_req(struct osmocom_ms *ms, uint8_t *data, uint16_t length); /* LAPDm wants to send a PH-* primitive to the physical layer (L1) */ int l1ctl_ph_prim_cb(struct osmo_prim_hdr *oph, void *ctx); +/* Transmit L1CTL_NEIGH_PM_REQ */ +int l1ctl_tx_neigh_pm_req(struct osmocom_ms *ms, int num, uint16_t *arfcn); + #endif diff --git a/src/host/layer23/include/osmocom/bb/common/osmocom_data.h b/src/host/layer23/include/osmocom/bb/common/osmocom_data.h index de25af5..6af5ca4 100644 --- a/src/host/layer23/include/osmocom/bb/common/osmocom_data.h +++ b/src/host/layer23/include/osmocom/bb/common/osmocom_data.h @@ -76,6 +76,7 @@ enum osmobb_l1ctl_sig { S_L1CTL_CCCH_MODE_CONF, S_L1CTL_TCH_MODE_CONF, S_L1CTL_LOSS_IND, + S_L1CTL_NEIGH_PM_IND, }; enum osmobb_global_sig { @@ -104,4 +105,10 @@ struct osmobb_tch_mode_conf { uint8_t tch_mode; }; +struct osmobb_neigh_pm_ind { + struct osmocom_ms *ms; + uint16_t band_arfcn; + uint8_t rx_lev; +}; + #endif diff --git a/src/host/layer23/src/common/l1ctl.c b/src/host/layer23/src/common/l1ctl.c index 867f5c5..bd7c67e 100644 --- a/src/host/layer23/src/common/l1ctl.c +++ b/src/host/layer23/src/common/l1ctl.c @@ -732,6 +732,45 @@ static int rx_l1_tch_mode_conf(struct osmocom_ms *ms, struct msgb *msg) return 0; } +/* Transmit L1CTL_NEIGH_PM_REQ */ +int l1ctl_tx_neigh_pm_req(struct osmocom_ms *ms, int num, uint16_t *arfcn) +{ + struct msgb *msg; + struct l1ctl_neigh_pm_req *pm_req; + int i; + + msg = osmo_l1_alloc(L1CTL_NEIGH_PM_REQ); + if (!msg) + return -1; + + LOGP(DL1C, LOGL_INFO, "Tx NEIGH PM Req (num %u)\n", num); + pm_req = (struct l1ctl_neigh_pm_req *) msgb_put(msg, sizeof(*pm_req)); + pm_req->n = num; + for (i = 0; i < num; i++) + pm_req->band_arfcn[i] = htons(*arfcn++); + + return osmo_send_l1(ms, msg); +} + +/* Receive L1CTL_NEIGH_PM_IND */ +static int rx_l1_neigh_pm_ind(struct osmocom_ms *ms, struct msgb *msg) +{ + struct l1ctl_neigh_pm_ind *pm_ind; + + for (pm_ind = (struct l1ctl_neigh_pm_ind *) msg->l1h; + (uint8_t *) pm_ind < msg->tail; pm_ind++) { + struct osmobb_neigh_pm_ind mi; + DEBUGP(DL1C, "NEIGH_PM IND: ARFCN: %4u RxLev: %3d %3d\n", + ntohs(pm_ind->band_arfcn), pm_ind->pm[0], + pm_ind->pm[1]); + mi.band_arfcn = ntohs(pm_ind->band_arfcn); + mi.rx_lev = pm_ind->pm[0]; + mi.ms = ms; + osmo_signal_dispatch(SS_L1CTL, S_L1CTL_NEIGH_PM_IND, &mi); + } + return 0; +} + /* Receive incoming data from L1 using L1CTL format */ int l1ctl_recv(struct osmocom_ms *ms, struct msgb *msg) { @@ -788,6 +827,10 @@ int l1ctl_recv(struct osmocom_ms *ms, struct msgb *msg) case L1CTL_SIM_CONF: rc = rx_l1_sim_conf(ms, msg); break; + case L1CTL_NEIGH_PM_IND: + rc = rx_l1_neigh_pm_ind(ms, msg); + msgb_free(msg); + break; default: LOGP(DL1C, LOGL_ERROR, "Unknown MSG: %u\n", l1h->msg_type); msgb_free(msg); -- 2.20.1