Skip to content

Commit 4790771

Browse files
authored
Replace conversion with native implementations (#164)
1 parent c3e6219 commit 4790771

File tree

3 files changed

+24
-66
lines changed

3 files changed

+24
-66
lines changed

nanoFramework.System.Net/IPAddress.cs

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
using System.Net.NetworkInformation;
88
using System.Net.Sockets;
9+
using System.Runtime.CompilerServices;
910

1011
namespace System.Net
1112
{
@@ -133,38 +134,7 @@ public byte[] GetAddressBytes()
133134
/// </returns>
134135
public static IPAddress Parse(string ipString)
135136
{
136-
if (ipString == null)
137-
throw new ArgumentNullException();
138-
139-
ulong ipAddress = 0L;
140-
int lastIndex = 0;
141-
int shiftIndex = 0;
142-
ulong mask = 0x00000000000000FF;
143-
ulong octet = 0L;
144-
int length = ipString.Length;
145-
146-
for (int i = 0; i < length; ++i)
147-
{
148-
// Parse to '.' or end of IP address
149-
if (ipString[i] == '.' || i == length - 1)
150-
// If the IP starts with a '.'
151-
// or a segment is longer than 3 characters or shiftIndex > last bit position throw.
152-
if (i == 0 || i - lastIndex > 3 || shiftIndex > 24)
153-
{
154-
throw new ArgumentException();
155-
}
156-
else
157-
{
158-
i = i == length - 1 ? ++i : i;
159-
octet = ulong.Parse(ipString.Substring(lastIndex, i - lastIndex)) & 0x00000000000000FF;
160-
ipAddress = ipAddress + ((octet << shiftIndex) & mask);
161-
lastIndex = i + 1;
162-
shiftIndex = shiftIndex + 8;
163-
mask = (mask << 8);
164-
}
165-
}
166-
167-
return new IPAddress((long)ipAddress);
137+
return new IPAddress(NetworkInterface.IPAddressFromString(ipString));
168138
}
169139

170140
/// <summary>
@@ -179,13 +149,7 @@ public static IPAddress Parse(string ipString)
179149
/// </remarks>
180150
public override string ToString()
181151
{
182-
return ((byte)(Address)).ToString() +
183-
"." +
184-
((byte)(Address >> 8)).ToString() +
185-
"." +
186-
((byte)(Address >> 16)).ToString() +
187-
"." +
188-
((byte)(Address >> 24)).ToString();
152+
return IPv4ToString((uint)Address);
189153
}
190154

191155
/// <summary>
@@ -230,5 +194,12 @@ internal IPAddress Snapshot()
230194

231195
throw new NotSupportedException();
232196
}
197+
198+
#region native methods
199+
200+
[MethodImpl(MethodImplOptions.InternalCall)]
201+
internal static extern string IPv4ToString(uint ipv4Address);
202+
203+
#endregion
233204
}
234205
}

nanoFramework.System.Net/NetworkInformation/NetworkInterface.cs

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,6 @@ public static NetworkInterface[] GetAllNetworkInterfaces()
9696
return ifaces;
9797
}
9898

