traceroute works, at least rudimentarily
This commit is contained in:
parent
1ebf932edb
commit
9e33a6f392
@ -252,6 +252,7 @@ namespace EduNetworkBuilder
|
||||
|
||||
public static UInt32 ParseIp(this string ipAddress)
|
||||
{
|
||||
if (ipAddress == null) ipAddress = "";
|
||||
var gw = ipAddress.Split('/'); //Pull off any cdr
|
||||
var mySplitVal = gw[0].Split('.');
|
||||
if (mySplitVal.Count() != 4)
|
||||
|
@ -1053,6 +1053,15 @@ namespace EduNetworkBuilder
|
||||
return; //exit early. Rest is done in tick
|
||||
}
|
||||
|
||||
public void ResetPacketTimeout()
|
||||
{
|
||||
//We should only do this when we know we are starting new packets.
|
||||
//Traceroute does this when resetting
|
||||
AlreadyChosenTimeout = false; //we do this at the beginning of processing
|
||||
NumberOfSecondsForTimeout = DefaultTimeout;
|
||||
NetworkStartTime = DateTime.Now;
|
||||
}
|
||||
|
||||
public void Tick()
|
||||
{
|
||||
EraseOldPackets();
|
||||
@ -1069,7 +1078,7 @@ namespace EduNetworkBuilder
|
||||
ProcessPacketsOnce();
|
||||
if(!ProcessingShouldContinue())
|
||||
{
|
||||
//We it has all been taken care of
|
||||
//It has all been taken care of
|
||||
}
|
||||
DrawPackets();
|
||||
//myPBox.Refresh();
|
||||
|
@ -823,9 +823,9 @@ namespace EduNetworkBuilder
|
||||
todo = destination.Edit(ItemClickedOn, this, NB.Translate("_Traceroute"));
|
||||
if (todo)
|
||||
{
|
||||
//ItemClickedOn.PingFromHere(destination);
|
||||
//myNetwork.ProcessPackets();
|
||||
//UpdateMessages();
|
||||
ItemClickedOn.TracerouteFromHere(destination);
|
||||
myNetwork.ProcessPackets();
|
||||
UpdateMessages();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1279,11 +1279,10 @@ namespace EduNetworkBuilder
|
||||
|
||||
public void TracerouteFromHere(IPAddress Destination)
|
||||
{
|
||||
//We need to create a packet
|
||||
Packet TracertPacket = new Packet(this, Destination, NB.Translate("_Traceroute"), PacketType.tracert_request, -1, 1);
|
||||
//We need to create a traceroute packet - start with 1 TTL
|
||||
//We pass it the destination as the payload string, so we have that for all traceroutes.
|
||||
Packet TracertPacket = new Packet(this, Destination, Destination.GetIPString, PacketType.tracert_request, -1, 1);
|
||||
Network myNet = NB.GetNetwork();
|
||||
//string dHost = myNet.ReverseDNSLookup(this, Destination);
|
||||
//myNet.RegisterPingTest(hostname, dHost);
|
||||
myNet.addPacket(TracertPacket);
|
||||
}
|
||||
|
||||
@ -1821,7 +1820,29 @@ namespace EduNetworkBuilder
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(tPacket.MyType == PacketType.arp_request)
|
||||
//Tracert_request is processed on the link arrivak
|
||||
if (tPacket.MyType == PacketType.tracert_reply)
|
||||
{
|
||||
//The reply got here. This packet is done
|
||||
tPacket.AddMessage(DebugLevel.info, NB.Translate("ND_ProcessArrival_TracertReply") + " " + tPacket.sourceIP.GetIPString);
|
||||
tPacket.Tracking.Status = NB.LeftPad(hostname) + " " + string.Format(NB.Translate("ND_ProcessArrival_TracertReply") + " " + tPacket.sourceIP.GetIPString);
|
||||
tPacket.MyStatus = PacketStatus.finished_ok;
|
||||
|
||||
IPAddress origStart = new IPAddress(tPacket.payloadData);
|
||||
int ttl = tPacket.OrigTTL + 1;
|
||||
|
||||
Console.WriteLine("Tracert: " + tPacket.OrigTTL + " " + tPacket.sourceIP.GetIPString);
|
||||
Console.WriteLine("Tracert: -- " + tPacket.sourceIP.GetIPString + " " + origStart.GetIPString);
|
||||
//If we had not landed on the actual dest...
|
||||
if (tPacket.sourceIP.GetIPString != origStart.GetIPString && ttl < 10)
|
||||
{
|
||||
Packet trPacket = new Packet(this, origStart, origStart.GetIPString, PacketType.tracert_request, -1, ttl);
|
||||
myNet.addPacket(trPacket);
|
||||
myNet.ResetPacketTimeout();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (tPacket.MyType == PacketType.arp_request)
|
||||
{
|
||||
//The arp request may not be asking for this IP.
|
||||
if(HasIPAddress(tPacket.destIP))
|
||||
@ -2478,6 +2499,38 @@ namespace EduNetworkBuilder
|
||||
|
||||
if (!ForwardsPackets())
|
||||
{
|
||||
//Traceroute bounce-back
|
||||
if(tPacket.MyType == PacketType.tracert_request)
|
||||
{
|
||||
tPacket.TTL--;
|
||||
//If it is a router, or this is the destination
|
||||
if(tPacket.TTL < 1 && (RoutesPackets() || HasMac(tPacket.destMAC)))
|
||||
{
|
||||
//The packet reached the end of its ttl. Bounce back.
|
||||
//this packet ends, another begins.
|
||||
Network myNet = NB.GetNetwork();
|
||||
|
||||
//We create a new packet
|
||||
Packet nPacket = new Packet(this, tPacket.sourceIP, tPacket.payloadData, PacketType.tracert_reply, tPacket.packetID);
|
||||
nPacket.OrigTTL = tPacket.OrigTTL;
|
||||
nPacket.OriginalDestIP = tPacket.destIP;
|
||||
nPacket.isFresh = true; //So it starts from here
|
||||
nPacket.Tracking = new PacketMessage();
|
||||
|
||||
//The original packet stops here
|
||||
tPacket.AddMessage(DebugLevel.info, NB.Translate("ND_ProcessArrival_TracerouteArrived") + " " + hostname);
|
||||
tPacket.Tracking.Status = NB.LeftPad(hostname) + " Traceroute: " + NB.Translate("ND_ProcessArrival_TracerouteArrived") + " "+ hostname;
|
||||
tPacket.MyStatus = PacketStatus.finished_ok;
|
||||
Console.WriteLine(" Tracert bounce: " + tPacket.OrigTTL + " " + hostname + " " + tPacket.payloadData);
|
||||
|
||||
//Finish setting up the new packet - sending it back
|
||||
nPacket.sourceIP = new IPAddress(NB.ZeroIPString);
|
||||
nPacket.TsourceIP = new IPAddress(NB.ZeroIPString);
|
||||
myNet.addPacket(nPacket);
|
||||
Console.WriteLine(" Tracert bounce pkt:" + nPacket.OrigTTL + nPacket.payloadData);
|
||||
}
|
||||
}
|
||||
|
||||
if (tPacket.MyType == PacketType.dhcp_request && !isDHCPServer)
|
||||
{
|
||||
tPacket.AddMessage(DebugLevel.debug, NB.LeftPad(hostname) + " " +string.Format(NB.Translate("ND_DoInFromLnkDeaf")));
|
||||
|
@ -38,6 +38,7 @@ namespace EduNetworkBuilder
|
||||
public int packetID;
|
||||
public int VLANID = NB.UntaggedVLAN; //starts on the management vlan
|
||||
public int TTL = 20;
|
||||
public int OrigTTL = 20; //The original TTL. We need to know what we started with so we can pass it back on a traceroute
|
||||
public int TickTTL = 50;
|
||||
public int health = 100;
|
||||
public IPAddress sourceIP;
|
||||
@ -95,6 +96,7 @@ namespace EduNetworkBuilder
|
||||
{
|
||||
MyType = copyfrom.MyType;
|
||||
TTL = copyfrom.TTL;
|
||||
OrigTTL = copyfrom.OrigTTL;
|
||||
sourceIP = copyfrom.sourceIP;
|
||||
TsourceIP = copyfrom.TsourceIP;
|
||||
destIP = copyfrom.destIP;
|
||||
@ -126,6 +128,7 @@ namespace EduNetworkBuilder
|
||||
packetID = NewPacketID;
|
||||
}
|
||||
if (startTTL != -1) this.TTL = startTTL;
|
||||
OrigTTL = TTL;
|
||||
WhereAmI = start;
|
||||
payloadData = payload;
|
||||
MyType = theType;
|
||||
@ -170,7 +173,7 @@ namespace EduNetworkBuilder
|
||||
}
|
||||
|
||||
if (startTTL != -1) this.TTL = startTTL;
|
||||
|
||||
OrigTTL = TTL;
|
||||
|
||||
if (theType != PacketType.arp_answer && theType != PacketType.arp_request)
|
||||
{
|
||||
@ -228,6 +231,10 @@ namespace EduNetworkBuilder
|
||||
case PacketType.ping_request:
|
||||
pencolor = Color.Blue;
|
||||
break;
|
||||
case PacketType.tracert_reply:
|
||||
case PacketType.tracert_request:
|
||||
pencolor = Color.LightBlue;
|
||||
break;
|
||||
case PacketType.tun_packet:
|
||||
pencolor = Color.White;
|
||||
break;
|
||||
|
@ -1657,6 +1657,14 @@
|
||||
<value>Device cannot respond - Packet Failed</value>
|
||||
<comment>ND_DoInputFromLink_PowerOff = Device cannot respond - Packet Failed</comment>
|
||||
</data>
|
||||
<data name="ND_ProcessArrival_TracerouteArrived" xml:space="preserve">
|
||||
<value>TTL reached.</value>
|
||||
<comment>ND_ProcessArrival_TracerouteArrived = TTL reached.</comment>
|
||||
</data>
|
||||
<data name="ND_ProcessArrival_TracertReply" xml:space="preserve">
|
||||
<value>Traceroute Destination Reached</value>
|
||||
<comment>ND_ProcessArrival_TracertReply = Traceroute Destination Reached</comment>
|
||||
</data>
|
||||
<data name="_Traceroute" xml:space="preserve">
|
||||
<value>Traceroute</value>
|
||||
<comment>_Traceroute = Traceroute</comment>
|
||||
|
Loading…
Reference in New Issue
Block a user