aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--net/slirp.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/net/slirp.c b/net/slirp.c
index 9f5925c302..89f66e37db 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -116,6 +116,13 @@ static void slirp_smb_cleanup(SlirpState *s);
static inline void slirp_smb_cleanup(SlirpState *s) { }
#endif
+/* Should only be used here */
+enum GFwdProtocols {
+ GFWD_TCP = 1,
+ GFWD_UDP = 2,
+ GFWD_MAX = 3, /* Invalid */
+};
+
static ssize_t net_slirp_send_packet(const void *pkt, size_t pkt_len,
void *opaque)
{
@@ -1165,14 +1172,23 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
char *end;
int port;
int target_port;
+ enum GFwdProtocols protocol = GFWD_MAX;
bool v6_only = false;
char addrstr[INET6_ADDRSTRLEN];
+ /*
+ * TODO(b/314977108): reimplement this parsing logic in following cl,
+ * as it became very long.
+ */
p = config_str;
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
goto fail_syntax;
}
- if (strcmp(buf, "tcp") && buf[0] != '\0') {
+ if (strcmp(buf, "tcp") == 0) {
+ protocol = GFWD_TCP;
+ } else if (strcmp(buf, "udp") == 0) {
+ protocol = GFWD_UDP;
+ } else if (buf[0] != '\0') {
goto fail_syntax;
}
@@ -1291,8 +1307,8 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
/*
* Parse target v6, we do not use char-socket backend, like the v4.
*/
- if (slirp_add_guestxfwd_new(s->slirp, &server_v6, port, &target_v6,
- target_port) < 0) {
+ if (slirp_add_guestxfwd(s->slirp, &server_v6, port, &target_v6,
+ target_port, protocol) < 0) {
goto fail_parsing;
}
}