
LFT CHANGELOG

lft 3.98 / WhoB 3.98
----------------------
- Build fixes for Linux: lft_watch.c now explicitly includes <sys/ioctl.h>
  for struct winsize and TIOCGWINSZ.  These were pulled in transitively
  on macOS but not on Linux glibc, breaking the build of --watch support
  out-of-the-box on Linux.
- whob link line cleaned up: the whob CLI tool no longer drag-links the
  ncurses libraries (it never used them).  Makefile / Makefile.in now
  define WHOB_LIBS = $(filter-out -lncurses -lncursesw,$(LIBS)) and use
  it in the whob target.  c-ares stays in the whob link since whois.c
  uses it for the server-prefetch async resolver path.

lft 3.97 / WhoB 3.97
----------------------
- watch-mode UDP ECMP stability across cycles: watch_reset_session no
  longer zeros sess->seq_start between cycles, preserving the IP-ID base
  that UDP probes embed for ECMP flow-hash consistency.  Without this,
  each watch cycle re-randomized the IP-ID base and took a different
  ECMP branch on multi-path networks, defeating the 3.97 UDP
  ECMP-stability fix.  TCP (sport) and ICMP (icmp_initial_seq anchor)
  were already preserved correctly.
- watch-mode hop count indicator no longer over-counts: with noisy>=2
  (forced in watch mode for the log drawer), EVT_RECV_PACKET formerly
  incremented the live hop counter for every responding TTL including
  ahead-limit overshoot replies past the target; the handler now recounts
  from hop_info[] capped at num_hops+1, matching EVT_PROGRESS_OK. The
  watch status-bar peak counter (max_hops_seen) is now set to the current
  cycle's n_hops rather than maximized, so it cannot get sticky after a
  short path follows a long one.
- watch-mode topology inheritance (--watch / -W): the first cycle is a
  conventional broad scan, but once the path length and RTT envelope have
  been stable for three consecutive cycles, subsequent cycles narrow
  ttl_limit to learned_num_hops + learn_margin (default 2), widen
  ahead_limit to the full known path width (capped at 16 to stay friendly
  to per-source ICMP rate limits), shrink timeout_ms to max(8 *
  max_observed_rtt, 200 ms), and tighten scatter_ms to 5. Auto-tune
  resets immediately if a cycle misses the target or the probe protocol
  changes, reverting to broad-scan defaults until the path stabilizes
  again. --no-learn disables the feature entirely; --learn-margin N
  (0 to 10) tunes the TTL probe margin above the learned path length.
- UDP probe ECMP flow-hash stability: all probes in a UDP trace session now
  use a fixed destination port rather than incrementing the port with each TTL
  (the traditional VJ traceroute approach). Each probe is identified by a
  pseudorandom session-unique value embedded in the IP ID field; ICMP
  time-exceeded replies echo this value back in the quoted inner IP header,
  allowing exact probe-to-reply matching without varying the 5-tuple. The IP ID
  base is generated the same way as the TCP initial sequence number (rand()),
  ensuring it is non-zero and session-unique. This keeps every UDP probe on the
  same ECMP path.
- ICMP probe ECMP flow-hash stability: a 2-byte compensation word appended to
  each ICMP echo payload keeps the ICMP checksum constant across all probes in
  a session. Because routers hash on the ICMP checksum field as a proxy for the
  missing port fields, holding the checksum constant ensures all probes follow
  the same ECMP path.
- For completeness, our TCP tracing implementation supported ECMP flow-hash 
  stability (and was the first tool to do this) since 1998. 
- Added a 'Capabilities' section to the version (-v) output to display the
  version of libraries against which LFT was linked at compile-time.

lft 3.96 / WhoB 3.96
----------------------
- rtt-statistics (-j N / --stats=N): per-hop RTT min/avg/max/stddev in all output
  modes; ASCII art candlestick chart above -o hop diagram; global Y-axis scale;
  jitter alert (>25 ms delta) highlighted in yellow with annotation; -o
  auto-activates with default 3 probes; -m/-M override probe count.
