12. Realtek 8139 Ethernet Controller 12.1.1 Ethernetvarianten · - Ältere Boards bieten nicht auf...

26
1 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess 1 Receive - 2 Receive + 3 Transmit + 6 Transmit - 1 8 1Transmit + 2 Transmit - 3 Receive + 6 Receive - 8 1 12. Realtek 8139 Ethernet Controller 12.1.1 Ethernetvarianten 10 BASE T: 10MBit Manchester Codierung. 100 BASE T/TX: 100MBit 4B/5B Codierung: - full-duplex mit passendem Switching-Hub, - halb-duplex. 12.1.2 Steckerformat RJ-45 Stecker - 8 Stifte, davon nur 4 Stifte benutzt, - keine Überkreuzung im Kabel. Stiftbelegung an Dosen, Hubs und Switches. Stiftbelegung an der Netzwerkkarte oder Uplink am Hub oder Switch.

Transcript of 12. Realtek 8139 Ethernet Controller 12.1.1 Ethernetvarianten · - Ältere Boards bieten nicht auf...

1 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

1 Receive - 2 Receive + 3 Transmit + 6 Transmit -

1 8

1Transmit + 2 Transmit - 3 Receive + 6 Receive -

81

12. Realtek 8139 Ethernet Controller

12.1.1 Ethernetvarianten

• 10 BASE T: 10MBit Manchester Codierung.

• 100 BASE T/TX: 100MBit 4B/5B Codierung: - full-duplex mit passendem Switching-Hub, - halb-duplex.

12.1.2 Steckerformat

• RJ-45 Stecker - 8 Stifte, davon nur 4 Stifte benutzt, - keine Überkreuzung im Kabel.

• Stiftbelegung an Dosen, Hubs und Switches.

• Stiftbelegung an der Netzwerkkarte oder Uplink am

Hub oder Switch.

2 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.2 Chip-Architektur des 8139 • PCI-Schnittstelle:

- Bus Master Übertragung, - DMA Deskriptoren.

• Interruptsteuerung: - Senden, empfangen, - Fehlersituationen.

• FIFO Steuerung: - Schwellwert-Einstellungen ...

• Zusätzliche Features: - Auto-Negotiation - Power-Control, - LAN Wakeup, - Flow Control.

• Boot ROM zum Starten vom Netz. • LED zur Anzeige des Link-Zustandes. • EEPROM zur Ablage von Konfigurierungsparametern.

Boot ROM Interface

LED

PCI

Interruptcontrol

FiFo

FiFo Control

Receive Transmit

EPROM Interface

3 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.3 Arbeitsweise

• Transfer nur über Bus Mastering möglich: - Ältere Boards bieten nicht auf allen Sockeln Bus Mastering, - RTL 8139 arbeitet auf physikalischen Adressen, - CPU arbeitet auf logischen Adressen.

• Pufferung geschieht im Hauptspeicher: - 64 KByte Ringpuffer für die empfangenen Pakete, - 4 Deskriptoren für abgehende Pakete im Chip, - Pakete selber im Hauptspeicher.

• 4 Transmit-Deskriptoren: - Sendeadresse im Hauptspeicher, - Zustand der Übertragung, - Länge des Paketes.

• Zwei FiFo Puffer à je 2Kbyte auf dem Chip (Senden & Empfangen): - beim Erreichen eines Schwellwertes im Empfangspuffer beginnt DMA Übertragung, - beim Erreichen eines Schwellwertes im Sendepuffer beginnt Übertragung ins Netz.

RLT 8139

RAM

4 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

32 Bit Startadresse 32 Bit Startadresse 32 Bit Startadresse 32 Bit Startadresse

24 Bit Status

12 Bit Länge

TSD0 @ $10

TSAD0 @ $20

12.4 Registersemantik

12.4.1 Transmit-Deskriptoren

• Transmit Status Register - TSD0 .. TSD3 (32 Bit, $10): [31] Carrier Sense Lost [30] Transmit Abort [29] Out of Window Collision [28] CD Heart Beat ; nur bei 10MBit ; [27..24] Carrier Sense Lost [21..16] Early Transmit Threshold:

