public Smerovaci_zaznam najdi_zaznam_v_smerovacej_tabulke(IPAddress ciel_adres) { int najdlhsi_prefix = -1; Smerovaci_zaznam smerovaci_zaznam = null; foreach (var zaznam in smerovacia_tabulka.ToList()) { if (Praca_s_ip.zisti_podsiet(ciel_adres, zaznam.cielova_siet, zaznam.maska)) { if (najdlhsi_prefix < Praca_s_ip.sprav_masku(zaznam.maska)) { najdlhsi_prefix = Praca_s_ip.sprav_masku(zaznam.maska); smerovaci_zaznam = zaznam; } } } if (smerovaci_zaznam != null) { return(smerovaci_zaznam); } else { return(null); } }
public void preposli(Rozhranie rozhranie, EthernetPacket eth, Smerovaci_zaznam smerovaci_zaznam, string via, IPAddress ciel_adres) { bool naslo = false; int pokus_arp = 3; while (pokus_arp > 0) { foreach (var zaznam in arp_tabulka.ToList()) { if (zaznam.ip == via || (via == null && zaznam.ip == ciel_adres.ToString())) { naslo = true; eth.DestinationHwAddress = PhysicalAddress.Parse(zaznam.mac); eth.SourceHwAddress = rozhranie.adapter.MacAddress; rozhranie.adapter.SendPacket(eth); pokus_arp = 0; break; } } if (!naslo) { if (via != null) { arp_request(rozhranie, IPAddress.Parse(via)); } else { arp_request(rozhranie, ciel_adres); } System.Threading.Thread.Sleep(500); } } Thread.CurrentThread.Abort(); }
public Smerovaci_zaznam najdi_najlepsiu_v_databaze(IPAddress adresa_siete, IPAddress maska) { Smerovaci_zaznam smerovaci_zaznam = null; int najlepsia = 99; foreach (var zaznam in rip_databaza.ToList()) { if (zaznam.cielova_siet.Equals(adresa_siete) && zaznam.maska.Equals(maska)) { if ((zaznam.metrika < najlepsia) && zaznam.metrika != 16) { najlepsia = zaznam.metrika; smerovaci_zaznam = zaznam; } } } if (smerovaci_zaznam == null) { return(null); } else { return(smerovaci_zaznam); } }
public void updatni_casovace() { lock (this) { if (povolene_rip1 == true || povolene_rip2 == true) { foreach (var zaznam in rip_databaza.ToList()) { zaznam.flush++; if (zaznam.flush >= flush_casovac) { smerovacia_tabulka.Remove(zaznam); rip_databaza.Remove(zaznam); continue; } if (zaznam.invalid >= invalid_casovac) { if (smerovacia_tabulka.Contains(zaznam)) { Smerovaci_zaznam najlepsia = najdi_najlepsiu_v_databaze(zaznam.cielova_siet, zaznam.maska); if (najlepsia != null && !najlepsia.Equals(zaznam) && !(najlepsia.metrika.Equals(16))) { smerovacia_tabulka.Add(najlepsia); smerovacia_tabulka.Remove(zaznam); rip_databaza.Remove(zaznam); } else { zaznam.metrika = 16; zaznam.holddown++; } } else { rip_databaza.Remove(zaznam); } } else { zaznam.invalid++; } } update_casovac++; if (update_casovac >= update_casovac_hodnota) { if (povolene_rip1) { posli_update(rozhranie1, 1, IPAddress.Parse("224.0.0.9"), PhysicalAddress.Parse("01005E000009")); } if (povolene_rip2) { posli_update(rozhranie2, 2, IPAddress.Parse("224.0.0.9"), PhysicalAddress.Parse("01005E000009")); } update_casovac = 0; } } } }
public void zmaz_smerovaci_zaznam() { Smerovaci_zaznam smerovaci_zaznam = najdi_najlepsiu_v_databaze(smerovacia_tabulka.ElementAt(main_view.lb_smerovaci_zaznam_index).cielova_siet, smerovacia_tabulka.ElementAt(main_view.lb_smerovaci_zaznam_index).maska); if (smerovaci_zaznam != null) { smerovacia_tabulka.Add(smerovaci_zaznam); } if (smerovacia_tabulka.ElementAt(main_view.lb_smerovaci_zaznam_index).typ != "R") { smerovacia_tabulka.RemoveAt(main_view.lb_smerovaci_zaznam_index); } }
public void priamo_pripojena_siet(int rozhranie) { foreach (var zaznam in smerovacia_tabulka.ToList()) { if (zaznam.typ == "D" && rozhranie == zaznam.exit_interface) { smerovacia_tabulka.Remove(zaznam); } } IPAddress siet = Praca_s_ip.adresa_siete(IPAddress.Parse(main_view.ip_adresa), IPAddress.Parse(main_view.maska)); Smerovaci_zaznam smerovaci_zaznam = new Smerovaci_zaznam("D", siet, IPAddress.Parse(main_view.maska), 1, 0, "X", rozhranie); smerovacia_tabulka.Add(smerovaci_zaznam); updatni_smerovaciu_tabulku(); }
public Smerovaci_zaznam rekurzivne_prehladanie(Smerovaci_zaznam smerovaci_zaznam, ref string via) { while (true) { if (smerovaci_zaznam.exit_interface == -1) { via = smerovaci_zaznam.next_hop; smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(IPAddress.Parse(smerovaci_zaznam.next_hop)); if (smerovaci_zaznam == null) { return(null); } } else { return(smerovaci_zaznam); } } }
public void trigger_update(int cislo_rozhrania, Smerovaci_zaznam zaznam) { IPv4Packet ip_paket; UdpPacket udp_paket; Byte[] ip; Byte[] hlava = new byte[] { 0x00, 0x02, 0x00, 0x00 }; Byte[] rip_hlava = new byte[] { 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 }; Byte[] next_hop = new byte[] { 0x00, 0x00, 0x00, 0x00 }; Byte[] metrika = new byte[] { 0x00, 0x00, 0x00, 0x10 }; Rozhranie rozhranie; if (cislo_rozhrania == 1) { rozhranie = rozhranie2; } else { rozhranie = rozhranie1; } EthernetPacket eth = new EthernetPacket(rozhranie.adapter.MacAddress, PhysicalAddress.Parse("01005E000009"), EthernetPacketType.IpV4); ip_paket = new IPv4Packet(IPAddress.Parse(rozhranie.ip_adresa), IPAddress.Parse("224.0.0.9")); ip_paket.TimeToLive = 2; udp_paket = new UdpPacket(520, 520); rip_hlava = rip_hlava.Concat(zaznam.cielova_siet.GetAddressBytes()).ToArray(); rip_hlava = rip_hlava.Concat(zaznam.maska.GetAddressBytes()).ToArray(); rip_hlava = rip_hlava.Concat(next_hop).ToArray(); rip_hlava = rip_hlava.Concat(metrika).ToArray(); udp_paket.PayloadData = rip_hlava; // udp_paket.UpdateUDPChecksum(); ip_paket.PayloadPacket = udp_paket; ip_paket.UpdateIPChecksum(); eth.PayloadPacket = ip_paket; rozhranie.adapter.SendPacket(eth); }
public void pridaj_staticku_cestu(int next_hop) { Smerovaci_zaznam smerovaci_zaznam = null; IPAddress ip = IPAddress.Parse(main_view.staticke_ip); IPAddress maska = IPAddress.Parse(main_view.staticke_maska); bool vloz = true; if (next_hop == 1) { smerovaci_zaznam = new Smerovaci_zaznam("S", ip, maska, 1, 0, main_view.staticke_next_hop, -1); } if (next_hop == 2) { smerovaci_zaznam = new Smerovaci_zaznam("S", ip, maska, 1, 0, "X", int.Parse(main_view.staticke_rozhranie)); } if (next_hop == 3) { smerovaci_zaznam = new Smerovaci_zaznam("S", ip, maska, 1, 0, main_view.staticke_next_hop, int.Parse(main_view.staticke_rozhranie)); } foreach (var zaznam in smerovacia_tabulka.ToList()) { if (zaznam.Equals(smerovaci_zaznam)) { vloz = false; } if (Praca_s_ip.adresa_siete(zaznam.cielova_siet, zaznam.maska).Equals(Praca_s_ip.adresa_siete(smerovaci_zaznam.cielova_siet, smerovaci_zaznam.maska)) && zaznam.maska.Equals(smerovaci_zaznam.maska) && zaznam.metrika > smerovaci_zaznam.metrika) { smerovacia_tabulka.Remove(zaznam); } } if (vloz) { smerovacia_tabulka.Add(smerovaci_zaznam); } updatni_smerovaciu_tabulku(); }
public void posli_ping(string ip) { if (ip.Equals(rozhranie1.ip_adresa) || ip.Equals(rozhranie2.ip_adresa)) { main_view.lbl_ping = "!!!!!"; } else { string cmdString = "abcdefghijklmnoprstu"; byte[] sendBuffer = Encoding.ASCII.GetBytes(cmdString); ICMPv4Packet ping = new ICMPv4Packet(new ByteArraySegment(sendBuffer)); string via = null; Rozhranie rozhranie = null; ping.Checksum = 0; ping.TypeCode = ICMPv4TypeCodes.EchoRequest; ping.Sequence = 1; ping.UpdateCalculatedValues(); byte[] bytes = BitConverter.GetBytes(GetCrc(ping.Bytes)); Array.Reverse(bytes); ushort result = BitConverter.ToUInt16(bytes, 0); ping.Checksum = result; Smerovaci_zaznam smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(IPAddress.Parse(ip)); if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface == -1) { smerovaci_zaznam = rekurzivne_prehladanie(smerovaci_zaznam, ref via); } if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface != -1 && smerovaci_zaznam.next_hop != "X") { via = smerovaci_zaznam.next_hop; } if (smerovaci_zaznam != null) { if (smerovaci_zaznam.exit_interface == 2) { rozhranie = rozhranie2; } if (smerovaci_zaznam.exit_interface == 1) { rozhranie = rozhranie1; } IPv4Packet ip_pak = new IPv4Packet(IPAddress.Parse(rozhranie1.ip_adresa), IPAddress.Parse(ip)); ip_pak.SourceAddress = IPAddress.Parse(rozhranie.ip_adresa); ip_pak.DestinationAddress = IPAddress.Parse(ip); ip_pak.PayloadPacket = ping; ip_pak.UpdateIPChecksum(); string label = ""; EthernetPacket eth = new EthernetPacket(rozhranie.adapter.MacAddress, rozhranie.adapter.MacAddress, EthernetPacketType.IpV4); eth.PayloadPacket = ip_pak; int pokus = 5; while (pokus-- > 0) { Thread posielanie = new Thread(() => preposli(rozhranie, eth, smerovaci_zaznam, via, IPAddress.Parse(ip))); posielanie.Start(); zapis_ping = true; Thread.Sleep(1000); if (zapis_ping.Equals(true)) { main_view.lbl_ping += "."; // main_view.lbl_ping = label;//main_view.vypis(".", 85); } } } else { main_view.lbl_ping = "neviem smerovat"; } } Thread.CurrentThread.Abort(); }
public void spracuj_rip(EthernetPacket eth, Packet packet, Rozhranie rozhranie, IPAddress oznamovatel) { lock (this) { Smerovaci_zaznam rip_zaznam; int dlzka = eth.Bytes.Length - 46; int pocet = dlzka / 20; int cislo_rozhrania; bool pridaj_do_databazy = true; IPAddress adresa_siete_rip; IPAddress maska_rip; bool pridaj_zaznam = true; int slash_maska; int posunutie_ip = 0, posunutie_maska = 0, posunutie_metrika = 0; if (rozhranie == rozhranie1) { cislo_rozhrania = 1; } else { cislo_rozhrania = 2; } if ((cislo_rozhrania == 1 && povolene_rip1) || (cislo_rozhrania == 2 && povolene_rip2)) { if ((int)eth.Bytes[42] == 2) { while ((pocet--) > 0) { adresa_siete_rip = Praca_s_ip.adresa_siete(new IPAddress(eth.Bytes.Skip(50 + posunutie_ip).Take(4).ToArray()), new IPAddress(eth.Bytes.Skip(54 + posunutie_maska).Take(4).ToArray())); maska_rip = new IPAddress(eth.Bytes.Skip(54 + posunutie_maska).Take(4).ToArray()); pridaj_zaznam = true; slash_maska = Praca_s_ip.sprav_masku(maska_rip); rip_zaznam = new Smerovaci_zaznam("R", adresa_siete_rip, maska_rip, 120, (int)eth.Bytes[65 + posunutie_metrika], oznamovatel.ToString(), cislo_rozhrania, 0, 0, 0); foreach (var zaznam in smerovacia_tabulka.ToList()) { if (adresa_siete_rip.Equals(Praca_s_ip.adresa_siete(zaznam.cielova_siet, zaznam.maska))) { if ((slash_maska == Praca_s_ip.sprav_masku(zaznam.maska))) { if (zaznam.metrika == 16) { pridaj_zaznam = false; break; } if (rip_zaznam.metrika == 16) { if (zaznam.typ.Equals("R") && zaznam.next_hop.Equals(rip_zaznam.next_hop)) { smerovacia_tabulka.Remove(zaznam); zaznam.metrika = 16; zaznam.invalid = invalid_casovac; Smerovaci_zaznam najlepsia = najdi_najlepsiu_v_databaze(zaznam.cielova_siet, zaznam.maska); if (najlepsia != null && !najlepsia.Equals(zaznam) && !(najlepsia.metrika.Equals(16))) { smerovacia_tabulka.Add(najlepsia); smerovacia_tabulka.Remove(zaznam); rip_databaza.Remove(zaznam); } else { trigger_update(zaznam.exit_interface, zaznam); } pridaj_zaznam = false; break; } else { pridaj_zaznam = false; break; } } if (rip_zaznam.metrika >= zaznam.metrika) { pridaj_zaznam = false; break; } else { smerovacia_tabulka.Remove(zaznam); break; } } } } if (pridaj_zaznam && rip_zaznam.metrika != 16) { smerovacia_tabulka.Add(rip_zaznam); rip_databaza.Add(rip_zaznam); posunutie_ip = posunutie_maska = posunutie_metrika = posunutie_ip + 20; continue; } pridaj_zaznam = true; foreach (var zaznam in rip_databaza.ToList()) { if (adresa_siete_rip.Equals(zaznam.cielova_siet) && zaznam.maska.Equals(rip_zaznam.maska) && (zaznam.next_hop.Equals(rip_zaznam.next_hop))) { pridaj_do_databazy = false; if (zaznam.metrika == 16) { continue; } if (rip_zaznam.metrika == 16) { zaznam.metrika = 16; continue; } else if (rip_zaznam.metrika != zaznam.metrika) { zaznam.metrika = rip_zaznam.metrika; zaznam.nastav_casovace(0, 0, 0); } else if (rip_zaznam.metrika == zaznam.metrika) { zaznam.nastav_casovace(0, 0, 0); break; } } } if (rip_zaznam.metrika == 16) { pridaj_do_databazy = false; } if (pridaj_do_databazy) { rip_databaza.Add(rip_zaznam); } pridaj_do_databazy = true; posunutie_ip = posunutie_maska = posunutie_metrika = posunutie_ip + 20; } } else if ((int)eth.Bytes[42] == 1) { posli_update(rozhranie, cislo_rozhrania, oznamovatel, eth.SourceHwAddress); } } } }
public void analyzuj(Rozhranie rozhranie, EthernetPacket eth, Packet paket) { if (eth.Type.ToString().Equals("Arp")) { IPAddress odosielatel_adres = new IPAddress(paket.Bytes.Skip(28).Take(4).ToArray()); IPAddress ciel_adres = new IPAddress(paket.Bytes.Skip(38).Take(4).ToArray()); if (ciel_adres.ToString().Equals("255.255.255.255") || ciel_adres.ToString().Equals(rozhranie.ip_adresa)) { if (paket.Bytes[21] == 1) { arp_reply(eth, rozhranie, odosielatel_adres, ciel_adres); //dosla mi request tak odpovedam } else if (paket.Bytes[21] == 2 && !eth.SourceHwAddress.ToString().Equals("02004C4F4F50")) //IGNORUJEM LOOPBACK { bool pridaj_arp_zaznam = true; arp = new Arp(odosielatel_adres.ToString(), eth.SourceHwAddress.ToString(), arp_casovac); foreach (var zaznam in arp_tabulka) { if (zaznam.ip.Equals(arp.ip) && zaznam.mac.Equals(arp.mac)) { zaznam.casovac = arp_casovac; pridaj_arp_zaznam = false; } if (zaznam.ip.Equals(arp.ip)) { pridaj_arp_zaznam = false; } } if (pridaj_arp_zaznam) { arp_tabulka.Add(arp); } } } else { if (paket.Bytes[21] == 1) // PROXY ARP { Smerovaci_zaznam naslo_zaznam = null; naslo_zaznam = najdi_zaznam_v_smerovacej_tabulke(ciel_adres); if (naslo_zaznam != null && naslo_zaznam.exit_interface == -1) { string via = null; naslo_zaznam = rekurzivne_prehladanie(naslo_zaznam, ref via); } if (naslo_zaznam != null && naslo_zaznam.exit_interface != -1 && (rozhranie.cislo_rozhrania != naslo_zaznam.exit_interface)) { arp_reply(eth, rozhranie, odosielatel_adres, ciel_adres); } } } } else if (eth.Type.ToString().Equals("IpV4")) { if ((--paket.Bytes[22]) > 0) { IPAddress odosielatel_address = new IPAddress(paket.Bytes.Skip(26).Take(4).ToArray()); IPAddress ciel_adres = new IPAddress(paket.Bytes.Skip(30).Take(4).ToArray()); Smerovaci_zaznam smerovaci_zaznam = null; string via = null; IPv4Packet ip_pak = (IPv4Packet)eth.PayloadPacket; ip_pak.UpdateIPChecksum(); if ((ciel_adres.ToString() == rozhranie1.ip_adresa || ciel_adres.ToString() == rozhranie2.ip_adresa) && (int)eth.Bytes[23] == 1) { ICMPv4Packet ping = (ICMPv4Packet)ip_pak.PayloadPacket; if ((int)eth.Bytes[34] == 8) { ping.Checksum = 0; ping.TypeCode = ICMPv4TypeCodes.EchoReply; byte[] bytes = BitConverter.GetBytes(GetCrc(ping.Bytes)); Array.Reverse(bytes); ushort result = BitConverter.ToUInt16(bytes, 0); ping.Checksum = result; ip_pak.SourceAddress = ciel_adres; ip_pak.DestinationAddress = odosielatel_address; ip_pak.PayloadPacket = ping; ip_pak.UpdateIPChecksum(); eth.PayloadPacket = ip_pak; smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(odosielatel_address); if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface == -1) { smerovaci_zaznam = rekurzivne_prehladanie(smerovaci_zaznam, ref via); } if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface != -1 && smerovaci_zaznam.next_hop != "X") { via = smerovaci_zaznam.next_hop; } if (smerovaci_zaznam != null) { if (smerovaci_zaznam.exit_interface == 2) { rozhranie = rozhranie2; } if (smerovaci_zaznam.exit_interface == 1) { rozhranie = rozhranie1; } Thread posielanie = new Thread(() => preposli(rozhranie, eth, smerovaci_zaznam, via, odosielatel_address)); posielanie.Start(); } } else if ((int)eth.Bytes[34] == 0) { if (zapis_ping) { // main_view.vypis("!", 99); main_view.lbl_ping += "!"; zapis_ping = false; } } } else if ((ciel_adres.ToString() == rozhranie.ip_adresa || ciel_adres.ToString() == "224.0.0.9") && ((int)eth.Bytes[43] == 2)) { spracuj_rip(eth, paket, rozhranie, odosielatel_address); } else { smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(ciel_adres); if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface == -1) { smerovaci_zaznam = rekurzivne_prehladanie(smerovaci_zaznam, ref via); } if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface != -1 && smerovaci_zaznam.next_hop != "X") { via = smerovaci_zaznam.next_hop; } if (smerovaci_zaznam != null) { if (smerovaci_zaznam.exit_interface == 1) { rozhranie = rozhranie1; } if (smerovaci_zaznam.exit_interface == 2) { rozhranie = rozhranie2; } Thread posielanie = new Thread(() => preposli(rozhranie, eth, smerovaci_zaznam, via, ciel_adres)); posielanie.Start(); } } } } if (zastav_vlakno) { rozhranie.adapter.Close(); } }