Skip to content

Commit 3529db7

Browse files
authored
Subnetting / Supernetting (#103)
* Subnetting added * Allow only ipv6 addresses with cidr, watermark changed * Supernetting added * Ask user when calculating more than 65535 subnets, ui improvements
1 parent 83b94d3 commit 3529db7

26 files changed

+881
-278
lines changed

Source/NETworkManager/Converters/ValidateSubnetCalculatorIPv4SplitterConverter.cs renamed to Source/NETworkManager/Converters/ValidateSubnetCalculatorSubnettingConverter.cs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,54 @@
66

77
namespace NETworkManager.Converters
88
{
9-
public sealed class ValidateSubnetCalculatorIPv4SplitterConverter : IMultiValueConverter
9+
public sealed class ValidateSubnetCalculatorSubnettingConverter : IMultiValueConverter
1010
{
1111
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
1212
{
1313
// if Validation.HasError is true...
1414
if ((bool)values[0] || (bool)values[1])
1515
return false;
16-
16+
1717
string subnet = values[2] as string;
1818
string newSubnetmaskOrCIDR = values[3] as string;
1919

2020
// Catch null exceptions...
2121
if (string.IsNullOrEmpty(subnet) || string.IsNullOrEmpty(newSubnetmaskOrCIDR))
2222
return false;
23-
23+
2424
// Get the cidr to compare...
25-
string subnetmaskOrCIDR = subnet.Split('/')[1];
25+
string[] subnetData = subnet.Split('/');
26+
27+
IPAddress ipAddress = IPAddress.Parse(subnetData[0]);
28+
string subnetmaskOrCIDR = subnetData[1];
2629
int cidr;
2730

28-
if (subnetmaskOrCIDR.Length < 3)
29-
cidr = int.Parse(subnetmaskOrCIDR);
31+
if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
32+
{
33+
if (subnetmaskOrCIDR.Length < 3)
34+
cidr = int.Parse(subnetmaskOrCIDR);
35+
else
36+
cidr = Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(subnetmaskOrCIDR));
37+
}
3038
else
31-
cidr = Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(subnetmaskOrCIDR));
32-
39+
{
40+
cidr = int.Parse(subnetmaskOrCIDR);
41+
}
42+
3343
newSubnetmaskOrCIDR = newSubnetmaskOrCIDR.TrimStart('/');
3444
int newCidr;
3545

36-
if (newSubnetmaskOrCIDR.Length < 3)
37-
newCidr = int.Parse(newSubnetmaskOrCIDR);
46+
if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
47+
{
48+
if (newSubnetmaskOrCIDR.Length < 3)
49+
newCidr = int.Parse(newSubnetmaskOrCIDR);
50+
else
51+
newCidr = Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(newSubnetmaskOrCIDR));
52+
}
3853
else
39-
newCidr = Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(newSubnetmaskOrCIDR));
54+
{
55+
newCidr = int.Parse(newSubnetmaskOrCIDR);
56+
}
4057

4158
// Compare
4259
return newCidr > cidr;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Net;
4+
using System.Windows.Data;
5+
6+
namespace NETworkManager.Converters
7+
{
8+
public sealed class ValidateSubnetCalculatorSupernettingConverter : IMultiValueConverter
9+
{
10+
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
11+
{
12+
// if Validation.HasError is true...
13+
if ((bool)values[0] || (bool)values[1])
14+
return false;
15+
16+
string subnet1 = values[2] as string;
17+
string subnet2 = values[3] as string;
18+
19+
// Catch null exceptions...
20+
if (string.IsNullOrEmpty(subnet1) || string.IsNullOrEmpty(subnet2))
21+
return false;
22+
23+
// Compare...
24+
string[] subnet1data = subnet1.Split('/');
25+
string[] subnet2data = subnet2.Split('/');
26+
27+
IPAddress subnet1IP = IPAddress.Parse(subnet1data[0]);
28+
IPAddress subnet2IP = IPAddress.Parse(subnet2data[0]);
29+
30+
if (subnet1IP.AddressFamily == subnet2IP.AddressFamily)
31+
return subnet1data[1] == subnet2data[1];
32+
33+
return false;
34+
}
35+
36+
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
37+
{
38+
throw new NotImplementedException();
39+
}
40+
}
41+
}

