[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