[LiSA-Devel] Enable interfaces
Ionut Nicu
ionut.nicu at ines.ro
Tue Jun 2 15:48:22 EEST 2009
Salut Andrei,
Faur Andrei wrote:
> M-am uitat in implementarea de CDP si am gasit functia
> cdpd_register_interface. Nu inteleg de ce se face cautarea interfetei
> in lista deregistered_interfaces si nici de ce e nevoie de o astfel de
> lista. Mai este nevoie de mentinerea anumitor informatii dupa ce
> s-a dat disable CDP pe o interfata?
>
O interfata cdp (struct cdp_interface) are o lista de neighbors si un
semafor pentru protejarea accesului concurent la aceasta (learning
thread vs aging thread).
In acelasi timp exista referinte la structurile de neighbor in heap-ul
(global) folosit pentru mecanismul de aging. Thread-ul care face aging
trebuie sa se stearga neighbor-ul si din lista de pe interfata (deci
utilizeaza semaforul de pe interfata pentru accesul la lista).
La disable cdp pe o interfata ar trebui in mod normal ca pentru fiecare
neighbor sa:
1. sterg neighbor-ul din heap.
2. mut ultimul element din heap peste pozitia acestuia si sa fac o
cernere (sift_down).
2. sterg neighbor-ul din lista si sa-i fac free
In final trebuie facut free la cdp_interface.
Solutia actuala din cdpd (mai simpla):
1. Scot cdp_interface din lista de interfete cdp enabled si o adaug in
deregistered_interfaces si las aging-ul sa-si faca treaba (interfata
fiind cdp disabled, toti neighborii vor fi stersi de aging dupa un timp).
2. La inregistrare interfata, reutilizez intrarea din deregistered
interfaces, care chiar ar mai putea avea inca neighbori pe ea (care nu
au fost inca aged). Mi se pare ca IOS-ul are un behavior similar (la
disable/enable cdp pe o interfata nu se face flush la lista de neighbori).
PS: nu stiu daca tu ai nevoie de o abordare de genul asta.
Bafta,
Ionut.
More information about the LiSA-Devel
mailing list