Source/NETworkManager/Models/Network/Subnet.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class Subnet
1111
{
1212
#region Static methods
1313
// Source: https://blogs.msdn.microsoft.com/knom/2008/12/31/ip-address-calculations-with-c-subnetmasks-networks/
14+
[Obsolete("Use IPNetwork for calculation...")]
1415
public static IPAddress GetIPv4NetworkAddress(IPAddress ipv4Address, IPAddress subnetmask)
1516
{
1617
byte[] ipv4AdressBytes = ipv4Address.GetAddressBytes();
@@ -25,6 +26,7 @@ public static IPAddress GetIPv4NetworkAddress(IPAddress ipv4Address, IPAddress s
2526
}
2627

2728
// Source: https://blogs.msdn.microsoft.com/knom/2008/12/31/ip-address-calculations-with-c-subnetmasks-networks/
29+
[Obsolete("Use IPNetwork for calculation...")]
2830
public static IPAddress GetIPv4Broadcast(IPAddress ipv4Address, IPAddress subnetmask)
2931
{
3032
byte[] ipv4AddressBytes = ipv4Address.GetAddressBytes();
@@ -38,6 +40,7 @@ public static IPAddress GetIPv4Broadcast(IPAddress ipv4Address, IPAddress subnet
3840
return new IPAddress(broadcastBytes);
3941
}
4042

43+
[Obsolete("Use IPNetwork for calculation...")]
4144
public static SubnetInfo CalculateIPv4Subnet(IPAddress ipv4Address, IPAddress subnetmask)
4245
{
4346
IPAddress networkAddress = GetIPv4NetworkAddress(ipv4Address, subnetmask);
@@ -78,11 +81,13 @@ public static SubnetInfo CalculateIPv4Subnet(IPAddress ipv4Address, IPAddress su
7881
#endregion
7982

8083
#region Methods
84+
[Obsolete("Use IPNetwork for calculation...")]
8185
public static Task<SubnetInfo[]> SplitIPv4SubnetAsync(IPAddress ipv4Address, IPAddress subnetmask, IPAddress newSubnetmask, CancellationToken cancellationToken)
8286
{
8387
return Task.Run(() => SplitIPv4Subnet(ipv4Address, subnetmask, newSubnetmask, cancellationToken), cancellationToken);
8488
}
8589

90+
[Obsolete("Use IPNetwork for calculation...")]
8691
public static SubnetInfo[] SplitIPv4Subnet(IPAddress ipv4Address, IPAddress subnetmask, IPAddress newSubnetmask, CancellationToken cancellationToken)
8792
{
8893
ConcurrentBag<SubnetInfo> bag = new ConcurrentBag<SubnetInfo>();

Source/NETworkManager/Models/Settings/SettingsInfo.cs

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2174,49 +2174,79 @@ public bool HTTPHeaders_ShowStatistics
21742174

21752175
#region Subnet Calculator
21762176
#region Calculator
2177-
private ObservableCollection<string> _subnetCalculator_IPv4Calculator_SubnetHistory = new ObservableCollection<string>();
2178-
public ObservableCollection<string> SubnetCalculator_IPv4Calculator_SubnetHistory
2177+
private ObservableCollection<string> _subnetCalculator_Calculator_SubnetHistory = new ObservableCollection<string>();
2178+
public ObservableCollection<string> SubnetCalculator_Calculator_SubnetHistory
21792179
{
2180-
get { return _subnetCalculator_IPv4Calculator_SubnetHistory; }
2180+
get { return _subnetCalculator_Calculator_SubnetHistory; }
21812181
set
21822182
{
2183-
if (value == _subnetCalculator_IPv4Calculator_SubnetHistory)
2183+
if (value == _subnetCalculator_Calculator_SubnetHistory)
21842184
return;
21852185

2186-
_subnetCalculator_IPv4Calculator_SubnetHistory = value;
2186+
_subnetCalculator_Calculator_SubnetHistory = value;
21872187
SettingsChanged = true;
21882188
}
21892189
}
21902190
#endregion
21912191

2192-
#region Splitter
2193-
private ObservableCollection<string> _subnetCalculator_IPv4Splitter_SubnetHistory = new ObservableCollection<string>();
2194-
public ObservableCollection<string> SubnetCalculator_IPv4Splitter_SubnetHistory
2192+
#region Subnetting
2193+
private ObservableCollection<string> _subnetCalculator_Subnetting_SubnetHistory = new ObservableCollection<string>();
2194+
public ObservableCollection<string> SubnetCalculator_Subnetting_SubnetHistory
21952195
{
2196-
get { return _subnetCalculator_IPv4Splitter_SubnetHistory; }
2196+
get { return _subnetCalculator_Subnetting_SubnetHistory; }
21972197
set
21982198
{
2199-
if (value == _subnetCalculator_IPv4Splitter_SubnetHistory)
2199+
if (value == _subnetCalculator_Subnetting_SubnetHistory)
22002200
return;
22012201

2202-
_subnetCalculator_IPv4Splitter_SubnetHistory = value;
2202+
_subnetCalculator_Subnetting_SubnetHistory = value;
22032203
SettingsChanged = true;
22042204
}
22052205
}
22062206

2207-
private ObservableCollection<string> _subnetCalculator_IPv4Splitter_NewSubnetmaskOrCIDRHistory = new ObservableCollection<string>();
2208-
public ObservableCollection<string> SubnetCalculator_IPv4Splitter_NewSubnetmaskOrCIDRHistory
2207+
private ObservableCollection<string> _subnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory = new ObservableCollection<string>();
2208+
public ObservableCollection<string> SubnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory
22092209
{
2210-
get { return _subnetCalculator_IPv4Splitter_NewSubnetmaskOrCIDRHistory; }
2210+
get { return _subnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory; }
22112211
set
22122212
{
2213-
if (value == _subnetCalculator_IPv4Splitter_NewSubnetmaskOrCIDRHistory)
2213+
if (value == _subnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory)
22142214
return;
22152215

2216-
_subnetCalculator_IPv4Splitter_NewSubnetmaskOrCIDRHistory = value;
2216+
_subnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory = value;
22172217
SettingsChanged = true;
22182218
}
22192219
}
2220+
#endregion
2221+
private ObservableCollection<string> _subnetCalculator_Supernetting_Subnet1 = new ObservableCollection<string>();
2222+
public ObservableCollection<string> SubnetCalculator_Supernetting_Subnet1
2223+
{
2224+
get { return _subnetCalculator_Supernetting_Subnet1; }
2225+
set
2226+
{
2227+
if (value == _subnetCalculator_Supernetting_Subnet1)
2228+
return;
2229+
2230+
_subnetCalculator_Supernetting_Subnet1 = value;
2231+
SettingsChanged = true;
2232+
}
2233+
}
2234+
2235+
private ObservableCollection<string> _subnetCalculator_Supernetting_Subnet2 = new ObservableCollection<string>();
2236+
public ObservableCollection<string> SubnetCalculator_Supernetting_Subnet2
2237+
{
2238+
get { return _subnetCalculator_Supernetting_Subnet2; }
2239+
set
2240+
{
2241+
if (value == _subnetCalculator_Supernetting_Subnet2)
2242+
return;
2243+
2244+
_subnetCalculator_Supernetting_Subnet2 = value;
2245+
SettingsChanged = true;
2246+
}
2247+
}
2248+
#region Supernetting
2249+
22202250
#endregion
22212251
#endregion
22222252

Source/NETworkManager/NETworkManager.csproj

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@
233233
<Compile Include="Converters\TimestampToStringConverter.cs" />
234234
<Compile Include="Converters\NullableDateTimeToStringConverter.cs" />
235235
<Compile Include="Converters\ValidateNetworkInterfaceProfileConverter.cs" />
236-
<Compile Include="Converters\ValidateSubnetCalculatorIPv4SplitterConverter.cs" />
236+
<Compile Include="Converters\ValidateSubnetCalculatorSupernettingConverter.cs" />
237+
<Compile Include="Converters\ValidateSubnetCalculatorSubnettingConverter.cs" />
237238
<Compile Include="Models\Documentation\CommunityManager.cs" />
238239
<Compile Include="Models\Documentation\ResourceInfo.cs" />
239240
<Compile Include="Models\Documentation\ResourceManager.cs" />
@@ -280,6 +281,7 @@
280281
<Compile Include="Models\Settings\RemoteDesktopSessionInfo.cs" />
281282
<Compile Include="Models\Update\UpdateAvailableArgs.cs" />
282283
<Compile Include="Models\Update\Updater.cs" />
284+
<Compile Include="Validators\IPv4IPv6SubnetmaskOrCIDRValidator.cs" />
283285
<Compile Include="Validators\NoSpacesValidator.cs" />
284286
<Compile Include="Validators\BaudValidator.cs" />
285287
<Compile Include="Validators\PrivacyAESValidator.cs" />
@@ -288,7 +290,7 @@
288290
<Compile Include="Validators\MultipleIPAddressesValidator.cs" />
289291
<Compile Include="Validators\MultipleHostsValidator.cs" />
290292
<Compile Include="Validators\HttpAndHttpsUriValidator.cs" />
291-
<Compile Include="Validators\SubnetCalculatorSubnetValidator.cs" />
293+
<Compile Include="Validators\IPv4IPv6SubnetValidator.cs" />
292294
<Compile Include="ViewModels\ListenersViewModel.cs" />
293295
<Compile Include="ViewModels\ConnectionsViewModel.cs" />
294296
<Compile Include="ViewModels\SubnetCalculatorHostViewModel.cs" />
@@ -298,6 +300,7 @@
298300
<Compile Include="ViewModels\DNSLookupHostViewModel.cs" />
299301
<Compile Include="ViewModels\HTTPHeadersHostViewModel.cs" />
300302
<Compile Include="ViewModels\SNMPHostViewModel.cs" />
303+
<Compile Include="ViewModels\SubnetCalculatorSupernettingViewModel.cs" />
301304
<Compile Include="ViewModels\TracerouteProfileViewModel.cs" />
302305
<Compile Include="ViewModels\TracerouteHostViewModel.cs" />
303306
<Compile Include="ViewModels\PuTTYHostViewModel.cs" />
@@ -333,10 +336,10 @@
333336
<Compile Include="Models\Settings\PortScannerProfileManager.cs" />
334337
<Compile Include="Validators\IPAddressValidator.cs" />
335338
<Compile Include="Validators\EmptyOrIPv4AddressValidator.cs" />
336-
<Compile Include="Validators\SubnetValidator.cs" />
339+
<Compile Include="Validators\IPv4SubnetValidator.cs" />
337340
<Compile Include="Validators\OpacityTextboxValidator.cs" />
338341
<Compile Include="ViewModels\DNSLookupViewModel.cs" />
339-
<Compile Include="ViewModels\SubnetCalculatorIPv4SplitterViewModel.cs" />
342+
<Compile Include="ViewModels\SubnetCalculatorSubnettingViewModel.cs" />
340343
<Compile Include="ViewModels\LookupOUILookupViewModel.cs" />
341344
<Compile Include="ViewModels\RemoteDesktopHostViewModel.cs" />
342345
<Compile Include="ViewModels\CommandLineHelpViewModel.cs" />
@@ -372,6 +375,9 @@
372375
<Compile Include="Views\SNMPHostView.xaml.cs">
373376
<DependentUpon>SNMPHostView.xaml</DependentUpon>
374377
</Compile>
378+
<Compile Include="Views\SubnetCalculatorSupernettingView.xaml.cs">
379+
<DependentUpon>SubnetCalculatorSupernettingView.xaml</DependentUpon>
380+
</Compile>
375381
<Compile Include="Views\TracerouteProfileDialog.xaml.cs">
376382
<DependentUpon>TracerouteProfileDialog.xaml</DependentUpon>
377383
</Compile>
@@ -399,8 +405,8 @@
399405
<Compile Include="Views\ARPTableView.xaml.cs">
400406
<DependentUpon>ARPTableView.xaml</DependentUpon>
401407
</Compile>
402-
<Compile Include="Views\SubnetCalculatorIPv4SplitterView.xaml.cs">
403-
<DependentUpon>SubnetCalculatorIPv4SplitterView.xaml</DependentUpon>
408+
<Compile Include="Views\SubnetCalculatorSubnettingView.xaml.cs">
409+
<DependentUpon>SubnetCalculatorSubnettingView.xaml</DependentUpon>
404410
</Compile>
405411
<Compile Include="Views\SubnetCalculatorHostView.xaml.cs">
406412
<DependentUpon>SubnetCalculatorHostView.xaml</DependentUpon>
@@ -650,6 +656,10 @@
650656
<Generator>MSBuild:Compile</Generator>
651657
<SubType>Designer</SubType>
652658
</Page>
659+
<Page Include="Views\SubnetCalculatorSupernettingView.xaml">
660+
<Generator>MSBuild:Compile</Generator>
661+
<SubType>Designer</SubType>
662+
</Page>
653663
<Page Include="Views\TracerouteProfileDialog.xaml">
654664
<Generator>MSBuild:Compile</Generator>
655665
<SubType>Designer</SubType>
@@ -686,7 +696,7 @@
686696
<Generator>MSBuild:Compile</Generator>
687697
<SubType>Designer</SubType>
688698
</Page>
689-
<Page Include="Views\SubnetCalculatorIPv4SplitterView.xaml">
699+
<Page Include="Views\SubnetCalculatorSubnettingView.xaml">
690700
<Generator>MSBuild:Compile</Generator>
691701
<SubType>Designer</SubType>
692702
</Page>
@@ -1086,7 +1096,7 @@
10861096
</Compile>
10871097
<Compile Include="Validators\SettingsFolderExistsValidator.cs" />
10881098
<Compile Include="Validators\SubnetmaskValidator.cs" />
1089-
<Compile Include="Validators\SubnetmaskOrCIDRValidator.cs" />
1099+
<Compile Include="Validators\IPv4SubnetmaskOrCIDRValidator.cs" />
10901100
<Compile Include="Validators\IPv4AddressValidator.cs" />
10911101
<Compile Include="Validators\EmptyValidator.cs" />
10921102
<Compile Include="Validators\PortValidator.cs" />

0 commit comments

Comments
 (0)