This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgHarald Welte has submitted this change and it was merged. Change subject: Port osmo_mcast_sock to libosmocore socket routines ...................................................................... Port osmo_mcast_sock to libosmocore socket routines Change-Id: Ia44c086fb8e428edf49bafd1662c31b2dc2bfc43 --- M src/host/virt_phy/src/shared/osmo_mcast_sock.c 1 file changed, 44 insertions(+), 65 deletions(-) Approvals: Harald Welte: Looks good to me, approved Jenkins Builder: Verified diff --git a/src/host/virt_phy/src/shared/osmo_mcast_sock.c b/src/host/virt_phy/src/shared/osmo_mcast_sock.c index ff81063..94aa925 100644 --- a/src/host/virt_phy/src/shared/osmo_mcast_sock.c +++ b/src/host/virt_phy/src/shared/osmo_mcast_sock.c @@ -10,32 +10,38 @@ #include <unistd.h> #include <virtphy/osmo_mcast_sock.h> +/* server socket is what we use for transmission. It is not subscribed + * to a multicast group or locally bound, but it is just a normal UDP + * socket that's connected to the remote mcast group + port */ struct mcast_server_sock *mcast_server_sock_setup(void *ctx, char* tx_mcast_group, int tx_mcast_port, int loopback) { - struct mcast_server_sock *serv_sock = talloc_zero(ctx, - struct mcast_server_sock); + struct mcast_server_sock *serv_sock = talloc_zero(ctx, struct mcast_server_sock); + int rc; - serv_sock->osmo_fd = talloc_zero(ctx, struct osmo_fd); - serv_sock->sock_conf = talloc_zero(ctx, struct sockaddr_in); + /* TODO: why allocate those dynamically ?!? */ + serv_sock->osmo_fd = talloc_zero(serv_sock, struct osmo_fd); + serv_sock->sock_conf = talloc_zero(serv_sock, struct sockaddr_in); - // setup mcast server socket - serv_sock->osmo_fd->fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (serv_sock->osmo_fd->fd == -1) { + /* setup mcast server socket */ + rc = osmo_sock_init_ofd(serv_sock->osmo_fd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, + tx_mcast_group, tx_mcast_port, OSMO_SOCK_F_CONNECT); + if (rc < 0) { perror("Failed to create Multicast Server Socket"); return NULL; } + /* TODO: Why kleep this stored in sock_conf? */ serv_sock->sock_conf->sin_family = AF_INET; serv_sock->sock_conf->sin_addr.s_addr = inet_addr(tx_mcast_group); serv_sock->sock_conf->sin_port = htons(tx_mcast_port); // determines whether sent mcast packets should be looped back to the local sockets. // loopback must be enabled if the mcast client is on the same machine - if (setsockopt(serv_sock->osmo_fd->fd, IPPROTO_IP, - IP_MULTICAST_LOOP, &loopback, sizeof(loopback)) < 0) { + if (setsockopt(serv_sock->osmo_fd->fd, IPPROTO_IP, IP_MULTICAST_LOOP, + &loopback, sizeof(loopback)) < 0) { perror("Failed to disable loopback.\n"); return NULL; } @@ -43,84 +49,59 @@ return serv_sock; } +/* the client socket is what we use for reception. It is a UDP socket + * that's bound to the GSMTAP UDP port and subscribed to the respective + * multicast group */ struct mcast_client_sock *mcast_client_sock_setup( void *ctx, char* mcast_group, int mcast_port, int (*fd_rx_cb)(struct osmo_fd *ofd, unsigned int what), void *osmo_fd_data) { - struct mcast_client_sock *client_sock = talloc_zero(ctx, - struct mcast_client_sock); - struct sockaddr_in *rx_sock_conf = talloc_zero(NULL, - struct sockaddr_in); - int rc, reuseaddr = 1, loopback = 1, all = 0; + struct mcast_client_sock *client_sock = talloc_zero(ctx, struct mcast_client_sock); + int rc, loopback = 1, all = 0; - client_sock->osmo_fd = talloc_zero(ctx, struct osmo_fd); - client_sock->mcast_group = talloc_zero(ctx, struct ip_mreq); + /* TODO: why allocate those dynamically ?!? */ + client_sock->osmo_fd = talloc_zero(client_sock, struct osmo_fd); + client_sock->mcast_group = talloc_zero(client_sock, struct ip_mreq); - // Create mcast client socket - client_sock->osmo_fd->fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (client_sock->osmo_fd->fd == -1) { + client_sock->osmo_fd->cb = fd_rx_cb; + client_sock->osmo_fd->when = BSC_FD_READ; + client_sock->osmo_fd->data = osmo_fd_data; + + /* Create mcast client socket */ + rc = osmo_sock_init_ofd(client_sock->osmo_fd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, + NULL, mcast_port, OSMO_SOCK_F_BIND); + if (rc < 0) { perror("Could not create mcast client socket"); return NULL; } - // Enable SO_REUSEADDR to allow multiple instances of this application to receive copies of the multicast datagrams. - rc = setsockopt(client_sock->osmo_fd->fd, - SOL_SOCKET, - SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)); - if (rc < 0) { - perror("Failed to configure REUSEADDR option"); - return NULL; - } - - // Bind to the proper port number with the IP address specified as INADDR_ANY. - rx_sock_conf->sin_family = AF_INET; - rx_sock_conf->sin_addr.s_addr = htonl(INADDR_ANY); - rx_sock_conf->sin_port = htons(mcast_port); - rc = bind(client_sock->osmo_fd->fd, (struct sockaddr *)rx_sock_conf, - sizeof(*rx_sock_conf)); - talloc_free(rx_sock_conf); - if (rc < 0) { - perror("Could not bind mcast client socket"); - return NULL; - } - - // Enable loopback of msgs to the host. - // Loopback must be enabled for the client, so multiple processes are able to recevie a mcast package. - rc = setsockopt(client_sock->osmo_fd->fd, - IPPROTO_IP, - IP_MULTICAST_LOOP, &loopback, sizeof(loopback)); + /* Enable loopback of msgs to the host. */ + /* Loopback must be enabled for the client, so multiple + * processes are able to receive a mcast package. */ + rc = setsockopt(client_sock->osmo_fd->fd, IPPROTO_IP, IP_MULTICAST_LOOP, + &loopback, sizeof(loopback)); if (rc < 0) { perror("Failed to enable IP_MULTICAST_LOOP"); return NULL; } - // Configure and join the multicast group + /* Configure and join the multicast group */ client_sock->mcast_group->imr_multiaddr.s_addr = inet_addr(mcast_group); client_sock->mcast_group->imr_interface.s_addr = htonl(INADDR_ANY); - rc = setsockopt(client_sock->osmo_fd->fd, - IPPROTO_IP, - IP_ADD_MEMBERSHIP, client_sock->mcast_group, - sizeof(*client_sock->mcast_group)); + rc = setsockopt(client_sock->osmo_fd->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, + client_sock->mcast_group, sizeof(*client_sock->mcast_group)); if (rc < 0) { perror("Failed to join to mcast goup"); return NULL; } - // this option will set the delivery option so that only packages are received - // from sockets we are bound to via IP_ADD_MEMBERSHIP - if (setsockopt(client_sock->osmo_fd->fd, IPPROTO_IP, - IP_MULTICAST_ALL, &all, sizeof(all)) < 0) { + /* this option will set the delivery option so that only packets + * from sockets we are subscribed to via IP_ADD_MEMBERSHIP are received */ + if (setsockopt(client_sock->osmo_fd->fd, IPPROTO_IP, IP_MULTICAST_ALL, &all, sizeof(all)) < 0) { perror("Failed to modify delivery policy to explicitly joined.\n"); return NULL; } - - // configure and register the osmocom filedescriptor - client_sock->osmo_fd->cb = fd_rx_cb; - client_sock->osmo_fd->when = BSC_FD_READ; - client_sock->osmo_fd->data = osmo_fd_data; - - osmo_fd_register(client_sock->osmo_fd); return client_sock; } @@ -171,10 +152,8 @@ void mcast_client_sock_close(struct mcast_client_sock *client_sock) { - setsockopt(client_sock->osmo_fd->fd, - IPPROTO_IP, - IP_DROP_MEMBERSHIP, client_sock->mcast_group, - sizeof(*client_sock->mcast_group)); + setsockopt(client_sock->osmo_fd->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, + client_sock->mcast_group, sizeof(*client_sock->mcast_group)); osmo_fd_unregister(client_sock->osmo_fd); client_sock->osmo_fd->fd = -1; client_sock->osmo_fd->when = 0; -- To view, visit https://gerrit.osmocom.org/3229 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ia44c086fb8e428edf49bafd1662c31b2dc2bfc43 Gerrit-PatchSet: 1 Gerrit-Project: osmocom-bb Gerrit-Branch: master Gerrit-Owner: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Jenkins Builder