osmux: add osmux_snprintf

Useful for debugging purposes. Modify also examples to use it.
This commit is contained in:
Pablo Neira Ayuso 2013-02-19 17:14:33 +01:00
parent aeeb4399a2
commit d32caea9ea
4 changed files with 111 additions and 6 deletions

View File

@ -71,7 +71,11 @@ static struct osmo_rtp_handle *rtp;
static void osmux_deliver(struct msgb *batch_msg, void *data)
{
printf("sending batch (len=%d)\n", batch_msg->len);
char buf[1024];
osmux_snprintf(buf, sizeof(buf), batch_msg);
LOGP(DOSMUX_TEST, LOGL_DEBUG, "sending batch (len=%d): %s\n",
batch_msg->len, buf);
osmo_dgram_send(conn, batch_msg);
}
@ -131,8 +135,6 @@ int read_cb(struct osmo_dgram *conn)
struct rtp_hdr *rtph;
int ret, ccid;
LOGP(DOSMUX_TEST, LOGL_DEBUG, "received message from datagram\n");
msg = msgb_alloc(RTP_MSGB_SIZE, "OSMUX/test");
if (msg == NULL) {
LOGP(DOSMUX_TEST, LOGL_ERROR, "cannot allocate message\n");
@ -154,6 +156,11 @@ int read_cb(struct osmo_dgram *conn)
if (rtph->payload_type == RTP_PT_AMR)
amr_write(msg);
char buf[1024];
osmo_rtp_snprintf(buf, sizeof(buf), msg);
LOGP(DOSMUX_TEST, LOGL_DEBUG, "received RTP (len=%d): %s\n", msg->len, buf);
ccid = get_ccid(rtph->ssrc);
if (ccid < 0)
register_ccid(rtph->ssrc);

View File

@ -78,7 +78,7 @@ static void tx_cb(struct msgb *msg, void *data)
char buf[4096];
osmo_rtp_snprintf(buf, sizeof(buf), msg);
printf("sending: %s\n", buf);
LOGP(DOSMUX_TEST, LOGL_DEBUG, "sending: %s\n", buf);
osmo_dgram_send(conn, msg);
amr_write(msg);
@ -102,10 +102,12 @@ int read_cb(struct osmo_dgram *conn)
return -1;
}
LOGP(DOSMUX_TEST, LOGL_DEBUG, "received OSMUX message (len=%d)\n", msg->len);
char buf[1024];
osmux_snprintf(buf, sizeof(buf), msg);
LOGP(DOSMUX_TEST, LOGL_DEBUG, "received OSMUX message (len=%d) %s\n",
msg->len, buf);
while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL) {
printf("tx_sched\n");
osmux_xfrm_output(osmuxh, &h_output, &list);
osmux_tx_sched(&list, tx_cb, NULL);
}

View File

@ -56,11 +56,15 @@ struct osmux_out_handle {
uint32_t rtp_timestamp;
};
struct osmux_hdr *osmux_get_hdr(struct msgb *msg);
static inline uint8_t *osmux_get_payload(struct osmux_hdr *osmuxh)
{
return (uint8_t *)osmuxh + sizeof(struct osmux_hdr);
}
int osmux_snprintf(char *buf, size_t size, struct msgb *msg);
void osmux_xfrm_input_init(struct osmux_in_handle *h);
int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg, int ccid);

View File

@ -34,6 +34,23 @@
static void *osmux_ctx;
struct osmux_hdr *osmux_get_hdr(struct msgb *msg)
{
struct osmux_hdr *osmuxh = (struct osmux_hdr *)msg->data;
if (msg->len < sizeof(struct osmux_hdr)) {
DEBUGPC(DLMUX, "received OSMUX frame too short (len = %d)\n",
msg->len);
return NULL;
}
return osmuxh;
}
static uint32_t osmux_get_payload_len(struct osmux_hdr *osmuxh)
{
return osmo_amr_bytes(osmuxh->amr_ft) * (osmuxh->ctr+1);
}
struct osmux_hdr *osmux_xfrm_output_pull(struct msgb *msg)
{
struct osmux_hdr *osmuxh = NULL;
@ -505,3 +522,78 @@ void osmux_xfrm_output_init(struct osmux_out_handle *h)
h->rtp_seq = (uint16_t)random();
h->rtp_timestamp = (uint32_t)random();
}
#define SNPRINTF_BUFFER_SIZE(ret, size, len, offset) \
size += ret; \
if (ret > len) \
ret = len; \
offset += ret; \
len -= ret;
static int osmux_snprintf_header(char *buf, size_t size, struct osmux_hdr *osmuxh)
{
int ret;
int len = size, offset = 0;
ret = snprintf(buf, len, "OSMUX seq=%03u ccid=%03u "
"ft=%01u ctr=%01u "
"amr_f=%01u amr_q=%01u "
"amr_ft=%02u amr_cmr=%02u ",
osmuxh->seq, osmuxh->circuit_id,
osmuxh->ft, osmuxh->ctr,
osmuxh->amr_f, osmuxh->amr_q,
osmuxh->amr_ft, osmuxh->amr_cmr);
SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
return offset;
}
static int osmux_snprintf_payload(char *buf, size_t size,
const uint8_t *payload, int payload_len)
{
int ret, i;
int len = size, offset = 0;
for (i=0; i<payload_len; i++) {
ret = snprintf(buf+offset, len, "%02x ", payload[i]);
SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
}
ret = snprintf(buf+offset, len, "]\n");
SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
return offset;
}
int osmux_snprintf(char *buf, size_t size, struct msgb *msg)
{
int ret;
unsigned int offset = 0;
int msg_len = msg->len, len = size;
struct osmux_hdr *osmuxh = (struct osmux_hdr *)msg->data;
int this_len;
while (msg_len > 0) {
this_len = sizeof(struct osmux_hdr) +
osmux_get_payload_len(osmuxh);
ret = osmux_snprintf_header(buf+offset, size, osmuxh);
if (ret < 0)
break;
SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
ret = osmux_snprintf_payload(buf+offset, size,
osmux_get_payload(osmuxh),
osmux_get_payload_len(osmuxh));
if (ret < 0)
break;
SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
msg_len -= this_len;
osmuxh = (struct osmux_hdr *)((uint8_t *)msg->data + this_len);
}
return offset;
}