/* revisions.txt */ REVISIONS 2.1.5 Note: Some of these bugs were caught by the new compiler in RedHat 7. 1) Fixed charQueue.write statement in serialp.cpp. Now it passes the char as an integer in the cmd field. It used to pass the char as a char pointer. This worked but was confusing. 2) Fixed charQueue.read() statement in aprsd.cpp. Now it reads the int cmd and then converts it to a char. (see #1 above) 3) aprspass.cpp: Added to the #includes list "stdlib.h" so it now compiles on RedHat 7 4) added a missing pthread_mutex_unlock() in SendFiletoClient(). Possible cause of lockups! 5) Fixed several instances where I had incorrectly used strncat. strcat is now used instead. Checked for buffer overflows. 6) Changed the way the number of connected clients is determined. Now the sessions[] array is searched and active connections are counted each time this value is required. The previous code had a counter "ConnectedClients" which sometimes got out of sync with reality. 7) Fixed many instances where ostrstream objects could create buffers without terminating NULLs if filled beyond capacity. (no overflow, just an unterminated string) 8) Fixed bug in Mic-E converter that rejected latitude decimal minutes greater than .59 . 9) Added filter code in serialp.cpp to prevent ?IGATE? and ?APRSD? querys from being igated from RF to the internet where dozens of replies could be generated. APRSD still responds to the RF station but doesn't pass the query to any other igates. 10) Applied patches from Steve Price (KG4PGU) to make code more portable. Didn't change to gethostbyname2_r() though. 11) Release a9: Worked on code that used gethostbyname2_r(). Removed mutex locks. Added a test for return value == 0 in addition to hostinfo pointer not being NULL. Will this fix the crashing problem? Answer, after a 500 hour test: NO! 12) Release a10: Replaced gethostbyname2_r with gethostbyname_r. 13) Added filter code in aprsString to reject "EH?" and "cmd:" packets. 14) Added "try" "catch" blocks to aprsString::AEAtoTAPR, split() and aprsString::changePath(). Now exceptions there will be caught instead of segfaulting. Note there was no solid evidence these functions ever caused a segfault. Safety first. 15) 5-19-02 Removed directed query responses. Fixed general query "?IGATE?" response to comply with APRS spec 1.0. 16) Stopped sending System Status messages on Link port (1313), Message Port (1314) and to Hubs you have connected to. You will no longer get: "aprsdATL>JAVA::javaMSG :Atlanta_GA Linux APRS Server: 127.0.0.1 connected 2 users online." and other such messages on these ports. The BEACON packet will still go to all ports except the 1314 message-only port. 17) Added support for NOGATE in path. If a packet from any source has NOGATE in the path it will killed and not go onto the Internet. 18) The server now adds information to the end of the PATH indicating the source of each packet . This is the qAc,CallSign construct. See server docs for more details. 19) In the code that creates connections to other hubs (Server command) I added code to check that the sysop of THIS hub provided a valid passcode. If not valid no data will be sent outbound. 20) Added error checking in thirdPartyReformat(). It now returns an error if packet wasn't valid AX25 or was already in 3rd party format. 21) Fixed problems with 3rd party packet handling. Now it works this way: A) Third party packets that have TCPIP in the 3rd party header are rejected. B) Third party packets that don't have TCPIP are converted to normal format and put on the internet stream. 22) Restructured the aprsd.cpp file into three files. All the aprs server thread code is now in servers.cpp. The http server is in httpserver.cpp. Also cleaned up alot of sloppy usage of extern declarations. All externs are now in include files. 22) Added signal handler for SIGINT to allow graceful shutdown when running as a daemon. Issuing a "killall -INT aprsd" command properly loads RESTORE.TNC into the tnc and stops aprsd. Also, "service aprsd.init stop" will properly shutdown aprsd. 23) Added new keyword to aprsd.conf file. New is "Server". It replaces the old "Igate" command (although Igate is still honored). A command such as "server first.aprs.net 23 hub-sr" defines the connection to first.aprs.net as a send/receive hub connection. The user passcode is supplied with another keyword "pass". See aprsd.conf docs for details. 24) Added a new class of port. OmniPort defaults to 14600 and allows the USER to control which data streams he wants via messages or plain ascii commands. 25) Added a new page of data to the html status page. Clicking on the users port number opens port filter status in a new window. There you can observe which streams each user is being sent. This became importaint because of the new OmniPort and its user definable streams. 26) Added bandwidth controls. Sysop may now specify the maximum allowed server load in bytes/sec. New users are rejected when the limit would be exceeded and the latest high bandwith users are disconnected if the load increases beyond the specfied limit. Keyword is "MaxLoad" in aprsd.conf . 27) TNC sysop mode can only be accessed from the new TNC Sysop Port 14500. Aprsd will now automatically put your telnet client into character-at-a-time mode for better operation with the TNC command line. 28) beta 7.1: Changed all sleep() and usleep() calls to nanosleep() calls. nanosleep() is threadsafe while the others are not. 29) Changed the qA construct to conform to new specs worked out with Pete Loveall, AE5PL. Added Petes "q" docs to mine. 30) aprsd215b8 released for testing Aug 9 2002. ----------- 2.1.4 1) Fixed DeleteSession() so it can't delete if port number is -1 and made ConnectedClients a signed integer. Hopefully this will prevent errors in the user count. 2) The dup detector now ignores trailing spaces 3) Put Location info on the html status page 4) Deal with mic-e timestamps as per this email from Bob on Aug 3 2000. "We should not have included the timestamp when the conversion was done by an IGate just for the reasons that we dropped the time stamp in all other stations back in 1996. It was a mistake and we should fix it by simply replacing the "@DDHHMMz" portion of the conversion with a "!" for TAPR Mic-E's and to a "=" format for Message capable Mic-E's (Kenwoods). This would eliminate this nuisance immediately. " 5) Fixed bug in HUB connection logic that caused it to advance by two instead of one after attempting to connect to a hub that was down. If only 2 hubs were defined it would always retry the same dead hub over and over. 6) Added command "LogAllRF" to aprsd.conf. When set to "yes" all packets heard from the TNC will be written to /aprsd2/rf.log instead of only packets with our call sign as was the case. 7) Added keyword "ConvertMicE yes | no" to aprsd.conf file. If this is set to "yes" Mic-E packets will be converted to classic APRS packets, otherwise they will pass through unchanged. Default is "no" . 8) Cleaned up some code in history.cpp: createHistoryArray(aprsString* hp) so it now aborts a history dump if memory allocation fails. The original code ignored a malloc failure. 2.1.3 July 6 2000 1) Fixed bug in user counter that incremented each time a hub connection was restablished and outgoing data was enabled, eg: a user and pass code provided. This bug caused the user limit to be exceeded even though there were not really that many users. 2.1.2 June 2000 0) Fixed lots of problems in the Mic-e conversion routine. It now conforms to the APRS PROTOCOL REFERENCE 1.0 Conversion errors should be gone now! 1) Changed packet buffers size from 1024 bytes to 255 bytes 2) Added a filter in SendToAllClients() to remove 3rd party reformatted packets from Internet data stream 3) Raised the igate limit from 20 to 100 4) Fixed error in serverConfig() that allowed more igates to be defined than buffer size permitted 5) Added "MSTAMP OFF" to TNC.INIT file 6) "# Tickle" is removed. 7) Added http server to provide status information in HTML format on port 14501 (or user defined) 8) Added keyword for aprsd.conf file to support http server configuration: httpport To change the port number add to your aprsd.conf file: httpport nnnnn where "nnnnn" is the port number. To DISABLE this feature add this to your aprsd.conf file: httpport 0 9) Fixed bug in SendToAllClients() which failed to close the socket when user disappeared. 10) Filter out comment packets, eg: # Tickle, at the igate and user inputs so they aren't repeated. 11) Added keyword for aprsd.conf to support a data port suppling the source IP address prepended to each aprs packet. eg: If user w4xyz at IP address 192.168.1.2 sends "Hi There." the packet will be sent out as: "!192.168.1.2:w4xyz!Hi There." This can help locate the source of bogus packets. To change the port number add to your aprsd.conf file: ipwatchport nnnnn where "nnnnn" is the port number. To DISABLE this feature add this to your aprsd.conf file: ipwatchport 0 12) Fixed end-of-line logic so it accepts CR or LF or CR-LF or LF-CR on all incoming internet packets. Now we can use netcat (nc) in addition to telnet to logon and watch the raw data. 13) Fixed error in code that reads the history.txt file. Now history items that have expired are ignored and don't go into the history list. Time-to-live (ttl) variables adjusted for current time. 14) Completely redesigned and recoded the duplicate packet detection logic. This effort broke lots of things and several days of debugging were required! This version should eliminate 100% of duplicates occuring within 15 seconds. See dupCheck.cpp, crc32.c and aprsString::gethash(). 15) Program doesn't Segfault on exit anymore. 16) The MYCALL parameter in the INIT.TNC file is read into the MyCall variable in aprsd and overides the MyCall parameter in the aprsd.conf file. If the TNC serial port is not defined the MyCall parameter in aprsd.conf is used. Previous versions required you to enter identical MYCALL strings in BOTH aprsd.conf and INIT.TNC. Now you only need one in INIT.TNC. 17) In INIT.TNC the first parameter to UNPROTO, the ax25 destination address, is replaced by the string "APDxxx" where xxx is the verison number of aprsd. This is done as the file is read into the TNC with "APDxxx" replacing the users string. eg: UNPROTO APRS VIA WIDE would become UNPROTO APD212 VIA WIDE. APDxxx is also inserted into the ax25 destination field of all packets created of converted by aprsd. 18) History list data is NOT saved to disk every 15 minutes. This is now done only at shutdown. 19) Cleaned up code so it now compiles without warnings with the -Wall option. Added "#define _PTHREADS" and "#define _GNU_SOURCE" to all sources. This should make the STL container library thread safe. 20) Changed instances of gethostbyname2() to the thread safe version, gethostbyname2_r(). Also found and changed some other non thread safe fuctions to the safe versions. 21) I fixed a bug in the igate connection thread which resulted in sockets not being closed after a failed attempt to connect. This caused aprsd to eventually run out of sockets if one or more igates were unreachable. When this happened no more connections could be made. This bug has been in all previous versions and I believe it has caused most of the "lockup" problems. 22) Added "hub" keyword to aprsd.conf. This is used the same way as "igate" to define remote systems to connect to. The difference is that although many hubs can be defined only one connection will be active at any time. If the connection fails the next hub will be tried in rotation until one accepts a connection. Use "hub" to connect to the "master" aprs servers on port 10152 or 23. ------------------------ 2.1.1 4-11-2000 1) Put the formerly secret validation module "validate.cpp" into the open source directory. 2) Wrote aprspass.cpp to generate passcodes from callsigns. 3) Fixed error in aprsString.cpp method AEAtoTAPR. It doesn't reverse the path now. 4) Changed default APRServe in aprsd.conf to second.aprs.net. 5) Updated documentation file aprsddoc.html. 6) Fixed bug in ?IGATE? query response so full host name is now displayed. 7) Install scripts modified to compile source code before installing. 8)Added keyword "aprsPass " to aprsd.conf. Set to "no" if you don't want to allow logons from users with the insecure aprs passcodes. Set to "yes" if you want the system to work with all users. -------------------------- 2.1.0 6-22-1999 1) Fixed the code so it runs properly as a daemon. See added function "daemonInit()" in code. Also modified aprsd.init . To run as a daemon enter: ./aprsd -d To run as a program enter: ./aprsd 2) Added logic to handle MD5 password encryption in the validate module. Now it works with RedHat 6.0 shadowed MD5 passwords. 3) Added "#include " statements in history.cpp and aprsd.cpp. Now it now compiles under RedHat 6.0. 4) Changed logic so messages sent on RF also are sent to other Internet users. Needed to do this so messages to wild card groups such as "SCOUTS" go both to RF and the remainder of the users and igates. 5) Fixed 2 bugs in mic_e and raw user port code. Now mic_e packets come out in raw format on port 14580 . 6) Fixed bug that caused the history list dump to abort and disconnect user after about 700 items had been sent. 7) New Feature: The server now responds to the "?IGATE?" query. 8) New Feature: You can put system abusers in the "user.deny" file and deny access to RF or prevent them from logging on. 9) New Feature: You can configure the server to ignore packets which were transmitted from your own TNC. The previous versions always igated your own TNCs packets. Use the command line "igateMyCall no" in aprsd.conf file to turn off igateing of your own TNCs packets. 10) Changed the servers status messages to the new format. eg: "aprsdATL>APRS,TCPIP*::USERLIST :Verified user W4HAM has logged on." Note the extra colon after TCPIP* and the lack of a message number on the end to indicate we don't expect an ack. 11) Fixed speed related problem in SendToAllClients() function that caused overflows of the Internet send queue. The server can now handle many more users at higher data rates. 12) Added command "TncPktSpacing" to the aprsd.conf file. This command takes one parameter which is the number of milliseconds between packets sent to the TNC. Queued packets to be transmitted will be spaced out at least by this number of milliseconds. The default is 1500 (1.5 seconds). ------------------------------------------------------------- 2.0.9 05-23-1999 Compiled the "validate" program as an library object file and put it in subdirectory lib/validate.o . Added lib/validate.o to linker list in the makefile. Changed the code so it just calls validate instead of running the external program. This is much safer than the external program and still hides the source as Steve Dimse requires. Changed the docs to reflect this change. ------------------------------------------------------------- 2.0.8 05-12-1999 1) Fixed a security problem with logons. It was possible in earlier versions to "be creative" with user and password strings to pass commands to a Linux shell. Replaced "system()" call with execl() and added filtering of shell characters such as ; <> ~ $ | etc. 2) Cleaned up some serial interface code which may have been causing trouble with raw packets on some systems. 3) Added msgdest2rf keyword in aprsd.conf file. -------------------------------------------------------------- 2.0.7a 04-05-1999 Replaced the Mic-E decoder/converter (mic_e.cpp) with the latest version from Alan Crosswell. ------------------------------------------------- 2.0.7 02-11-1999 Fixed bug in the mic-e conversion code which produced incorrect lat/lon under some conditions (1 degree off). See mic_e.cpp Fixed the user validation code so it now works with shadowed passwords. Added code to send redundent acks to the TNC at the suggestion of Bob Bruninga. New keywords for aprsd.conf: "ackrepeats" and "ackrepeattime". --------------------------------------------------- 2.0.6a fixes a bug in 2.0.6 which causes packets which were written to rf.log to have their CR-LF removed before being sent on the internet. This only showed up on packets entering from the UDP port. ** Major functional upgrade 2.0.x (July-Aug-Sep-Oct 1998) ** 2.0.6 added tcpip port for raw tnc data to maintain compatibiltiy with older 1.x versions. Added duplicate packet filter. Duplicate packets (same "ax25 source call" and data) are discarded if they are heard less than 30 seconds after the original. Duplicates are also removed from the history file. Each station can can have only one posit, one weather, and one "other" packet in the history buffer. Only the latest packets are kept, older ones are deleted. Added configuration file /home/aprsd2/aprsd.conf to allow easy setting of tcpip ports, the serial port and other custom parameters. Added two-way Igating of messages and corresponding posits. Added means for stations in a list to be gated to RF full time or just their posits every 15 minutes. Added user log-on and validation for Mac/WinAPRS. Also accepts Linux user/passwords. Added UDP port for sending data directly to the TNC or tcpip users I use it to inject my weather data into the aprs stream. Improved Remote TNC sysop mode. TNC now goes off line to give the system operator a private connection to issue TNC commands via telnet. Fixed shutdown bug. Now /home/aprsd2/history.txt is properly saved and it doesn't dump core on shutdown. Fixed segmentation fault bug. Now it only runs on RedHat 5.1 or later because it needs libstdc++ . -------------------------------------------------------- Modification 1.0.5 (July 1998): Stopped echo of Internet user data back to originator. This will prevent infinite echo loops when two servers are linked. -------------------------------------------------------- Modification 1.0.4 (MAR 1998) : Added code for an additional server port 14580 which does NOT echo any user data from the internet. This allows Steves AprsServ to use the local VHF APRS data but not get any Internet user data. -------------------------------------------------------- bug fix 1.0.3 (Nov 1997): No longer crashes when logged on users data line length exceeds 1024 bytes. All chars past 1021 are truncated. --------------------------------------------------------- -------------------------------------------------------- Here's some off the air data for reference // //$GPRMC,013426,A,3405.3127,N,08422.4680,W,1.7,322.5,280796,003.5,W*73 KD4GVX>APRS,WB4VNT-2,N4NEQ-2*,WIDE:@071425/Steve in Athens, Ga. N4NEQ-9>APRS,RELAY*,WIDE:/211121z3354.00N/08418.04W/GGA/NUL/APRS/good GGA FIX/A= 000708 N4NEQ-9>APRS,RELAY,WIDE*:/211121z3354.00N/08418.04W/GGA/NUL/APRS/good GGA FIX/A= 000708 KE4FNU>APRS,KD4DLT-7,N4NEQ-2*,N4KMJ-7,WIDE:@311659/South Atlanta via v7.5a@Stock bridge@DavesWorld KC4ELV-2>APRS,KD4DLT-7,N4NEQ-2*,WIDE:@262026/APRS 7.4 on line. KC4ELV-2>APRS,KD4DLT-7,N4NEQ-2,WIDE*:@262026/APRS 7.4 on line. N4QEA>APRS,SEV,WIDE,WIDE*:@251654/John in Knoxville, TN. U-2000 WD4JEM>APRS,N4NEQ-2,WIDE*:@170830/APRS 7.4 on line. KD4DLT>APRS,KD4DLT-7,N4NEQ-2*,WIDE:@201632/APRS 7.6f on line. N4NEQ-3>BEACON,WIDE,WIDE:!3515.46N/08347.70W#PHG4970/WIDE-RELAY Up High!!! N4NEQ-3>BEACON,WIDE*,WIDE:!3515.46N/08347.70W#PHG4970/WIDE-RELAY Up High!!! KD4DKW>APRS:@151615/APRS 7.6f on line. KE4KQB>APRS,KD4DLT-7,WIDE*:@111950/APRS 7.6 on line. WB4VNT>APRS,WB4VNT-2,N4NEQ-2*,WIDE:@272238/7.5a on line UGA rptr 147.000+ N4YTR>APRS,AB4KN-2*,WIDE:@111443zEd - ARES DEC National Weather Service, GA N4YTR>APRS,AB4KN-2,WIDE*:@111443zEd - ARES DEC National Weather Service, GA W6PNC>APRS,N4NEQ-2,WIDE:@272145/3358.60N/08417.84WyJohn in Dunwoody, GA WA4DSY-9>APRS,WIDE:$GPRMC,014441,A,3405.3251,N,08422.5074,W,0.0,359.3,280796,003 .5,W*77 N6OAA>APRS,GATE,WIDE*:@280144z4425.56N/08513.11W/ "Mitch", Lake City, MI /* end of file */