コード例 #1
0
 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;
             }
         }
     }
 }
コード例 #2
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);
                    }
                }
            }
        }