osmux: remove generic functions to register and get ccid

Remove these functions:

- osmux_xfrm_input_get_ccid
- osmux_xfrm_input_register_ccid

The ccid will be managed by the BSC and it will be stored in the
mgcp_endpoint structure.

Also adjust all tests and examples using the API.
This commit is contained in:
Pablo Neira Ayuso 2012-10-20 20:10:31 +02:00
parent 631c6fe0ad
commit 5654c43f80
4 changed files with 104 additions and 65 deletions

View File

@ -7,6 +7,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <arpa/inet.h>
#include <osmocom/core/talloc.h> #include <osmocom/core/talloc.h>
#include <osmocom/core/msgb.h> #include <osmocom/core/msgb.h>
@ -84,11 +85,51 @@ struct osmux_in_handle h_input = {
.deliver = osmux_deliver, .deliver = osmux_deliver,
}; };
#define MAX_CONCURRENT_CALLS 8
static int ccid[MAX_CONCURRENT_CALLS];
static int get_ccid(uint32_t ssrc)
{
int i, found = 0;
for (i=0; i<MAX_CONCURRENT_CALLS; i++) {
if (ccid[i] == ssrc) {
found = 1;
break;
}
}
return found ? i : -1;
}
static void register_ccid(uint32_t ssrc)
{
int i, found = 0;
for (i=0; i<MAX_CONCURRENT_CALLS; i++) {
if (ccid[i] == ssrc)
continue;
if (ccid[i] < 0) {
found = 1;
break;
}
}
if (found) {
ccid[i] = ssrc;
LOGP(DOSMUX_TEST, LOGL_DEBUG, "mapping ssrc=%u to ccid=%d\n",
ntohl(ssrc), i);
} else {
LOGP(DOSMUX_TEST, LOGL_ERROR, "cannot map ssrc to ccid!\n");
}
}
int read_cb(struct osmo_dgram *conn) int read_cb(struct osmo_dgram *conn)
{ {
struct msgb *msg; struct msgb *msg;
struct rtp_hdr *rtph; struct rtp_hdr *rtph;
int ret; int ret, ccid;
LOGP(DOSMUX_TEST, LOGL_DEBUG, "received message from datagram\n"); LOGP(DOSMUX_TEST, LOGL_DEBUG, "received message from datagram\n");
@ -113,11 +154,11 @@ int read_cb(struct osmo_dgram *conn)
if (rtph->payload_type == RTP_PT_AMR) if (rtph->payload_type == RTP_PT_AMR)
amr_write(msg); amr_write(msg);
/* now build the osmux frame */ ccid = get_ccid(rtph->ssrc);
if (osmux_xfrm_input_get_ccid(&h_input, rtph->ssrc) < 0) if (ccid < 0)
osmux_xfrm_input_register_ccid(&h_input, rtph->ssrc); register_ccid(rtph->ssrc);
while ((ret = osmux_xfrm_input(&h_input, msg)) > 0) { while ((ret = osmux_xfrm_input(&h_input, msg, ccid)) > 0) {
/* batch full, deliver it */ /* batch full, deliver it */
osmux_xfrm_input_deliver(&h_input); osmux_xfrm_input_deliver(&h_input);
} }

View File

@ -61,10 +61,8 @@ static inline uint8_t *osmux_get_payload(struct osmux_hdr *osmuxh)
} }
void osmux_xfrm_input_init(struct osmux_in_handle *h); void osmux_xfrm_input_init(struct osmux_in_handle *h);
int osmux_xfrm_input_get_ccid(struct osmux_in_handle *h, uint32_t ssrc);
void osmux_xfrm_input_register_ccid(struct osmux_in_handle *h, uint32_t ssrc);
int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg); int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg, int ccid);
void osmux_xfrm_input_deliver(struct osmux_in_handle *h); void osmux_xfrm_input_deliver(struct osmux_in_handle *h);
void osmux_xfrm_output_init(struct osmux_out_handle *h); void osmux_xfrm_output_init(struct osmux_out_handle *h);

View File

