sockets: Support multipath TCP
Multipath TCP allows combining multiple interfaces/routes into a single socket, with very little work for the user/admin. It's enabled by 'mptcp' on most socket addresses: ./qemu-system-x86_64 -nographic -incoming tcp:0:4444,mptcp Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Message-Id: <20210421112834.107651-6-dgilbert@redhat.com> Acked-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
a59136f3b1
commit
8bd1078aeb
@ -122,6 +122,10 @@ static int qio_dns_resolver_lookup_sync_inet(QIODNSResolver *resolver,
|
|||||||
.ipv4 = iaddr->ipv4,
|
.ipv4 = iaddr->ipv4,
|
||||||
.has_ipv6 = iaddr->has_ipv6,
|
.has_ipv6 = iaddr->has_ipv6,
|
||||||
.ipv6 = iaddr->ipv6,
|
.ipv6 = iaddr->ipv6,
|
||||||
|
#ifdef IPPROTO_MPTCP
|
||||||
|
.has_mptcp = iaddr->has_mptcp,
|
||||||
|
.mptcp = iaddr->mptcp,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
(*addrs)[i] = newaddr;
|
(*addrs)[i] = newaddr;
|
||||||
|
@ -57,6 +57,8 @@
|
|||||||
# @keep-alive: enable keep-alive when connecting to this socket. Not supported
|
# @keep-alive: enable keep-alive when connecting to this socket. Not supported
|
||||||
# for passive sockets. (Since 4.2)
|
# for passive sockets. (Since 4.2)
|
||||||
#
|
#
|
||||||
|
# @mptcp: enable multi-path TCP. (Since 6.1)
|
||||||
|
#
|
||||||
# Since: 1.3
|
# Since: 1.3
|
||||||
##
|
##
|
||||||
{ 'struct': 'InetSocketAddress',
|
{ 'struct': 'InetSocketAddress',
|
||||||
@ -66,7 +68,8 @@
|
|||||||
'*to': 'uint16',
|
'*to': 'uint16',
|
||||||
'*ipv4': 'bool',
|
'*ipv4': 'bool',
|
||||||
'*ipv6': 'bool',
|
'*ipv6': 'bool',
|
||||||
'*keep-alive': 'bool' } }
|
'*keep-alive': 'bool',
|
||||||
|
'*mptcp': { 'type': 'bool', 'if': 'defined(IPPROTO_MPTCP)' } } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @UnixSocketAddress:
|
# @UnixSocketAddress:
|
||||||
|
@ -278,6 +278,11 @@ static int inet_listen_saddr(InetSocketAddress *saddr,
|
|||||||
|
|
||||||
/* create socket + bind/listen */
|
/* create socket + bind/listen */
|
||||||
for (e = res; e != NULL; e = e->ai_next) {
|
for (e = res; e != NULL; e = e->ai_next) {
|
||||||
|
#ifdef IPPROTO_MPTCP
|
||||||
|
if (saddr->has_mptcp && saddr->mptcp) {
|
||||||
|
e->ai_protocol = IPPROTO_MPTCP;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
|
getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
|
||||||
uaddr,INET6_ADDRSTRLEN,uport,32,
|
uaddr,INET6_ADDRSTRLEN,uport,32,
|
||||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
NI_NUMERICHOST | NI_NUMERICSERV);
|
||||||
@ -456,6 +461,13 @@ int inet_connect_saddr(InetSocketAddress *saddr, Error **errp)
|
|||||||
for (e = res; e != NULL; e = e->ai_next) {
|
for (e = res; e != NULL; e = e->ai_next) {
|
||||||
error_free(local_err);
|
error_free(local_err);
|
||||||
local_err = NULL;
|
local_err = NULL;
|
||||||
|
|
||||||
|
#ifdef IPPROTO_MPTCP
|
||||||
|
if (saddr->has_mptcp && saddr->mptcp) {
|
||||||
|
e->ai_protocol = IPPROTO_MPTCP;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
sock = inet_connect_addr(saddr, e, &local_err);
|
sock = inet_connect_addr(saddr, e, &local_err);
|
||||||
if (sock >= 0) {
|
if (sock >= 0) {
|
||||||
break;
|
break;
|
||||||
@ -687,6 +699,17 @@ int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
|
|||||||
}
|
}
|
||||||
addr->has_keep_alive = true;
|
addr->has_keep_alive = true;
|
||||||
}
|
}
|
||||||
|
#ifdef IPPROTO_MPTCP
|
||||||
|
begin = strstr(optstr, ",mptcp");
|
||||||
|
if (begin) {
|
||||||
|
if (inet_parse_flag("mptcp", begin + strlen(",mptcp"),
|
||||||
|
&addr->mptcp, errp) < 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
addr->has_mptcp = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user