		       Xrouter Recent Changes
		       ======================


Version 172 (17/11/01)
~~~~~~~~~~~~~~~~~~~~~~
- Version 170 would crash with "divide error" if PZTNODES recovery file
  was not present or contained no nodes - fixed.

- Once scroll buffer was full, console scrollback/forward were "rolling
  over" at the limits, making it difficult to spot the transitions
  between old and new data.  It now stops at the limits.

- When console window was reprinted at the end of review mode, some old
  data from the scroll buffer was being appended to the last line - fixed.

- NRR was not showing "?" for intermediate non-xrouter nodes - fixed.

- N T was showing bogus positions for directly heard nodes without
  APRS - fixed.

- Hop count from NPING wasn't updating N T - fixed.

- Increased max no. of command aliases from to 16.

- Entries in pztboot.log were written with \r instead of \n - fixed.

- Someone was trying to attach two ports to one SCC interface, so added
  an error trap for this.  No matter how precise I make the documentation,
  there's always someone who doesn't read it!

- Async driver rewritten to restore the ability to service shared
  interrupt cards without incurring performance penalty on SCC cards. I
  had broken this a couple of versions ago while trying to squeeze the
  optimum performance out of an antique machine with 8 SCC ports.

- When Xon/off handshaking was used, there was a (remote) possibility
  that XON wouldn't be sent when async buffer was emptied - fixed.

- SCC driver code optimised still further.  I believe it's now far
  faster than any other C-based program, but not as fast as one
  written in assembler (One day I'll get round to writing more of
  Xrouter in assembler :-) Nevertheless, on my 20Mhz dinosaur it
  effortlessly manages the top speed (38,400 bauds full duplex) a
  soft-clocked Baycom USCC board is capable of.

- Added logging of first command line arg at startup, plus logging
  of exit, restart, reboot and watchdog exit events, plus initialisation
  errors in pztboot.log.

- Added AXUDP. This requires a pseudo-interface with type = "axudp",
  and adds "udplocal" and "udpremote" keywords. If not specified,
  they default to 93

- The TCPLINKS command, previously only compiled into alphatest
  versions, is now available to all sysops as "TCP STATUS".

- Added UDP status command & display.

- Added YAM driver.

- Added code to detect duplicate use of UARTs. I don't like wasting
  precious code space just to detect stupid config mistakes, but
  users waste too much of my time with bug reports which turn out to
  be due to their own errors!

- Added logging of startup and alt-x to main log, which will help the
  sysop work out if restarts were sysop-induced or due to a failure,
  such as a power cut or watchdog activity.

- If configured wrongly, internal loopback ports could go into
  an endless loop upon receipt of certain types of traffic, causing
  a "crash". This has now been fixed - the rest of the code will
  continue operating normally even if the loopback gets into a loop.

- Prevented broadcasting and piping to loopback ports because it is
  pointless and potentially dangerous. If it can be done, someone
  will inadvertently do it, and I did!

- Someone reported that PROXY didn't allow connects to L4 alias - fixed.
  Hopefully it still works for callsign? :-)

- APRS / UIVIEW messaging, previously only compiled into alphatest
  versions is now available to everyone, and is accessed by
  "AM[sg] <port>".  This allows people without APRS (such as myself)
  to exchange messages, bulletins and announcements with APRS users.

- MOTD wasn't expired if running without consoles - fixed.

- Added responses to ?APRSP, ?APRSS, ?APRSD, ?APRST, ?PING?, and
  UIview ping, dx and general queries.

- Added QTH keyword (max 32 chars) to xrouter.cfg

- Added IDPATH to allow ID to be sent via digis on APRS ports if
  required.

- Prevented from digipeating frames we originated.

- Frames we digi are not digid again within 9 sec. This should help
  prevent things bouncing between digis.

- Added APRS Packet<>Internet gateway (Igate), which required new
  config file IGATE.CFG, plus a new IGATE= keyword and two more
  DIGIFLAGS in XROUTER.CFG.

- Added START and STOP commands, used for starting & stopping daemons
  such as the igate.

- The "Connect" command had somehow become broken, reporting "syntax
  error" if the digis were space-delimited. Fixed this, and made it a
  lot more idiot proof, so it can now cope with digis in a variety of
  formats, e.g. "1,2,,,3,  4,5,6  ", and will reject commands like
  "C 2" "C S" "C 2 S", "C V", "C 2 V", "C 2 V S", as syntax errors.
  Also, instead of truncating the no. of digis to 8, it now reports
  "too many digis" because it couldn't comply exactly with the user's
  request.

- Added APRS tunnelling via Netrom. This will only work if the source
  and target nodes are both Xrouter. Frames are tunnelled when an APRS
  frame is received in which the final digi is a known netrom call.