- 8, n*32 Bytes, [15] TOK, Transmit successful, [14] TUN, Transmit FiFo underrun, [13] OWN,

- the CPU currently owns the packet - not the adapter.

[12..0] Größe des zu versendenden Paketes in Bytes

• Transmit Start Adress Register - TSAD0 .. TSAD (32 Bit, $20).

5 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.4.2 Weitere Geräteregister

• ca. 60 Register vorhanden, Memory mapped.

• CR - Command Register (8 Bit, $37 ): [4] Reset [3] Receiver Enable [2] Transmitter Enable [0] Buffer empty

• BMCR - Basic Mode Control Register (16 Bit, $62): [15] Reset [13] Speed_Set 100Mbps [12] Auto Negotation enabled [9] Restart Auto Negotation [8] Enable full-duplex mode

6 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

• TCR - Transmit Configuration Register (32 Bit, $40)

- [30..28] Hardware Versionsnummer - [27] RTL8139B(L) - [25..24] Interframe Gap 9.6us .. 8.4us (100Mbit) oder 960ns .. 840 ns (10Mbit) - [18..17] (normal, MAC, PHY, Twister)-Loopback, - [16] CRC Prüfsumme am Paketende anfügen - [10..8] Max Tx-DMA Burst 16-2048 Bytes - [7..4] TxRetryCount: Retries=16 + ( Tx Retry*16 ) - [0] Clear Abort

7 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

• RCR - Receive Configuration Register (32 Bit, $44): [27..24] Early Receive Threshold zum Auslösen des Interrupts (% der Gesamtlänge): 0000 = no early threshold, 0001 = 1/16, 0010 = 2/16 .... 1111 = 15/16 Nur möglich für bekannte Protokolle mit Längenfeld. [16] fehlerhafte Pakete mit Länge > 8 Bytes empfangen [15..13] Schwellwert für Empfangs-DMA (16 Bytes ... 1024 Bytes, 111 = ganzes Paket) [12..11] Länge des Empfangspuffers (00 = 8K ; 01 =16K ... 11 = 64K ) [10..8] Maximale DMA Burst Size per Rx DMA (16 Bytes .. unbegrenzt) [7] sofortiger Wraparound am Ende des Ringpuffers oder erst nach einem Paket [6] Eprom Typ (nicht alle Chipversionen) [5] Fehlerhafte Pakete annehmen [4] Pakete < 64 Bytes annehmen [3] Broadcast Pakete annehmen [2] Multicast Pakete annehmen, [1] Pakete mit übereinstimmender MAC- Adresse annehmen [0] Pakete mit beliebiger MAC Adresse annehmen

8 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

• Interrupt Status & Interrupt Mask Register (16 Bit, $3e / $3c ):

[15] System Error [14] Time Out [13] Cable Length changed [6] Receive Fifo Overflow [5] Link changed [4] Rx Buffer overflow [3] Transmit Error Interrupt [2] Transmit OK Interrupt [1] Receive Error Interrupt [0] Receive OK Interrupt

9 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

• RBSTART- Receive Buffer Start Address (32 Bit, $30): - Offset an der das nächste zu lesende Paket steht, - maximal 64 Kbyte Puffer möglich.

• CAPR - Current Address of Packet Read (16 Bit, $38): - Offset an der das nächste zu lesende Paket steht, - maximal 64 Kbyte Puffer möglich, - aktueller Lesezeiger der Karte.

• CBA - Current Buffer Address (16 Bit, $3a): - aktueller Schreibzeiger der Karte, - Wrap-Around am Ende des Puffers.

• IDR0..IDR5 - Mac ID Register (48 Bit, $00): - Ethernet-Adresse der Karte, - gegebenfalls selber setzen.

• MAR0..MAR7 - Multicast Address (64 Bit, $08): - Bitmap für den Hashcode der Multicast-Adresse, - Detailtest durch die Software.

10 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.5 Registerklasse für RLT 8139

12.5.1 Die Plurix-Klasse PMapper:

