Skip to content

Commit 41ef88b

Browse files
feat: IPv6 support in UnityTransport [MTT-4801] (#2232)
* feat: IPv6 support in UnityTransport [MTT-4801] * Add PR number to CHANGELOG entry * Make standards happy
1 parent 326bda6 commit 41ef88b

File tree

5 files changed

+89
-29
lines changed

5 files changed

+89
-29
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1111

1212
### Added
1313

14+
- IPv6 is now supported for direct connections when using `UnityTransport`. (#2232)
1415
- Added WebSocket support when using UTP 2.0 with `UseWebSockets` property in the `UnityTransport` component of the `NetworkManager` allowing to pick WebSockets for communication. When building for WebGL, this selection happens automatically. (#2201)
1516

1617
### Changed

com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,12 @@ public struct ConnectionAddressData
296296

297297
private static NetworkEndpoint ParseNetworkEndpoint(string ip, ushort port)
298298
{
299-
if (!NetworkEndpoint.TryParse(ip, port, out var endpoint))
299+
NetworkEndpoint endpoint = default;
300+
301+
if (!NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv4) &&
302+
!NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv6))
300303
{
301304
Debug.LogError($"Invalid network endpoint: {ip}:{port}.");
302-
return default;
303305
}
304306

305307
return endpoint;
@@ -491,7 +493,8 @@ private bool ClientBindAndConnect()
491493

492494
InitDriver();
493495

494-
int result = m_Driver.Bind(NetworkEndpoint.AnyIpv4);
496+
var bindEndpoint = serverEndpoint.Family == NetworkFamily.Ipv6 ? NetworkEndpoint.AnyIpv6 : NetworkEndpoint.AnyIpv4;
497+
int result = m_Driver.Bind(bindEndpoint);
495498
if (result != 0)
496499
{
497500
Debug.LogError("Client failed to bind");
@@ -632,7 +635,7 @@ public void SetClientRelayData(string ipAddress, ushort port, byte[] allocationI
632635
/// <summary>
633636
/// Sets IP and Port information. This will be ignored if using the Unity Relay and you should call <see cref="SetRelayServerData"/>
634637
/// </summary>
635-
/// <param name="ipv4Address">The remote IP address</param>
638+
/// <param name="ipv4Address">The remote IP address (despite the name, can be an IPv6 address)</param>
636639
/// <param name="port">The remote port</param>
637640
/// <param name="listenAddress">The local listen address</param>
638641
public void SetConnectionData(string ipv4Address, ushort port, string listenAddress = null)

com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ namespace Unity.Netcode.EditorTests
77
{
88
public class UnityTransportTests
99
{
10-
// Check that starting a server doesn't immediately result in faulted tasks.
10+
// Check that starting an IPv4 server succeeds.
1111
[Test]
12-
public void UnityTransport_BasicInitServer()
12+
public void UnityTransport_BasicInitServer_IPv4()
1313
{
1414
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
1515
transport.Initialize();
@@ -19,9 +19,9 @@ public void UnityTransport_BasicInitServer()
1919
transport.Shutdown();
2020
}
2121

22-
// Check that starting a client doesn't immediately result in faulted tasks.
22+
// Check that starting an IPv4 client succeeds.
2323
[Test]
24-
public void UnityTransport_BasicInitClient()
24+
public void UnityTransport_BasicInitClient_IPv4()
2525
{
2626
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
2727
transport.Initialize();
@@ -31,6 +31,32 @@ public void UnityTransport_BasicInitClient()
3131
transport.Shutdown();
3232
}
3333

34+
// Check that starting an IPv6 server succeeds.
35+
[Test]
36+
public void UnityTransport_BasicInitServer_IPv6()
37+
{
38+
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
39+
transport.Initialize();
40+
transport.SetConnectionData("::1", 7777);
41+
42+
Assert.True(transport.StartServer());
43+
44+
transport.Shutdown();
45+
}
46+
47+
// Check that starting an IPv6 client succeeds.
48+
[Test]
49+
public void UnityTransport_BasicInitClient_IPv6()
50+
{
51+
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
52+
transport.Initialize();
53+
transport.SetConnectionData("::1", 7777);
54+
55+
Assert.True(transport.StartClient());
56+
57+
transport.Shutdown();
58+
}
59+
3460
// Check that we can't restart a server.
3561
[Test]
3662
public void UnityTransport_NoRestartServer()

com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections;
44
using System.Collections.Generic;
55
using Unity.Netcode.Transports.UTP;
6+
using Unity.Networking.Transport;
67
using UnityEngine;
78

89
namespace Unity.Netcode.RuntimeTests
@@ -37,15 +38,22 @@ public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List<TransportE
3738

3839
// Common code to initialize a UnityTransport that logs its events.
3940
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events,
40-
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0)
41+
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
4142
{
4243
var logger = new TransportEventLogger();
4344
events = logger.Events;
4445

4546
transport = new GameObject().AddComponent<UnityTransport>();
47+
4648
transport.OnTransportEvent += logger.HandleEvent;
4749
transport.MaxPayloadSize = maxPayloadSize;
4850
transport.MaxSendQueueSize = maxSendQueueSize;
51+
52+
if (family == NetworkFamily.Ipv6)
53+
{
54+
transport.SetConnectionData("::1", 7777);
55+
}
56+
4957
transport.Initialize();
5058
}
5159

com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Linq;
66
using System.Text;
77
using Unity.Netcode.Transports.UTP;
8+
using Unity.Networking.Transport;
89
using UnityEngine;
910
using UnityEngine.TestTools;
1011
using static Unity.Netcode.RuntimeTests.UnityTransportTestHelpers;
@@ -21,6 +22,15 @@ public class UnityTransportTests
2122
NetworkDelivery.Reliable
2223
};
2324

25+
private static readonly NetworkFamily[] k_NetworkFamiltyParameters =
26+
{
27+
NetworkFamily.Ipv4,
28+
#if !(UNITY_SWITCH || UNITY_PS4 || UNITY_PS5)
29+
// IPv6 is not supported on Switch, PS4, and PS5.
30+
NetworkFamily.Ipv6
31+
#endif
32+
};
33+
2434
private UnityTransport m_Server, m_Client1, m_Client2;
2535
private List<TransportEvent> m_ServerEvents, m_Client1Events, m_Client2Events;
2636

@@ -60,10 +70,12 @@ public IEnumerator Cleanup()
6070

6171
// Check if can make a simple data exchange.
6272
[UnityTest]
63-
public IEnumerator PingPong([ValueSource("k_DeliveryParameters")] NetworkDelivery delivery)
73+
public IEnumerator PingPong(
74+
[ValueSource("k_DeliveryParameters")] NetworkDelivery delivery,
75+
[ValueSource("k_NetworkFamiltyParameters")] NetworkFamily family)
6476
{
65-
InitializeTransport(out m_Server, out m_ServerEvents);
66-
InitializeTransport(out m_Client1, out m_Client1Events);
77+
InitializeTransport(out m_Server, out m_ServerEvents, family: family);
78+
InitializeTransport(out m_Client1, out m_Client1Events, family: family);
6779

6880
m_Server.StartServer();
6981
m_Client1.StartClient();
@@ -89,10 +101,12 @@ public IEnumerator PingPong([ValueSource("k_DeliveryParameters")] NetworkDeliver
89101

90102
// Check if can make a simple data exchange (both ways at a time).
91103
[UnityTest]
92-
public IEnumerator PingPongSimultaneous([ValueSource("k_DeliveryParameters")] NetworkDelivery delivery)
104+
public IEnumerator PingPongSimultaneous(
105+
[ValueSource("k_DeliveryParameters")] NetworkDelivery delivery,
106+
[ValueSource("k_NetworkFamiltyParameters")] NetworkFamily family)
93107
{
94-
InitializeTransport(out m_Server, out m_ServerEvents);
95-
InitializeTransport(out m_Client1, out m_Client1Events);
108+
InitializeTransport(out m_Server, out m_ServerEvents, family: family);
109+
InitializeTransport(out m_Client1, out m_Client1Events, family: family);
96110

97111
m_Server.StartServer();
98112
m_Client1.StartClient();
@@ -126,13 +140,15 @@ public IEnumerator PingPongSimultaneous([ValueSource("k_DeliveryParameters")] Ne
126140
// loopback traffic are too small for the amount of data sent in a single update here.
127141
[UnityTest]
128142
[UnityPlatform(exclude = new[] { RuntimePlatform.Switch, RuntimePlatform.PS4, RuntimePlatform.PS5 })]
129-
public IEnumerator SendMaximumPayloadSize([ValueSource("k_DeliveryParameters")] NetworkDelivery delivery)
143+
public IEnumerator SendMaximumPayloadSize(
144+
[ValueSource("k_DeliveryParameters")] NetworkDelivery delivery,
145+
[ValueSource("k_NetworkFamiltyParameters")] NetworkFamily family)
130146
{
131147
// We want something that's over the old limit of ~44KB for reliable payloads.
132148
var payloadSize = 64 * 1024;
133149

134-
InitializeTransport(out m_Server, out m_ServerEvents, payloadSize);
135-
InitializeTransport(out m_Client1, out m_Client1Events, payloadSize);
150+
InitializeTransport(out m_Server, out m_ServerEvents, payloadSize, family: family);
151+
InitializeTransport(out m_Client1, out m_Client1Events, payloadSize, family: family);
136152

137153
m_Server.StartServer();
138154
m_Client1.StartClient();
@@ -164,10 +180,12 @@ public IEnumerator SendMaximumPayloadSize([ValueSource("k_DeliveryParameters")]
164180

165181
// Check making multiple sends to a client in a single frame.
166182
[UnityTest]
167-
public IEnumerator MultipleSendsSingleFrame([ValueSource("k_DeliveryParameters")] NetworkDelivery delivery)
183+
public IEnumerator MultipleSendsSingleFrame(
184+
[ValueSource("k_DeliveryParameters")] NetworkDelivery delivery,
185+
[ValueSource("k_NetworkFamiltyParameters")] NetworkFamily family)
168186
{
169-
InitializeTransport(out m_Server, out m_ServerEvents);
170-
InitializeTransport(out m_Client1, out m_Client1Events);
187+
InitializeTransport(out m_Server, out m_ServerEvents, family: family);
188+
InitializeTransport(out m_Client1, out m_Client1Events, family: family);
171189

172190
m_Server.StartServer();
173191
m_Client1.StartClient();
@@ -193,11 +211,13 @@ public IEnumerator MultipleSendsSingleFrame([ValueSource("k_DeliveryParameters")
193211

194212
// Check sending data to multiple clients.
195213
[UnityTest]
196-
public IEnumerator SendMultipleClients([ValueSource("k_DeliveryParameters")] NetworkDelivery delivery)
214+
public IEnumerator SendMultipleClients(
215+
[ValueSource("k_DeliveryParameters")] NetworkDelivery delivery,
216+
[ValueSource("k_NetworkFamiltyParameters")] NetworkFamily family)
197217
{
198-
InitializeTransport(out m_Server, out m_ServerEvents);
199-
InitializeTransport(out m_Client1, out m_Client1Events);
200-
InitializeTransport(out m_Client2, out m_Client2Events);
218+
InitializeTransport(out m_Server, out m_ServerEvents, family: family);
219+
InitializeTransport(out m_Client1, out m_Client1Events, family: family);
220+
InitializeTransport(out m_Client2, out m_Client2Events, family: family);
201221

202222
m_Server.StartServer();
203223
m_Client1.StartClient();
@@ -234,11 +254,13 @@ public IEnumerator SendMultipleClients([ValueSource("k_DeliveryParameters")] Net
234254

235255
// Check receiving data from multiple clients.
236256
[UnityTest]
237-
public IEnumerator ReceiveMultipleClients([ValueSource("k_DeliveryParameters")] NetworkDelivery delivery)
257+
public IEnumerator ReceiveMultipleClients(
258+
[ValueSource("k_DeliveryParameters")] NetworkDelivery delivery,
259+
[ValueSource("k_NetworkFamiltyParameters")] NetworkFamily family)
238260
{
239-
InitializeTransport(out m_Server, out m_ServerEvents);
240-
InitializeTransport(out m_Client1, out m_Client1Events);
241-
InitializeTransport(out m_Client2, out m_Client2Events);
261+
InitializeTransport(out m_Server, out m_ServerEvents, family: family);
262+
InitializeTransport(out m_Client1, out m_Client1Events, family: family);
263+
InitializeTransport(out m_Client2, out m_Client2Events, family: family);
242264

243265
m_Server.StartServer();
244266
m_Client1.StartClient();

0 commit comments

Comments
 (0)