Skip to content

Commit c82224e

Browse files
committed
Split subnet added
1 parent 7604aed commit c82224e

4 files changed

Lines changed: 60 additions & 9 deletions

File tree

Source/NETworkManager/Models/Network/Subnet.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using NETworkManager.Helpers;
2+
using System;
23
using System.Collections.Generic;
34
using System.Net;
45

@@ -26,11 +27,40 @@ public static SubnetInfo CalculateIPv4Subnet(IPAddress ipv4Address, IPAddress su
2627
};
2728
}
2829

29-
public static List<SubnetInfo> SplitIPv4Subnet(IPAddress ipv45Address, IPAddress subnetmask, IPAddress newSubnetmask)
30+
public static List<SubnetInfo> SplitIPv4Subnet(IPAddress ipv4Address, IPAddress subnetmask, IPAddress newSubnetmask)
3031
{
3132
List<SubnetInfo> list = new List<SubnetInfo>();
3233

34+
// Calculate the current subnet
35+
SubnetInfo subnetInfo = CalculateIPv4Subnet(ipv4Address, subnetmask);
3336

37+
int newCidr = SubnetmaskHelper.ConvertSubnetmaskToCidr(newSubnetmask);
38+
39+
// Get new HostBits based on SubnetBits (CIDR) // Hostbits (32 - /24 = 8 -> 00000000000000000000000011111111)
40+
string newHostBits = (new string('1', (32 - newCidr))).PadLeft(32, '0');
41+
42+
// Convert Bits to Int64, add +1 to get all available IPs
43+
int newTotalIPs = Convert.ToInt32(newHostBits, 2) + 1;
44+
45+
// Get bytes...
46+
byte[] networkAddressBytes = subnetInfo.NetworkAddress.GetAddressBytes();
47+
48+
// Get int...
49+
if (BitConverter.IsLittleEndian)
50+
Array.Reverse(networkAddressBytes);
51+
52+
int networkAddress = BitConverter.ToInt32(networkAddressBytes, 0);
53+
54+
// Calculate each new subnet...
55+
for (int i = 0; i < subnetInfo.TotalIPs; i += newTotalIPs)
56+
{
57+
byte[] newNetworkAddressBytes = BitConverter.GetBytes(networkAddress + i);
58+
59+
if (BitConverter.IsLittleEndian)
60+
Array.Reverse(newNetworkAddressBytes);
61+
62+
list.Add(CalculateIPv4Subnet(new IPAddress(newNetworkAddressBytes), newSubnetmask));
63+
}
3464

3565
return list;
3666
}

Source/NETworkManager/NETworkManager.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,6 @@
181181
<Compile Include="Validators\SubnetValidator.cs" />
182182
<Compile Include="Validators\OpacityTextboxValidator.cs" />
183183
<Compile Include="ViewModels\Applications\DNSLookupViewModel.cs" />
184-
<Compile Include="ViewModels\Applications\ObserverableCollection.cs" />
185184
<Compile Include="ViewModels\Applications\SubnetCalculatorIPv4SplitterViewModel.cs" />
186185
<Compile Include="ViewModels\Applications\WikiOUILookupViewModel.cs" />
187186
<Compile Include="ViewModels\Help\HelpCommandLineViewModel.cs" />

Source/NETworkManager/ViewModels/Applications/SubnetCalculatorIPv4SplitterViewModel.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Net;
55
using System.Windows.Input;
66
using NETworkManager.Helpers;
7-
using System.Windows;
87
using System.Collections.ObjectModel;
98

109
namespace NETworkManager.ViewModels.Applications
@@ -118,6 +117,8 @@ public ICommand SplitIPv4SubnetCommand
118117
#region Methods
119118
private void SplitIPv4SubnetAction()
120119
{
120+
SplitResult.Clear();
121+
121122
string[] subnet = Subnet.Trim().Split('/');
122123

123124
string subnetmask = subnet[1];
@@ -126,8 +127,13 @@ private void SplitIPv4SubnetAction()
126127
if (subnetmask.Length < 3)
127128
subnetmask = Subnetmask.GetFromCidr(int.Parse(subnet[1])).Subnetmask;
128129

129-
SubnetInfo subnetInfo = Models.Network.Subnet.CalculateIPv4Subnet(IPAddress.Parse(subnet[0]), IPAddress.Parse(subnetmask));
130-
130+
string newSubnetmask = NewSubnetmaskOrCIDR.TrimStart('/');
131+
132+
if (newSubnetmask.Length < 3)
133+
newSubnetmask = Subnetmask.GetFromCidr(int.Parse(newSubnetmask)).Subnetmask;
134+
135+
Models.Network.Subnet.SplitIPv4Subnet(IPAddress.Parse(subnet[0]), IPAddress.Parse(subnetmask), IPAddress.Parse(newSubnetmask)).ForEach(x => SplitResult.Add(x));
136+
131137
SubnetHistory = new List<string>(HistoryListHelper.Modify(SubnetHistory, Subnet, SettingsManager.Current.Application_HistoryListEntries));
132138
NewSubnetmaskOrCIDRHistory = new List<string>(HistoryListHelper.Modify(NewSubnetmaskOrCIDRHistory, NewSubnetmaskOrCIDR, SettingsManager.Current.Application_HistoryListEntries));
133139
}