- Added active Path MTU Discovery: -K / --mtu / --path-mtu starts probes at
  the local interface MTU (queried via SIOCGIFMTU; 1500 fallback) so that
  bottleneck links return ICMP "fragmentation needed" (type 3, code 4) messages
  identifying the path MTU; probe size steps down on each PTB received, using
  the next-hop MTU value or, for pre-RFC-1191 routers that return zero, the
  next lower RFC 1191 plateau (65535→32000→17914→8166→4352→2002→1492→1006→
  508→296→68); hops where the path MTU is constrained show [MTU: NNNN] in
  regular output, as pathmtu="NNNN" in XML, and as a separate row in ASCII
  art (-o); hops that silently drop oversized DF probes without returning a
  PTB show [MTU Limit] hop N dropped DF probe (NNNN bytes, no PTB received)
  immediately after the [neglected] line for that hop; -L is silently ignored
  when -K is active; documented in lft.8 with PTB terminology explained
- Extended active PMTUD (-K) to ICMP probe mode (-p): open_sockets() now
  queries SIOCGIFMTU and sets sess->userlen for ICMP as it does for TCP/UDP;
  generateICMPPacket() picks up sess->userlen as the total packet size; PTB
  (type 3, code 4) responses are intercepted in icmp_process_packet() and
  handled by lft_pmtud_icmp_handle_ptb() which steps down sess->userlen the
  same way lft_pmtud_handle_ptb() steps down the TCP/UDP trace_packet
  template; icmp_check_timeouts() flags timed-out hops as pmtud_blackhole and
  calls lft_pmtud_verify_blackholes() (now non-static) before icmp_finish();
  icmp_finish() emits per-hop [MTU Limit] / [neglected] output matching
  finish() behaviour; lft.8 -K section updated to reference all three
  probe protocols and explain the payload-inflation rationale
- Migrated c-ares usage from deprecated API to c-ares 1.34+ event model:
  replaced ares_fds()/ares_process() with ARES_OPT_SOCK_STATE_CB /
  ares_process_fds() in both lft_lib.c (main trace loop) and whois.c
  (whois server prefetch); replaced ares_gethostbyname() with
  ares_getaddrinfo() in whois.c; removed all -Wdeprecated-declarations
  pragma suppressions; builds cleanly at -std=gnu23 with zero warnings
- Annotation labels in -o ASCII art updated: stateful firewall now shows
  Stateful FW (U+21F6), flag-based filter shows Flag FW (U+2691),
  BSD TCP anomaly shows BSD Bug (U+21C4), AS boundary shows ASN Seam
  and network boundary shows NET Seam (both U+2573); plain ASCII
  fallbacks updated to [Stateful FW], [Flag FW], [BSD Bug] respectively;
  seam fallbacks retain x-AS-Seam-x / x-Net-Seam-x for compatibility
- RTT chart x-axis label now shows end-to-end RTT derived from the target
  column's own min/max samples (not the global trace min/max), formatted as
  "End-to-End RTT Nmin–Nmax ms, N hops to proto://address:port" where proto
  reflects the active probe mode (tcp/udp/icmp) and port is the destination
  port; falls back to "N hops traced, target unreachable" when target was
  not reached; lft.8 -j entry updated accordingly
- Updated include/win32/wingetopt.c to add getopt_long() implementation
  (required since 3.95 added getopt_long() throughout lft.c; Windows builds
  were broken at link time without it); wingetopt.h extended with struct
  option, no_argument / required_argument / optional_argument constants,
  getopt_long() declaration, and opterr / optopt globals
- Rewrote makefile.vc (formerly auto-generated by the defunct Bakefile tool):
  now hand-maintained with NPCAP_DIR / CARES_DIR configurable paths, proper
  Npcap SDK linkage (wpcap.lib Packet.lib), c-ares linkage (cares.lib),
  correct include search paths, and a DEBUG=1 mode; documents SDK download
  URLs and quick-start instructions in the header comment
- Removed deprecated lft.spec instructions
- Updated config/install-sh
- Updated config/config.guess and config/config.sub 

lft 3.95 / WhoB 3.95
----------------------
- Replaced gethostbyname()/gethostbyaddr() with getaddrinfo()/getnameinfo()
  throughout (~50 calls) for modernization and prerequisite for IPv6 
