/* send first ctrl message and start timer */ static void trx_ctrl_timer_cb(void *data) { struct trx_l1h *l1h = data; LOGP(DTRX, LOGL_NOTICE, "No response from transceiver for trx=%d\n", l1h->trx->nr); trx_ctrl_send(l1h); }
int mgcp_analyze_header(struct mgcp_config *cfg, struct msgb *msg, struct mgcp_msg_ptr *ptr, int size, const char **transaction_id, struct mgcp_endpoint **endp) { int found; *transaction_id = "000000"; if (size < 3) { LOGP(DMGCP, LOGL_ERROR, "Not enough space in ptr\n"); return -1; } found = find_msg_pointers(msg, ptr, size); if (found <= 3) { LOGP(DMGCP, LOGL_ERROR, "Gateway: Not enough params. Found: %d\n", found); return -1; } /* * replace the space with \0. the main method gurantess that * we still have + 1 for null termination */ msg->l3h[ptr[3].start + ptr[3].length + 1] = '\0'; msg->l3h[ptr[2].start + ptr[2].length + 1] = '\0'; msg->l3h[ptr[1].start + ptr[1].length + 1] = '\0'; msg->l3h[ptr[0].start + ptr[0].length + 1] = '\0'; if (strncmp("1.0", (const char *)&msg->l3h[ptr[3].start], 3) != 0 || strncmp("MGCP", (const char *)&msg->l3h[ptr[2].start], 4) != 0) { LOGP(DMGCP, LOGL_ERROR, "Wrong MGCP version. Not handling: '%s' '%s'\n", (const char *)&msg->l3h[ptr[3].start], (const char *)&msg->l3h[ptr[2].start]); return -1; } *transaction_id = (const char *)&msg->l3h[ptr[0].start]; if (endp) { *endp = find_endpoint(cfg, (const char *)&msg->l3h[ptr[1].start]); return *endp == NULL; } return 0; }
static int bind_rtp(struct mgcp_config *cfg, struct mgcp_rtp_end *rtp_end, int endpno) { if (create_bind(cfg->source_addr, &rtp_end->rtp, rtp_end->local_port) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to create RTP port: %s:%d on 0x%x\n", cfg->source_addr, rtp_end->local_port, endpno); goto cleanup0; } if (create_bind(cfg->source_addr, &rtp_end->rtcp, rtp_end->local_port + 1) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to create RTCP port: %s:%d on 0x%x\n", cfg->source_addr, rtp_end->local_port + 1, endpno); goto cleanup1; } set_ip_tos(rtp_end->rtp.fd, cfg->endp_dscp); set_ip_tos(rtp_end->rtcp.fd, cfg->endp_dscp); rtp_end->rtp.when = BSC_FD_READ; if (osmo_fd_register(&rtp_end->rtp) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to register RTP port %d on 0x%x\n", rtp_end->local_port, endpno); goto cleanup2; } rtp_end->rtcp.when = BSC_FD_READ; if (osmo_fd_register(&rtp_end->rtcp) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to register RTCP port %d on 0x%x\n", rtp_end->local_port + 1, endpno); goto cleanup3; } return 0; cleanup3: osmo_fd_unregister(&rtp_end->rtp); cleanup2: close(rtp_end->rtcp.fd); rtp_end->rtcp.fd = -1; cleanup1: close(rtp_end->rtp.fd); rtp_end->rtp.fd = -1; cleanup0: return -1; }
/* we will need to stop the paging request */ static int handle_page_resp(struct gsm_subscriber_connection *conn, struct msgb *msg) { uint8_t mi_type; char mi_string[GSM48_MI_SIZE]; struct gsm48_hdr *gh; struct gsm48_pag_resp *resp; struct gsm_subscriber *subscr; if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*resp)) { LOGP(DMSC, LOGL_ERROR, "PagingResponse too small: %u\n", msgb_l3len(msg)); return -1; } gh = msgb_l3(msg); resp = (struct gsm48_pag_resp *) &gh->data[0]; gsm48_paging_extract_mi(resp, msgb_l3len(msg) - sizeof(*gh), mi_string, &mi_type); DEBUGP(DRR, "PAGING RESPONSE: mi_type=0x%02x MI(%s)\n", mi_type, mi_string); switch (mi_type) { case GSM_MI_TYPE_TMSI: subscr = subscr_active_by_tmsi(conn->bts->network, tmsi_from_string(mi_string)); break; case GSM_MI_TYPE_IMSI: subscr = subscr_active_by_imsi(conn->bts->network, mi_string); break; default: subscr = NULL; break; } if (!subscr) { LOGP(DMSC, LOGL_ERROR, "Non active subscriber got paged.\n"); return -1; } paging_request_stop(conn->bts, subscr, conn, msg); subscr_put(subscr); return 0; }
/* Confirmation of an GTP ECHO request */ static int echo_conf(struct pdp_t *pdp, void *cbp, int recovery) { if (recovery < 0) { LOGP(DGPRS, LOGL_NOTICE, "GTP Echo Request timed out\n"); /* FIXME: if version == 1, retry with version 0 */ } else { DEBUGP(DGPRS, "GTP Rx Echo Response\n"); } return 0; }
void BasicDebug::debug( double init_value ) { if (init_value >= 0.0) { SEQUENCE = init_value; } #ifdef DEBUG_TO_LOG LOGP(TO_STRING(SEQUENCE++)); #else std::cout << SEQUENCE++ << std::endl; #endif }
static int forward_ussd(struct sccp_connections *con, const struct ussd_request *req, struct msgb *input) { struct msgb *msg, *copy; struct ipac_msgt_sccp_state *state; struct bsc_nat_ussd_con *ussd; if (!con->bsc->nat->ussd_con) return -1; msg = msgb_alloc_headroom(4096, 128, "forward ussd"); if (!msg) { LOGP(DNAT, LOGL_ERROR, "Allocation failed, not forwarding.\n"); return -1; } copy = msgb_alloc_headroom(4096, 128, "forward bts"); if (!copy) { LOGP(DNAT, LOGL_ERROR, "Allocation failed, not forwarding.\n"); msgb_free(msg); return -1; } copy->l2h = msgb_put(copy, msgb_l2len(input)); memcpy(copy->l2h, input->l2h, msgb_l2len(input)); msg->l2h = msgb_put(msg, 1); msg->l2h[0] = IPAC_MSGT_SCCP_OLD; /* fill out the data */ state = (struct ipac_msgt_sccp_state *) msgb_put(msg, sizeof(*state)); state->trans_id = req->transaction_id; state->invoke_id = req->invoke_id; memcpy(&state->src_ref, &con->remote_ref, sizeof(con->remote_ref)); memcpy(&state->dst_ref, &con->real_ref, sizeof(con->real_ref)); memcpy(state->imsi, con->imsi, strlen(con->imsi)); ussd = con->bsc->nat->ussd_con; bsc_do_write(&ussd->queue, msg, IPAC_PROTO_IPACCESS); bsc_do_write(&ussd->queue, copy, IPAC_PROTO_SCCP); return 0; }
static void handle_chan_nack(struct gsm_subscriber_connection *conn, struct bsc_api *api, struct gsm_lchan *lchan) { if (conn->secondary_lchan != lchan) return; LOGP(DMSC, LOGL_ERROR, "Channel activation failed. Waiting for timeout now\n"); conn->secondary_lchan->conn = NULL; conn->secondary_lchan = NULL; }
/* called for the master (listening) socket of the instance, allocates a new client */ static int l1ctl_sock_accept_cb(struct osmo_fd *ofd, unsigned int what) { struct l1ctl_sock_inst *lsi = ofd->data; struct l1ctl_sock_client *lsc; int fd, rc; fd = accept(ofd->fd, NULL, NULL); if (fd < 0) { LOGP(DL1C, LOGL_ERROR, "Failed to accept connection to l2.\n"); return -1; } lsc = talloc_zero(lsi, struct l1ctl_sock_client); if (!lsc) { close(fd); LOGP(DL1C, LOGL_ERROR, "Failed to allocate L1CTL client\n"); return -1; } lsc->l1ctl_sock = lsi; lsc->ofd.fd = fd; lsc->ofd.when = BSC_FD_READ; lsc->ofd.cb = l1ctl_sock_data_cb; lsc->ofd.data = lsc; if (lsi->accept_cb) { rc = lsi->accept_cb(lsc); if (rc < 0) { talloc_free(lsc); close(fd); return rc; } } LOGP(DL1C, LOGL_INFO, "Accepted client (fd=%u) from server (fd=%u)\n", fd, ofd->fd); if (osmo_fd_register(&lsc->ofd) != 0) { LOGP(DL1C, LOGL_ERROR, "Failed to register the l2 connection fd.\n"); talloc_free(lsc); return -1; } llist_add_tail(&lsc->list, &lsi->clients); return 0; }
int paging_si_update(struct paging_state *ps, struct gsm48_control_channel_descr *chan_desc) { LOGP(DPAG, LOGL_INFO, "Paging SI update\n"); ps->chan_desc = *chan_desc; /* FIXME: do we need to re-sort the old paging_records? */ return 0; }
static int gsm411_rl_report_req(struct gsm411_smr_inst *inst, struct msgb *msg) { LOGP(DLSMS, LOGL_DEBUG, SMR_LOG_STR "TX SMS REPORT\n", inst->id); new_rp_state(inst, GSM411_RPS_IDLE); inst->mn_send(inst, GSM411_MNSMS_DATA_REQ, msg); gsm411_send_release(inst); return 0; }
/* 9.1.18 IMMEDIATE ASSIGNMENT is received */ static int imm_ass(struct osmocom_ms *ms, struct msgb *msg) { struct gsm48_imm_ass *ia = msgb_l3(msg); LOGP(DRR, LOGL_INFO, "IMMEDIATE ASSIGNMENT:\n"); if (state != SCAN_STATE_RACH) { LOGP(DRR, LOGL_INFO, "Not for us, no request.\n"); return 0; } /* request ref */ if (match_ra(ms, &ia->req_ref)) { return ta_result(ia->timing_advance); } LOGP(DRR, LOGL_INFO, "Request, but not for us.\n"); return 0; }
static int rcv_cch(struct osmocom_ms *ms, struct msgb *msg) { struct abis_rsl_cchan_hdr *ch = msgb_l2(msg); int msg_type = ch->c.msg_type; int rc; LOGP(DRSL, LOGL_INFO, "Received '%s' from layer1\n", rsl_msg_name(msg_type)); if (state == SCAN_STATE_RACH && msg_type == RSL_MT_CHAN_CONF) { rc = chan_conf(ms, msg); msgb_free(msg); return rc; } LOGP(DRSL, LOGL_NOTICE, "RSLms message unhandled\n"); msgb_free(msg); return 0; }
static int rsl_rll_error(uint8_t cause, struct lapdm_msg_ctx *mctx) { struct msgb *msg; LOGP(DLLAPD, LOGL_NOTICE, "sending MDL-ERROR-IND %d\n", cause); msg = rsl_rll_simple(RSL_MT_ERROR_IND, mctx->chan_nr, mctx->link_id, 1); msg->l2h = msgb_put(msg, sizeof(struct abis_rsl_rll_hdr)); msgb_tlv_put(msg, RSL_IE_RLM_CAUSE, 1, &cause); return rslms_sendmsg(msg, mctx->dl->entity); }
void BasicDebug::debug( const std::string& message, double init_value ) { if (init_value >= 0.0) { SEQUENCE = init_value; } #ifdef DEBUG_TO_LOG LOGP(TO_STRING(SEQUENCE++) + " : " + message); #else std::cout << SEQUENCE++ << " : " << message << std::endl; #endif }
static int gsm411_mnsms_error_ind_tx(struct gsm411_smr_inst *inst, struct msgb *msg) { LOGP(DLSMS, LOGL_DEBUG, SMR_LOG_STR "TX SMS MNSMS-ERROR-IND\n", inst->id); new_rp_state(inst, GSM411_RPS_IDLE); inst->rl_recv(inst, GSM411_SM_RL_REPORT_IND, msg); gsm411_send_release(inst); return 0; }
static int gsm411_mmsms_est_cnf(struct gsm411_smc_inst *inst, struct msgb *msg) { if (!inst->cp_msg) { LOGP(DLSMS, LOGL_FATAL, "EST CNF, but we have no cp_msg. This " "should never happen, please fix!\n"); return -EINVAL; } return gsm411_mmsms_send_msg(inst); }
/*! \brief Initialize telnet based VTY interface * \param[in] tall_ctx \ref talloc context * \param[in] priv private data to be passed to callback * \param[in] port UDP port number */ int telnet_init(void *tall_ctx, void *priv, int port) { struct sockaddr_in sock_addr; int fd, rc, on = 1; tall_telnet_ctx = talloc_named_const(tall_ctx, 1, "telnet_connection"); /* FIXME: use new socket.c code of libosmocore */ fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (fd < 0) { LOGP(0, LOGL_ERROR, "Telnet interface socket creation failed\n"); return fd; } setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); memset(&sock_addr, 0, sizeof(sock_addr)); sock_addr.sin_family = AF_INET; sock_addr.sin_port = htons(port); sock_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); rc = bind(fd, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); if (rc < 0) { LOGP(0, LOGL_ERROR, "Telnet interface failed to bind\n"); close(fd); return rc; } rc = listen(fd, 0); if (rc < 0) { LOGP(0, LOGL_ERROR, "Telnet interface failed to listen\n"); close(fd); return rc; } server_socket.data = priv; server_socket.fd = fd; osmo_fd_register(&server_socket); return 0; }
static int gsm411_rl_data_req(struct gsm411_smr_inst *inst, struct msgb *msg) { LOGP(DLSMS, LOGL_DEBUG, SMR_LOG_STR "TX SMS RP-DATA\n", inst->id); /* start TR1N and enter 'wait for RP-ACK state' */ osmo_timer_schedule(&inst->rp_timer, GSM411_TMR_TR1M); new_rp_state(inst, GSM411_RPS_WAIT_FOR_RP_ACK); return inst->mn_send(inst, GSM411_MNSMS_EST_REQ, msg); }
static int ussd_read_cb(struct osmo_fd *bfd) { struct bsc_nat_ussd_con *conn = bfd->data; struct msgb *msg; struct ipaccess_head *hh; int ret; ret = ipa_msg_recv(bfd->fd, &msg); if (ret <= 0) { LOGP(DNAT, LOGL_ERROR, "USSD Connection was lost.\n"); bsc_nat_ussd_destroy(conn); return -1; } LOGP(DNAT, LOGL_NOTICE, "MSG from USSD: %s proto: %d\n", osmo_hexdump(msg->data, msg->len), msg->l2h[0]); hh = (struct ipaccess_head *) msg->data; if (hh->proto == IPAC_PROTO_IPACCESS) { if (msg->l2h[0] == IPAC_MSGT_ID_RESP) { struct tlv_parsed tvp; int ret; ret = ipaccess_idtag_parse(&tvp, (unsigned char *) msg->l2h + 2, msgb_l2len(msg) - 2); if (ret < 0) { LOGP(DNAT, LOGL_ERROR, "ignoring IPA response " "message with malformed TLVs\n"); return ret; } if (TLVP_PRESENT(&tvp, IPAC_IDTAG_UNITNAME)) ussd_auth_con(&tvp, conn); } msgb_free(msg); } else if (hh->proto == IPAC_PROTO_SCCP) { forward_sccp(conn->nat, msg); } else { msgb_free(msg); } return 0; }
int sgsn_gtp_init(struct sgsn_instance *sgi) { int rc; struct gsn_t *gsn; rc = gtp_new(&sgi->gsn, sgi->cfg.gtp_statedir, &sgi->cfg.gtp_listenaddr.sin_addr, GTP_MODE_SGSN); if (rc) { LOGP(DGPRS, LOGL_ERROR, "Failed to create GTP: %d\n", rc); return rc; } gsn = sgi->gsn; sgi->gtp_fd0.fd = gsn->fd0; sgi->gtp_fd0.priv_nr = 0; sgi->gtp_fd0.data = sgi; sgi->gtp_fd0.when = BSC_FD_READ; sgi->gtp_fd0.cb = sgsn_gtp_fd_cb; rc = osmo_fd_register(&sgi->gtp_fd0); if (rc < 0) return rc; sgi->gtp_fd1c.fd = gsn->fd1c; sgi->gtp_fd1c.priv_nr = 1; sgi->gtp_fd1c.data = sgi; sgi->gtp_fd1c.when = BSC_FD_READ; sgi->gtp_fd1c.cb = sgsn_gtp_fd_cb; osmo_fd_register(&sgi->gtp_fd1c); if (rc < 0) return rc; sgi->gtp_fd1u.fd = gsn->fd1u; sgi->gtp_fd1u.priv_nr = 2; sgi->gtp_fd1u.data = sgi; sgi->gtp_fd1u.when = BSC_FD_READ; sgi->gtp_fd1u.cb = sgsn_gtp_fd_cb; osmo_fd_register(&sgi->gtp_fd1u); if (rc < 0) return rc; /* Start GTP re-transmission timer */ sgi->gtp_timer.cb = sgsn_gtp_tmr_cb; sgi->gtp_timer.data = sgi; sgsn_gtp_tmr_start(sgi); /* Register callbackcs with libgtp */ gtp_set_cb_delete_context(gsn, cb_delete_context); gtp_set_cb_conf(gsn, cb_conf); gtp_set_cb_recovery(gsn, cb_recovery); gtp_set_cb_data_ind(gsn, cb_data_ind); gtp_set_cb_unsup_ind(gsn, cb_unsup_ind); gtp_set_cb_extheader_ind(gsn, cb_extheader_ind); return 0; }
static int encode_audio(struct mgcp_process_rtp_state *state, uint8_t *dst, size_t buf_size, size_t max_samples) { int nbytes = 0; size_t nsamples = 0; /* Encode samples into dst */ while (nsamples + state->dst_samples_per_frame <= max_samples) { if (nbytes + state->dst_frame_size > buf_size) { if (nbytes > 0) break; /* Not even one frame fits into the buffer */ LOGP(DMGCP, LOGL_INFO, "Encoding (RTP) buffer too small: %d > %d.\n", nbytes + state->dst_frame_size, buf_size); return -ENOSPC; } switch (state->dst_fmt) { case AF_GSM: gsm_encode(state->dst.gsm_handle, state->samples + state->sample_offs, dst); break; #ifdef HAVE_BCG729 case AF_G729: bcg729Encoder(state->dst.g729_enc, state->samples + state->sample_offs, dst); break; #endif case AF_PCMU: ulaw_encode(state->samples + state->sample_offs, dst, state->src_samples_per_frame); break; case AF_PCMA: alaw_encode(state->samples + state->sample_offs, dst, state->src_samples_per_frame); break; case AF_S16: memmove(dst, state->samples + state->sample_offs, state->dst_frame_size); break; case AF_L16: l16_encode(state->samples + state->sample_offs, dst, state->src_samples_per_frame); break; default: break; } dst += state->dst_frame_size; nbytes += state->dst_frame_size; state->sample_offs += state->dst_samples_per_frame; nsamples += state->dst_samples_per_frame; } state->sample_cnt -= nsamples; return nbytes; }
/* callback when there's something to read from the l1 msg_queue */ static int l1if_fd_cb(struct osmo_fd *ofd, unsigned int what) { //struct msgb *msg = l1p_msgb_alloc(); struct msgb *msg = msgb_alloc_headroom(sizeof(SuperFemto_Prim_t) + 128, 128, "1l_fd"); struct femtol1_hdl *fl1h = ofd->data; int rc; msg->l1h = msg->data; rc = read(ofd->fd, msg->l1h, msgb_tailroom(msg)); if (rc < 0) { if (rc != -1) LOGP(DL1IF, LOGL_ERROR, "error reading from L1 msg_queue: %s\n", strerror(errno)); msgb_free(msg); return rc; } msgb_put(msg, rc); switch (ofd->priv_nr) { case MQ_SYS_WRITE: if (rc != sizeof(SuperFemto_Prim_t)) LOGP(DL1IF, LOGL_NOTICE, "%u != " "sizeof(SuperFemto_Prim_t)\n", rc); return l1if_handle_sysprim(fl1h, msg); case MQ_L1_WRITE: #ifndef HW_SYSMOBTS_V1 case MQ_TCH_WRITE: case MQ_PDTCH_WRITE: #endif if (rc != sizeof(GsmL1_Prim_t)) LOGP(DL1IF, LOGL_NOTICE, "%u != " "sizeof(GsmL1_Prim_t)\n", rc); return l1if_handle_l1prim(ofd->priv_nr, fl1h, msg); default: /* The compiler can't know that priv_nr is an enum. Assist. */ LOGP(DL1IF, LOGL_FATAL, "writing on a wrong queue: %d\n", ofd->priv_nr); exit(0); break; } };
int mtp_handle_pcap(struct mtp_link *link, int dir, const uint8_t *data, int len) { if (link->pcap_fd >= 0) mtp_pcap_write_msu(link->pcap_fd, data, len); if (link->set->pcap_fd >= 0) mtp_pcap_write_msu(link->set->pcap_fd, data, len); /* This might be too expensive? */ LOGP(DPCAP, LOGL_DEBUG, "Packet: %s\n", osmo_hexdump(data, len)); return 0; }
/* Give RSSI report */ int gprs_rlcmac_rssi_rep(struct gprs_rlcmac_tbf *tbf) { /* No measurement values */ if (!tbf->meas.rssi_num) return -EINVAL; LOGP(DRLCMACMEAS, LOGL_INFO, "UL RSSI of TLLI=0x%08x: %d dBm\n", tbf->tlli, tbf->meas.rssi_sum / tbf->meas.rssi_num); return 0; }
uint8_t init_rcmd(uint8_t priority) { uint8_t num_tasks = 0; LOG("init: prio "); LOGP("%u\r\n", priority); rpc_init_endpoint(&rcmd_endpoint); ASSERT(num_tasks == NUM_TASKS_RCMD); return num_tasks; }
static void send_response(node_id_t origin, node_id_t src, uint8_t seq, uint8_t attempt) { int8_t rc; LOG("response to origin: seq "); LOGP("%u", seq); LOGA(" via "); LOGP("%u ", src); LOGA(" attempt "); LOGP("%u\r\n", attempt); init_pkt(&tx_pkt); tx_pkt.type = PKT_TYPE_DISCOVER_RESPONSE; tx_pkt.dest = src; tx_pkt.payload[PKT_RESPONSE_ORIGIN_OFFSET] = origin; tx_pkt.len += PKT_RESPONSE_ORIGIN_LEN; tx_pkt.payload[PKT_RESPONSE_SEQ_OFFSET] = seq; tx_pkt.len += PKT_RESPONSE_SEQ_LEN; rc = send_pkt(&tx_pkt, TX_FLAG_NONE, NULL); if (rc != NRK_OK) LOG("WARN: failed to send discover req\r\n"); }
static int verify_call_id(const struct mgcp_endpoint *endp, const char *callid) { if (strcmp(endp->callid, callid) != 0) { LOGP(DMGCP, LOGL_ERROR, "CallIDs does not match on 0x%x. '%s' != '%s'\n", ENDPOINT_NUMBER(endp), endp->callid, callid); return -1; } return 0; }
static int gsm411_send_abort(struct gsm411_smr_inst *inst) { struct msgb *msg = gsm411_msgb_alloc(); LOGP(DLSMS, LOGL_DEBUG, SMR_LOG_STR "TX: MNSMS-ABORT-REQ\n", inst->id); msgb_tv_put(msg, 1, 111); //FIXME: better idea ? */ return inst->mn_send(inst, GSM411_MNSMS_ABORT_REQ, msg); }
static void swd_loop_run(void *_data) { int rc; struct oc2gbts_mgr_instance *mgr = _data; LOGP(DSWD, LOGL_INFO, "Going to check for watchdog notification.\n"); rc = swd_run(mgr, 1); if (rc != 0) { swd_state_reset(mgr, SWD_FAIL_START); } }