DeltaLima / TheNetNode-CB

TheNetNode by Nordlink >< CB Version 1.79cb53
Other
3 stars 3 forks source link

Convers, fehlerhafte Einträge in der Dest-Tabelle #3

Closed DerHirschi closed 4 months ago

DerHirschi commented 6 months ago

Moin,

es gibt ein Problem mit mit dem Convers und dessen Destination Tabelle. Im Conv-Mode /d ergibt einen Dest-Eintrag ohne Hostnamen mit wechselnder Software/revisions Flag/Kennung.

Es fällt dabei auf das die SW/Kennung die Kennungen anderer Knoten annimmt. Zudem sind unter /d # haufenweise Fehlerhafte Einträge zu sehen ( Im CB DL-Convers System ) wobei die Hostnamen der fehlerhaften Einträge eine bis zu 3 stellige Zahl (ttl?) ist aber Revisons-Kennung fehlt (Siehe Screenshot Bildschirmfoto von 2024-04-20 02-33-12 )

Das Problem an der Sache ist das jeder neue oder sich ändernde Eintrag an das Netzwerk (alle anderen Knoten) gemeldet werden. Allerdings auch wieder Fehlerhaft , was dann im Convers Query Kanal (32767) wie folgt aussieht. [cmds]: RX fm halle2 DEST 32 pp-3.14t

Richtig wäre : [cvsd]: TX to halle2 DEST SERVER1 2 pycd-0.2

Das "DEST" Paket wird ohne Hostnamen gesendet was wiederum zu neuen, fehlerhaften Einträgen in den Knoten führt und sich mit der Zeit "aufschaukelt" und immer mehr Traffic verursacht da alle neuen Dest's an die Knoten gemeldet werden .. Auch wieder mit fehlerhaften Paketen .. Yeahh ..

Auch konnte ich erfassen, dass der TTL-Wert der fehlerhaften Pakete als Hostnamen in der Tabelle gesetzt wird. Sprich jeder neue TTL-Wert der noch nicht in der Tab vorhanden ist, bekommt nenn neuen Eintrag und produziert weiteren Traffic. Siehe Screenshot's : Bildschirmfoto von 2024-04-20 05-58-34

Des weiteren ist beim Testen aufgefallen, dass die Dest-Tab direkt nach dem Neustart und frisch aufbauen der Testlinks sauber war, bis der erste PING reingekommen ist.

In der Datei cvs_cmds.c, in der Funktion 'h_pong_command', Zeile 3722 befindet sich ein Mod der die Dest-Tabelle updated bei jedem Ping. Ich bin mir nicht sicher, in wie fern es Nötig ist, da lt. Protokoll die Dest Tabelle über das DEST Paket geupdated wird. Es kann sein das hier die Einträge für die Laufzeitmessung hinterlegt werden. Es scheint aber auch klar zu sein, dass die falsche Variabel 'name' an update_destinations() übergeben wird.

Leider ist c++ nicht meine Sprache von daher habe ich selber nur wenig Möglichkeiten eine bessere Lösung zu finden als folgende Lösung.

In der cvs_cmds.c Zeile 3722: if (strlen(l->name) > 3)
einfügen.

Ausserdem habe ich die Funktion update_destinations in der Datei cvs_cvsd.c wie folgt verändert:

`void update_destinations(PERMLINK p, char name, time_t rtt, char rev) { PERMLINK l; DESTINATION d, d1; WORD pl; char buffer[256];

if (!rev) return; if (strlen(rev) < 4) //if (rev != '\0') return;

for (d = destinations; d; d = d->next) if (!Strcmp(d->name, name)) break;

if (!d) { d = (DESTINATION *)calloc(1, sizeof(DESTINATION)); if (d) { d->link = p; Strcpy(d->name, name); Strcpy(d->rev, rev); if (!destinations || (! destinations->name) || (Strcmp(destinations->name, name) > 0)) { d->next = destinations; destinations = d; } else { d1 = destinations; while (d1->next) { if (Strcmp(d1->next->name, name) > 0) { d->next = d1->next; d1->next = d; break; } d1 = d1->next; } if (!d1->next) { d->next = d1->next; d1->next = d; } } } } else { if (strlen(name) < 4) return;
Strcpy(d->rev, rev); d->link = p; } ` if (!d) return; if (strlen(name) < 4) return;

