[satip] Bug in curl und andere Merkwürdigkeiten

  • Seit ein paar Monaten habe ich einen "EyeTV Netstream 4Sat" SatIP Receiver mit 4 Empfängern und wollte den mit einem neu aufgesetzen VDR der auf einem odroid-c4 läuft nutzen.


    Zuerst hab' ich das SatIP-Plugin probiert, aber das hat nicht wirklich auf Anhieb funktioniert. Da mich das etwas genervt hat hab' ich tiefer gegraben und sogleich einen Bug in curl entdeckt - wenigstens in der Version die ich verwende und die bis jetzt aktuell ist:


    RTSP: 503 answer to CURL_RTSPREQ_SETUP is truncated with 'Excess found', CURLOPT_WRITEFUNCTION doesn't get called · Issue #12414 · curl/curl
    I did this After calling CURLOPT_RTSPREQ_SETUP my satip server has no more resources and sends back 503 with a No-More: parameter (see…
    github.com


    Der Bug führt dazu das Rückmeldungen vom SatIP-Receiver nicht vom SatIP-Plugin mit diesen Anweisungen gelesen werden können:

    Code
    SATIP_CURL_EASY_SETOPT(handleM, CURLOPT_WRITEFUNCTION, NULL);
    SATIP_CURL_EASY_SETOPT(handleM, CURLOPT_WRITEDATA, NULL);

    Das führte (bei mir) dann zu vielen "Detected invalid status code" Logzeilen. Das hat mich etwas verunsichert ob ich da nicht einen Schrott SatIP Receiver habe der sich gar nicht an die Spezifikation hält. Also hab' ich mir noch die Mühe gemacht die SatIP-Spezifikation anzuschauen und siehe da, die zurückgemeldeten Stati sind ganz und gar nicht invalid :rolleyes:


    Zudem werden Rückmeldungen zwar ausgewertet im weiteren Programmverlauf aber einfach ignoriert. Mein SatIP-Server sendet wenn eine Verbindung ohne TEARDOWN beendet wurde eine Rückmeldung 503 auf SETUP mit Body "no more sessions". Wegen dem Curl-Bug ist diese nicht ersichtlich dennoch könnte ein "stumpfes" warten von 65 Sekunden dazu führen das die SatIP-Server Resource wieder frei ist.


    Auch sonst bin ich auf komische Sachen gestoßen wie z.B.:

    Code
    SATIP_CURL_EASY_SETOPT(handleM, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_OPTIONS); // FIXME: this really should be CURL_RTSPREQ_RECEIVE, but getting timeout errors

    Das sendet gefühlt wie wild OPTION-Requests.. Wenn ich da wieder CURL_RTSPREQ_RECEIVE eintrage funktioniert das bei mir ganz ohne timeout errors?? Und sendet dann erheblich weniger Requests. Das wäre IMHO als Quirk an- und abschaltbar sehr fein..


    Auch wird der Reception Status über DESCRIBE geholt, gleichzeitig das RTCP Announcment ausgewertet:

    Code
    // Read reception statistics via DESCRIBE and RTCP

    Das hätte ich wiederrum auch gern als Quirk an- und abschaltbar. Beziehungsweise ob DESCRIBEs geschickt werden oder nicht oder ob DESCRIBE und/oder RTCP Announcments ausgewertet werden... hab' auf jeden Fall jede Menge Requests im Wireshark gefunden...


    Daneben solche Sachen, die habe ich bei mir einfach einkommentiert (und sendet dann auch weniger Requests):

    Code
    if (!strcmp(*streamParamM, *lastParamM) && hasLockM) {
    debug1("%s Identical parameters [device %d]", __PRETTY_FUNCTION__, deviceIdM);
    //return true; // fall through because detection does not work reliably
    }


    Am schlimmsten ist aber die standardmäßige SETUP -> PLAY -> TEARDOWN Schleife bei jedem Kanalwechsel die es (zumindest mit meiner) SatIP-Box nicht braucht .. ;( Das habe ich auch noch extra mit DVBViewer und VLC im Wireshark geprüft, beide verwenden eine wie in der Spezifikation vorgegebene Arbeitsweise (Seite 24, 3.5.1): SETUP -> PLAY -> PLAY [...] und für Keepalive alle 50 Sekunden eine OPTIONS... und nur beim Beenden der Programme oder einem Timeout ein TEARDOWN


    Bei Tests mit Aufnahmen wurden bei mir beim Umschalten auf einen Kanal des gleichen Transponders die Aufnahme beschädigt.


    [Edit] Ui, gerade gefunden: [Octopus NET Pro und Sat>IP] Aufnahmefehler bei gleichzeitiger Nutzung eines anderen Senders auf dem aufnehmenden Transponder


    Desweiteren gab es eine Situation da wurde die SatIP-Box mit Anfragen geflutet weil die zwar 503 zurückgab das SatIP-Plugin aber ständig "draufhämmerte"...


    Da mir das Umbauen/Abändern vom Plugin zu anstrengend ist/war habe ich mich mal nach was anderem umgeschaut -> vtuner


  • Die Aufnahmefehler wurden aber bei mir durch den Quirk verursacht.

    Ohne diesen, habe ich kaum noch Aufnahmefehler, und keine bei gleichzeitiger Nutzung eines anderen Senders auf dem aufnehmenden Transponder.


    Aber sehr interessant, Deine Analyse...

    Gentoo Linux ~ VDR 2.6.6 ~ DD Octopus NET V2 S2 Max - SAT>IP ~ LENOVO ThinkServer TS200V ~ Intel(R) Core(TM) i5 CPU680@3.60GHz ~ 16GB RAM ~ NVIDIA T400

    Einmal editiert, zuletzt von heifisch ()

  • Uh, mein Bug-Report in curl wurde geschlossen:



    Die Unzulänglichkeit wurde nun dokumentiert und das wars :wand


    Mein Aufwand mit extra Fake-Server und -Client Programm zu schreiben um curl-"Gott" bagder davon zu überzeugen das das IMHO ein Bug ist war für den Arsch :thumbdown: Da komme ich mir vor wie bei Software von Siemens... ist aber eine andere Baustelle...


    Offiziell unterstützt curl eben nur RTSP nach RFC xyz und nicht Sat>IP ... was bedeutet das Fehlerrückmeldungen nun nie vom satip-plugin ausgewertet werden können bis jemand curl dort rausschmeisst... naja.. egal :evil:

  • Liest sich für mich aber erstmal so als wäre das als Bug akzeptiert. Ein Pull Request hätte also wohl eine Chance. Die haben allerdings eine etwas komische Art diese Fälle zu behandeln. Das Issue hätte man offen lassen sollen.


    Auch die Texte im Issue lesen sich bisschen so als wäre das Curl Projekt mittlerweile auch durch mehrere Hände gegangen und die aktuellen Projektleiter haben halt kein besonderes Interesse an RTSP. Kenne das selbst nur zu gut das ich bei meinen vielen privaten OSS Projekten manchmal bei einem Issue einfach mal sagen muss: Problem akzeptiert aber ich habe weder Zeit noch Motivation das selbst zu lösen.

  • Der Curl-Bug scheint mir eine echt interessante Entdeckung.

    Das würde erklären, warum es bei Sat>IP immer wieder diese komischen Probleme mit den EPG-Scans usw. gibt.


    Liest sich für mich aber erstmal so als wäre das als Bug akzeptiert.

    Würde ich auch so sagen.

    Die haben allerdings eine etwas komische Art diese Fälle zu behandeln. Das Issue hätte man offen lassen sollen.

    An den Vorgehen kann man aber eigentlich nichts aussetzen.

    Firefox schließt die Issues nach 30 Tagen Inaktivität automatisch und Kommentar los.

    (Und ich Trottel suche dann tagelang verzweifelt nach der Lösung :cursing: .)


    die aktuellen Projektleiter haben halt kein besonderes Interesse an RTSP.

    Oder schlicht keine Ahnung davon?

    Bei diesen Projekten, die alles mögliche können wollen, passiert das gar nicht so selten, dass Experten für Teilbereiche fehlen.


    Mein Aufwand mit extra Fake-Server und -Client Programm zu schreiben um curl-"Gott" bagder davon zu überzeugen das das IMHO ein Bug ist war für den Arsch

    Evtl. nicht ganz.

    Ich habe mal etwas damit rum gespielt und anscheinend das Problem gelöst. Zumindest für diesen Fall.

    Jedenfalls nehme ich mal an, dass die folgende Ausgabe korrekt seinen sollte:


    Dazu habe ich lediglich data->req.no_body = FALSE; in curl/lib/rtsp.c Zeile 282 eingefügt.

    Quasi analog RTSPREQ_GET_PARAMETER ein paar Zeilen weiter unten.

    (Das Kommentar da hat mich übrigens drauf gebracht das einfach mal zu versuchen.)


    Man könnte, wenn man mutig ist, auch einfach das TRUE in Zeile 265 durch ein FALSE ersetzen.


    Ehrlich gesagt traue ich der "Lösung" aber nicht so ganz und befürchte Nebenwirkungen irgendwo anders. Irgendwie wäre es einfach zu einfach ;) .

    Wirklich testen kann ich das aber nicht, ich habe (noch?) kein SAT>IP.

    Gruss
    SHF


  • Irgendwie wäre es einfach zu einfach

    Ich denke mal das ist so einfach (also in Zeile 265 TRUE auf FALSE setzen), damit wird nur ein optionaler Body gelesen und zurückgeliefert. Frage mich überhaupt warum das explizit unterdrückt werden muss? Es schadet nicht und hat IMHO bei reinen RTSP-Servern keine negative Auswirkung.


    Überhaupt gibt es bei keinem SAT>IP-Befehl außer DESCRIBE einen Body, dafür bei den Fehlern 400, 403 und 503 die bei allen SAT>IP-Befehlen außer DESCRIBE auftreten können..


    Das ist aber dann nur der Anfang des Problems im satip-Plugin. Dort wird z.B. der von mir erwähnte 503 mit Body "No-more: sessions" zwar ausgewertet:

    Code
     if (strstr(r, "No-More:")) {
               char *tmp = NULL;
               if (sscanf(r, "No-More:%m[^;]", &tmp) == 1) {
                  errorNoMoreM = skipspace(tmp);
                  debug3("%s No-More: %s [device %d]", __PRETTY_FUNCTION__, *errorNoMoreM, tunerM.GetId());
                  }
               FREE_POINTER(tmp);
               }

    Bei funktionierender CURL-Lib würde es sogar eine Fehlermeldung geben (anstatt dem total irreleitenden invalid status code)


    Leider leider führt das aber nicht dazu das der Tuner-Thread irgendwie damit umgeht:

    Es wird ein Disconnect gemacht und dann alle 250ms erneut drauf gehämmert. Das Log wird geflutet. Mein Satip-Receiver mag das nicht so dolle und kann dann schonmal den Dienst quittieren, was dann nur zu noch mehr Meldungen führt...


    Bei vtuner habe ich die "No-More: sessions" durch Zufall selbst erzeugt, in der alten Version des satip-Programms wurde kein Teardown gesendet, d.h. bei jedem Stop das satip-Programms verwaiste die Session. Das habe ich mittlerweile behoben.


    Aber: Zusätzlich sollte IMHO grundsätzlich immer bei jedem 503 Service unavailable mindestens 65 Sekunden gewartet werden bis erneut eine Aktion durchgeführt wird (habe ich so im satip Programm umgesetzt). Sollte es sich um eine verwaiste Session handeln wurde diese mittlerweile freigegeben und der neuerliche SETUP geht ohne Fehler durch. Ist einfach kein Tuner mehr verfügbar so wird dann im Endeffekt nur einmal pro Minute geprüft ob ein Tuner frei ist im Gegensatz zur jetzigen Lösung: 240 Mal.


    Das würde für das satip-Plugin bedeuten das jemand den Status in die Action-Funktion rausführt und entweder einfach die tsSet-Bearbeitung verzögert oder einen neunen State tsWaitForTuner oder sowas einfügt...

  • Frage mich überhaupt warum das explizit unterdrückt werden muss? Es schadet nicht und hat IMHO bei reinen RTSP-Servern keine negative Auswirkung.

    Das frage ich mich auch.

    Allenfalls könnte es doch Probleme mit Anwendungen geben, die mit dem alten Verhalten rechnen? Da vom Server aber eh nichts zurück kommen sollte ...


    Das ist aber dann nur der Anfang des Problems im satip-Plugin.

    Der Curl-Bug könnte aber die Ursache für das ganze Chaos sein.

    Ohne gescheite Rückmeldung vom Server kann man schwerlich drauf sinnvoll reagieren.


    Es wird ein Disconnect gemacht und dann alle 250ms erneut drauf gehämmert. Das Log wird geflutet. Mein Satip-Receiver mag das nicht so dolle und kann dann schonmal den Dienst quittieren, was dann nur zu noch mehr Meldungen führt...

    Die Server scheinen etwas unterschiedlich zu reagieren, ist mein Eindruck.

    Unter Umständen kommt man bei einem Anderen aus anderen Gründen in den Zustand und das Vorgehen mach da Sinn?

    So wie ich es verstanden habe, stochert das Plugin ja ziemlich im Dunkeln, was den Fehler angeht.

    Und ein Timeout von 65 Sekunden ist halt schon lang, wenn es bei jedem Programmwechsel auftritt ;D .


    Ich habe die Änderung bei curl jedenfalls mal in einen Patch gepackt.

    Wer das satip-Plugin benutzt und Lust hat, kann es also mal probieren.

    Dateien

    Gruss
    SHF


  • Normal haben SETUP und PLAY keinen body, also sieht der Patch so noch falsch aus..

  • Normal haben SETUP und PLAY keinen body, also sieht der Patch so noch falsch aus.

    Das stimmt nicht für Rückmeldungen 400, 403 oder 503 die auch bei SETUP und PLAY kommen können:

    Überhaupt gibt es bei keinem SAT>IP-Befehl außer DESCRIBE einen Body, dafür bei den Fehlern 400, 403 und 503 die bei allen SAT>IP-Befehlen außer DESCRIBE auftreten können

  • Das ist ja nicht neu, aber im Normalfall, status code 200 (OK), gibt es keinen. Dann muss es schon etwas mehr Aufwand werden.

  • Der Patch sollte erstmal nur Diskussionsgrundlage dienen und mein Gefasel, ein paar Beiträge weiter oben, in eine verständliche Form bringen ;) .

    Ehrlich gesagt ist mir auch nicht ganz klar, warum das funktioniert, bzw. nicht schon immer so gemacht wurde.

    Die Beschreibung von req.no_body könnte Aufschlussreich sein, bis dahin bin ich aber noch nicht gekommen.

    Bevor man den Patch irgendwo einreicht müsste man den dann auch nochmal testen. Das kann ich aber nicht wirklich, da ich (noch?) kein SAT>IP einsetze.

    (Ich lese aber interessiert mit, da ich überlege eventuell zeitnah einzusteigen. Aber vermeiden will, dass das bei mir in eine Dauerbaustelle ausartet.)

    Gruss
    SHF


Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!