Hallo, ich arbeite schon länger mit dem enc28j60 Ethernetchip. Soweit problemlos. Nun möchte ich Multicast Pakete empfangen. Leider funktioniert das nicht. Es werden nur Broadcast oder Unicast Pakete empfangen.
Zur Auswertung schicke ich die Daten direkt nach dem Empfang per UART raus.
Den Paketfilter habe ich bereits auf Multicast gesetzt bzw. auch komplett gelöscht. Keine Abweichung.
Paket abholen:
1
unsigned int enc_receive_packet( unsigned int bufsize, unsigned char *buf )
2
{
3
unsigned char rxheader[6];
4
unsigned int len, status;
5
unsigned char u;
6
7
// check rx packet counter
8
u = enc_read_reg( ENC_REG_EPKTCNT );
9
ENC_DEBUG("enc_receive: EPKTCNT=%i\n", (int) u);
10
if( u == 0 ) {
11
// packetcounter is 0, there is nothing to receive, go back
Leider nur eine Idee in der anderen Richtung: ist sicher, dass die Pakete überhaupt auf der Leitung sind? Hatte mir für solche kniffligen Fälle extra einen uralten Hub (nicht Switch) organisiert, der den kompletten Traffic auf alle Ports legt, so dass man mit Wireshark sieht was da tatsächlich läuft, wenn zwei nicht so richtig miteinander reden wollen.
Danke für den Tipp. Ich habe das umfänglich geprüft. Multicast wird generell erstmal per Broadcast gesendet und das habe ich auch nochmal mit Port Spiegelung überprüft. Die Pakete gehen definitiv raus. Auch Multicast Paket vom ENC28J60 kommen am PC an. Es betrifft nur den Empfang!
Ich würde das Problem eingrenzen, indem ich einen funktionierenden Frame nehme, und dann Bit für Bit ändere, schicke, schaue, bis er plötzlich nicht mehr ankommt. Mehrfach, um festzustellen, ob immer das gleiche Bit den Ausschlag gibt, oder Zufallseffekte im Spiel sind. Kann mir eigentlich nur vorstellen, dass ein Filter auf die MAC-Adresse noch irgendwo übrig geblieben ist beim Umbauen.
Multicast wird generell erstmal per Broadcast gesendet
Genau genommen ist die Broadcast-Adresse ff-ff-ff-ff-ff-ff eine spezielle Multicast-Adresse. Mit welcher MAC-Adresse werden die Pakete vom PC gesendet? Bessere Switche geben Multicast erst weiter, nachdem die Empfänger sich per IGMP dafür angemeldet haben. Verbinde PC und ENC28J60 doch mal direkt per Crossover-Kabel.
Was macht denn die Funktion enc_setbits_reg() genau, setzt/löscht sie einzelne Bits oder schreibt sie das Byte ins Register?
Ich hatte vor einer Weile einen ENC28J60 mit einem STM32 verwendet und da hat der Multicastempfang soweit ich mich erinnere funktioniert. Bei mir war nur das "CRCEN" Bit im ERXFCON Register gesetzt.
Eventuell auch mal das ERXFCON Register zurücklesen und schauen was dort tatsächlich steht.
Ich habe noch mal kurz das Code-Fragment des TO angeschaut, es gibt dort enc_write_reg() und enc_setbits_reg(). Dann wird wohl enc_setbits_reg() einzelne Bits im Register setzen und der Aufruf "enc_setbits_reg(ENC_REG_ERXFCON, 0)" müsste dann vermutlich "enc_write_reg(ENC_REG_ERXFCON, 0)" sein damit es das gewünschte macht.
müsste dann vermutlich "enc_write_reg(ENC_REG_ERXFCON, 0)" sein damit es
das gewünschte macht.
Stimmt. Mir war entgangen, dass da nur das Broadcast-Bit gesetzt wird. Sonst würde ja nur Broadcast erlaubt. Für Multicast müsste Bit 1 (MCEN) gesetzt sein.
Ich würde das Problem eingrenzen, indem ich einen funktionierenden Frame
nehme, und dann Bit für Bit ändere, schicke, schaue, bis er plötzlich
nicht mehr ankommt. Mehrfach, um festzustellen, ob immer das gleiche Bit
den Ausschlag gibt, oder Zufallseffekte im Spiel sind. Kann mir
eigentlich nur vorstellen, dass ein Filter auf die MAC-Adresse noch
irgendwo übrig geblieben ist beim Umbauen.
Das wäre eine aufwendige aber sehr detaillierte Idee um das Problem einzugrenzen. Danke für den Tipp. Werde ich vermutlich so machen müssen.
Genau genommen ist die Broadcast-Adresse ff-ff-ff-ff-ff-ff eine
spezielle Multicast-Adresse. Mit welcher MAC-Adresse werden die Pakete
vom PC gesendet? Bessere Switche geben Multicast erst weiter, nachdem
die Empfänger sich per IGMP dafür angemeldet haben.
Korrekt, wenn Multicast Snooping deaktiviert ist sendet der Switch es als Broadcast, also auf allen Ports. Der AVR meldet sich über den NIC bereits für die passende Gruppe an. Zudem habe ich kontrolliert, dass die Paket auch wirklich aus dem Port kommen. Das ist zumindest sichergestellt. Aktuell bezieht sich das Problem nur auf dem Empfang der MC Paket zwischen Switchport Ausgang und AVR SPI Eingang. Also auf den ENC28J60. Da liegt im Moment das Problem.
Stimmt. Mir war entgangen, dass da nur das Broadcast-Bit gesetzt wird.
Sonst würde ja nur Broadcast erlaubt. Für Multicast müsste Bit 1 (MCEN)
gesetzt sein.
Nicht ganz korrekt: Wird der Filter aktiviert, müssen mehrere Bits gesetzt werden, oder halt keine, wenn der Filter aus sein soll.
Danke erstmal für die ganzen Tipps. Ich schau mir das jetzt im Detail nochmal an.
Der Teufel steck meist im Detail:
Das Problem lag tatsächlich am Filter: Beim Einsetzen der Funktion, habe ich write BIT mit write BYTE vertauscht. Kleiner Unterschied, große Wirkung! Das war der entscheidene Tipp!
Dann bleibt nur zu hoffen, dass Anderen dieses Thread nutzt, wenn sie ein ähnliches Problem mit dem Empfang von Paketen haben.