Closed DerHirschi closed 4 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
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
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 ..
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 :)
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;
}
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
Ist gemerged, danke dir! :)
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 )
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 :
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);
} }`
if (!rev) return; if (strlen(rev) < 4) //if (rev != '\0') return;
} else { if (strlen(name) < 4) return; Strcpy(d->rev, rev); d->link = p; }
undif (!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 demif (!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)