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 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); } } } }