99-
private string IPv4AddressToString(uint ipv4Address)
100-
{
101-
return string.Concat(
102-
((ipv4Address >> 0) & 0xFF).ToString(),
103-
".",
104-
((ipv4Address >> 8) & 0xFF).ToString(),
105-
".",
106-
((ipv4Address >> 16) & 0xFF).ToString(),
107-
".",
108-
((ipv4Address >> 24) & 0xFF).ToString()
109-
);
110-
}
111-
11299
private string IPv6AddressToString(uint[] ipv6Address)
113100
{
114101
throw new NotImplementedException();
@@ -134,9 +121,9 @@ public void EnableStaticIPv4(string ipv4Address, string ipv4SubnetMask, string i
134121
{
135122
try
136123
{
137-
_ipv4Address = IPAddressFromString(ipv4Address);
138-
_ipv4NetMask = IPAddressFromString(ipv4SubnetMask);
139-
_ipv4GatewayAddress = IPAddressFromString(ipv4GatewayAddress);
124+
_ipv4Address = (uint)IPAddressFromString(ipv4Address);
125+
_ipv4NetMask = (uint)IPAddressFromString(ipv4SubnetMask);
126+
_ipv4GatewayAddress = (uint)IPAddressFromString(ipv4GatewayAddress);
140127
_startupAddressMode = AddressMode.Static;
141128

142129
UpdateConfiguration((int)UpdateOperation.Dhcp);
@@ -190,9 +177,9 @@ public void EnableStaticIP(string ipv4Address, string ipv4subnetMask, string ipv
190177
{
191178
throw new NotImplementedException();
192179

193-
_ipv4Address = IPAddressFromString(ipv4Address);
194-
_ipv4NetMask = IPAddressFromString(ipv4subnetMask);
195-
_ipv4GatewayAddress = IPAddressFromString(ipv4gatewayAddress);
180+
_ipv4Address = (uint)IPAddressFromString(ipv4Address);
181+
_ipv4NetMask = (uint)IPAddressFromString(ipv4subnetMask);
182+
_ipv4GatewayAddress = (uint)IPAddressFromString(ipv4gatewayAddress);
196183

197184
// FIXME
198185
// need to test this
@@ -242,7 +229,7 @@ public void EnableStaticIPv4Dns(string[] dnsAddresses)
242229
int iAddress = 0;
243230
for (int i = 0; i < dnsAddresses.Length; i++)
244231
{
245-
uint address = IPAddressFromString(dnsAddresses[i]);
232+
uint address = (uint)IPAddressFromString(dnsAddresses[i]);
246233

247234
addresses[iAddress] = address;
248235

@@ -351,23 +338,23 @@ public bool IsAutomaticDnsEnabled
351338
/// </summary>
352339
public string IPv4Address
353340
{
354-
get { return IPv4AddressToString(_ipv4Address); }
341+
get { return IPAddress.IPv4ToString(_ipv4Address); }
355342
}
356343

357344
/// <summary>
358345
/// Contains the gateway IPv4 address.
359346
/// </summary>
360347
public string IPv4GatewayAddress
361348
{
362-
get { return IPv4AddressToString(_ipv4GatewayAddress); }
349+
get { return IPAddress.IPv4ToString(_ipv4GatewayAddress); }
363350
}
364351

365352
/// <summary>
366353
/// Retrieves the network interface's IPv4 subnet mask.
367354
/// </summary>
368355
public string IPv4SubnetMask
369356
{
370-
get { return IPv4AddressToString(_ipv4NetMask); }
357+
get { return IPAddress.IPv4ToString(_ipv4NetMask); }
371358
}
372359

373360
/// <summary>
@@ -390,12 +377,12 @@ public string[] IPv4DnsAddresses
390377

391378
if (_ipv4dnsAddress1 != 0)
392379
{
393-
list.Add(IPv4AddressToString(_ipv4dnsAddress1));
380+
list.Add(IPAddress.IPv4ToString(_ipv4dnsAddress1));
394381
}
395382

396383
if (_ipv4dnsAddress2 != 0)
397384
{
398-
list.Add(IPv4AddressToString(_ipv4dnsAddress2));
385+
list.Add(IPAddress.IPv4ToString(_ipv4dnsAddress2));
399386
}
400387

401388
return (string[])list.ToArray(typeof(string));
@@ -489,7 +476,7 @@ public NetworkInterfaceType NetworkInterfaceType
489476
private extern void UpdateConfiguration(int updateType);
490477

491478
[MethodImpl(MethodImplOptions.InternalCall)]
492-
private static extern uint IPAddressFromString(string ipAddress);
479+
internal static extern long IPAddressFromString(string ipAddress);
493480

494481
#endregion
495482
}

nanoFramework.System.Net/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
////////////////////////////////////////////////////////////////
1414
// update this whenever the native assembly signature changes //
15-
[assembly: AssemblyNativeVersion("100.1.3.2")]
15+
[assembly: AssemblyNativeVersion("100.1.3.3")]
1616
////////////////////////////////////////////////////////////////
1717

1818
// Setting ComVisible to false makes the types in this assembly not visible

0 commit comments

Comments
 (0)