- MIC-E packets now show their position in MHeard and DX lists.

- TX/RX active is now available for SLIP & KISS interfaces.

- Added PC100, DRSI and PA0HZP interface drivers.

- Added DXFLAGS= keyword to XROUTER.CFG.  DX list now records only
  directly heard stations, unless bit 0 of DXFLAGS is set (default = 0)

- Reduced deliberate i/o delays in SCC driver to cater for slow
  machines - please tell me if this no longer works on fast machines!

- Changes to main interrupt and UART service. It seems to be ok on my
  586/133 and 386/20, but please tell me if you experience problems
  which weren't present in previous version.

- Added "Quit" command, which is more universally understood than
  the equivalent "Bye".

- IP datagrams may now be routed via digipeaters.  To enable this, the
  "callsign" field of the ARP ADD command now accepts a destination
  callsign and up to 8 digipeaters.  The callsign and digis must form
  a single, comma-delimited string, e.g. "G8PZT,DIGI1,DIGI2-5".  This
  applies also to the ARP commands in IPROUTE.SYS.  Digipeater addresses
  are not accepted by the ARP PUBLISH command.

- Domain.sys has been made compatible with normal domain.txt files.
  The optional TTL field can be included, and domain names can be
  suffixed with dots.  If not suffixed, ".ampr.org." is appended.
  The original simpler file format is still recognised.

- Domain suffix is currently fixed at ".ampr.org".  Commands such as
  "telnet g8pzt" will get translated to "telnet gb7pzt.ampr.org",
  but "fbb.org" will be left alone because it's already complete.

- The ability to query an external DNS, if it can't resolve a hostname
  in the local domain.sys file, has been added.  To activate this, put
  the new keyword "DNS=<ipaddress>" (e.g. "DNS=44.131.91.2") in the
  "general configuration" section of the XROUTER.CFG file (immediately
  after the router's own IP address is a good place). If the line isn't
  included, only the local domain.sys file will be used.
  Warning: Don't try to resolve too many names simultaneously as it
  might run out of memory and trash the stack!)

- A rudimentary DNS server has been added, which will answer queries from
  other systems (UDP port 53).  It only responds to requests directed at
  the main IP address, and will only answer one query per message. Only
  standard queries for type A are currently answered.  Recursion is
  supported.  Other query types will be supported in a later version.

- PIPE can be made selective, by adding a comma-delimited callsign list,
  e.g. "PIPE=4 GB7PZT,KDRBBS".  This will reduce the loading on the
  destination port, by piping only the frames with the specified calls
  in the destination field.

- Added bi-directional piping, activated by adding 512 to the PIPEFLAG
  value (suggested value = 515).  If a frame is piped on a birectional
  pipe, the source call is remembered so that responses will be piped
  back to the sender.  This is useful in cases where a BBS has a front
  end router.  Simply set up bidrectional selective pipes from each
  user port to the BBS port, and set up the BCAST option so that the
  UI mail headers are broadcast on each user port.  The BBS will then
  allow direct connect and will respond to resync requests.  You no
  longer need to use PROXY.

- Added N H (hop counts), N P (position), N Q (queue), N R (rtt) and
  N F (frame counts) commands, but some of them won't work fully as
  I've been requested to disable my advanced networking protocols
  because they crash Linux nodes!!  It's not *my* problem, but in the
  interests of packet radio I've located the error in the Linux code
  and informed the people who matter.  I'll give them a few months
  to fix it, then I'll reactivate my protocols.

- AX25 calls are now screened for validity.  Only numbers, spaces and
  upper case letters are legal.  Hopefully this will help to reject
  corrupt frames caused by noise/errors at the physical layer, e.g.
  errors on a KISS line.  The downside is that the sysop will no
  longer be able to see he has a layer 1 problem!

- Added Days/hours/min/sec uptime to stats display.

- Each console can now have its own colour scheme and console call,
  by using the new CONSOLE definition section in XROUTER.CFG.  This
  is completely optional and backward compatible.  If CONSOLE overrides
  aren't specified, each console will use the global values as before.

- Each console call is now shown on the top status line for that console.

- When switching consoles, there had been a slight delay before the top
  status line was displayed. It now appears immediately.


Version 171
~~~~~~~~~~~
- Various development versions. Restricted release only. Use at your
  own risk!

Version 170	13/7/01
~~~~~~~~~~~~~~~~~~~~~~~
- Added PROXY facility (See PROXY.TXT and port section of XROUTER.CFG).

