From efcfac9b1de15bbcf28dba955c5549ef9a52b4fc Mon Sep 17 00:00:00 2001
From: Tim Young <Tim.Young@LightSys.org>
Date: Tue, 1 Sep 2015 12:07:23 -0500
Subject: [PATCH] Fix bug in wrouter and routing DHCP packets

---
 EduNetworkBuilder/NetworkCard.cs             |  7 ++-
 EduNetworkBuilder/NetworkDevice.cs           | 13 +++++-
 EduNetworkBuilder/Resources/ReleaseNotes.rtf | 48 ++++++++++----------
 3 files changed, 40 insertions(+), 28 deletions(-)

diff --git a/EduNetworkBuilder/NetworkCard.cs b/EduNetworkBuilder/NetworkCard.cs
index 63f7bb0..639d616 100644
--- a/EduNetworkBuilder/NetworkCard.cs
+++ b/EduNetworkBuilder/NetworkCard.cs
@@ -379,8 +379,11 @@ namespace EduNetworkBuilder
             NetworkLink nl;
             if (NB.GetComponentType(tPacket.WhereAmI) != GeneralComponentType.device) return false;  //we cannot do this.
             NetworkDevice WhereFrom = (NetworkDevice)tPacket.WhereAmI;
-            
-            switch (GetNicType)
+            NicType what = GetNicType;
+            if (!tPacket.isFresh && WhereFrom.IsWirelessForwarder() && what == NicType.wlan)
+                what = NicType.wport;
+
+            switch (what)
             {
                 case NicType.lo:
                 case NicType.management_interface:
diff --git a/EduNetworkBuilder/NetworkDevice.cs b/EduNetworkBuilder/NetworkDevice.cs
index 4d01190..7a396cd 100644
--- a/EduNetworkBuilder/NetworkDevice.cs
+++ b/EduNetworkBuilder/NetworkDevice.cs
@@ -1222,6 +1222,7 @@ namespace EduNetworkBuilder
             //  if the dstIP matches (broadcast), we process it but it still continues
             //  Set the "we have processed it" flag
             //  and we process arrival
+
             bool MacAddressMatch = HasMac(tPacket.destMAC);
             bool ExactMatch = HasIPAddress(tPacket.destIP);
             bool BroadcastMatch = HasBroadcastAddress(tPacket.destIP);
@@ -1230,7 +1231,8 @@ namespace EduNetworkBuilder
             if(ExactMatch || BroadcastMatch)
             {
                 //Change this.  Need a new ProcessArrival
-                ProcessArrival(tPacket);
+                if(tPacket.MyType != PacketType.dhcp_answer) //If it is a match, it should be handled elsewhere
+                    ProcessArrival(tPacket);
                 if (ExactMatch && tPacket.isFinshed())
                     return;
             }
@@ -1321,8 +1323,11 @@ namespace EduNetworkBuilder
                         if ((tPacket.isFresh && !ExactMatch ) || (NeedsRouting && DoesRouting()) ||
                             IsWirelessForwarder())
                         {
+                            if (nic == tPacket.InboundNic) break;  //never send it out the nic it came in on
                             //Pass it to the NIC to send out each nic+interface.
-                            //The nic checks to see if it works and then processes it                            
+                            //The nic checks to see if it works and then processes it  
+                            string tMAC = tPacket.destMAC;
+                            string ttMAC = tPacket.OutboundDestMAC;
                             if (BroadcastMatch && tPacket.MyType != PacketType.dhcp_answer)
                                 tPacket.OutboundDestMAC = NB.BroadcastMACString;
                             tPacket.destMAC = tPacket.OutboundDestMAC; 
@@ -1330,6 +1335,8 @@ namespace EduNetworkBuilder
                             {
                                 count++;
                             }
+                            tPacket.destMAC = tMAC;
+                            tPacket.OutboundDestMAC = ttMAC;
                         }
                         break;
                     case NicType.port:
@@ -1626,6 +1633,8 @@ namespace EduNetworkBuilder
                 nPacket = new Packet(tPacket);
                 nPacket.isFresh = true; //So it starts from here
                 nPacket.Tracking = new PacketMessage();
+                if (hostname == "server0")
+                    Console.WriteLine("here");
                 myNet.addPacket(nPacket);
                //We need to find a dhcp IP for this.
                 IPAddress dst = RequestDHCPLease(tPacket.sourceMAC, tPacket.OutboundIP);
diff --git a/EduNetworkBuilder/Resources/ReleaseNotes.rtf b/EduNetworkBuilder/Resources/ReleaseNotes.rtf
index c847d2c..1224b7a 100644
--- a/EduNetworkBuilder/Resources/ReleaseNotes.rtf
+++ b/EduNetworkBuilder/Resources/ReleaseNotes.rtf
@@ -1,6 +1,6 @@
 {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
 {\*\generator Riched20 10.0.10240}\viewkind4\uc1 
-\pard\sa200\sl276\slmult1\f0\fs22\lang9 Version 1.0.22\par
+\pard\sa200\sl276\slmult1\b\f0\fs22\lang9 Version 1.0.22\b0\par
 * Added ssid and keys for wireless links\par
 * Wireless will auto-disconnect if link is too long\par
 * Wireless will auto-connect if ssid and key match, if link is short enough\par
@@ -10,16 +10,16 @@
 * wireless router handles dhcp requests properly (both responds to it but also passes it on)\par
 * right-clicking light and microwave no longer has ping, arp, edit, and other context menus\par
 * added net-test for DHCP server status (on/off)\par
-* If multiple DHCP servers, client randomly chooses which to keep.\line Version 1.0.21   08/15/2015\par
+* If multiple DHCP servers, client randomly chooses which to keep.\line\b Version 1.0.21   08/15/2015\b0\par
 * Added a microwave and fluorescent light.  They corrupt data when packets run close to them.\par
 * Added some packet corruption puzzles\par
 * Fixed window resize-on-load issue where the help window popped up first, then the builder window resized over to hide the help window. \par
-Version 1.0.20  08/12/2015\par
+\b Version 1.0.20  08/12/2015\b0\par
 * wports do not display on tooltips or when printing the device info\par
 * Added ctrl-s to quick-save a network we are working on\par
 * commented out wireless devices for now - doing a big demo and wireless is not yet complete\par
 * added search box to help\par
-Version 1.0.19  08/08/2015\par
+\b Version 1.0.19  08/08/2015\b0\par
 *Updated context help for most puzzles that introduce new ideas.\par
 * Sorted Help topics when adding them in net-tests.\par
 * Added some images to the help to help clarify things.\par
@@ -27,12 +27,12 @@ Version 1.0.19  08/08/2015\par
 * Open Help so it can be kept open while the puzzles progress.\par
 * Deal with minimized state better (used to shrink window to smallest possible state)\par
 * Remember size and location of main window between uses.\par
-Version 1.0.18  08/08/2015\par
+\b Version 1.0.18  08/08/2015\b0\par
 * Added Context Help for puzzles.\par
 -  Each puzzle can have context help\par
 -  There is a net-test to have us read help\par
 * fixed minor problem with a "ding" sound when we load a puzzle that has something locked.\par
-Version 1.0.17  08/01/2015\par
+\b Version 1.0.17  08/01/2015\b0\par
 * Added more help\par
 * Much progress made in preparing for a French translation\par
 * allow for Puzzle's description to be in another language\par
@@ -41,21 +41,21 @@ Version 1.0.17  08/01/2015\par
 * Save box starts in the directory of the file we opened (if we have one)\par
 * Choose a language at startup if one has never been chosen, and have option to change language.\par
 * Added another puzzle, showing what happens (or does not happen) if we have two networks that use the same IP addresses, and we want to build a VPN between them.\par
-Version 1.0.16  07/18/2015\par
+\b Version 1.0.16  07/18/2015\b0\par
 * Added ability to break links (bad network wire)\par
 * "connection lights" on network cards / ports when we edit devices\par
 * Test for "needs link to" does not succeed if the link in question is a broken link\par
 * Added a puzzle to show you how to find broken links \par
 * Used broken links in other puzzles\par
 * Fixed bug: switches could not use DHCP for many different reasons.  Now it works for them.\par
-Version 1.0.15  07/11/2015\par
+\b Version 1.0.15  07/11/2015\b0\par
 * Added ping time progress bar\par
 * Fixed issue with things timing out before they completed.  If the network screen is too large, it makes it go just a tiny bit slower and various things would fail.  When the first packet successfully makes it to the far end, it recomputes the time needed and gives extra time.\par
 * Added context menu ping.  If an item is supposed to ping something, right-clicking adds the ping test to the menu.  Takes some of the guess-work out of things.\par
 * Fixed minor issue with this change log.  Had two 1.0.11 versions & somehow was stating we were at version 10.x.x instead of 1.x.x (sigh)  \par
 * Fixed the VPNify puzzle.  Had a goof in it.\par
 * Made it so you cannot connect a link to a VPN.  A VPN should be a virtual connection, not a physical connection.\par
-Version 1.0.14  07/10/2015\par
+\b Version 1.0.14  07/10/2015\b0\par
 * When we finish a puzzle, allow us to auto-open the "next puzzle" box.\par
 * Added lots more puzzles\par
 * Added more help & documentation\par
@@ -63,13 +63,13 @@ Version 1.0.14  07/10/2015\par
 * Made it so the test for a matching route compared netmasks\par
 * Added a printer object\par
 * Added a copier object\par
-Version 1.0.13  06/21/2015\par
+\b Version 1.0.13  06/21/2015\b0\par
 * Fixed issues with arp - arp could go through routers.  Now works correctly\par
 * Made it test for puzzle completion after adding devices\par
 * Made it test for completion after changing / deleting devices\par
 * Let you delete / add NICs on PCs, primarily so we can solve the duplicate MAC puzzle\par
 * Replaced the "Network Loop" puzzle with the correct one.\par
-Version 1.0.12  06/20/2015\par
+\b Version 1.0.12  06/20/2015\b0\par
 * Added VPN and TUN nic types\par
 * Fixed numerous small bugs\par
 * Fixed bug with early solution to failed ping test\par
@@ -77,7 +77,7 @@ Version 1.0.12  06/20/2015\par
 * Added a "firewall" network that has a firewall and vpns\par
 * Added numerous firewall / vpn puzzles\par
 * Fixed a DNS issue.  It now more intelligently finds the right IP address when you ping it\par
-Version 1.0.11   06/14/2015\par
+\b Version 1.0.11   06/14/2015\b0\par
 * Added the ability to lock various important features to make puzzles better\par
 * Able to add interfaces (multiple IPs on a Network Card)\par
 * Right-click context menu to add net-tests.  \par
@@ -85,7 +85,7 @@ Version 1.0.11   06/14/2015\par
 * Can add NICs (on some devices)\par
 * Can delete NICs\par
 * Fixed minor bug with broadcast pinging solving ping test for individual computers\par
-Version 1.0.10   06/13/2015\par
+\b Version 1.0.10   06/13/2015\b0\par
 * Renamed puzzles to manage them easier\par
 * Deal with duplicate IPs, and what happens when a packet returns to a computer that did not send it.\par
 * Change to the help window so you can keep the window open while working with the puzzle.\par
@@ -95,7 +95,7 @@ Version 1.0.10   06/13/2015\par
 * Added a FailedPing test so we can ping things that must fail (show the firewall works)\par
 * added more to the help\par
 * added more puzzles\par
-Version 1.0.0.9   05/29/2015\par
+\b Version 1.0.0.9   05/29/2015\b0\par
 * Add a grid to the network map.  It makes things easier to straighten up\par
 * Sorted and organized the puzzles\par
 * Made a level for each puzzle.\par
@@ -105,41 +105,41 @@ Version 1.0.0.9   05/29/2015\par
 * Reset buttons when we load a new network.\par
 * Added a bunch more puzzles\par
 * Sometimes the remembered IP gets annoying when it remembers odd gateways and numbers we cannot change.  Fixed that in many cases.\par
-Version 1.0.0.8   05/25/2015\par
+\b Version 1.0.0.8   05/25/2015\b0\par
 * Always Start with level0 puzzles for now\par
 * Fixed the icon when program running\par
 * Added an infrastructure for Puzzles (needs work)\par
 * Added a number of basic puzzles\par
 * Fixed DHCP Leases.  Now it clears leases when you change the DHCP server range.\par
-Version 1.0.0.7   05/16/2015\par
+\b Version 1.0.0.7   05/16/2015\b0\par
 * Added file association so we can double-click an enbx file\par
 * Fixed the icon so it looks right (removed left edge)\par
-Version 1.0.0.6    05/16/2015\par
+\b Version 1.0.0.6    05/16/2015\b0\par
 * Able to delete a route (right click route and delete it)\par
 * Add map title as something we can load/save\par
 * Add message as something we can load and save\par
 * Changing size of items affects all items\par
 * Allow entering a hostname in the IP address field (ping / gateway)\par
-Version 1.0.0.5   04/26/2015\par
+\b Version 1.0.0.5   04/26/2015\b0\par
 * Fixed ping from switch\par
 * Fixed error message when pinging IP that does not exist\par
-Version 1.0.0.4   04/26/2015\par
+\b Version 1.0.0.4   04/26/2015\b0\par
 * Fixed broadcast ping\par
 *Fixed dhcp request error\par
-Version 1.0.0.3   04/15/2015\par
-* Added "file" -> "new" to erase and start a clean new network\par
+\b Version 1.0.0.3   04/15/2015\par
+\b0 * Added "file" -> "new" to erase and start a clean new network\par
 * Fixed pc2 to have gateway on "solved"->"Two Networks"\par
 * Fixed - only machines capable of doing DHCP do dhcp request if we do DHCP request on all\par
 * Changed - major overhaul to tcp-stack.\par
 * Downgrade - Arp temporarily removed from system while tcp-stack overhaul completed\par
-Version 1.0.0.2   4/19/2015\par
+\b Version 1.0.0.2   4/19/2015\b0\par
 * Added IP-Phone\par
 * Packets terminate at the far end - this makes it easier to see packets go both directions\par
 * Packets are randomized in transit - Allows packets to arrive at slightly different times\par
-Version 1.0.0.1   4/11/2015\par
+\b Version 1.0.0.1   4/11/2015\b0\par
 * DHCP selection on nics is not functioning correctly\par
 * Various small bug-fixes\par
-Version 1.0.0.0   4/10/2015\par
+\b Version 1.0.0.0   4/10/2015\b0\par
 This is the initial alpha build\par
 * basic pinging\par
 * basic arp\par