| #include <stdint.h> |
| #include <string.h> |
| |
| #include <osmocom/core/msgb.h> |
| #include <osmocom/core/application.h> |
| #include <osmocom/core/logging.h> |
| |
| #include <osmocom/mgcp/iuup_cn_node.h> |
| #include <osmocom/mgcp/iuup_protocol.h> |
| |
| void *ctx = NULL; |
| |
| static const char *dump(struct msgb *msg) |
| { |
| return osmo_hexdump_nospc(msg->data, msg->len); |
| } |
| |
| struct msgb *msgb_from_hex(const char *label, const char *hex) |
| { |
| struct msgb *msg = msgb_alloc_headroom(4096 + OSMO_IUUP_HEADROOM, |
| OSMO_IUUP_HEADROOM, label); |
| unsigned char *rc; |
| msg->l2h = msg->data; |
| rc = msgb_put(msg, osmo_hexparse(hex, msg->data, msgb_tailroom(msg))); |
| OSMO_ASSERT(rc == msg->l2h); |
| return msg; |
| } |
| |
| const char *expect_rx_payload = NULL; |
| int rx_payload(struct msgb *msg, void *node_priv) |
| { |
| printf("rx_payload() invoked by iuup_cn!\n"); |
| printf(" [IuUP] -RTP->\n"); |
| printf("%s\n", dump(msg)); |
| printf("node_priv=%p\n", node_priv); |
| if (!expect_rx_payload) { |
| printf("ERROR: did not expect rx_payload()\n"); |
| exit(-1); |
| } else if (strcmp(expect_rx_payload, dump(msg))) { |
| printf("ERROR: mismatches expected msg %s\n", expect_rx_payload); |
| exit(-1); |
| } else |
| printf("ok: matches expected msg\n"); |
| expect_rx_payload = NULL; |
| return 0; |
| } |
| |
| const char *expect_tx_msg = NULL; |
| int tx_msg(struct msgb *msg, void *node_priv) |
| { |
| printf("tx_msg() invoked by iuup_cn!\n"); |
| printf(" <-PDU- [IuUP]\n"); |
| printf("%s\n", dump(msg)); |
| printf("node_priv=%p\n", node_priv); |
| if (!expect_tx_msg) { |
| printf("ERROR: did not expect tx_msg()\n"); |
| exit(-1); |
| } else if (strcmp(expect_tx_msg, dump(msg))) { |
| printf("ERROR: mismatches expected msg %s\n", expect_tx_msg); |
| exit(-1); |
| } else |
| printf("ok: matches expected msg\n"); |
| expect_tx_msg = NULL; |
| return 0; |
| } |
| |
| static int rx_pdu(struct osmo_iuup_cn *cn, struct msgb *msg) |
| { |
| int rc; |
| printf(" -PDU-> [IuUP]\n"); |
| printf("%s\n", dump(msg)); |
| rc = osmo_iuup_cn_rx_pdu(cn, msg); |
| printf("rc=%d\n", rc); |
| return rc; |
| } |
| |
| static int tx_payload(struct osmo_iuup_cn *cn, struct msgb *msg) |
| { |
| int rc; |
| printf(" [IuUP] <-RTP-\n"); |
| printf("%s\n", dump(msg)); |
| rc = osmo_iuup_cn_tx_payload(cn, msg); |
| printf("rc=%d\n", rc); |
| return rc; |
| } |
| |
| void test_cn_session() |
| { |
| void *node_priv = (void*)0x2342; |
| |
| struct osmo_iuup_cn_cfg cfg = { |
| .node_priv = node_priv, |
| .rx_payload = rx_payload, |
| .tx_msg = tx_msg, |
| }; |
| |
| struct osmo_iuup_cn *cn = osmo_iuup_cn_init(ctx, &cfg, __func__); |
| OSMO_ASSERT(cn); |
| |
| printf("\nSend IuUP Initialization. Expecting direct tx_msg() of the Initialization Ack\n"); |
| expect_tx_msg = "8060dc5219495e3f00010111" /* RTP header */ |
| "e4002400"; /* IuUP Init Ack */ |
| rx_pdu(cn, |
| msgb_from_hex("IuUP-Init", |
| "8060dc5219495e3f00010111" /* <- RTP header */ |
| "e000df99" /* <- IuUP header */ |
| "160051673c01270000820000001710000100" /* IuUP params */)); |
| |
| #define RTP_HEADER "8060944c6256042c00010102" |
| #define IUUP_HEADER "0100e2b3" |
| #define RTP_PAYLOAD "6cfb23bc46d18180c3e5ffe040045600005a7d35b625b80005fff03214ced0" |
| printf("\nReceive payload encapsulated in IuUP. Expecting rx_payload() of just RTP packet\n"); |
| printf("i.e. should strip away " IUUP_HEADER "\n"); |
| expect_rx_payload = RTP_HEADER "f03c" RTP_PAYLOAD; |
| rx_pdu(cn, |
| msgb_from_hex("IuUP-Data", |
| RTP_HEADER IUUP_HEADER RTP_PAYLOAD)); |
| |
| printf("\nTransmit RTP. Expecting tx_msg() with inserted IuUP header\n"); |
| expect_tx_msg = RTP_HEADER "000002b3" RTP_PAYLOAD; |
| tx_payload(cn, |
| msgb_from_hex("RTP data", RTP_HEADER "f03c" RTP_PAYLOAD)); |
| |
| printf("\nMore RTP, each time the Frame Nr advances, causing a new header CRC.\n"); |
| expect_tx_msg = RTP_HEADER "0100e2b3" RTP_PAYLOAD; |
| tx_payload(cn, |
| msgb_from_hex("RTP data", RTP_HEADER "f03c" RTP_PAYLOAD)); |
| expect_tx_msg = RTP_HEADER "02007eb3" RTP_PAYLOAD; |
| tx_payload(cn, |
| msgb_from_hex("RTP data", RTP_HEADER "f03c" RTP_PAYLOAD)); |
| expect_tx_msg = RTP_HEADER "03009eb3" RTP_PAYLOAD; |
| tx_payload(cn, |
| msgb_from_hex("RTP data", RTP_HEADER "f03c" RTP_PAYLOAD)); |
| |
| printf("All done.\n"); |
| } |
| |
| static const struct log_info_cat log_categories[] = { |
| }; |
| |
| const struct log_info log_info = { |
| .cat = log_categories, |
| .num_cat = ARRAY_SIZE(log_categories), |
| }; |
| |
| int main(void) |
| { |
| ctx = talloc_named_const(NULL, 0, __FILE__); |
| void *msgb_ctx = msgb_talloc_ctx_init(ctx, 0); |
| osmo_init_logging2(ctx, &log_info); |
| |
| test_cn_session(); |
| |
| talloc_free(msgb_ctx); |
| return 0; |
| } |