next up previous contents
Next: Erweiterter Code Up: Erweiterung des Kernels Previous: Erweiterung des Kernels

Vorhandener Code

  Der Switch hat zwei Fälle zu unterscheiden: Ein Ethernet-Frame kann vom eigenen TCP/IP-Stack oder von einem der Ports kommen. Im ersteren Fall ruft der Switch die Funktion br_tx_frame -- das tx im Funktionsnamen deutet schon an, daß hier ein IP-Paket gesendet werden soll -- im zweiteren die Funktion br_receive_frame auf. In beiden Fällen wird dem Switch die Struktur sk_buff übergeben, die unter /usr/src/linux/include/linux/skbuff.h deklariert wird. Unter anderem enthält diese Struktur die Quell- und Ziel-Adresse des empfangenen Schicht-2-Frames.

Kommt der Frame vom host stack, so wird, nachdem das Loopback Device ausgeschlossen wurde, die Funktion br_forward(struct sk_buff *skb, int port) aufgerufen, der die Struktur sk_buff und der Ursprungsport als Integerwert übergeben werden. Diese Funktion leitet den Frame entweder an eine bekannte Adresse an einem bestimmten Port weiter oder schickt einen Broadcast an alle Ports, wenn die Zieladresse des Frames nicht bekannt ist.

Liegt der Frame hingegen an einem Port an, so wird zunächst die Funktion static int br_learn(struct sk_buff *skb, int port) aufgerufen. br_learn ruft die Funktion br_avl_find_addr aus br_tree.c auf, die u.a. den Port und die MAC-Adresse des empfangenen Frames in eine Tabelle einträgt[*] oder den vorhandenen Eintrag mit einem neueren Datum versieht. Das Datum dient als Timestamp, damit nach einer gewissen Zeit der Inaktivität der Eintrag wieder gelöscht werden kann. Ist die gewünschte Information in der Tabelle abgepeichert worden, wird das Ziel des Frames festgestellt. Ist der Frame für den Switch selber, so wird er an den host stack weitergeleitet, ansonsten die Funktion br_forward aufgerufen, die für die Auslieferung des Frames verantwortlich ist.

Je nachdem, ob die Zieladresse bekannt ist, also in der Switch Tabelle vorhanden ist, oder nicht, ruft br_forward die Funktion extern int dev_queue_xmit(struct sk_buff *skb) auf, die den Frame an den gewünschten Port ausliefert oder static int br_flood(struct sk_buff *skb, int port), die den Frame an alle Ports außer dem Quellport weiterleitet.


next up previous contents
Next: Erweiterter Code Up: Erweiterung des Kernels Previous: Erweiterung des Kernels
Root on HPHEGER0
3/3/1999