Relazioni tra generazioni NET_BUFFER_LIST
I writer di driver devono comprendere e mantenere la relazione tra le strutture padre (originale) e le strutture figlio (derivate NET_BUFFER_LIST ) che derivano da operazioni clone, frammento e riassemble.
Il chiamante di una funzione clone/fragment/reassemble mantiene la relazione padre/figlio, incluso il puntatore padre nella struttura di NET_BUFFER_LIST figlio e un conteggio figlio. Il conteggio figlio garantisce che il chiamante libera il padre dopo che tutti i figli sono stati liberati. Sono applicabili le regole seguenti:
Dopo che un driver crea strutture figlio da una struttura NET_BUFFER_LIST , deve mantenere la proprietà della struttura padre e deve passare le strutture figlio ad altri driver. Il driver non deve mai passare la struttura padre NET_BUFFER_LIST a un altro driver.
Un driver deve aggiornare solo il conteggio figlio nella struttura di NET_BUFFER_LIST padre. Poiché la struttura padre non viene mai passata a un altro driver, non esiste alcun rischio che il valore del conteggio figlio possa essere sovrascritto. Il driver deve impostare il puntatore padre nelle strutture figlio per puntare alla struttura padre.
Quando un driver riceve un NET_BUFFER_LIST da un altro driver, il driver non deve sovrascrivere il puntatore padre. Se la struttura NET_BUFFER_LIST ricevuta è un elemento figlio, il puntatore padre deve essere già impostato. Il driver può usare la NET_BUFFER_LIST ricevuta da un altro driver come struttura padre.
NDIS non applica le regole precedenti. Il proprietario corrente di una struttura NET_BUFFER_LIST deve gestire il conteggio figlio e il puntatore padre. Ad esempio, se il proprietario corrente clonerà e frammenterà una struttura NET_BUFFER_LIST, deve gestire il puntatore padre e il contatore figlio.
NDIS imposta il conteggio figlio su zero e il puntatore padre su NULL quando alloca una struttura NET_BUFFER_LIST. NDIS non modifica questi campi ogni volta che un driver passa una struttura NET_BUFFER_LIST a un altro driver.