diff --git a/EduNetworkBuilder/NB.cs b/EduNetworkBuilder/NB.cs index a8e722b..5647d7a 100644 --- a/EduNetworkBuilder/NB.cs +++ b/EduNetworkBuilder/NB.cs @@ -238,6 +238,7 @@ namespace EduNetworkBuilder public static int WirelessMaxUnsuccessfulLink = 120; //The link will connect, but the packet will drop public static int WirelessMaxSuccessfulLink = 100; //Packets will drop after this distance public static int WirelessReconnectDistance = 70; //Try to find a closer AP if we are this far out. + public static int UntaggedVLAN = -1; //If the packet is not tagged. /// /// Find the global random number generator. diff --git a/EduNetworkBuilder/NetworkDevice.cs b/EduNetworkBuilder/NetworkDevice.cs index 50ee951..6c47265 100644 --- a/EduNetworkBuilder/NetworkDevice.cs +++ b/EduNetworkBuilder/NetworkDevice.cs @@ -1399,9 +1399,13 @@ namespace EduNetworkBuilder break; string tMAC = tPacket.destMAC; string ttMAC = tPacket.OutboundDestMAC; + + tPacket.VLANID = NB.UntaggedVLAN; //we are routing, so we adopt the outgoing vlanID - state it needs to be tagged + if (BroadcastMatch && tPacket.MyType != PacketType.dhcp_answer) tPacket.OutboundDestMAC = NB.BroadcastMACString; - tPacket.destMAC = tPacket.OutboundDestMAC; + tPacket.destMAC = tPacket.OutboundDestMAC; + //wearehere; //set the vlan id to 1 probably so we adopt the outgoing vlan if(nic.SendPacketOutNIC(tPacket)) { count++; @@ -2277,6 +2281,8 @@ namespace EduNetworkBuilder //Now we pass it to the nic if(nc != null) nc.ProcessInboundPacket(tPacket); + if (hostname != null) + Console.WriteLine("Starting on device: " + hostname + " VLANID = " + tPacket.VLANID.ToString()); if(!tPacket.ready_to_delete) tPacket.StartOnDevice(this); } diff --git a/EduNetworkBuilder/NetworkInterface.cs b/EduNetworkBuilder/NetworkInterface.cs index a61dee9..2eddc28 100644 --- a/EduNetworkBuilder/NetworkInterface.cs +++ b/EduNetworkBuilder/NetworkInterface.cs @@ -163,7 +163,7 @@ namespace EduNetworkBuilder // tPacket.sourceIP = new IPAddress(myIP.GetIP.ToIpString(), "", IPAddressType.ip_only); //We only want the IP address //} //VLAN stuff - VLANInfo VI = GetVLANInfo(tPacket.VLANID); + VLANInfo VI = OutgoingVLAN(tPacket.VLANID); VLANTagType What = VI.Tag; Network theNet = NB.GetNetwork(); NetworkDevice HD = theNet.GetDeviceFromID(AttachedToHostNic); @@ -172,6 +172,7 @@ namespace EduNetworkBuilder if (What == VLANTagType.Forbidden) { //we drop it silently + Console.WriteLine(" -- Forbidding outbound packet. " + tPacket.VLANID + " " + HD.hostname + " " + VI.ID); string errString = string.Format(NB.Translate("NI_VLANOut"), hostname, tPacket.destIP.GetIPString); tPacket.AddMessage(DebugLevel.switching, errString); tPacket.Tracking.Status = errString; @@ -181,7 +182,7 @@ namespace EduNetworkBuilder if(What == VLANTagType.Untagged) { //We strip off the tagging - tPacket.VLANID = 1; //set to the default vlan + tPacket.VLANID = NB.UntaggedVLAN; //set to the default vlan } if(What == VLANTagType.Tagged) { @@ -196,18 +197,24 @@ namespace EduNetworkBuilder //If the packet is tagged with the ID, and the port is tagged, return that //If the packet is untagged, return the one that is untagged VLANInfo newVLANinfo = null; - if (ID != 1) //It is tagged + if (ID != NB.UntaggedVLAN) //It is tagged { foreach(VLANInfo vi in VLANs) { - if (vi.ID == ID) return vi; + if (vi.ID == ID) + { + if (vi.Tag == VLANTagType.Forbidden) + Console.WriteLine(" About to be forbidden."); + return vi; + } } //We do not have one set yet. Add a new one newVLANinfo = new VLANInfo(ID, VLANTagType.Forbidden); + Console.WriteLine(" Creating forbidden vlan - " + ID); VLANs.Add(newVLANinfo); return newVLANinfo; } - else //the packet is the default vlan (1) so appears untagged. + else //the packet is untagged. { foreach (VLANInfo vi in VLANs) { @@ -225,6 +232,54 @@ namespace EduNetworkBuilder return newVLANinfo; } + private VLANInfo OutgoingVLAN(int ID) + { + //Search through outgoing vlan stuff to find the right one + //If the packet is tagged with the ID, and the port is tagged, return that + //If the packet is untagged, return the one that is untagged + VLANInfo newVLANinfo = null; + if (ID != NB.UntaggedVLAN) //the packet is tagged + { + foreach (VLANInfo vi in VLANs) + { + if (vi.ID == ID) + { + if (vi.Tag == VLANTagType.Forbidden) + Console.WriteLine(" About to be outbound forbidden."); + return vi; + } + } + //We do not have one set yet. Add a new one + newVLANinfo = new VLANInfo(ID, VLANTagType.Forbidden); + Console.WriteLine(" Creating outbound forbidden vlan - " + ID); + VLANs.Add(newVLANinfo); + return newVLANinfo; + } + else //the packet is untagged. + { + //we should find the untagged vlan + //if no untagged vlan, find the tagged vlan + + foreach (VLANInfo vi in VLANs) + { + if (vi.Tag == VLANTagType.Untagged) return vi; + } + foreach (VLANInfo vi in VLANs) + { + if (vi.Tag == VLANTagType.Tagged) return vi; + } + //We do not have an "untagged" vlan. Return the settings for vlan1 + foreach (VLANInfo vi in VLANs) + { + if (vi.ID == 1) return vi; + } + } + //We should never get here. This is just a fall-through + newVLANinfo = new VLANInfo(ID, VLANTagType.Forbidden); + VLANs.Add(newVLANinfo); + return newVLANinfo; + } + public void ProcessInboundPacket(Packet tPacket) { bool isgood = false; @@ -255,9 +310,9 @@ namespace EduNetworkBuilder } if (What == VLANTagType.Untagged) { - //If it is 1 (default vlan), this is OK. Otherwise drop. - //Untagged means we expect it to be vlan of 1 on the cable side - if(tPacket.VLANID != 1) + //If it is (default vlan), this is OK. Otherwise drop. + //Untagged means we expect it to be vlan of (untagged) on the cable side + if(tPacket.VLANID != NB.UntaggedVLAN) { //Oops. We need to reject the packet string errString = string.Format(NB.Translate("NI_VLANInUntagged"), hostname, tPacket.destIP.GetIPString); @@ -268,13 +323,13 @@ namespace EduNetworkBuilder } else //We need to tag the packet with the new VLAN-ID { - tPacket.VLANID = VI.ID; //The packet is ow tagged + tPacket.VLANID = VI.ID; //The packet is now tagged } } if (What == VLANTagType.Tagged) { //If the packet is tagged, and the vlan expected tagged, all is good. - if(tPacket.VLANID != VI.ID) + if (tPacket.VLANID != NB.UntaggedVLAN && tPacket.VLANID != VI.ID) { //Oops. We need to reject the packet string errString = string.Format(NB.Translate("NI_VLANInMisMatch"), hostname, tPacket.destIP.GetIPString); @@ -283,6 +338,8 @@ namespace EduNetworkBuilder tPacket.MyStatus = PacketStatus.finished_ok; return; } + else + tPacket.VLANID = VI.ID; //Make sure it is properly tagged. } } diff --git a/EduNetworkBuilder/Packet.cs b/EduNetworkBuilder/Packet.cs index c01961a..3859fd4 100644 --- a/EduNetworkBuilder/Packet.cs +++ b/EduNetworkBuilder/Packet.cs @@ -36,7 +36,7 @@ namespace EduNetworkBuilder } } public int packetID; - public int VLANID = 1; //starts on the management vlan + public int VLANID = NB.UntaggedVLAN; //starts on the management vlan public int TTL = 20; public int TickTTL = 50; public int health = 100; @@ -109,6 +109,7 @@ namespace EduNetworkBuilder StartTime = copyfrom.StartTime; OriginalDestIP = copyfrom.OriginalDestIP; packetID = copyfrom.packetID; + VLANID = copyfrom.VLANID; Tracking.AddMessage(DebugLevel.debug, WhereAmI, NB.Translate("P_PacketDuplicated")); } @@ -345,6 +346,7 @@ namespace EduNetworkBuilder public void StartOnLink(NetworkLink theLink, NetworkDevice start_device) { if (theLink == null) return; + Console.WriteLine("Starting on link: " + theLink.GetUniqueIdentifier + " vlanID = " + VLANID.ToString()); InboundNic = null; InboundInterface = null; WhereAmI = theLink;