- Added asynchronous reverse-DNS via c-ares: PTR queries sent for each hop
  IP as it is revealed by an incoming ICMP time-exceeded response, merged into
  the existing select() loop via ares_fds()/ares_process(); results are ready
  by the time the trace completes, eliminating post-trace serial DNS latency
  (typically 180-260ms savings on a 10-15 hop trace)
- Whois library lazy DNS resolution: w_init() registers known server hostnames
  in a cache but fires no lookups; a new w_prefetch() function resolves a single
  server on first use via c-ares when w_ask() is called, bypassing the OS
  resolver (and mDNSResponder on macOS) only for the service actually needed
- New -Q flag disables async DNS at runtime without recompiling; documented in
  --help (under Advanced Resolution Options) and the manpage
- -T timing display shows "resolving: X.XXs (async)" label when c-ares handled
  name resolution during the trace, distinguishing from the synchronous path
- configure now probes common third-party prefix directories (/opt/homebrew,
  /usr/local, /opt/local, /opt/pkg) for both libpcap and c-ares before falling
  back to AC_CHECK_LIB; ./configure now finds Homebrew-installed c-ares on
  Apple Silicon without requiring manual LDFLAGS/CPPFLAGS
- Added pkg-config support for c-ares detection (mirroring existing pcap path)
- Added --with-cares=PATH configure option for manual c-ares path override
- Added --disable-async-dns configure option to disable c-ares at build time
- All async DNS code guarded by #ifdef HAVE_CARES; builds and runs correctly
  with or without c-ares installed; -Q is a safe no-op when not compiled in
- c-ares initialised with ARES_OPT_TIMEOUTMS=500ms, ARES_OPT_TRIES=2
  (1000ms worst-case per host); DNS results are a bonus and never block the
  trace -- unresolved hops display numerically as before
- Updated lft.8 manpage to document -Q and async DNS behavior
- Added -o ASCII art hop diagram output: horizontal per-hop columns with
  Unicode box-drawing headers (┌─ HOP N ─┐) with ASCII fallback ([- HOP N -]);
  ANSI color auto-detected via TERM/COLORTERM/isatty and suppressed by NO_COLOR;
  terminal-width-aware row wrapping; SOURCE and TARGET columns with port numbers
- Column layout (top to bottom): header, hostname, IP address, AS number (-A),
  network name (-N), round-trip time, then feature annotation line
- Feature labels use needlework and symbolic Unicode glyphs when the terminal
  supports them, with plain ASCII fallbacks for all annotations: seam
  boundaries, cloaked hops, firewall anomalies, and target state indicators
  each have a distinct glyph style in Unicode mode and a readable ASCII
  equivalent when Unicode is unavailable
- Narrowed ICMP unreachable stop behavior: only codes 0 (net), 1 (host),
  2 (protocol), 3 (port), 9 (net admin prohibited), 10 (host admin
  prohibited), and 13 (communication admin prohibited) halt the trace by
  default; all other codes (4, 5-8, 11-12, 14-15) are recorded but the
  trace continues; new lft_icmp_stops_trace() static inline helper in
  lft_lib.h shared between lft_lib.c and lft_btcptrace.c
- Adaptive mode (-E/-e) now automatically implies --ignore-unreachables
  (break_on_icmp=0); the adaptive engine needs to probe through devices
  that send ICMP unreachables to perform stateful path analysis
- Added getopt_long() replacing getopt(); every short flag now has a
  long-form equivalent (e.g. --dport, --min-probes, --max-hops,
  --ignore-unreachables, --adaptive, --ascii, --tcp-window); multiple
  aliases supported where traceroute convention warrants (--min-ttl /
  --first-hop, --max-hops / --ttl-max, --quiet / --silent, --length /
  --bytes, --device / --receive-device, --from-device / --source-device);
  all short flags remain fully backward-compatible
- Added long-only --help option (OPT_HELP sentinel); displays usage
  summary and exits
- Added -w (--tcp-window) to usage() help text under Advanced Tracing
  Options and to the manpage; the option existed and functioned but was
  undocumented in both places
- Added "long-form options available, see lft(8)" note to --help output
- Fixed manpage: -m and -M descriptions corrected from "re-attempts per
  host" to "probes per hop"; -M default corrected from 3 to 2 (matching
  actual code default); "min tll" typo corrected to "min ttl"; "Type of
  Serice" typo corrected to "Type of Service"
