aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2020-03-10 16:46:41 +0100
committerHarald Welte <laforge@osmocom.org>2020-03-10 21:35:56 +0100
commit5914d76d5c63826c7884f74aa0eb29325e24f613 (patch)
treee995347e2206b4dedd97e951276e402c3134c037
parentcb4340b8a443811a7bfa281a32937663b51c8d62 (diff)
osmo-bts-virtual: Add "virtual-um ttl <0-255>" VTY option
This can be used to determine the multicast TTL packet and hence how far the packet will propagate in the network. If you want to operate the virtual Um only on your own machine, a TTL of 0 would prevent the packets from ever being transmitted on your local ethernet segment. Change-Id: I18a9f93b764aee4e1dc68a1c6ac4d078e52ca61d Related: OS#2966
-rw-r--r--include/osmo-bts/phy_link.h1
-rw-r--r--src/osmo-bts-virtual/l1_if.c2
-rw-r--r--src/osmo-bts-virtual/main.c1
-rw-r--r--src/osmo-bts-virtual/virtual_um.c15
-rw-r--r--src/osmo-bts-virtual/virtual_um.h2
-rw-r--r--src/osmo-bts-virtual/virtualbts_vty.c21
6 files changed, 39 insertions, 3 deletions
diff --git a/include/osmo-bts/phy_link.h b/include/osmo-bts/phy_link.h
index 69c6bd6a..116297b6 100644
--- a/include/osmo-bts/phy_link.h
+++ b/include/osmo-bts/phy_link.h
@@ -53,6 +53,7 @@ struct phy_link {
} osmotrx;
struct {
char *mcast_dev; /* Network device for multicast */
+ int ttl; /* TTL of transmitted udp multicast */
char *bts_mcast_group; /* BTS are listening to this group */
uint16_t bts_mcast_port;
char *ms_mcast_group; /* MS are listening to this group */
diff --git a/src/osmo-bts-virtual/l1_if.c b/src/osmo-bts-virtual/l1_if.c
index b6a3507d..31280123 100644
--- a/src/osmo-bts-virtual/l1_if.c
+++ b/src/osmo-bts-virtual/l1_if.c
@@ -204,7 +204,7 @@ int bts_model_phy_link_open(struct phy_link *plink)
plink->u.virt.virt_um = virt_um_init(plink, plink->u.virt.ms_mcast_group, plink->u.virt.ms_mcast_port,
plink->u.virt.bts_mcast_group, plink->u.virt.bts_mcast_port,
- virt_um_rcv_cb);
+ plink->u.virt.ttl, virt_um_rcv_cb);
if (!plink->u.virt.virt_um) {
phy_link_state_set(plink, PHY_LINK_SHUTDOWN);
return -1;
diff --git a/src/osmo-bts-virtual/main.c b/src/osmo-bts-virtual/main.c
index 02b7ae92..a6fc290f 100644
--- a/src/osmo-bts-virtual/main.c
+++ b/src/osmo-bts-virtual/main.c
@@ -123,6 +123,7 @@ void bts_model_phy_link_set_defaults(struct phy_link *plink)
plink->u.virt.bts_mcast_port = DEFAULT_BTS_MCAST_PORT;
plink->u.virt.ms_mcast_group = talloc_strdup(plink, DEFAULT_MS_MCAST_GROUP);
plink->u.virt.ms_mcast_port = DEFAULT_MS_MCAST_PORT;
+ plink->u.virt.ttl = -1; /* initialize to -1 to prevent us setting the TTL */
}
void bts_model_phy_instance_set_defaults(struct phy_instance *pinst)
diff --git a/src/osmo-bts-virtual/virtual_um.c b/src/osmo-bts-virtual/virtual_um.c
index 752e4b61..cf5d6cdd 100644
--- a/src/osmo-bts-virtual/virtual_um.c
+++ b/src/osmo-bts-virtual/virtual_um.c
@@ -62,10 +62,12 @@ static int virt_um_fd_cb(struct osmo_fd *ofd, unsigned int what)
}
struct virt_um_inst *virt_um_init(void *ctx, char *tx_mcast_group, uint16_t tx_mcast_port,
- char *rx_mcast_group, uint16_t rx_mcast_port,
+ char *rx_mcast_group, uint16_t rx_mcast_port, int ttl,
void (*recv_cb)(struct virt_um_inst *vui, struct msgb *msg))
{
struct virt_um_inst *vui = talloc_zero(ctx, struct virt_um_inst);
+ int rc;
+
vui->mcast_sock = mcast_bidir_sock_setup(ctx, tx_mcast_group, tx_mcast_port,
rx_mcast_group, rx_mcast_port, 1, virt_um_fd_cb, vui);
if (!vui->mcast_sock) {
@@ -75,6 +77,17 @@ struct virt_um_inst *virt_um_init(void *ctx, char *tx_mcast_group, uint16_t tx_m
}
vui->recv_cb = recv_cb;
+ /* -1 means default, i.e. no TTL explicitly configured in VTY */
+ if (ttl >= 0) {
+ rc = osmo_sock_mcast_ttl_set(vui->mcast_sock->tx_ofd.fd, ttl);
+ if (rc < 0) {
+ perror("Cannot set TTL of Virtual Um transmit socket");
+ mcast_bidir_sock_close(vui->mcast_sock);
+ talloc_free(vui);
+ return NULL;
+ }
+ }
+
return vui;
}
diff --git a/src/osmo-bts-virtual/virtual_um.h b/src/osmo-bts-virtual/virtual_um.h
index ac098dd4..7841c33b 100644
--- a/src/osmo-bts-virtual/virtual_um.h
+++ b/src/osmo-bts-virtual/virtual_um.h
@@ -23,7 +23,7 @@ struct virt_um_inst {
struct virt_um_inst *virt_um_init(
void *ctx, char *tx_mcast_group, uint16_t tx_mcast_port,
- char *rx_mcast_group, uint16_t rx_mcast_port,
+ char *rx_mcast_group, uint16_t rx_mcast_port, int ttl,
void (*recv_cb)(struct virt_um_inst *vui, struct msgb *msg));
void virt_um_destroy(struct virt_um_inst *vui);
diff --git a/src/osmo-bts-virtual/virtualbts_vty.c b/src/osmo-bts-virtual/virtualbts_vty.c
index 323222b4..875e6822 100644
--- a/src/osmo-bts-virtual/virtualbts_vty.c
+++ b/src/osmo-bts-virtual/virtualbts_vty.c
@@ -69,6 +69,9 @@ void bts_model_config_write_phy(struct vty *vty, struct phy_link *plink)
if (plink->u.virt.mcast_dev)
vty_out(vty, " virtual-um net-device %s%s",
plink->u.virt.mcast_dev, VTY_NEWLINE);
+ if (plink->u.virt.ttl != -1)
+ vty_out(vty, " virtual-um ttl %d%s",
+ plink->u.virt.ttl, VTY_NEWLINE);
if (strcmp(plink->u.virt.ms_mcast_group, DEFAULT_BTS_MCAST_GROUP))
vty_out(vty, " virtual-um ms-multicast-group %s%s",
plink->u.virt.ms_mcast_group, VTY_NEWLINE);
@@ -171,6 +174,23 @@ DEFUN(cfg_phy_mcast_dev, cfg_phy_mcast_dev_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_phy_mcast_ttl, cfg_phy_mcast_ttl_cmd,
+ "virtual-um ttl <0-255>",
+ VUM_STR "Configure the TTL for transmitted multicast GSMTAP packets\n")
+{
+ struct phy_link *plink = vty->index;
+
+ if (plink->state != PHY_LINK_SHUTDOWN) {
+ vty_out(vty, "Can only reconfigure a PHY link that is down%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ plink->u.virt.ttl = atoi(argv[0]);
+
+ return CMD_SUCCESS;
+}
+
int bts_model_vty_init(struct gsm_bts *bts)
{
vty_bts = bts;
@@ -180,6 +200,7 @@ int bts_model_vty_init(struct gsm_bts *bts)
install_element(PHY_NODE, &cfg_phy_bts_mcast_group_cmd);
install_element(PHY_NODE, &cfg_phy_bts_mcast_port_cmd);
install_element(PHY_NODE, &cfg_phy_mcast_dev_cmd);
+ install_element(PHY_NODE, &cfg_phy_mcast_ttl_cmd);
return 0;
}