Source/NETworkManager/Views/Applications/SubnetCalculatorIPv4SplitterView.xaml

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@
1616
</UserControl.Resources>
1717
<Grid>
1818
<Grid.RowDefinitions>
19+
<RowDefinition Height="Auto" />
1920
<RowDefinition Height="Auto" />
2021
<RowDefinition Height="Auto" />
2122
<RowDefinition Height="*" />
2223
</Grid.RowDefinitions>
23-
<StackPanel Grid.Row="0" Margin="0,0,0,20">
24-
<TextBlock Style="{StaticResource HeaderTextBlock}" Text="{DynamicResource String_Header_Subnet}" />
24+
<TextBlock Grid.Row="0" Style="{StaticResource HeaderTextBlock}" Text="{DynamicResource String_Header_Subnet}" />
25+
<StackPanel Grid.Row="1" Margin="0,0,0,20">
2526
<Grid Margin="0,0,0,10">
2627
<Grid.ColumnDefinitions>
2728
<ColumnDefinition Width="Auto" />
@@ -45,7 +46,7 @@
4546
</ComboBox.Text>
4647
</ComboBox>
4748
<TextBlock Grid.Column="0" Grid.Row="2" Style="{StaticResource CenterTextBlock}" Text="{DynamicResource String_NewSubnetmaskOrCIDR}" />
48-
<ComboBox Grid.Column="2" Grid.Row="2" x:Name="cbNewSubnetmaskOrCIDR" ItemsSource="{Binding SubnetHistory}" mah:TextBoxHelper.Watermark="{DynamicResource String_Watermark_ExampleSubnetmaskOrCIDR}" Validation.ErrorTemplate="{StaticResource DefaultErrorTemplate}" Style="{StaticResource HistoryComboBox}">
49+
<ComboBox Grid.Column="2" Grid.Row="2" x:Name="cbNewSubnetmaskOrCIDR" ItemsSource="{Binding NewSubnetmaskOrCIDRHistory}" mah:TextBoxHelper.Watermark="{DynamicResource String_Watermark_ExampleSubnetmaskOrCIDR}" Validation.ErrorTemplate="{StaticResource DefaultErrorTemplate}" Style="{StaticResource HistoryComboBox}">
4950
<ComboBox.Text>
5051
<Binding Path="NewSubnetmaskOrCIDR" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
5152
<Binding.ValidationRules>
@@ -90,6 +91,21 @@
9091
</Button.Style>
9192
</Button>
9293
</StackPanel>
93-
<TextBlock Grid.Row="1" Style="{StaticResource HeaderTextBlock}" Text="{DynamicResource String_Header_Result}" />
94+
<TextBlock Grid.Row="2" Style="{StaticResource HeaderTextBlock}" Text="{DynamicResource String_Header_Result}" />
95+
<DataGrid Grid.Row="3" FontSize="14" mah:ControlsHelper.ContentCharacterCasing="Normal" ItemsSource="{Binding SplitResult}" CanUserResizeColumns="False" VerticalScrollBarVisibility="Auto" AutoGenerateColumns="False" IsReadOnly="True" CanUserSortColumns="False">
96+
<DataGrid.Resources>
97+
<Style TargetType="{x:Type ScrollBar}" BasedOn="{StaticResource DataGridScrollBar}" />
98+
</DataGrid.Resources>
99+
<DataGrid.Columns>
100+
<DataGridTextColumn Header="Network Address" Binding="{Binding NetworkAddress}" MinWidth="150" />
101+
<DataGridTextColumn Header="Broadcast" Binding="{Binding Broadcast}" MinWidth="150" />
102+
<DataGridTextColumn Header="Total IPs" Binding="{Binding TotalIPs}" MinWidth="80" />
103+
<DataGridTextColumn Header="Subnetmask" Binding="{Binding Subnetmask}" MinWidth="150" />
104+
<DataGridTextColumn Header="CIDR" Binding="{Binding CIDR}" MinWidth="80" />
105+
<DataGridTextColumn Header="Host First IP" Binding="{Binding HostFirstIP}" MinWidth="150" />
106+
<DataGridTextColumn Header="Host Last IP" Binding="{Binding HostLastIP}" MinWidth="150" />
107+
<DataGridTextColumn Header="Host IPs" Binding="{Binding HostIPs}" MinWidth="80" />
108+
</DataGrid.Columns>
109+
</DataGrid>
94110
</Grid>
95111
</UserControl>

0 commit comments

Comments
 (0)