aboutsummaryrefslogtreecommitdiffstats
path: root/tests/virtsock/virt_um_bts.c
blob: 37807b70df7dbf0cb3b3f8b5fd8b90b854bebe34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <osmocom/core/msgb.h>
#include <osmocom/core/select.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <talloc.h>
#include <unistd.h>

#include "../../src/osmo-bts-virtual/virtual_um.h"

static char *rx_mcast_group = "224.0.0.1";
static int rx_mcast_port = 6666;
static char *tx_mcast_group = "225.0.0.1";
static int tx_mcast_port = 6667;

static void virt_um_rx_cb(struct virt_um_inst *vui, struct msgb *msg)
{
	char addrbuf[32];
	inet_ntop(AF_INET, &vui->mcast_sock->rx_sock->mcast_group->imr_multiaddr, addrbuf, 32);
	printf("Received ACK from MS(%s): \"%s\"\n", addrbuf, msgb_data(msg));
}

// main prog for a client program continuously receiving data from a multicast socket and responding to them answers on another
int main(void)
{
	int i = 0;
	struct virt_um_inst *vui = virt_um_init(NULL, tx_mcast_group,
	                tx_mcast_port, rx_mcast_group, rx_mcast_port,
	                virt_um_rx_cb);
	if (!vui) {
		perror("Error initializing vui.");
	}

	while (++i < 1000) {
		struct msgb *outmsg = msgb_alloc(VIRT_UM_MSGB_SIZE,
		                "Virtual UM Rx");
		char strbuf[64], addrbuf[32], *data_loc;
		int port, rc;
		sprintf(strbuf, "MSG: (%u)", i);
		data_loc = (char *)msgb_put(outmsg, strlen(strbuf)+1);
		memcpy(data_loc, strbuf, strlen(strbuf)+1);

		rc = virt_um_write_msg(vui, outmsg);
		inet_ntop(AF_INET, &vui->mcast_sock->tx_sock->sock_conf->sin_addr, addrbuf, 32);
		port = vui->mcast_sock->tx_sock->sock_conf->sin_port;
		if (rc < 0) {
			perror("Error sending MSG");
		} else if (rc == 0) {
			printf("Nothing sent: \"%s\"\n", msgb_data(outmsg));
		} else {
			printf("Sent MSG to MS(%s:%d): \"%s\"\n", addrbuf, port, msgb_data(outmsg));
		}
		// receive all pending acks
		while(osmo_select_main(1));

		sleep(1);
	}

	virt_um_destroy(vui);
	return 0;
}