- Updated manpage -i description to enumerate the specific ICMP codes
  that stop the trace by default and note that adaptive mode implies it
- Updated manpage -E/e entry to note that adaptive mode implies
  --ignore-unreachables
- Whois and getnameinfo DNS calls now protected by timeout wrappers:
  w_getaddrinfo_timed() (POSIX: alarm/SIGALRM; Windows: worker thread +
  WaitForSingleObject/TerminateThread) prevents whois server resolution
  from stalling the trace indefinitely; lft_getnameinfo_timed() applies
  the same Windows thread-based ceiling to getnameinfo() calls in the
  output path
- configure now emits a deferred advisory warning (AC_MSG_WARN) when
  c-ares is not found, displayed at the bottom of configure output;
  libpcap AC_MSG_ERROR messages updated to consistent style with
  platform-specific install instructions including macOS Homebrew
- Suppressed unresolved [AS?] and [NULL]/[NET?] annotations in -o ASCII
  art and GraphViz output to avoid cluttering columns where no data is
  available; regular output retains the annotation but normalises the
  label from [NULL] to [NET?] for consistency with [AS?]
- Added startup privilege check: lft_check_permissions() probes for raw
  socket access (the same capability pcap requires) before executing the
  trace; if insufficient, exits immediately with platform-appropriate
  remediation guidance -- on Linux recommends setcap(8) with setuid-root
  as a last resort; on macOS/BSD instructs the setuid-root method with
  the resolved binary path ready to copy-paste; on Windows directs the
  user to run as Administrator with Npcap installed

lft 3.94 / WhoB 3.94
----------------------
- Fixed libpcap detection in configure: replaced deprecated pcap_lookupdev()
  (removed in libpcap 1.10) with pcap_findalldevs(), which is what the code
  actually calls at runtime via lft_pcap_lookupdev()
- Added pkg-config support for libpcap detection, with fallback to manual
  detection for systems without pkg-config
- Fixed memory leak in lft_pcap_lookupdev(): pcap_findalldevs() result list
  was never freed with pcap_freealldevs()
- Updated make install to detect platform (Linux vs. others) and check for
  root privileges before granting capabilities: on Linux with root, uses
  setcap(8) to grant cap_net_raw,cap_net_admin without a setuid root binary;
  falls back to setuid root if setcap is unavailable; warns clearly if install
  is not run as root; on non-Linux platforms uses setuid root directly
- Updated --enable-universal to target arm64 + x86_64 (Apple Silicon + Intel)
  replacing the obsolete i386 + ppc targets
- Removed obsolete autoconf macros: AC_HEADER_STDC, AC_C_CONST,
  AC_PROG_GCC_TRADITIONAL, AC_FUNC_MALLOC, AC_FUNC_REALLOC,
  AC_FUNC_SELECT_ARGTYPES, AC_STRUCT_TM, AC_HEADER_TIME
- Improved configure error messages for missing libpcap with platform-specific
  install instructions
- Replaced pcap_open_live() with pcap_create()/pcap_set_snaplen()/
  pcap_set_promisc()/pcap_set_timeout()/pcap_activate() for improved error
  reporting; activation failures now surface via pcap_geterr() with distinct
  fatal (ERR_PCAP_ACTIVATE_ERROR) and non-fatal (WRN_PCAP_ACTIVATE) paths
- Improved raw socket permission error to display platform-appropriate hint
  for granting required privileges

lft 3.93 / WhoB 3.93
----------------------
- Updated lft_types.h to reflect some DARWIN (Apple) specifics

lft 3.92 / WhoB 3.92
----------------------
- Changed lft_types.h to reflect some OpenBSD specifics


lft 3.91 / WhoB 3.91
----------------------
- Fixed bugs.debian.org/cgi-bin/bugreport.cgi?bug=922430
- Updated date


lft 3.9 / WhoB 3.9
----------------------
- Fixed a bug that could indicate a target was closed when it was open
- Improved support for DLT_NULL interfaces on BSD-like operating systems
- Improved deprecated pcap device enumeration method
- Improved GraphViz output format appearance 


lft 3.8 / WhoB 3.8
----------------------
- Added support for DLT_NULL interfaces