• gestattet eine Registerstruktur auf den Speicher abzubilden,

• Basisklasse für memory-mapped Registerklassen,

• kann nicht mit new() alloziert werden,

• attr_sys & attr_nobc (No Backchain).

• public class Regs8139 extends PMapper =>

Regs8139

PCI-Space

RAM-Space mapAt(0xefffffff)

11 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.5.2 Geräteregister als Java-Klasse Regs8139

• Adressierung im Kontext der Registerklasse.

• Kann keine eigentlichen Variablen besitzen.

• Gemappt wird in der zugehörigen Device-Instanz.

• Mnemonischer und effizienter als Methodenaufrufe.

• Immer mit der Synthetisierung eines Zeigers verbunden.

• In Sprachen wie C, Pascal, Modula-2 als Struct bzw. Record.

• In Plurix als Compiler-Feature implementiert ( ....mapAt() ).

package devices; /** Bildet die RLT8139 Register in den PCI-Speicher ab * @author P. Schulthess * @version 0.001 */ public class Regs8139 extends PMapper { int IDR0, IDR4, MAR0, MAR4; // 6 Byte MAC-Address, 2 B Filler, 8 B Multicast Mask

12 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

int TSD0, TSD1, TSD2, TSD3; // Transmit status of descriptors 0..3, $10 ... int TSAD0, TSAD1, TSAD2, TSAD3; // Transmit address of descriptors 0..3, $20 .. int RBSTART; // receive buffer start address, $30 . short ERBCR; // early receive byte count, $34 byte ERSR, CR; // early receive status, command register, $36 short CAPR, CBR; // curr. adr. of pk read, curr. buffer adr. short IMR, ISR; // Int mask, Int status int TCR, RCR; // Transmit/Receive configuration register, int TCTR, MPC; // timer count, missed packets, $40 byte CR9346, CONFIG0, CONFIG1, f1; // 9346 command, configuration1/2,, $50 int TimerInt; // Timer interval until timeout interupt in ISR byte MSR, CONFIG3, f2, f3; // Media status, configuration 3,,, $58 short MULINT, RERID, TSAD; // Multiple Int, PCI Revision, xMit status all short BMCR, BMSR; // Basic mode control/-status, short ANAR, ANLPAR, ANER; // autoneg. advertise/-partner/-expansion, $$66 short DIS, FSC; // disconnect counter, false carrier short NWAYTR, RX_ER, CSCR, f4; // N-wy test, receive errors, cs configuration, $70 long PHY1_P, TW_P, PHY2_P; // Physical parameters, twist p., 3 bytes filler, $78 byte CRC0, CRC4; // Power management and wakeup, $84 long W0, W1, W2, W3; // wakeup frames, $8c long W4, W5, W6, W7; // wakeup frames byte LSB0, LSB4; // Power management and wakeup, $cc final static int

13 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

ErrorPck=0x20, RuntPacket=0x10, BroadCastPck=0x08, // which packets- MultiCastPck=0x4, PhysMatchPck=0x2, AllPck=0x1; // -to receive ? final static int InterframeGapTime=3, // 9.6us 10MBit, 960ns 100MBit RxFifoThreshold=7, // 0=16Bytes, 1=32Bytes, ..., 7=no rx threshold MaxTxDmaBurst=6, // 0=16Bytes, 1=32Bytes, .. 7=2048bytes MaxRxDmaBurst=6, // 0=16Bytes, 1=32Bytes, .. 7=unlimited RxBufferSize=3; // 0=8K, 1=16K, 2=32K, 3=64K public void initRegisters( byte[] rxBuffer) { CR=Reset; while (CR > 0); // reset pending CR9346=0xC0; // enable Config_Register_Write ANAR=0x3E1; // all modes advertised, CSMA#1 BMCR=ANE; // auto negotiation enable IMR=0; // disable all NIC interrupts RCR=(RxBufferSize<<11)|(RxFifoThreshold<<13)|(MaxRxDmaBurst<<8); TCR=(MaxTxDmaBurst<<8)|(InterframeGapTime<<24); // command registers CR9346=0x00; // disable Config_Register_Write RBSTART=Magic.Cast(int, rxBuffer); // Startaddress of receive buffer } }

14 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.6 Realtek 8139 Treiber als Java Instanz

12.6.1 Header und Konstanten: package devices; import kernel.*; import kernel.memory.*; import devices.bus.pci.*; /** Driver instance for Realtek 8139 network adapter * @author O. Marquardt, M. Schöttner, P. Schulthess * @version 0.5 */ public attr_sys attr_nonbc class Realtek8139 extends NetworkAdapter{ final static int // Bitpositions - sorry for the mess Reset=0x10, rEnable=0x0008, tEnable=0x4, BufferEmpty=0x0001, // init ANE=0x1000, MBPS100=0x2000, MBPS10 =0x0, FullDuplex =0x0100, // network mode Tx_OWN=0x2000, Tx_TOK=0x8000, Tx_Threshold=0, clearAbort=0x1, // sending state SyERR=0x8000, TmOut=0x4000, LCh=0x2000, FOVW=0x40, PUN=0x0020, // int types RXOVW=0x0010, TER =0x0008, TOK=0x0004, RER =0x02, ROK=0x0001, xMulticast=0x8000, RxPhyscl=0x4000, RxBrodcst=0x2000, // receive results RxBadSymbl=0x0020, RxRuntPk=0x0010, RxTooLong=0x0008, RxCRCErr =0x0004, RxBdAlgn=0x0002, RxStatsOK=0x0001;

15 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.6.2 Variablen, Standardmethoden und PCI-Initialisierung:

• Jeder Plurix Treiber muss einige abstrakte Methoden implementieren: - DetectDevice() prüft, ob das gerät auch tatsächlich vorhanden ist. - Initialize() zum Aufbauen der persistenten Datenstrukturen, - Reinitialize() wird beim Warmstart oder Fallback gerufen, - Start() aktiviert das Gerät zum Senden/empfangen, - Stop() fährt das Gerät sicher herunter.

• Dazu kommen gerätespezifische Methoden (real soon now ...): - Lesen, Schreiben, Parameter setzen, Signalisieren, Mechanik, - USB-Device, ATAPI-Device, SCSI ...

Regs8139 r; // mapped registers int[] tDescPool= new int[1000]; // pool for TxDescriptors byte[] rxBuff = new byte[80000]; // must lock to be safe int rxRead; // read pointer public boolean detectDevice(){ deviceID=PCI.LookForDevice(PCI.NetworkCntl, 0x10EC , 0x8139); return deviceID != PCI.NoDevice ; }

16 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

public int initialize() { int baseAdr = PCI.ReadConfig(deviceID, 0x04)& 0xFFFF0000; baseAdr = baseAdr | PCI.Inst_MAR|PCI.Inst_BM| PCI.Inst_IOR; PCI.WriteConfig(deviceID, 0x04, baseAdr); r= Magic.cast(Regs8139, Regs8139.mapAt( baseAdr)); return reinitialize(); } public int reinitialize() { r.initRegisters(rxBuff); rxRead=0; Interrupts.InsertHandler( this, PCI.getInterrupt(deviceID)); return start(); } public int start(){ r.CR= rEnable | tEnable; r.IMR=FOVW|RXOVW|TER|TOK|RER|ROK; state=Device.STARTED; return 0; } public int stop() { r.CR=0; r.IMR=0; state=Device.STOPPED; // disable return 0; } public long getNicAdress() { return (long) r.IDR4<<32 | r.IDR0; } private void sendMore() {} // check for pending packets some day

17 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

ByteDevice

Device

Keyboard V24

Networkdevice

RTL8139 NE2000

Videoadapter

S3 Virge VGA

12.7 Vererbungshierarchie für Devices in Plurix

• Geplant, jedoch nicht implementiert.

• Grundprinzip:

• Auf oberster Ebene nur abstrakte Klasse Device.

• Auf unterster Ebene konkrete Implementierungen.

• Package-Organisation jedoch entsprechend den PCI Signaturen.

18 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.8 Paket senden

• Neuen Deskriptor aufsetzen, sobald vorherige Aktion zu Ende.

• Hier wird nur ein Deskriptor verwendet (im Prinzip sind 4 vorhanden).

private void Tx(int physicalAddress, int len) { while ((r.TSD0 | Tx_OWN)=0) len = len; // "lazy" loop r.TSAD0 = physicalAddress; // only descriptor #0 r.TSD0 = len ; // set length and start descriptor }

• Methode sendMore(): - prüft ob noch weitere Pakete in Sender-Queue liegen, - Hier jedoch keine Sender-Queue, nur Busy-Loop, - Für optimale Performance jedoch erforderlich.

• Pufferungsstrategien: - pro Paket maximal 1792 Bytes, - nur einen Deskriptor nutzen, - alle 4 Deskriptoren nutzen, - weitere Pakete vorhalten.

19 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.9 ISR - Interrupt Service Routine:

• Ein Plurix Gerätetreiber wird vom First-Level Handler (FLIH) gerufen.

public int ISR() { // called by first level handler int intStatus; while ( (intStatus=r.ISR) >0) { // no write combining possible in the lines below if((intStatus&ROK)>0) { r.ISR=ROK; rxPacket (); }; if((intStatus&TOK)>0) { r.ISR=TOK; sendMore(); }; if((intStatus&(RXOVW|FOVW)) >0) r.IsR=RXOVW|FOVW; // Might insert overwrite warning message if((intStatus&TER)>0) { // transmit error r.ISR=TER; // might "clearAbort" if((r.TSAD&0xF)>0 ) // this deskriptor, low bits r.TCR= r.TCR | clearAbort; } }; return 0; }

• sendMore() im Prinzip zum autonomen Versenden mehrerer Pakete.

20 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.10 First-Level Interrupt Handler

• "Shared Interrupt" Szenarium: - mehrere Geräte nutzen denselben Interrupt, - PCI Bus verfügt nur über 4 Interrupt Leitungen, - Mehrere IRQ Holder (FLIH) sind an IRQ# gebunden, - IRQ-Holder ruft nacheinander die Handler für IRQ# auf, - Holder kehrt zurück, wenn keine weiteren Interrupts, - bedient den Interrupt Kontroller Chip.

• Meist 15 festverdrahtete First-Level-Handler: - FLIH Instanzen mit jeweils eigener IRQ Nummer, - rufen die vorgeschriebene Methode ISR(), - Tabelle mit den Treiberinstanzen.

• Vereinfachung für Plurix: - nur eine FLIH-Instanz, ohne inneren Zustand, - ISR Register im Int-Kontroller ergibt die IRQ#.

• Plurix FLIH als Klasse Interrupts im Kernel-Package.

IDT

Device Device Device Device Device

IRQ0 IRQ1 IRQ3 IRQ15 IRQ15 IRQ12 IRQ13 IRQ14 IRQ15

Device Device Device Device Device

ISR()

FLIH

21 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

• Direkter Interruptaufruf (nicht Plurix): - jedes Gerät besitzt einen eigenen Interrupt mit IRQ#, - dieser Interrupt ist an den Handler gebunden. - Interrupt wird durch das Gerät ausgelöst. - Handler wird direkt angesprungen, - Schnellere Verarbeitung.

• Nachteil: - Schwierig bei "Shared Interrupts". - Treiberkontext schwieriger bereitzustellen, - Jeder Treiber muss selber den Interrupt Kontroller bedienen,

IDT

IRQ0 IRQ1 IRQ3 IRQ15 IRQ15 IRQ12 IRQ13 IRQ14 IRQ15

Device

ISR( ) Device

22 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.11 Empfangen eines Paketes

12.11.1 Format im Ringpuffer: • Der Ringpuffer enthält auch die 4 Bytes des Headers, • Länge des Pakets in Bytes (2 Byte), • Status des Pakets (2 Byte).

• Ablauf im Chip - CAPR um 4 inkrementieren, - Speicherplatz für ReceiveOK, CRC-Error, Runt, .. - Transfer des Paketes vom FiFo in den Hauptspeicher, - Nachträgliches Schreiben von Paketlänge + Status.

• Empfangen eines Paketes: - Meldung der Paketankunft nach oben, - Übergeordnetes Protokoll holt dann die Daten ab, - Weiterschalten des Lesezeigers im Puffer (Karte & Programm).

rxPacket() im Treiber

Höheres Protokoll

received getData

Header

23 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.11.2 Methoden zum Empfangen eines Paketes:

• Überprüfen des per DMA abgelegten Paketes.

• Benachrichtigen des übergeordneten IP-Protokolles.

• Pufferzeiger inkrementieren - unabhängig von der höheren Ebene.

• Läuft im Interrupt mit unterbundener Unterbrechung.

void rxPacket() { boolean paketOK; int len, status, iMask=RxStatusOK|RxBadAlign|RxCRCErr|RxTooLong|RxRunt; while ((r.CR & BufferEmpty)==0) { // loop for finish of PCI Transfer status =(rxBuffer[rxRead+1]<<8)+rxBuffer[rxRead]; // 8139 header len =(rxBuffer[rxRead+3]<<8)+rxBuffer[rxRead+2]; // watch for Byteorder paketOK=(status & iMask)==RxStatusOK; if(packetOK && (SYSTEM.ip!=null)) { // notify protocol above and if(SYSTEM.ip.received(this, rxRead+4, len-4)); // let it then call getData } rxRead=(rxRead+len+4+3) & 0xFFFC; // update pointer, wrap around r.CAPR=rxRead-16; // notify adapter, update pointer } }

24 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

• Abholen der eingegangenen Daten durch das höhere Protokoll:

public void getData(int source, int offset, int bytes, int MemAdr) { int rap, bufferOffset; // higher level protocols will acess via getData bufferOffset=(source+offset) % BufferSize; if((bufferOffset+bytes-1)<BufferSize){ Memory.CopyMemory(bufferBase+bufferOffset, MemAdr, bytes); } else {rap=BufferSize-bufferOffset; // simulate RingBuffer Memory.CopyMemory(bufferBase+bufferOffset, MemAdr, rap); Memory.CopyMemory(bufferBase, MemAdr+rap, bytes-rap); } }

• Sonderfall für Wrap-Around Situation.

• Läuft normalerweise ebenfalls noch im Interrupt: - Hauptarbeit in der Methode Memory.CopyMemory(), - ca. 2.5 µsec pro Kilobyte (=> R. Göckelmann), - Überlaufschutz durch die Karte.

25 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.11.3 Byte-Order Prüfung

• Little Endian (PC): Niedrigwertige Bits an niedrigen Speicheradressen: - Pascal-Testprogramm mit

Varianten-Record.

• 8139 Header im Bytepuffer: - Statusbits in den unteren 16 Bit, - Längenfeld in oberen 16 Bit, - byteweise zusammensetzen:

4 Byte Header

Länge Status

26 Systemprogrammierung I, Sommer 2002, @VS, Informatik Ulm, P. Schulthess

12.12 Empfang von Multicast Paketen

• Anwendungsfall: z.B. Seitenanfrage oder Commit-Request im Plurix-Cluster.

• Problem: - Eine Multicast Nachrichten für eine andere Gruppe sollen keine CPU-Zeit kosten, - Eine Station kann an vielen Multicast-Gruppen teilnehmen, - Hardwareaufwand soll sich in Grenzen halten.

• Lösungsansatz: - Neben der eigentlichen Mac-Adresse gibt es eine 64 Bit Multicast-Bitmap, - Eine ankommende Multicast-Adresse wird hash-codiert auf "eins aus 64", - Empfang, falls das entsprechende Bit in der Multicast-Bitmap gesetzt ist, - Interrupt-Status zeigt an, dass ein Multicast Paket empfangen wurde, - Anschliessend zusätzliche Prüfung der MC-Adresse in Software.

8139 Register MultiC-BitmapMAC-Addr. sr

MultiC-Addr.

hash ?