/* data has arrived on the udp socket */ static int udp_read_cb(struct osmo_fd *ofd) { struct msgb *msg = msgb_alloc_headroom(SYSMOBTS_PRIM_SIZE, 128, "udp_rx"); struct l1fwd_hdl *l1fh = ofd->data; struct femtol1_hdl *fl1h = l1fh->fl1h; int rc; if (!msg) return -ENOMEM; msg->l1h = msg->data; l1fh->remote_sa_len[ofd->priv_nr] = sizeof(l1fh->remote_sa[ofd->priv_nr]); rc = recvfrom(ofd->fd, msg->l1h, msgb_tailroom(msg), 0, (struct sockaddr *) &l1fh->remote_sa[ofd->priv_nr], &l1fh->remote_sa_len[ofd->priv_nr]); if (rc < 0) { perror("read from udp"); msgb_free(msg); return rc; } else if (rc == 0) { perror("len=0 read from udp"); msgb_free(msg); return rc; } msgb_put(msg, rc); DEBUGP(DL1C, "UDP: Received %u bytes for queue %d\n", rc, ofd->priv_nr); /* put the message into the right queue */ rc = osmo_wqueue_enqueue(&fl1h->write_q[ofd->priv_nr], msg); return rc; }
static int pack_and_send(struct esme *esme, uint32_t type, void *ptr) { struct msgb *msg = msgb_alloc(4096, "SMPP_Tx"); int rc, rlen; if (!msg) return -ENOMEM; rc = smpp34_pack(type, msg->tail, msgb_tailroom(msg), &rlen, ptr); if (rc != 0) { LOGP(DSMPP, LOGL_ERROR, "[%s] Error during smpp34_pack(): %s\n", esme->system_id, smpp34_strerror); msgb_free(msg); return -EINVAL; } msgb_put(msg, rlen); return osmo_wqueue_enqueue(&esme->wqueue, msg); }
/* 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; } };
static int pcu_sock_read(struct osmo_fd *bfd) { struct pcu_sock_state *state = (struct pcu_sock_state *)bfd->data; struct gsm_pcu_if *pcu_prim; struct msgb *msg; int rc; msg = msgb_alloc(sizeof(*pcu_prim), "pcu_sock_rx"); if (!msg) return -ENOMEM; pcu_prim = (struct gsm_pcu_if *) msg->tail; rc = recv(bfd->fd, msg->tail, msgb_tailroom(msg), 0); if (rc == 0) goto close; if (rc < 0) { if (errno == EAGAIN) return 0; goto close; } rc = pcu_rx(pcu_prim->msg_type, pcu_prim); /* as we always synchronously process the message in pcu_rx() and * its callbacks, we can free the message here. */ msgb_free(msg); return rc; close: msgb_free(msg); pcu_sock_close(state, 1); return -1; }
/* FIXME: merge with smpp_smsc.c */ static int esme_read_cb(struct osmo_fd *ofd) { struct esme *esme = ofd->data; uint32_t len; uint8_t *lenptr = (uint8_t *) &len; uint8_t *cur; struct msgb *msg; int rdlen; int rc; switch (esme->read_state) { case READ_ST_IN_LEN: rdlen = sizeof(uint32_t) - esme->read_idx; rc = read(ofd->fd, lenptr + esme->read_idx, rdlen); if (rc < 0) { LOGP(DSMPP, LOGL_ERROR, "[%s] read returned %d\n", esme->system_id, rc); } else if (rc == 0) { goto dead_socket; } else esme->read_idx += rc; if (esme->read_idx >= sizeof(uint32_t)) { esme->read_len = ntohl(len); msg = msgb_alloc(esme->read_len, "SMPP Rx"); if (!msg) return -ENOMEM; esme->read_msg = msg; cur = msgb_put(msg, sizeof(uint32_t)); memcpy(cur, lenptr, sizeof(uint32_t)); esme->read_state = READ_ST_IN_MSG; esme->read_idx = sizeof(uint32_t); } break; case READ_ST_IN_MSG: msg = esme->read_msg; rdlen = esme->read_len - esme->read_idx; rc = read(ofd->fd, msg->tail, OSMO_MIN(rdlen, msgb_tailroom(msg))); if (rc < 0) { LOGP(DSMPP, LOGL_ERROR, "[%s] read returned %d\n", esme->system_id, rc); } else if (rc == 0) { goto dead_socket; } else { esme->read_idx += rc; msgb_put(msg, rc); } if (esme->read_idx >= esme->read_len) { rc = smpp_pdu_rx(esme, esme->read_msg); esme->read_msg = NULL; esme->read_idx = 0; esme->read_len = 0; esme->read_state = READ_ST_IN_LEN; } break; } return 0; dead_socket: msgb_free(esme->read_msg); osmo_fd_unregister(&esme->wqueue.bfd); close(esme->wqueue.bfd.fd); esme->wqueue.bfd.fd = -1; exit(2342); return 0; }
static int osmo_stats_reporter_statsd_send(struct osmo_stats_reporter *srep, const char *name1, unsigned int index1, const char *name2, int64_t value, const char *unit) { char *buf; int buf_size; int nchars, rc = 0; char *fmt = NULL; char *prefix = srep->name_prefix; int old_len = msgb_length(srep->buffer); if (prefix) { if (name1) { if (index1 != 0) fmt = "%1$s.%2$s.%6$u.%3$s:%4$d|%5$s"; else fmt = "%1$s.%2$s.%3$s:%4$d|%5$s"; } else { fmt = "%1$s.%2$0.0s%3$s:%4$d|%5$s"; } } else { prefix = ""; if (name1) { if (index1 != 0) fmt = "%1$s%2$s.%6$u.%3$s:%4$d|%5$s"; else fmt = "%1$s%2$s.%3$s:%4$d|%5$s"; } else { fmt = "%1$s%2$0.0s%3$s:%4$d|%5$s"; } } if (srep->agg_enabled) { if (msgb_length(srep->buffer) > 0 && msgb_tailroom(srep->buffer) > 0) { msgb_put_u8(srep->buffer, '\n'); } } buf = (char *)msgb_put(srep->buffer, 0); buf_size = msgb_tailroom(srep->buffer); nchars = snprintf(buf, buf_size, fmt, prefix, name1, name2, value, unit, index1); if (nchars >= buf_size) { /* Truncated */ /* Restore original buffer (without trailing LF) */ msgb_trim(srep->buffer, old_len); /* Send it */ rc = osmo_stats_reporter_send_buffer(srep); /* Try again */ buf = (char *)msgb_put(srep->buffer, 0); buf_size = msgb_tailroom(srep->buffer); nchars = snprintf(buf, buf_size, fmt, prefix, name1, name2, value, unit, index1); if (nchars >= buf_size) return -EMSGSIZE; } if (nchars > 0) msgb_trim(srep->buffer, msgb_length(srep->buffer) + nchars); if (!srep->agg_enabled) rc = osmo_stats_reporter_send_buffer(srep); return rc; }