lft 3.79 / WhoB 3.79
----------------------
- Improved feature: 'whob me' and 'whob whoami' to display your public IP 

lft 3.78 / WhoB 3.78
----------------------
- Added feature: 'whob me' to display your current public IP address

lft 3.77 / WhoB 3.77
----------------------
- Added feature: 'whob -gA' to show all prefixes TRANSITING an ASN
  Very powerful, much-requested feature! Enjoy 
  Many thanks to Prefix WhoIs team!


lft 3.76 / WhoB 3.76
----------------------
- Remove compiler warnings using more casts (Victor)
- Autoremake ./configure script so everyone has a reasonable default


lft 3.75 / WhoB 3.75
----------------------
- Improved cross-compiling compatiblity (thanks to Gustavo Z.) 


lft 3.74 / WhoB 3.74
----------------------
- Fixed source port randomizaiton with -z (thanks to Conor M.)
- Fixed compilation on OpenBSD (thanks to Renaud A.)


lft 3.71 / WhoB 3.71
----------------------
- WhoB: Autodetect input from STDIN (pipe) without '-f -'
- WhoB: Redirect some extraneous output to STDERR 


lft 3.7 / WhoB 3.7
----------------------
- Added support for 4-byte ASNs
- Added support for whob reading bulk input from stdin using '-f -'


lft 3.6 / WhoB 3.6
----------------------
- Added support for 4-byte ASNs


lft 3.5 / WhoB 3.5
----------------------
- Roy T. provided DNS speed-ups
- Added GraphViz output option with -g


lft 3.35 / WhoB 3.5
----------------------
- Roy T. provided some clean-ups to avoid double free()s 
- Bug fixes only


lft 3.33 / WhoB 3.5
----------------------
- Fixed free(sess->hostname) bug (segfault on unresolvable hostname)
- Improved error hanlding of pcap failures related to data link type
- Kurt's FreeBSD fix for pcap snprintf
- Bug fixes only


lft 3.32 / WhoB 3.5
----------------------
- Added support for several encapsulating protocols such as PPP
- no other changes


lft 3.31 / WhoB 3.5
----------------------
- Added #define for AI_NUMERICSERV undeclared on some platforms/versions
- No other changes


