/* received Measurement Report */ int gprs_rlcmac_meas_rep(Packet_Measurement_Report_t *pmr) { NC_Measurement_Report_t *ncr; NC_Measurements_t *nc; int i; LOGP(DRLCMACMEAS, LOGL_INFO, "Measuement Report of TLLI=0x%08x:", pmr->TLLI); switch (pmr->UnionType) { case 0: ncr = &pmr->u.NC_Measurement_Report; LOGPC(DRLCMACMEAS, LOGL_INFO, " NC%u Serv %d dbm", ncr->NC_MODE + 1, ncr->Serving_Cell_Data.RXLEV_SERVING_CELL - 110); for (i = 0; i < ncr->NUMBER_OF_NC_MEASUREMENTS; i++) { nc = &ncr->NC_Measurements[i]; LOGPC(DRLCMACMEAS, LOGL_DEBUG, ", Neigh %u %d dbm", nc->FREQUENCY_N, nc->RXLEV_N - 110); } LOGPC(DRLCMACMEAS, LOGL_INFO, "\n"); break; case 1: LOGPC(DRLCMACMEAS, LOGL_INFO, " <EXT Reporting not supported!>\n"); break; } return 0; }
/* attempt to do a handover */ static int attempt_handover(struct gsm_meas_rep *mr) { struct gsm_network *net = mr->lchan->ts->trx->bts->network; struct neigh_meas_proc *best_cell = NULL; unsigned int best_better_db = 0; int i, rc; /* find the best cell in this report that is at least RXLEV_HYST * better than the current serving cell */ for (i = 0; i < ARRAY_SIZE(mr->lchan->neigh_meas); i++) { struct neigh_meas_proc *nmp = &mr->lchan->neigh_meas[i]; int avg, better; /* skip empty slots */ if (nmp->arfcn == 0) continue; /* caculate average rxlev for this cell over the window */ avg = neigh_meas_avg(nmp, net->handover.win_rxlev_avg_neigh); /* check if hysteresis is fulfilled */ if (avg < mr->dl.full.rx_lev + net->handover.pwr_hysteresis) continue; better = avg - mr->dl.full.rx_lev; if (better > best_better_db) { best_cell = nmp; best_better_db = better; } } if (!best_cell) return 0; LOGP(DHO, LOGL_INFO, "%s: Cell on ARFCN %u is better: ", gsm_ts_name(mr->lchan->ts), best_cell->arfcn); if (!net->handover.active) { LOGPC(DHO, LOGL_INFO, "Skipping, Handover disabled\n"); return 0; } rc = handover_to_arfcn_bsic(mr->lchan, best_cell->arfcn, best_cell->bsic); switch (rc) { case 0: LOGPC(DHO, LOGL_INFO, "Starting handover\n"); break; case -ENOSPC: LOGPC(DHO, LOGL_INFO, "No channel available\n"); break; case -EBUSY: LOGPC(DHO, LOGL_INFO, "Handover already active\n"); break; default: LOGPC(DHO, LOGL_ERROR, "Unknown error\n"); } return rc; }
void amr_log_mr_conf(int ss, int logl, const char *pfx, struct amr_multirate_conf *amr_mrc) { int i; LOGP(ss, logl, "%s AMR MR Conf: num_modes=%u", pfx, amr_mrc->num_modes); for (i = 0; i < amr_mrc->num_modes; i++) LOGPC(ss, logl, ", mode[%u] = %u/%u/%u", i, amr_mrc->bts_mode[i].mode, amr_mrc->bts_mode[i].threshold, amr_mrc->bts_mode[i].hysteresis); LOGPC(ss, logl, "\n"); }
/* second common part of RADIO-STATUS */ static int common_tx_radio_status2(struct msgb *msg, uint8_t cause) { msgb_tvlv_put(msg, BSSGP_IE_CAUSE, 1, &cause); LOGPC(DBSSGP, LOGL_NOTICE, "CAUSE=%u\n", cause); return gprs_ns_sendmsg(bssgp_nsi, msg); }
static int rtp_data_net(struct osmo_fd *fd, unsigned int what) { char buf[4096]; struct sockaddr_in addr; struct mgcp_endpoint *endp; int rc, proto; endp = (struct mgcp_endpoint *) fd->data; rc = receive_from(endp, fd->fd, &addr, buf, sizeof(buf)); if (rc <= 0) return -1; if (memcmp(&addr.sin_addr, &endp->net_end.addr, sizeof(addr.sin_addr)) != 0) { LOGP(DMGCP, LOGL_ERROR, "Endpoint 0x%x data from wrong address %s vs. ", ENDPOINT_NUMBER(endp), inet_ntoa(addr.sin_addr)); LOGPC(DMGCP, LOGL_ERROR, "%s\n", inet_ntoa(endp->net_end.addr)); return -1; } if (endp->net_end.rtp_port != addr.sin_port && endp->net_end.rtcp_port != addr.sin_port) { LOGP(DMGCP, LOGL_ERROR, "Data from wrong source port %d on 0x%x\n", ntohs(addr.sin_port), ENDPOINT_NUMBER(endp)); return -1; } /* throw away the dummy message */ if (rc == 1 && buf[0] == DUMMY_LOAD) { LOGP(DMGCP, LOGL_NOTICE, "Filtered dummy from network on 0x%x\n", ENDPOINT_NUMBER(endp)); return 0; } proto = fd == &endp->net_end.rtp ? PROTO_RTP : PROTO_RTCP; endp->net_end.packets += 1; endp->net_end.octets += rc; forward_data(fd->fd, &endp->taps[MGCP_TAP_NET_IN], buf, rc); switch (endp->type) { case MGCP_RTP_DEFAULT: return send_to(endp, DEST_BTS, proto == PROTO_RTP, &addr, buf, rc); case MGCP_RTP_TRANSCODED: return send_transcoder(&endp->trans_net, endp->cfg, proto == PROTO_RTP, buf, rc); } LOGP(DMGCP, LOGL_ERROR, "Bad MGCP type %u on endpoint %u\n", endp->type, ENDPOINT_NUMBER(endp)); return 0; }
/*! \brief Transmit RADIO-STATUS for TLLI (10.3.5) */ int bssgp_tx_radio_status_tlli(struct bssgp_bvc_ctx *bctx, uint8_t cause, uint32_t tlli) { struct msgb *msg = common_tx_radio_status(bctx); if (!msg) return -ENOMEM; bssgp_msgb_tlli_put(msg, tlli); LOGPC(DBSSGP, LOGL_NOTICE, "TLLI=0x%08x ", tlli); return common_tx_radio_status2(msg, cause); }
/*! \brief Transmit RADIO-STATUS for TMSI (10.3.5) */ int bssgp_tx_radio_status_tmsi(struct bssgp_bvc_ctx *bctx, uint8_t cause, uint32_t tmsi) { struct msgb *msg = common_tx_radio_status(bctx); uint32_t _tmsi = htonl(tmsi); if (!msg) return -ENOMEM; msgb_tvlv_put(msg, BSSGP_IE_TMSI, 4, (uint8_t *)&_tmsi); LOGPC(DBSSGP, LOGL_NOTICE, "TMSI=0x%08x ", tmsi); return common_tx_radio_status2(msg, cause); }
/* Chapter 12.15 */ static int get_clock_sync_compl_cb(struct octphy_hdl *fl1, struct msgb *resp, void *data) { tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_INFO_RSP *cir = (tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_INFO_RSP *) resp->l2h; mOCTVC1_HW_MSG_CLOCK_SYNC_MGR_INFO_RSP_SWAP(cir); LOGP(DL1C, LOGL_INFO, "CLOCK-SYNC-MGR-INFO.resp Reference=%s ", get_value_string(clocksync_source_vals, cir->ulClkSourceRef)); LOGPC(DL1C, LOGL_INFO, "Selection=%s)\n", get_value_string(clocksync_sel_vals, cir->ulClkSourceSelection)); msgb_free(resp); return 0; }
/*! \brief Transmit RADIO-STATUS for IMSI (10.3.5) */ int bssgp_tx_radio_status_imsi(struct bssgp_bvc_ctx *bctx, uint8_t cause, const char *imsi) { struct msgb *msg = common_tx_radio_status(bctx); uint8_t mi[10]; int imsi_len = gsm48_generate_mid_from_imsi(mi, imsi); if (!msg) return -ENOMEM; /* strip the MI type and length values (2 bytes) */ if (imsi_len > 2) msgb_tvlv_put(msg, BSSGP_IE_IMSI, imsi_len-2, mi+2); LOGPC(DBSSGP, LOGL_NOTICE, "IMSI=%s ", imsi); return common_tx_radio_status2(msg, cause); }
void gprs_gb_log_parse_context(int log_level, struct gprs_gb_parse_context *parse_ctx, const char *default_msg_name) { const char *msg_name; const char *sep = ""; if (!parse_ctx->tlli_enc && !parse_ctx->ptmsi_enc && !parse_ctx->new_ptmsi_enc && !parse_ctx->bssgp_ptmsi_enc && !parse_ctx->imsi) return; msg_name = gprs_gb_message_name(parse_ctx, default_msg_name); if (parse_ctx->llc_msg_name) msg_name = parse_ctx->llc_msg_name; LOGP(DGPRS, log_level, "%s: Got", msg_name); if (parse_ctx->tlli_enc) { LOGPC(DGPRS, log_level, "%s TLLI %08x", sep, parse_ctx->tlli); sep = ","; } if (parse_ctx->old_tlli_enc) { LOGPC(DGPRS, log_level, "%s old TLLI %02x%02x%02x%02x", sep, parse_ctx->old_tlli_enc[0], parse_ctx->old_tlli_enc[1], parse_ctx->old_tlli_enc[2], parse_ctx->old_tlli_enc[3]); sep = ","; } if (parse_ctx->bssgp_raid_enc) { struct gprs_ra_id raid; gsm48_parse_ra(&raid, parse_ctx->bssgp_raid_enc); LOGPC(DGPRS, log_level, "%s BSSGP RAID %u-%u-%u-%u", sep, raid.mcc, raid.mnc, raid.lac, raid.rac); sep = ","; } if (parse_ctx->raid_enc) { struct gprs_ra_id raid; gsm48_parse_ra(&raid, parse_ctx->raid_enc); LOGPC(DGPRS, log_level, "%s RAID %u-%u-%u-%u", sep, raid.mcc, raid.mnc, raid.lac, raid.rac); sep = ","; } if (parse_ctx->old_raid_enc) { struct gprs_ra_id raid; gsm48_parse_ra(&raid, parse_ctx->old_raid_enc); LOGPC(DGPRS, log_level, "%s old RAID %u-%u-%u-%u", sep, raid.mcc, raid.mnc, raid.lac, raid.rac); sep = ","; } if (parse_ctx->bssgp_ptmsi_enc) { uint32_t ptmsi = GSM_RESERVED_TMSI; gprs_parse_tmsi(parse_ctx->bssgp_ptmsi_enc, &ptmsi); LOGPC(DGPRS, log_level, "%s BSSGP PTMSI %08x", sep, ptmsi); sep = ","; } if (parse_ctx->ptmsi_enc) { uint32_t ptmsi = GSM_RESERVED_TMSI; gprs_parse_tmsi(parse_ctx->ptmsi_enc, &ptmsi); LOGPC(DGPRS, log_level, "%s PTMSI %08x", sep, ptmsi); sep = ","; } if (parse_ctx->new_ptmsi_enc) { uint32_t new_ptmsi = GSM_RESERVED_TMSI; gprs_parse_tmsi(parse_ctx->new_ptmsi_enc, &new_ptmsi); LOGPC(DGPRS, log_level, "%s new PTMSI %08x", sep, new_ptmsi); sep = ","; } if (parse_ctx->imsi) { char mi_buf[200]; mi_buf[0] = '\0'; gsm48_mi_to_string(mi_buf, sizeof(mi_buf), parse_ctx->imsi, parse_ctx->imsi_len); LOGPC(DGPRS, log_level, "%s IMSI %s", sep, mi_buf); sep = ","; } if (parse_ctx->invalidate_tlli) { LOGPC(DGPRS, log_level, "%s invalidate", sep); sep = ","; } if (parse_ctx->await_reattach) { LOGPC(DGPRS, log_level, "%s re-attach", sep); sep = ","; } LOGPC(DGPRS, log_level, "\n"); }