d->rtt = rtt; if (labs(rtt - d->last_sent_rtt) > (d->last_sent_rtt / 8L)) { for (pl = 0; pl < MAXCVSHOST; pl++) { l = permarray[pl]; if ( l != NULL && l != d->link && l->connection && l->connection->type == CT_HOST ) { if (rtt) sprintf(buffer, "/\377\200DEST %s %ld %s\r", name, rtt+(l->txtime+l->rxtime)/2L, rev); else sprintf(buffer, "/\377\200DEST %s 0\r", name);

    d->last_sent_rtt = rtt;
    appenddirect(l->connection, buffer);
    send_proto("cvsd", "TX to %s %s", l->connection->name, buffer+3);
  }
}

} }`

if (!rev) return; if (strlen(rev) < 4) //if (rev != '\0') return; } else { if (strlen(name) < 4) return; Strcpy(d->rev, rev); d->link = p; } und if (!d) return; if (strlen(name) < 4) return; wurden geändert. Wie gesagt, ich bin mit dieser Lösung absolut nicht zufrieden, kann aber mangels c++ Kenntnisse nicht mehr macht.

Aber es sollte zumindest ein Lösungsansatz sein bzw. das Problem eingrenzen.

Um zu verhindern das DEST-Pakete mit leeren Hostnamen verhindert wird genügt if (strlen(name) < 4) return; unter dem if (!d) return;

Aber es verhindert nicht das fehlerhafte Pakete die aus einem "Verseuchten" Netzwerk kommen ausgewertet werden.

Auf AX25N0 läuft bereits die "gefixte/modifizierte" Version. Hier kann man auf Kanal 32767 sehen das keine fehlerhaften DEST Pakete mehr gesendet werden und die /d und /d # Tabelle sauber ist .. Auch kann man hier sehen das von CB0HAL fehlerhafte DEST Pakete gesendet werden.

Auf CB0HAL wo noch die unmodifizierte Version läuft kann man auf Kanal 32767 sehen wie nach jedem PING ein fehlerhaftes DEST Paket gesendet wird .. Auch kann man hier unter /d und vor allem unter /d # die ganzen fehlerhaften Einträge sehen.

Falls eine Anbindung an den CB-DL-Convers oder unserem Testknoten für Testzwecke gewünscht wird einfach im DL-Convers an den angeschlossenen Knoten melden ( z.B. FT0NOD/CB0HAL/AX25N0/CB0SAW )

73, Manuel (MD2SAW via CB0SAW)

DerHirschi commented 6 months ago
Specification of conversd's protocol.

This file is part of the Tampa PingPong conversd-Distribution

$Revision: 1.1.1.1 $$Date: 2001/10/10 13:29:59 $

This file is _very_ far away from being complete, but I think a description
of the host command is needed for you to implement your own conversds.

A connection may have four states: UNKNOWN, USER, OBSERVER or HOST.
When a connection is established, it falls into the UNKNOWN state.

State UNKNOWN knows about four commands:

 /NAME <call> [channel]
    - this command makes a user login, i.e. the state will be changed
      USER, the sign on message will be displayed user's name set to
      call, and channel will be entered. The latter is optional, if
      not enterted, channel 0 will be selected. The channel number
      must be in the range of 0..32767 due to older conventions.

 /..HOST <hostname> [software [facilities]]
    - the command is sent by the connecting host to join the HOST
      state. The host name must be given, the software string and
      facility string is optional. Software sting may be up to eight
      characters long. The facility string consists of single letters
      already assigned are:
        a - "away feature" (old style - will expire Dec, 31th 1995)
        d - "destination forwarding"
        m - "channel modes"
        p - "ping pong link measurement"
        u - "udat command extension and user command understood both"
        A - "away feature" (new style)
        n - "TNOS-style" nickname support
          If you like to assign new characters, please drop me a note
          with a brief description of the feature... I will include it
          in further specifications.

 /ONLINE <a|l|q>
    - it is the same as the normal "who" command in the USER state
      except you don't need to login...

 /CSTAT
        - This is the normal "links" command called in the USER state. No
          login is necessary.

State HOST accepts the following commands:

 /..AWAY <user> <host> <time> [text]                       (OPTIONAL)
    - mark user@host on channel as being away. If text is not present
      he is back again. The given text should be stored in your
      conversd to give a hint to the users doing a private message
      to an away-being person. Time indicates, when the command was
      issued       (* WARNING format changed at pp-3.01 -> 3.02 *)

 /..CMSG <user> <channel> <text>                          (NECESSARY)
    - channel message. user wrote it to the whole channel. text
      should be delivered to all users on this channel, and to
      all hosts who are a downstream for a user in this channel.
      Be aware of duplicating strings ! if user is "conversd",
      this a broadcast Message. Then no formatting should be done.

 /..DEST <host> <time> [software]                          (OPTIONAL)
    - The host is reachable for the other node via me in time seconds.
          The aim host is running the named software.

 /..ECMD <user> <cmdname> [parameters]                     (OPTIONAL)
    - If 'user' is "conversd", then this host is broadcasting the
          existance of an extended command named 'cmdname'. In this case
          'parameters' is ignored.

          Otherwise, this is a request from 'user' to execute the command
          'cmdname', with 'parameters' passed to the command. Any/All
          hosts supporting this command can respond, assuming that each
          one passes the command on down the line, or can act on the command
          and finish the command.

 /..HELP <user> <cmdname>                                 (OPTIONAL)
    - This is a request from 'user' to retrieve the help information
      for command 'cmdname', which is an extended ECMD somewhere on the
      system. Any/All hosts supporting this command can respond, assuming
      that each one passes the command on down the line, or can act on
      the command and finish the command.

 /..INVI <from> <user> <channel>                          (NECESSARY)
    - An invitation from from is sent to user via the whole network.
      if the user is found on your system, he should be informed
      about the invitation and an answer string should be sent to
      from using the UMSG command.

 /..LOOP <host>                                            (OPTIONAL)
    - Indicates that a routing loop has been discovered. This
          connection should be dropped upon receipt of this message.

 /..MODE <channel> <options>                               (OPTIONAL)
    - set channel to mode options. possible options are:
      +i - invisible channel, its existence is not displayed
      +l - local channel, no text forwarding is performed
      +m - moderated channel, only channel operators may write
      +p - private channel, invitation needed to join into
      +s - secret channel, no channel number is displayed
      +t - topics may be set only by channel operators.

 /..OBSV <user> <host> <timestamp> <fromchan> <tochan> [@|text]
                                                           (OPTIONAL)
    - user@host left fromchan and joined tochan at time timestamp
          as an OBSERVER ONLY. This places the user in OBSERVER state.
      text is his personal name (like in the UDAT field). A '@'
      in the text field indicates an empty personal note.
          If tochan == -1 (user leaves channel) the additional text
          indicates the reason for the signoff...

 /..OPER <fromname> <channel> <user>                       (OPTIONAL)
    - user becomes either channel-operator or operator
          (if channel==-1). from set this status for user.

 /..PING                                                   (OPTIONAL)
    - a pong answer is requested. no arguments are given to ping.

 /..PONG <time>                                            (OPTIONAL)
    - time is your own measured time (i.e. ping sent to pong re-
      ceived). Special values:
        -1: you don't do measurements.
         0: I did not make measurements yet, but it's implemented.

 /..ROUT <dest> <user> <ttl>                               (OPTIONAL)
    - user queried his server for the route to a given host in
      the network. Upon receipt of such a request, send back a
      personal conversd response to <user> containing this string:
      "*** route: <myname> -> <downstreamname> -> <dest>" While
      Collecting all these messages, the user will learn the
      individual route to his desired destination. A ttl greater
      than 0 indicates that this query should be forwared to the
      next hop.

 /..SYSI <user> <host>|all                       (OPTIONAL/SUGGESTED)
    - 'user' requests system information for 'host' or all systems.
      At the MINIMUM, the email address of the convers sysop
      should be available via this command.

 /..TOPI <user> <host> <time> <channel> [text]             (OPTIONAL)
    - user@host set up a new topic at time (seconds passed since
          Jan, 1 1970) on channel. The topic is given in the text.
      If text is empty, the topic is removed only. If your host
      holds a newer topic, it should not be changed and forwarded...

 /..UADD <user> <host> <nickname> <channel> [text]         (OPTIONAL)
    - user@host sets his personal description to text (or removes
          it). Also the 'nickname' is set. Since there is overlap
          between the /..UADD, /..UDAT, and /..USER commands, this
          is primarily used for setting the nickname, and for compatibility
          with early versions of TNOS, which did not support the /..UDAT
          command.

 /..UDAT <user> <host> [text]                             (NECESSARY)
    - user@host sets his personal description to text (or removes
      it). This field is _obsolete_ ! The personal description is
      transmitted via the /..USER command. In internet converse
      it is still used, so I check out the environment.

 /..UMSG <from> <to> <text>                               (NECESSARY)
    - from sends a private message to to. The contents of text
      should not be formattet if from is "conversd".

 /..USER <user> <host> <timestamp> <fromchan> <tochan> [@|text]
                                                          (NECESSARY)
    - user@host left fromchan and joined tochan at time timestamp.
      text is his personal name (like in the UDAT field). A '@'
      in the text field indicates an empty personal note.
          If tochan == -1 (user leaves channel) the additional text
          indicates the reason for the signoff...

All HOST state commands that are NOT supported or recognized must be
passed on unmodified to all connected hosts.

The OBSERVER state is a subset of the USER state, and only allows commands
that produce NO output to others.

I hope this helps you to implement your own playground...

Fred Baumgarten, dc6iq@insu1.etec.uni-karlsruhe.de, dc6iq@db0sao.ampr.org

Updated for Tampa PingPong by Brian A. Lantz, ko4ks@ko4ks.ampr.org, brian@lantz.com 
DerHirschi commented 6 months ago

Kurzes update: Die o.g Modifikationen sind teilweise großer Mist. Führt zu Loopdetections und das nicht löschen toter Hosts da DEST Pakete ohne rev-flag verworfen werden, was so nicht richtig ist. (DEST /0) wird nicht ausgewertet.

Auch habe ich festgestellt, dass die fehlerhaften Einträge in der /d # Liste erst mal nicht relevant sind, solange sie nicht auf ein HOST/Knoten zeigen. Wichtig ist das sich kein "Leereintrag" in der /d Liste befindet.

Was die Modifikation/Hack unseren unbekannten "Hackers" angeht, ergibt sie für die Funktionalität / Laufzeitmessung erst mal kein Sinn für mich. Die variablen für die Laufzeitmessungen werden in der Funktion h_pong selbst verarbeitet..

Dementsprechend habe ich habe ich in der src/cvs_cmds.c Zeile 3722 - 3724 auskommentiert.

Um zu verhindern das DEST Pakete mit leeren Hostnamen gesendet werden habe ich in der src/cvs_cvsd.c in Zeile 1729 folgendes eingefügt. if (strlen(name) < 4) return;

Diese Lösung gefällt mir persönlich viel besser und scheint bis jetzt auch fehlerfrei auf dem DL-Convers Verbund zu laufen, in dem sich 4 Knoten mit angepasster TNN Version befinden, wobei einer von den Knoten ein "Hauptknoten(AX25N0)" ist. Ein weitere Hauptknoten (CB0HAL) läuft noch mit einer unmodifizierten Version und spammt AX25N0 fleißig mit fehlerhaften DEST Paketen zu. Alle Knoten hinter AX25N0 haben eine komplett saubere /d # Liste ..

DeltaLima commented 6 months ago

Hi @DerHirschi , danke für deine sehr ausführlichen Ausführungen! :) Leider stecke ich im Quellcode von TNN und Begleitanwendungen nicht drin und C / C++ ist auch nicht meine größte Stärke. Daher kann ich leider keinen fachlich konstruktiven Kommentar zu deinen Vorschlägen abgeben :(

Das TNN Repo hier hatte ich damals eher als Archiv angelegt, da ich selbst große Mühe hatte die CB-Version von TNN zu finden und diese leichter auffindbar machen wollte.

Insofern reich bitte sehr gern, wenn du magst, einen Pull-Request ein , den ich dann in den master mergen kann :)

DeltaLima commented 6 months ago

PS: Codeblöcke weren in Github Markdown idR mit drei ` eingeleitet und wieder geschlossen und man kann direkt hinter die einleitenden Backticks die sprache, wie "c" schreiben für Syntax highlighting :)

```c void test123(int foo) { return rofl; } ```

void  test123(int foo) {
 return rofl;
}
DerHirschi commented 6 months ago

Grins. Danke für deine Erklärungen bzgl. Codeblöcke.
So ein neumoderner sch... grins.

Nee alles gut. .

Ich denke ich/wir werden die Modifikation/fix noch etwas testen bzw. Den convers mit den Mod laufen lassen, um sicher zu gehen das nichts unerwartetes passiert und wenn alles gut aussieht, den pull req einreichen.

73, Manuel

DerHirschi commented 4 months ago

4

DeltaLima commented 4 months ago

Ist gemerged, danke dir! :)