lft 3.3 / WhoB 3.5
----------------------
- Improved LFT target detection behind firewalls
- Updated LFT for newer pcap version defaults
- WhoB ignores comments [#,;] in input files
- Added LFT option -f to specify fake source address
- Applied many, many, many fixes from Juli M. of USA -- Thanks!
- Applied many, many, many fixes from Markus Gothe of Sweden -- Thanks!


lft 3.2 / WhoB 3.2
----------------------
- Added support for 802.1q tagged VLANs
- Manual page corrections (thanks to Brett)
- WhoB will use Prefix WhoIs for bulk file resolution in
  Cymru-compatible format with '-c' but Cymru will be used 
  with '-C'


lft 3.1 / WhoB 3.1
----------------------
- New configure options:
  --enable-gtod Forces LFT to use gettimeofday() on each packet instead of 
  using the BPF timestamp. This is critical on platforms that have enabled
  'fastts' or that do not have high-precision BPF timestamping.
  --enable-universal generates binaries including both PPC and Intel architecture 
  (for users running Mac OS X/Darwin)
- Improved compatibility with NetBSD and Darwin/Mac OS X
- Added autoconf support for NetBSD
- Improved compatibility with older compilers (thanks to Sean)
- Updated autoconf bits and pieces
- By popular request, reversed the -g option of WhoB
  WhoB now uses gigo mode by default unless -g is specified which turns
  ON its parser and enables the other various options


lft 3.0
----------------------
- Completely refactored and now a workable library
- LFT has a new (-b) TCP Basic trace method that makes TCP traces NAT-friendly
- LFT has a new (-p) ICMP trace method that uses echo requests to trace paths
- Many memory issues fixed 
- Cleanup of several 2.6b5-3.0b features


lft 2.6 / WhoB 2.0
----------------------
- LFT prints 'open' in the target block if the target dest port is open
- LFT indicates the reason it marked ports open/closed in verbose(2) output 
- LFT prints an asterisk when it retransmits a packet after a timeout
- LFT uses Prefix WhoIs (bulk) or RISWHOIS (bulk) for netname resolution
- LFT has a new (-u) traditional UDP-based tracing feature
- LFT displays start and finish times/dates when using the (-T) option
- LFT has a new (-U) feature to display all times in UTC/GMT0
- LFT only shows time spent tracing/resolving at verbosity level 1 or higher
- LFT sets the ToS bit on outgoing IP datagrams when (-I) option is used
- LFT gets timevals from packets instead of calling gettimeofday()
- LFT won't be fooled into thinking there's a firewall on a gateway just
  because adaptive mode ups the state waiting for replies that never come
- Improved LFT performance (removed gettimeofday() on each packet)
- WhoB/library uses Prefix WhoIs to resolve OrgNames and NetNames
- WhoB/library has improved support for RIPE NCC RIS and Prefix WhoIs
- WhoB supports bulk resolution (-f option) from an input file
- WhoB also supports one-per-line output (-cf option) from a bulk input file
- WhoB will use putenv() on Solaris who is missing setenv() to set TZ
- WhoB has a new (-g) feature to take input directly from the command line 
  and print output directly from Prefix WhoIs (referred to as GIGO)
- Added $DESTDIR support to Makefile (thanks Daniel)
- Fixed an off-by-one bug in LFT related to ASN display encountered when 
  a trace contains one or more neglected TTLs
- Fixed an off-by-one bug in LFT's verbose output regarding TTLs
- Fixed variable ordering in whois.c from 2.6b1 (thanks Erick) 
- Numerous platform-specific improvements
- Reconfigured autoconf and segregated ./config/
- Updated autoconf components to v2.59


lft 2.5 / WhoB 1.5
----------------------
- Inclusive of betas 2.32 to 2.4x
- Added -z option to pseudo-randomize source port
- Added behavior to automatically select the most appropriate interface
  based on routing (this was on the most wanted list)
- Improved OpenBSD compatibility (IP length nonzero)
- OpenBSD is now detected by autoconf (for configuring the above)
- Darwin is now detected by autoconf and its definition disables
  some BSD features to make it compatible with MacOS X and Darwin
- LFT now indicates it has reached the target by printing a 'T'
  character in the status display (if status is enabled)
- Cleanups were made to the verbose output levels (-VVV)
- Significantly revamped whois framework makes it easy to include
  whois functionality into other programs
- Added -C and -R and -r options to force alternate ASN sources:
    - (r)IPE RIS - special thanks to Rene Wilhelm @ RIPE NCC
    - (C)ymru 
    - (R)ADB 
- Default ASN source (-A) is now Prefix WhoIs (see pwhois.org)
- LFT now queries for ASNs in bulk format after completing
  a trace if pwhois (default), RIPE NCC RIS, or Cymru is selected
- Added dst/src port autoselection based on user-supplied hostname
- Vastly improved standalone whois client "whob" see whob.8 (whob manpage)
- Makefile now installs 'whob' no-frills whois client (try ./whob)
- "Smart" mode is now referred to as "Adaptive" mode (-E)


lft 2.31
--------------------
- Fixed time precision on FreeBSD 5.3 (Thanks to Kurt Jaeger)


lft 2.3:
--------------------
- added WSAIoctl() call to select proper IF on windows based on dest (thanks Graham!)
- lowered max_retries to a default of 2
- cleaned up formatting related to -S option
- cleaned up verbose output to be more friendly
- cleaned up error messages
- updated manpage
- updated spec file


lft 2.2:
--------------------
- removed dependence on regex library
- removed dependence on INT_MAX
- fixed whois code to get the most specific netblock instead of the least specific netblock
- can now specify interface by IP instead of by name


lft 2.1:
--------------------

- Added autoconf support
- Ported to cygwin
- Fixed the Solaris and BSD makefiles (manpage install errors)
- Modified the whois code to resolve ASN and netname lookup 
    problems with RIPE entries.  (-A) and (-N) code...
- Modified the whois code to support local-as
- Vastly streamlined the (-V) verbose output to cover the 
    important information (sequence, etc) of all packets
    sent and received


lft 2.0 (and betas):
--------------------

- (-E) and (-F) shouldn't be used at the same time, now LFT knows that
- Implemented fixes that enable LFT to run under Solaris/SPARC (Jim McKim)
- Changed name from FFT to LFT (layer four trace)
- Added ICMP messages for codes 13-15 
- Changed the (-P) option added in 1.99 to (-E) in order to force use of  
    the new "smart" engine
- Enhanced stateful firewall (packet filter) detection en route
- Engine: "smart" mode now tries FIN, SYN, etc table to get packets through
    which dramatically improves its "find a way" capability
- Engine: "smart" mode now detects the BSD bug properly
- Engine: "smart" mode now detects firewalls in transit
- Compilation: made lft_queue.h the default for all OSs
- UI: lots of user interface changes


lft 1.99-beta(s):
--------------------

- Added Loose Source Routing feature (LSRR) [<gateway> <...>] <target>
- Added (-N) Netblock name lookup feature 
- Added (-A) ASN lookup feature 
- Added (-P) option to automatically send 3 probes for more stats 
- Added (-V) lots of verbose debugging information
- Added (-F) feature to revert to sending FIN packets
- Added (-T) option to show trace and resolution timings (LFT is fast)
- Added BSD 4.[23] and derivative (bug) inappropriate TTL detection
- Engine: Use sequence numbers as packet ID instead of destination port
    numbers. This achieves a number of goals: 
    Return ICMP and TCP packets are more uniquely identified. 
    It is now possible to check the route for specific destination
    port, which is important if route varies based on port (such
    as with transparent proxying using a load balancing switch on
    port 80)  (thank you Ugen!)
- Engine: Send SYN packets. Variety of firewalls and NAT devices won't 
    pass through a single TCP packet that is not a part of established
    connection, unless it carries SYN flag only (initial packet). 
    Pitfall: this may create useless PCB blocks on destination host,
    if it does not use SYN cookies or some other SYN flood protection.
    However it's better then not being able to use lft from behind
    firewalls.  (thank you Ugen!)
- Renamed (-H) max hops/ttl option 
- UI cleaned up in several areas, especially result list & RTT display
- Detect local packet filter


lft 1.91:
---------------------

- Fixed Makefile.solaris (last time we'll see this before autoconf)
- added <sockio.h> for Solaris

lft 1.9:
--------------------

- Default source port is now 53/tcp (dns-xfer)
- Configurable source port on command line through -p or host:port
- Configurable initial destination port on command line using -d 
- Source and Destination ports use /etc/services for lookup
- Fixed a bug that created a gethostbyaddr() call even when the user
  specified NOT to do reverse DNS lookups -- makes -n option way faster!
- Changed the way lft auto-detects the IP address of the interface selected
   * now, we determine what address is assigned to the interface instead of
     just getting the hosts's primary/default address and using it
   * thanks, Aaron, for bringing this to our attention! 
   * thanks, Lane, for coming up with a platform-independent 
     way of making it work.


lft 1.8:
--------------------

- added option to suppress status indicator and only show trace (or errors)
   * people using lft from a web page wanted this
- added option to select the network interface used as hop zero
   * string length of device is tested to avoid potential buffer overflows
- modified the status bar to display:

Send mode: ->( <packet number> / <TTL of packet> )
Recv mode: <{ <TTL of packet received> }

Additional testing platforms for this release:

- Aaron Bentley (Univ Toronto) tested lft successfully under Debian Woody Linux
   * Aaron also contributed a variation of net device selection -- thanks


lft 1.7:
--------------------

- added option to disable reverse DNS host lookups
- made several areas slightly more user-friendly
- modified the status bar to display:

Send mode: ->( <packet number> / <TTL of packet> )
Recv mode: <( <TTL of packet received> )

- changed "source" port from tcp/80 to tcp/25

most firewalls today permit tcp_established implicitly, not traffic
from tcp/80 explicitly, therefore we figured sending packets from 
tcp/25 would be more likely to get through.

- modified initialization of 32-bit unsigned integer used to 
  calculate checksum

LFT now builds again under Solaris, but still miscalculates checksums 

- fixed round trip time calculation 
- several other minor tweaks
- tested under RedHat Linux, Darwin 5.5 (MacOS X v10.1) 

lft 1.6 (nils):
---------------

- Great idea.

