/* process an already parsed measurement report and decide if we want to * attempt a handover */ static int process_meas_rep(struct gsm_meas_rep *mr) { struct gsm_network *net = mr->lchan->ts->trx->bts->network; int av_rxlev; /* we currently only do handover for TCH channels */ switch (mr->lchan->type) { case GSM_LCHAN_TCH_F: case GSM_LCHAN_TCH_H: break; default: return 0; } /* parse actual neighbor cell info */ if (mr->num_cell > 0 && mr->num_cell < 7) process_meas_neigh(mr); av_rxlev = get_meas_rep_avg(mr->lchan, MEAS_REP_DL_RXLEV_FULL, net->handover.win_rxlev_avg); /* Interference HO */ if (rxlev2dbm(av_rxlev) > -85 && meas_rep_n_out_of_m_be(mr->lchan, MEAS_REP_DL_RXQUAL_FULL, 3, 4, 5)) return attempt_handover(mr); /* Bad Quality */ if (meas_rep_n_out_of_m_be(mr->lchan, MEAS_REP_DL_RXQUAL_FULL, 3, 4, 5)) return attempt_handover(mr); /* Low Level */ if (rxlev2dbm(av_rxlev) <= -110) return attempt_handover(mr); /* Distance */ if (mr->ms_l1.ta > net->handover.max_distance) return attempt_handover(mr); /* Power Budget AKA Better Cell */ if ((mr->nr % net->handover.pwr_interval) == 0) return attempt_handover(mr); return 0; }
static int _insert_ud(struct meas_db_state *st, unsigned long meas_id, int dtx, int uplink, const struct gsm_meas_rep_unidir *ud) { unsigned long rowid; SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 1, meas_id)); SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 2, rxlev2dbm(ud->full.rx_lev))); SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 3, rxlev2dbm(ud->sub.rx_lev))); SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 4, ud->full.rx_qual)); SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 5, ud->sub.rx_qual)); SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 6, dtx)); SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 7, uplink)); SCK_DONE(st->db, sqlite3_step(st->stmt_ins_ud)); SCK_OK(st->db, sqlite3_reset(st->stmt_ins_ud)); return sqlite3_last_insert_rowid(st->db); err_io: exit(1); }