Version 168	18/6/01
~~~~~~~~~~~~~~~~~~~~~~~
- Major rewriting to support new PZTSOCK socket-based API.  I tried to
  keep it backwards compatible with existing PZTHOST driver, but it was
  holding me back so the old versions of PZTHOST will no longer work.
  Unfortunately, the new socket driver isn't fully tested either, so
  this version is a standalone router only, and is NOT GUARANTEED to
  support any host applications.  I've included PZTSOCK.EXE in case you
  want to try it in place of PZTHOST, but don't destroy your old version ;-)
  I wanted to get it fully tested before release, but it's been almost
  4 months since the last release, and I couldn't hold it back any
  longer. I'm sorry, there's no new documentation as yet - I haven't
  had the time :-(

- The main program is now XROUTER.EXE and the configuration file is
  XROUTER.CFG.  If you are upgrading from a previous version, simply
  rename PZTNODE.CFG to XROUTER.CFG and the new version will read it.

- Added "extern" driver type verification, to prevent people trying to
  use a HDLC driver or a packet driver in ethernet mode etc.  You will
  now have to use the correct driver for the router version.

- Protected extern driver rcv routine from frames with invalid length,
  which might arise if the wrong protocol was selected for the driver.

- Added ax25 segmentation. Until I sort out some sort of link option
  negotiation scheme, this is only activated if it receives incoming
  fragments.

- Added IPIP encapsulation. This is activated by mode "e" in IP routing
  table.

- Added RESTART command for reloading new versions without rebooting PC
  or using batch file.

- Added Netrom backend protocol (not yet tested).

- Fixed problem with incorrect user SSID on L4 downlinks.

- Some obscure AX25 protocol faults rectified.

- Default IP ttl is now 255 not 25, as the latter iss too short for the
  era of internet gateways. A new "IPTTL=" keyword in INIT.SYS allows this
  to be overridden, and an "IP TTL" command allows it to be varied on the
  fly.

- Two mods to aid proper TCP link closure under all conditions:
  TCP connections now timeout upon excessive retries. This is non-RFC793,
  but is necessary to clean up connections when the other end crashes or
  goes away without closing properly.
  For incoming connections (uplinks) only; Upon receipt of an unsolicited
  FIN (signifying that the caller wants to terminate the link), it now
  sends a reciprocal FIN when all pending data has been sent, and goes
  into LAST-ACK state.  Previously it had followed RFC793, going into
  CLOSE_WAIT where it would stay forever if router had nothing to send..

- Added rudimentary security.... If user comes via TCP/IP and doesn't
  supply a valid ham radio callsign, and he tries to downlink on a
  ham radio channel, the downlink is refused. He's allowed to downlink
  on non-44 ports.

- ARP table is now updated from arp requests as well as replies.  This
  prevents us having to send a reciprocal arp request.

- Fixed ARP entries won't be overwritten by learned ones.

- ARP wasn't being initialised for KISS loopback, causing it to crash
  when making an arp request on loopback - fixed.

- Node table entries were disappearing as soon as obscnt fell below
  obsmin, instead of persisting till zero - fixed.  This hopefully also
  fixed the problem whereby the "no. of nodes via this route" count for
  each route had a tendency to grow.

- Full cmd list wasn't wrapping - fixed.

- Sysop-defined and host cmds were only displayed on full cmd list - they
  now show on both lists.

- Added (rudimentary!) message of the day facility:-
  "MOTD [<days> <text>] | [ @ ]" displays, sets or clears motd.  Up to 1
  line of text can be stored, and is sent after L2 ctext only at present.
  If Ctext isn't sent, Motd isn't sent.  It isn't sent to TCP and L4
  callers, simply because it hasn't been written in yet!  The <days>
  count is decremented at midnight, and the message stops being displayed
  when it reaches 0.  It is meant for displaying urgent notifications,
  rally adverts etc.  Anything more permanent should go in ctext.

- If "interlock" was used on SCC cards, the interlocked ports would
  never tx. - fixed (but not tested)

- When a link retries out, it now sends a <DM R F> as per 2.4.6.4 instead
  of silently closing as some other implementations seem to.

- L2 links with excessive retries were breaking prematurely - fixed.

- I deliberately didn't include the facility to create netrom routes via
  digipeaters because I don't think it's good practice.  However I was
  asked to do so, and the facility is hereby included.  May the gods have
  mercy on me... Modified the ROUTE ADD command to add them on the fly.
  Format is the same as in BPQNODES

- Added ECHO command, which switches into an echo session, whereby
  anything typed by the user is echoed back to him (for test purposes).
  Tee only escape is to disconnect.

- Added DISCARD command, which switches into a discard session, whereby
  anything sent by user is simply discarded - it "sinks" data.

- Added CTRL command which reads/writes the CTRL port defined in the CFG
  file (e.g. CTRL=0378 to use LPT1).  This is used for controlling external
  hardware devices via logic, and reading status from the.  The command
  "CTRL" reads the port, and "CTRL <value>" writes it.  The read value is
  the OR of last written value and external level, so a bit must be
  written to 0 in order to use it as an input. If written to 1, it will
  always return 1.

- L2 tx window wasn't being kept full after a partial ack, leading to
  annoying pauses on good links.  Hopefully fixed.

- Implemented modulo-128 with receive resequencing, to take advantage of
  good links.  The method of activation isn't fully decided as yet.  If
  the caller requests modulo-128 he will always get it.  If the port
  maxframe is set > 7, *ALL* L2 downlinks on that port will be tried
  using modulo-128.  This is not recommended, since hardly any users
  are EAX25 compatible.  If they answer (correctly) with <DM> or <FRMR>
  the link will fall back to normal Modulo-8 AX25, but it's simply a
  waste of airtime attempting EAX25 in the first place.  It is more
  likely that EAX25 would be used on inter-node links with other PZT
  routers, Linux and PE1CHL boxes, so simply define a maxframe > 7
  for the route, or for the port if it's not shared.

- Added J (recent connects) command.

- Added APRS generic digipeating for RELAY, WIDE, TRACE, TRACEn-N and
  WIDEn-N.

- Added extra flags to "digiflag", to control APRS digipeating.

- Added optional IDTEXT for each port, allowing a more meaningful ID
  on APRS ports.

- Added CFLAGS to port init. 1 = allow uplink, 2 = allow downlink,
  3 = allow both up and downlink.  This allows ports to be used for
  unconnected operations such as UI digipeating only.

- The number of digis in ax25 address was limited to 7 - I'd
  misinterpreted 56 octets as 7*8byte fields instead of 8*7byte (Doh!)
  - raised to 8.

- Added response to ?APRS? query.

- Added check for own call in previous digis to prevent digi looping.

- Added "SEND <port> <call> [ V[ia] digi,digi ] <text>" to send unproto
  text.

- Added "DX [port]" command, to show the best APRS DX. It only works if
  the router's APRS position has been defined of course.  I urge
  all sysops to include a position in their ID beacon - you'll be
  surprised how useful it is!

Versions 1.64 - 1.67 development versions only.
~~~~~~~~~~~~~~~~~~~~

Version 1.63	27/2/01
~~~~~~~~~~~~~~~~~~~~~~~
- Added multi-protocol Ethernet interface (requires PZT external driver
  ETHDRV.EXE plus ethernet card driver), allowing the simultaneous use
  of raw TCP/IP, AX25, AXIP tunnelling etc. between PZT routers, and
  between PZT and xNOS, Linux etc. using Ethernet.  This will also
  interconnect with a BPQ system which is using ODIDRV.

- Added ARP PUBLISH command, which can also be used in IPROUTE.SYS

- Added ARP FLUSH command to purge temporary entries.

- Learned ARP entries now expire after 15 minutes.

- Added IP ROUTE LOOKUP <host> to show routing to specified host.

- Suppression of "Trying" for connects to call wasn't working - fixed.

- Telnet receive was broken from v158 causing double line spacing on
  pzt <> pzt telnet sessions - fixed.

- External interface protected against missing driver.

- Diskette free space shown by FTP "LIST" command was wrong - fixed.

- DOS mode would allow change to non-existent drive or directory - fixed.

- Since 6/10/00 "*** Disconnected" was overwriting last line of recived
  text - fixed.

- Prevented the use of portalias2 for connects and non-UI digipeating.

- Added the ability to specify a port in ROUTE command (e.g. "R R 2").


Version 1.62	19/2/01  (not released)
~~~~~~~~~~~~~~~~~~~~~~~
- Major rewrite of interrupt service to improve serial port performance
  on slow machines with 8250 UARTs.

- Serial port flow control setting was wrong - fixed

- Added IRQ number validation to SCC initialisation, to prevent the
  attempted use of non-existent IRQ's on XT machines.

- If our IDMSG didn't contain a valid APRS position, received APRS beacons
  were shown as having a bearing of 0 and a distance > 5000 Km. - Fixed.

- Top status line update caused a slight flicker on some machines - fixed.

- Added MHCLEAR <port> command, to clear MHeard list on specified port,
  for example after a lift, or a change of frequency.

- Tidied MHeard display to enable it all to fit on one line.  Unfortunately
  the "type" field had to be reduced to initial letters only (N=Node,
  D=Digi, A=ARP, I=IP)

- Connection via digis was broken by recent code changes - fixed.

- Added AXIP tunnelling protocol, allowing AX25 nodes to be linked via
  the Internet or any other IP-only network.

- Fixed TCP receive bug which caused lost characters when segments
  overlapped, e.g. when receiving data from Windows Telnet!

- Fixed "spurious locked nodes" problem.