@ -138,14 +138,13 @@ struct osmux_batch {
struct llist_head node_list; struct llist_head node_list;
unsigned int remaining_bytes; unsigned int remaining_bytes;
uint8_t seq; uint8_t seq;
int64_t ccid[OSMUX_MAX_CONCURRENT_CALLS];
}; };
static int static int
osmux_batch_add(struct osmux_in_handle *h, struct msgb *out_msg, osmux_batch_put(struct osmux_in_handle *h, struct msgb *out_msg,
struct msgb *msg, struct rtp_hdr *rtph, struct msgb *msg, struct rtp_hdr *rtph,
struct amr_hdr *amrh, uint32_t amr_payload_len, struct amr_hdr *amrh, uint32_t amr_payload_len,
int add_osmux_header) int ccid, int add_osmux_header)
{ {
struct osmux_batch *batch = (struct osmux_batch *)h->data; struct osmux_batch *batch = (struct osmux_batch *)h->data;
struct osmux_hdr *osmuxh; struct osmux_hdr *osmuxh;
@ -157,7 +156,7 @@ osmux_batch_add(struct osmux_in_handle *h, struct msgb *out_msg,
osmuxh->amr_f = amrh->f; osmuxh->amr_f = amrh->f;
osmuxh->amr_q= amrh->q; osmuxh->amr_q= amrh->q;
osmuxh->seq = batch->seq++; osmuxh->seq = batch->seq++;
osmuxh->circuit_id = osmux_xfrm_input_get_ccid(h, rtph->ssrc); osmuxh->circuit_id = ccid;
osmuxh->amr_cmr = amrh->cmr; osmuxh->amr_cmr = amrh->cmr;
osmuxh->amr_ft = amrh->ft; osmuxh->amr_ft = amrh->ft;
msgb_put(out_msg, sizeof(struct osmux_hdr)); msgb_put(out_msg, sizeof(struct osmux_hdr));
@ -184,7 +183,7 @@ static int
osmux_xfrm_encode_amr(struct osmux_in_handle *h, osmux_xfrm_encode_amr(struct osmux_in_handle *h,
struct msgb *out_msg, struct msgb *out_msg,
struct rtp_hdr *rtph, struct msgb *msg, struct rtp_hdr *rtph, struct msgb *msg,
int add_osmux_header) int ccid, int add_osmux_header)
{ {
struct amr_hdr *amrh; struct amr_hdr *amrh;
uint32_t amr_len; uint32_t amr_len;
@ -196,8 +195,8 @@ osmux_xfrm_encode_amr(struct osmux_in_handle *h,
amr_payload_len = amr_len - sizeof(struct amr_hdr); amr_payload_len = amr_len - sizeof(struct amr_hdr);
if (osmux_batch_add(h, out_msg, msg, rtph, amrh, amr_payload_len, if (osmux_batch_put(h, out_msg, msg, rtph, amrh, amr_payload_len,
add_osmux_header) < 0) ccid, add_osmux_header) < 0)
return -1; return -1;
return 0; return 0;
@ -206,6 +205,7 @@ osmux_xfrm_encode_amr(struct osmux_in_handle *h,
struct batch_list_node { struct batch_list_node {
struct llist_head head; struct llist_head head;
uint32_t ssrc; uint32_t ssrc;
int ccid;
struct llist_head list; struct llist_head list;
}; };
@ -245,7 +245,7 @@ static struct msgb *osmux_build_batch(struct osmux_in_handle *h)
} }
osmux_xfrm_encode_amr(h, batch_msg, rtph, cur, osmux_xfrm_encode_amr(h, batch_msg, rtph, cur,
add_osmux_hdr); node->ccid, add_osmux_hdr);
llist_del(&cur->list); llist_del(&cur->list);
msgb_free(cur); msgb_free(cur);
ctr++; ctr++;
@ -289,7 +289,7 @@ static int osmux_rtp_amr_payload_len(struct msgb *msg, struct rtp_hdr *rtph)
} }
static int static int
osmux_msgb_batch_queue_add(struct osmux_batch *batch, struct msgb *msg) osmux_batch_add(struct osmux_batch *batch, struct msgb *msg, int ccid)
{ {
struct rtp_hdr *rtph; struct rtp_hdr *rtph;
struct batch_list_node *node; struct batch_list_node *node;
@ -342,6 +342,7 @@ osmux_msgb_batch_queue_add(struct osmux_batch *batch, struct msgb *msg)
if (node == NULL) if (node == NULL)
return 0; return 0;
node->ccid = ccid;
node->ssrc = rtph->ssrc; node->ssrc = rtph->ssrc;
INIT_LLIST_HEAD(&node->list); INIT_LLIST_HEAD(&node->list);
llist_add_tail(&node->head, &batch->node_list); llist_add_tail(&node->head, &batch->node_list);
@ -365,7 +366,7 @@ osmux_msgb_batch_queue_add(struct osmux_batch *batch, struct msgb *msg)
* an error occured and we have skipped the message. If 1 is returned, you * an error occured and we have skipped the message. If 1 is returned, you
* have to invoke osmux_xfrm_input_deliver and try again. * have to invoke osmux_xfrm_input_deliver and try again.
*/ */
int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg) int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg, int ccid)
{ {
int ret; int ret;
struct rtp_hdr *rtph; struct rtp_hdr *rtph;
@ -389,7 +390,7 @@ int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg)
osmo_timer_schedule(&batch->timer, 0, osmo_timer_schedule(&batch->timer, 0,
h->batch_factor * DELTA_RTP_MSG); h->batch_factor * DELTA_RTP_MSG);
} }
ret = osmux_msgb_batch_queue_add(batch, msg); ret = osmux_batch_add(batch, msg, ccid);
break; break;
default: default:
/* Only AMR supported so far, sorry. */ /* Only AMR supported so far, sorry. */
@ -402,7 +403,6 @@ int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg)
void osmux_xfrm_input_init(struct osmux_in_handle *h) void osmux_xfrm_input_init(struct osmux_in_handle *h)
{ {
struct osmux_batch *batch; struct osmux_batch *batch;
int i;
LOGP(DLMIB, LOGL_DEBUG, "initialized osmux input converter\n"); LOGP(DLMIB, LOGL_DEBUG, "initialized osmux input converter\n");
@ -415,9 +415,6 @@ void osmux_xfrm_input_init(struct osmux_in_handle *h)
batch->timer.cb = osmux_batch_timer_expired; batch->timer.cb = osmux_batch_timer_expired;
batch->timer.data = h; batch->timer.data = h;
for (i=0; i<OSMUX_MAX_CONCURRENT_CALLS; i++)
batch->ccid[i] = -1;
h->data = (void *)batch; h->data = (void *)batch;
} }
@ -500,44 +497,6 @@ osmux_tx_sched(struct llist_head *list,
} }
} }
void osmux_xfrm_input_register_ccid(struct osmux_in_handle *h, uint32_t ssrc)
{
struct osmux_batch *batch = (struct osmux_batch *)h->data;;
int i, found = 0;
for (i=0; i<OSMUX_MAX_CONCURRENT_CALLS; i++) {
if (batch->ccid[i] == ssrc)
continue;
if (batch->ccid[i] < 0) {
found = 1;
break;
}
}
if (found) {
batch->ccid[i] = ssrc;
LOGP(DLMIB, LOGL_DEBUG, "mapping ssrc=%u to ccid=%d\n",
ntohl(ssrc), i);
} else {
LOGP(DLMIB, LOGL_ERROR, "cannot map ssrc to ccid!\n");
}
}
int osmux_xfrm_input_get_ccid(struct osmux_in_handle *h, uint32_t ssrc)
{
struct osmux_batch *batch = (struct osmux_batch *)h->data;;
int i, found = 0;
for (i=0; i<OSMUX_MAX_CONCURRENT_CALLS; i++) {
if (batch->ccid[i] == ssrc) {
found = 1;
break;
}
}
return found ? i : -1;
}
void osmux_xfrm_output_init(struct osmux_out_handle *h) void osmux_xfrm_output_init(struct osmux_out_handle *h)
{ {
int i; int i;

View File

@ -73,19 +73,60 @@ struct osmux_in_handle h_input = {
.deliver = deliver, .deliver = deliver,
}; };
#define MAX_CONCURRENT_CALLS 8
static int ccid[MAX_CONCURRENT_CALLS];
static void register_ccid(uint32_t ssrc)
{
int i, found = 0;
for (i=0; i<MAX_CONCURRENT_CALLS; i++) {
if (ccid[i] == ssrc)
continue;
if (ccid[i] < 0) {
found = 1;
break;
}
}
if (found) {
ccid[i] = ssrc;
LOGP(DOSMUXTEST, LOGL_DEBUG, "mapping ssrc=%u to ccid=%d\n",
ntohl(ssrc), i);
} else {
LOGP(DOSMUXTEST, LOGL_ERROR, "cannot map ssrc to ccid!\n");
}
}
static int get_ccid(uint32_t ssrc)
{
int i, found = 0;
for (i=0; i<MAX_CONCURRENT_CALLS; i++) {
if (ccid[i] == ssrc) {
found = 1;
break;
}
}
return found ? i : -1;
}
static int pcap_test_run(struct msgb *msg) static int pcap_test_run(struct msgb *msg)
{ {
int ret; int ret, ccid;
struct rtp_hdr *rtph; struct rtp_hdr *rtph;
rtph = osmo_rtp_get_hdr(msg); rtph = osmo_rtp_get_hdr(msg);
if (rtph == NULL) if (rtph == NULL)
return 0; return 0;
if (osmux_xfrm_input_get_ccid(&h_input, rtph->ssrc) < 0) ccid = get_ccid(&h_input, rtph->ssrc);
osmux_xfrm_input_register_ccid(&h_input, rtph->ssrc); if (ccid < 0)
register_ccid(&h_input, rtph->ssrc);
while ((ret = osmux_xfrm_input(&h_input, msg)) > 1) { while ((ret = osmux_xfrm_input(&h_input, msg, ccid)) > 1) {
/* batch full, deliver it */ /* batch full, deliver it */
osmux_xfrm_input_deliver(&h_input); osmux_xfrm_input_deliver(&h_input);
} }