Auf meiner Dreambox stürzt Neutrino (auf CNN) auch immer noch ab und zu ab
Allerdings ist mir da folgendes aufgefallen:
Auf CNN wird der aktuelle EPG-Event nicht gefunden
=> in infoviewer.cpp (ca. Zeile 420) wird nach jeweils 1.1 Sekunden die Funktion getEPG aufgerufen, um den aktuellen Event auszulesen, Dadurch wird ein neuer Event an den sectionsd geschickt.
Da aber (bei CNN) eine Menge "dmx.read timeout"-Meldungen im sectionsd kommen,
vermute ich, daß durch die Timeouts der sectionsd länger als die 1.1 Sekunden beschäftigt ist und sich dadurch die Events so langsam "aufstauen", was dann irgendwann zum Absturz führt.
IMHO liegt der Fehler also an den dmx.read-Timeouts.
Das könnte evtl. mit dem von Obi im "Neutrino auf Dreambox"-Thread
http://tuxbox-forum.dreambox-fan.de/for ... c&start=60 beschriebenen Problem zusammenhängen:
obi hat geschrieben:im CVS log habe ich folgende Änderung gesehen:
Code: Alles auswählen
--- a/apps/tuxbox/neutrino/daemons/sectionsd/sectionsd.cpp 29 Mar 2007 15:43:32 -0000 1.237
+++ b/apps/tuxbox/neutrino/daemons/sectionsd/sectionsd.cpp 17 May 2007 21:14:47 -0000
@@ -5919,7 +5919,9 @@ int eit_set_update_filter(int *fd)
dsfp.filter.mask[1] = 0xFF;
dsfp.filter.mask[2] = 0xFF;
dsfp.filter.mask[3] = (0x1F << 1) | 0x01;
+#if HAVE_DVB_API >= 3
dsfp.filter.mode[3] = 0x1F << 1;
+#endif
// dsfp.filter.mask[4] = 0xFF;
dsfp.flags = DMX_CHECK_CRC | DMX_IMMEDIATE_START;
dsfp.pid = 0x12;
Das kann einfach nicht richtig sein. Deshalb habe ich mir mal den umliegenden Code angeschaut und dabei ist mir etwas aufgefallen:
Code: Alles auswählen
bzero(&dsfp, sizeof(struct dmx_sct_filter_params));
dsfp.filter.filter[0] = 0x4e; /* table_id */
dsfp.filter.filter[1] = (unsigned char)(messaging_current_servicekey >> 8);
dsfp.filter.filter[2] = (unsigned char)messaging_current_servicekey;
// dsfp.filter.filter[3] = (messaging_current_version_number << 1) | 0x01;
// dsfp.filter.filter[4] = messaging_current_section_number;
dsfp.filter.mask[0] = 0xFF;
dsfp.filter.mask[1] = 0xFF;
dsfp.filter.mask[2] = 0xFF;
dsfp.filter.mask[3] = (0x1F << 1) | 0x01;
#if HAVE_DVB_API >= 3
dsfp.filter.mode[3] = 0x1F << 1;
#endif
// dsfp.filter.mask[4] = 0xFF;
Durch den Aufruf von bzero wird u.a. filter[3] auf 0 gesetzt. Da das setzen von filter[3] auf einen sinnvollen Wert abgeschaltet ist, führt mask[3] mit dem Wert 0x3F dazu, dass niemals korrekte Daten empfangen werden können. Das hat zwei Ursachen:
1. Das niedrigste Bit hat folgende Bedeutung:
current_next_indicator: This 1-bit indicator, when set to "1" indicates that the sub_table is the currently applicable
sub_table. When the bit is set to "0", it indicates that the sub_table sent is not yet applicable and shall be the next
sub_table to be valid.
Daraus folgt, dass nur diejenigen Tabellen gültige Werte beinhalten, bei denen dieses Bit auf 1 steht. Der Code filtert jedoch ausschließlich auf 0.
2. Die fünf benachbarten Bits geben die Versionsnummer der Tabelle an:
version_number: This 5-bit field is the version number of the sub_table. The version_number shall be incremented
by 1 when a change in the information carried within the sub_table occurs. When it reaches value 31, it wraps around to
0. When the current_next_indicator is set to "1", then the version_number shall be that of the currently applicable
sub_table. When the current_next_indicator is set to "0", then the version_number shall be that of the next applicable
sub_table.
In der neueren API-Version gibt es das Mode-Feld, das die Bedeutung der Angegeben Bits im Filter umkehrt:
Eine Section / Tabelle wird dann an sectionsd weitergereicht, wenn für alle Bits des Filters gilt:
(filter AND mask) = (data AND mask) XOR mode
Es gibt keine entsprechende Funktion in der alten API.
Der Code für API >= 3 würde hier auf Versionen != 0 filtern, wenn Punkt 1 nicht zutreffen würde. Der Code für API < 3 macht nun das Gegenteil: Er filtert ausschließlich auf Version 0. Jedoch gilt hier ebenfalls Punkt 1.
Ich habe schon ein wenig mit den verschiedenen Werten für die Filter rumgespielt, aber noch keinen Erfolg gehabt
dbluelle