[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v9 10/16] net: dgram: move mcast specific code from net_socket_fd
From: |
Laurent Vivier |
Subject: |
[PATCH v9 10/16] net: dgram: move mcast specific code from net_socket_fd_init_dgram() |
Date: |
Mon, 26 Sep 2022 21:50:42 +0200 |
It is less complex to manage special cases directly in
net_dgram_mcast_init() and net_dgram_udp_init().
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Reviewed-by: Stefano Brivio <sbrivio@redhat.com>
---
net/dgram.c | 143 +++++++++++++++++++++++++++-------------------------
1 file changed, 73 insertions(+), 70 deletions(-)
diff --git a/net/dgram.c b/net/dgram.c
index 57933bfbd1c1..9fb01410304e 100644
--- a/net/dgram.c
+++ b/net/dgram.c
@@ -256,52 +256,11 @@ static NetClientInfo net_dgram_socket_info = {
static NetDgramState *net_dgram_fd_init_dgram(NetClientState *peer,
const char *model,
const char *name,
- int fd, int is_fd,
- SocketAddress *mcast,
+ int fd,
Error **errp)
{
- struct sockaddr_in *saddr = NULL;
- int newfd;
NetClientState *nc;
NetDgramState *s;
- SocketAddress *sa;
- SocketAddressType sa_type;
-
- sa = socket_local_address(fd, errp);
- if (!sa) {
- return NULL;
- }
- sa_type = sa->type;
- qapi_free_SocketAddress(sa);
-
- /*
- * fd passed: multicast: "learn" dgram_dst address from bound address and
- * save it. Because this may be "shared" socket from a "master" process,
- * datagrams would be recv() by ONLY ONE process: we must "clone" this
- * dgram socket --jjo
- */
-
- if (is_fd && mcast != NULL) {
- saddr = g_new(struct sockaddr_in, 1);
-
- if (convert_host_port(saddr, mcast->u.inet.host,
mcast->u.inet.port,
- errp) < 0) {
- goto err;
- }
- /* must be bound */
- if (saddr->sin_addr.s_addr == 0) {
- error_setg(errp, "can't setup multicast destination address");
- goto err;
- }
- /* clone dgram socket */
- newfd = net_dgram_mcast_create(saddr, NULL, errp);
- if (newfd < 0) {
- goto err;
- }
- /* clone newfd to fd, close newfd */
- dup2(newfd, fd);
- close(newfd);
- }
nc = qemu_new_net_client(&net_dgram_socket_info, peer, model, name);
@@ -311,24 +270,7 @@ static NetDgramState
*net_dgram_fd_init_dgram(NetClientState *peer,
net_socket_rs_init(&s->rs, net_dgram_rs_finalize, false);
net_dgram_read_poll(s, true);
- /* mcast: save bound address as dst */
- if (saddr) {
- g_assert(s->dgram_dst == NULL);
- s->dgram_dst = (struct sockaddr *)saddr;
- snprintf(nc->info_str, sizeof(nc->info_str),
- "fd=%d (cloned mcast=%s:%d)",
- fd, inet_ntoa(saddr->sin_addr), ntohs(saddr->sin_port));
- } else {
- snprintf(nc->info_str, sizeof(nc->info_str), "fd=%d %s", fd,
- SocketAddressType_str(sa_type));
- }
-
return s;
-
-err:
- g_free(saddr);
- closesocket(fd);
- return NULL;
}
static int net_dgram_mcast_init(NetClientState *peer,
@@ -341,6 +283,7 @@ static int net_dgram_mcast_init(NetClientState *peer,
NetDgramState *s;
int fd, ret;
struct sockaddr_in *saddr;
+ gchar *info_str;
if (remote->type != SOCKET_ADDRESS_TYPE_INET) {
error_setg(errp, "multicast only support inet type");
@@ -360,6 +303,9 @@ static int net_dgram_mcast_init(NetClientState *peer,
g_free(saddr);
return -1;
}
+ info_str = g_strdup_printf("mcast=%s:%d",
+ inet_ntoa(saddr->sin_addr),
+ ntohs(saddr->sin_port));
} else {
switch (local->type) {
case SOCKET_ADDRESS_TYPE_INET: {
@@ -377,9 +323,14 @@ static int net_dgram_mcast_init(NetClientState *peer,
g_free(saddr);
return -1;
}
+ info_str = g_strdup_printf("mcast=%s:%d",
+ inet_ntoa(saddr->sin_addr),
+ ntohs(saddr->sin_port));
break;
}
- case SOCKET_ADDRESS_TYPE_FD:
+ case SOCKET_ADDRESS_TYPE_FD: {
+ int newfd;
+
fd = monitor_fd_param(monitor_cur(), local->u.fd.str, errp);
if (fd == -1) {
g_free(saddr);
@@ -392,7 +343,46 @@ static int net_dgram_mcast_init(NetClientState *peer,
name, fd);
return -1;
}
+
+ /*
+ * fd passed: multicast: "learn" dgram_dst address from bound
+ * address and save it. Because this may be "shared" socket from a
+ * "master" process, datagrams would be recv() by ONLY ONE process:
+ * we must "clone" this dgram socket --jjo
+ */
+
+ saddr = g_new(struct sockaddr_in, 1);
+
+ if (convert_host_port(saddr, local->u.inet.host,
local->u.inet.port,
+ errp) < 0) {
+ g_free(saddr);
+ closesocket(fd);
+ return -1;
+ }
+
+ /* must be bound */
+ if (saddr->sin_addr.s_addr == 0) {
+ error_setg(errp, "can't setup multicast destination address");
+ g_free(saddr);
+ closesocket(fd);
+ return -1;
+ }
+ /* clone dgram socket */
+ newfd = net_dgram_mcast_create(saddr, NULL, errp);
+ if (newfd < 0) {
+ g_free(saddr);
+ closesocket(fd);
+ return -1;
+ }
+ /* clone newfd to fd, close newfd */
+ dup2(newfd, fd);
+ close(newfd);
+
+ info_str = g_strdup_printf("fd=%d (cloned mcast=%s:%d)",
+ fd, inet_ntoa(saddr->sin_addr),
+ ntohs(saddr->sin_port));
break;
+ }
default:
g_free(saddr);
error_setg(errp, "only support inet or fd type for local");
@@ -400,9 +390,7 @@ static int net_dgram_mcast_init(NetClientState *peer,
}
}
- s = net_dgram_fd_init_dgram(peer, model, name, fd,
- local->type == SOCKET_ADDRESS_TYPE_FD,
- remote, errp);
+ s = net_dgram_fd_init_dgram(peer, model, name, fd, errp);
if (!s) {
g_free(saddr);
return -1;
@@ -411,8 +399,8 @@ static int net_dgram_mcast_init(NetClientState *peer,
g_assert(s->dgram_dst == NULL);
s->dgram_dst = (struct sockaddr *)saddr;
- snprintf(s->nc.info_str, sizeof(s->nc.info_str), "mcast=%s:%d",
- inet_ntoa(saddr->sin_addr), ntohs(saddr->sin_port));
+ pstrcpy(s->nc.info_str, sizeof(s->nc.info_str), info_str);
+ g_free(info_str);
return 0;
@@ -512,7 +500,10 @@ static int net_dgram_init(NetClientState *peer,
break;
}
- case SOCKET_ADDRESS_TYPE_FD:
+ case SOCKET_ADDRESS_TYPE_FD: {
+ SocketAddress *sa;
+ SocketAddressType sa_type;
+
fd = monitor_fd_param(monitor_cur(), local->u.fd.str, errp);
if (fd == -1) {
return -1;
@@ -523,23 +514,35 @@ static int net_dgram_init(NetClientState *peer,
name, fd);
return -1;
}
+
+ sa = socket_local_address(fd, errp);
+ if (sa) {
+ sa_type = sa->type;
+ qapi_free_SocketAddress(sa);
+
+ info_str = g_strdup_printf("fd=%d %s", fd,
+ SocketAddressType_str(sa_type));
+ } else {
+ info_str = g_strdup_printf("fd=%d", fd);
+ }
break;
+ }
default:
error_setg(errp, "only support inet or fd type for local");
return -1;
}
- s = net_dgram_fd_init_dgram(peer, model, name, fd, 0, NULL, errp);
+ s = net_dgram_fd_init_dgram(peer, model, name, fd, errp);
if (!s) {
return -1;
}
+ pstrcpy(s->nc.info_str, sizeof(s->nc.info_str), info_str);
+ g_free(info_str);
+
if (remote) {
g_assert(s->dgram_dst == NULL);
s->dgram_dst = dgram_dst;
-
- pstrcpy(s->nc.info_str, sizeof(s->nc.info_str), info_str);
- g_free(info_str);
}
return 0;
}
--
2.37.3
- [PATCH v9 05/16] qapi: net: add stream and dgram netdevs, (continued)
- [PATCH v9 05/16] qapi: net: add stream and dgram netdevs, Laurent Vivier, 2022/09/26
- [PATCH v9 03/16] net: simplify net_client_parse() error management, Laurent Vivier, 2022/09/26
- [PATCH v9 04/16] qapi: net: introduce a way to bypass qemu_opts_parse_noisily(), Laurent Vivier, 2022/09/26
- [PATCH v9 14/16] net: stream: move to QIO to enable additional parameters, Laurent Vivier, 2022/09/26
- [PATCH v9 15/16] tests/qtest: netdev: test stream and dgram backends, Laurent Vivier, 2022/09/26
- [PATCH v9 13/16] qemu-sockets: update socket_uri() and socket_parse() to be consistent, Laurent Vivier, 2022/09/26
- [PATCH v9 11/16] net: dgram: add unix socket, Laurent Vivier, 2022/09/26
- [PATCH v9 01/16] net: introduce convert_host_port(), Laurent Vivier, 2022/09/26
- [PATCH v9 09/16] net: dgram: make dgram_dst generic, Laurent Vivier, 2022/09/26
- [PATCH v9 12/16] qemu-sockets: move and rename SocketAddress_to_str(), Laurent Vivier, 2022/09/26
- [PATCH v9 10/16] net: dgram: move mcast specific code from net_socket_fd_init_dgram(),
Laurent Vivier <=
- [PATCH v9 16/16] net: stream: add QAPI events to report connection state, Laurent Vivier, 2022/09/26