diff --git a/etc/config/atcommands.user b/etc/config/atcommands.user index 3fd0ea6..4e99a18 100644 --- a/etc/config/atcommands.user +++ b/etc/config/atcommands.user @@ -21,4 +21,6 @@ Disable NSA Only;AT+QNWPREFCFG="nr5g_disable_mode",2 Get Currently Enabled 5G/NR SA Bands;AT+QNWPREFCFG="nr5g_band" Get Currently Enabled 5G/NR NSA Bands;AT+QNWPREFCFG="nsa_nr5g_band" Get Currently Enabled 4G/LTE Bands;AT+QNWPREFCFG="lte_band" -View assigned IPv4/IPv6 addresses from the provider;AT+QMAP="WWAN" \ No newline at end of file +View assigned IPv4/IPv6 addresses from the provider;AT+QMAP="WWAN" +Enable IPPT paste in MAC for FF:FF:FF...;AT+QMAP="MPDN_rule",0,1,0,1,1,"FF:FF:FF:FF:FF:FF" +Disable IPPT;AT+QMAP="MPDN_rule",0 diff --git a/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/CONTROL/control b/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/CONTROL/control new file mode 100755 index 0000000..045c363 --- /dev/null +++ b/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/CONTROL/control @@ -0,0 +1,6 @@ +Package: ookla-speedtest +Version: 1.2.0 +Architecture: aarch64_cortex-a53 +Maintainer: Ookla speedtest.net https://www.speedtest.net/apps/cli +Description: Allows you to test your internet speed with speedtest.net +Depends: libc diff --git a/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/build-ipk b/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/build-ipk new file mode 100755 index 0000000..eb83cf6 --- /dev/null +++ b/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/build-ipk @@ -0,0 +1,74 @@ +#!/bin/sh + +# Script for building OpenWRT .ipk packages using tar by iamromulan +# Works with SDXPPINN OpenWRT - iamromulan +# This script accepts an optional path to the directory containing the `CONTROL` and `root` directories. +# Usage: ./build-ipk.sh [path] +# If no path is provided, the script will look in the current directory for `CONTROL` and `root` directories. +# This will spit out an ipk in the current directory + +# Check if the script is run as root. If not, rerun with sudo. +if [ "$(id -u)" -ne 0 ]; then + echo "Script is not running as root. Re-executing with sudo..." + exec sudo "$0" "$@" +fi + +# Set the default build path to the current directory +build_path="." + +# Check if a path is provided as the first argument +if [ "$1" ]; then + build_path="$1" +fi + +# Check if the required directories are present in the specified path +if [ ! -d "${build_path}/CONTROL" ] || [ ! -d "${build_path}/root" ]; then + echo "Error: CONTROL and root directories must be present in the specified path (${build_path})." + exit 1 +fi + +# Extract values from the CONTROL/control file in the specified path +pkgname=$(grep -i '^Package:' "${build_path}/CONTROL/control" | awk '{print $2}') +version=$(grep -i '^Version:' "${build_path}/CONTROL/control" | awk '{print $2}') +architecture=$(grep -i '^Architecture:' "${build_path}/CONTROL/control" | awk '{print $2}') + +# Check if values are extracted correctly +if [ -z "$pkgname" ] || [ -z "$version" ] || [ -z "$architecture" ]; then + echo "Error: Failed to extract Package, Version, or Architecture from ${build_path}/CONTROL/control." + exit 1 +fi + +# Set the final IPK name based on the extracted values +ipkname="${pkgname}_${version}_${architecture}.ipk" + +# Ensure all CONTROL scripts are executable +echo "Setting permissions for CONTROL scripts..." +chmod +x "${build_path}/CONTROL"/* + +# Set ownership for CONTROL and root files +echo "Setting ownership for all package files..." +chown -R root:root "${build_path}/CONTROL"/* +chown -R root:root "${build_path}/root"/* + +# Create control.tar.gz from the CONTROL directory +echo "Creating control.tar.gz..." +tar -czvf control.tar.gz -C "${build_path}/CONTROL" . + +# Create data.tar.gz from the root directory +echo "Creating data.tar.gz..." +tar -czvf data.tar.gz -C "${build_path}/root" . + +# Create debian-binary file (must contain exactly "2.0" without a newline) +echo -n "2.0" > debian-binary +chown -R root:root debian-binary + +# Combine the components into the final .ipk file using tar +echo "Packaging ${ipkname}..." +tar -czvf "$ipkname" debian-binary control.tar.gz data.tar.gz + +# Clean up intermediate files +echo "Cleaning up temporary files..." +rm -f control.tar.gz data.tar.gz debian-binary + +echo "IPK package ${ipkname} created successfully using tar." + diff --git a/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/root/usr/bin/speedtest b/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/root/usr/bin/speedtest new file mode 100755 index 0000000..677c6e7 Binary files /dev/null and b/ipk-source/ookla-speedtest_1.2.0_aarch64_cortex-a53/root/usr/bin/speedtest differ diff --git a/ipk-source/sdxpinn-mount-fix/build-ipk b/ipk-source/sdxpinn-mount-fix/build-ipk old mode 100644 new mode 100755 diff --git a/ipk/ookla-speedtest_1.2.0_aarch64_cortex-a53.ipk b/ipk/ookla-speedtest_1.2.0_aarch64_cortex-a53.ipk new file mode 100644 index 0000000..2f4a214 Binary files /dev/null and b/ipk/ookla-speedtest_1.2.0_aarch64_cortex-a53.ipk differ diff --git a/rcPCIe_SDXPINN_toolkit.sh b/rcPCIe_SDXPINN_toolkit.sh index 9dd4125..afe7fa4 100644 --- a/rcPCIe_SDXPINN_toolkit.sh +++ b/rcPCIe_SDXPINN_toolkit.sh @@ -35,7 +35,7 @@ send_at_commands_using_atcmd() { echo -e "\e[1;32mSending AT command: $at_command\e[0m" echo -e "\e[1;32mResponse:\e[0m" # Use atcmd to send the command and display the output - atcmd_output=$(atcmd "$at_command") + atcmd_output=$(atcmd "'$at_command'") echo "$atcmd_output" echo -e "\e[1;32m----------------------------------------\e[0m" done @@ -44,12 +44,12 @@ send_at_commands_using_atcmd() { overlay_check() { if ! grep -qs '/real_rootfs ' /proc/mounts; then - echo -e "\e[31mYou have not ran Option 2 yet!!! Please run option 2!!\e[0m" + echo -e "\e[31mYou have not installed the sdxpinn-mount-fix!!! Please run option 2!!\e[0m" return 1 fi } -basic_55x_setup() { +install_mount_fix() { # Check if neither /etc nor /real_rootfs is mounted if ! grep -qs '/etc ' /proc/mounts && ! grep -qs '/real_rootfs ' /proc/mounts; then # Echo message in red @@ -68,60 +68,50 @@ basic_55x_setup() { if grep -qs '/real_rootfs ' /proc/mounts; then # Echo message in red echo -e "\033[31mThe environment has already been setup. If you want to undo the changes temporarily run service mount-fix stop.\033[0m" + echo -e "\033[31mWant to uninstal? Then run opkg remove sdxpinn-mount-fix\033[0m" exit 1 fi + # Install mount-fix + cd /tmp + curl -O https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/ipk/sdxpinn-mount-fix_1.1.0_aarch64_cortex-a53.ipk + opkg install sdxpinn-mount-fix_1.1.0_aarch64_cortex-a53.ipk +} - cd /etc/init.d/ - wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/init.d/mount-fix - wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/init.d/init-overlay-watchdog - # Set executable permissions - chmod +x mount-fix - chmod +x init-overlay-watchdog - cd /usr/sbin - wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/usr/sbin/init-overlay-watchdog.sh - cd / - service mount-fix enable - service init-overlay-watchdog enable - service mount-fix start +basic_55x_setup() { echo "src/gz iamromulan-SDXPINN-repo https://raw.githubusercontent.com/iamromulan/quectel-rgmii-toolkit/SDXPINN/opkg-feed" >> /etc/opkg/customfeeds.conf - rm /etc/opkg/distfeeds.conf - cd /etc/opkg/ - wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/opkg/distfeeds.conf cd / - wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/opkg-feed/iamromulan-SDXPINN-repo.key -O /tmp/iamromulan-SDXPINN-repo.key - opkg-key add /tmp/iamromulan-SDXPINN-repo.key + curl -O https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/opkg-feed/iamromulan-SDXPINN-repo.key -O /tmp/iamromulan-SDXPINN-repo.key + opkg-key add /tmp/iamromulan-SDXPINN-repo.key opkg update - opkg install inotifywait inotifywatch - service init-overlay-watchdog start - echo -e "\e[92m" - echo "Mount fix completed!" - echo "Visit https://github.com/iamromulan for more!" - echo "Proceeding with basic packages installation...." - echo -e "\e[0m" + echo -e "\e[92m" + echo "iamromulan's ipk/opkg repo added!...." + echo -e "\e[0m" opkg install atinout luci-app-atinout-mod opkg install shadow-login opkg install luci-app-ttyd opkg install mc-skins + mv /bin/login /bin/login.old + cp /usr/bin/login /bin/login rm /etc/config/atcommands.user rm /etc/config/atinout rm /etc/config/ttyd cd /etc/config/ - wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/atcommands.user - wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/ttyd - wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/atinout + curl -O https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/atcommands.user + curl -O https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/ttyd + curl -O https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/atinout cd / service uhttpd enable service dropbear enable service uhttpd start service dropbear start echo -e "\e[92m" - echo "Set your root password:" - echo -e "\e[0m" + echo "Set your root password:" + echo -e "\e[0m" set_root_passwd echo -e "\e[92m" - echo "Basic packages installed!" - echo "Visit https://github.com/iamromulan for more!" - echo -e "\e[0m" + echo "Basic packages installed!" + echo "Visit https://github.com/iamromulan for more!" + echo -e "\e[0m" } ttl_setup() { @@ -219,64 +209,13 @@ tailscale_menu() { # Function to install, update, or remove Tailscale install_update_tailscale() { - echo -e "\e[1;31mInstalling Tailscale from opkg...\e[0m" - opkg install tailscale - if [ $? -ne 0 ]; then - echo -e "\e[1;31mFailed to install Tailscale via opkg.\e[0m" - return 1 - fi - - echo -e "\e[1;32mTailscale has been installed via opkg.\e[0m" - echo -e "\e[1;32mUpdating to the latest Tailscale version...\e[0m" - - # Stop Running Service - service tailscale stop - - # Define variables for the download - TAILSCALE_URL="https://pkgs.tailscale.com/stable/tailscale_1.74.1_arm64.tgz" - TAILSCALE_TGZ="/tmp/tailscale_1.74.1_arm64.tgz" - TAILSCALE_TMP_DIR="/tmp/tailscale_update" - - # Download the latest Tailscale package - echo -e "\e[1;32mDownloading latest Tailscale package...\e[0m" - curl "$TAILSCALE_URL" -o "$TAILSCALE_TGZ" - if [ $? -ne 0 ]; then - echo -e "\e[1;31mFailed to download Tailscale package. Please check your internet connection.\e[0m" - rm -f "$TAILSCALE_TGZ" - return 1 - fi - - # Extract the package - echo -e "\e[1;32mExtracting Tailscale package...\e[0m" - mkdir -p "$TAILSCALE_TMP_DIR" - tar -xzf "$TAILSCALE_TGZ" -C "$TAILSCALE_TMP_DIR" - if [ $? -ne 0 ]; then - echo -e "\e[1;31mFailed to extract Tailscale package.\e[0m" - rm -f "$TAILSCALE_TGZ" - rm -rf "$TAILSCALE_TMP_DIR" - return 1 - fi - - # Replace the binaries with force option - echo -e "\e[1;32mUpdating Tailscale binaries...\e[0m" - cp -f "$TAILSCALE_TMP_DIR/tailscale_1.74.1_arm64/tailscale" /usr/sbin/ - cp -f "$TAILSCALE_TMP_DIR/tailscale_1.74.1_arm64/tailscaled" /usr/sbin/ - if [ $? -ne 0 ]; then - echo -e "\e[1;31mFailed to copy new Tailscale binaries.\e[0m" - rm -f "$TAILSCALE_TGZ" - rm -rf "$TAILSCALE_TMP_DIR" - return 1 - fi - - # Set the correct permissions - chmod +x /usr/sbin/tailscale /usr/sbin/tailscaled - - # Clean up temporary files - rm -f "$TAILSCALE_TGZ" - rm -rf "$TAILSCALE_TMP_DIR" - - # Start Tailscale service if available - service tailscale start + echo -e "\e[1;31mInstalling Tailscale 1.74.1...\e[0m" + cd /tmp + curl -O https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/ipk/tailscaled_1.74.1-1_aarch64_cortex-a53.ipk + curl -O https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/ipk/tailscale_1.74.1-1_aarch64_cortex-a53.ipk + opkg install tailscaled_1.74.1-1_aarch64_cortex-a53.ipk + opkg install tailscale_1.74.1-1_aarch64_cortex-a53.ipk + echo -e "\e[1;32mTailscale version 1.74.1 installed\e[0m" } @@ -379,46 +318,49 @@ while true; do echo "Select an option:" echo -e "\e[0m" echo -e "\e[96m1) Send AT Commands\e[0m" # Cyan - echo -e "\e[92m2) First time setup/run me after a flash!\e[0m" # Green + echo -e "\e[92m2) Install sdxpinn-mount-fix/run me after a flash!\e[0m" # Green echo -e "\e[94m3) TTL Setup\e[0m" # Light Blue - echo -e "\e[94m4) Set root password\e[0m" # Light Blue - echo -e "\e[94m5) Tailscale Management\e[0m" # Light Blue - echo -e "\e[92m6) Install Speedtest.net CLI app (speedtest command)\e[0m" # Light Green - echo -e "\e[93m7) Exit\e[0m" # Yellow (repeated color for exit option) + echo -e "\e[94m4) Install Basic Packages/enable luci/add iamromulan's feed to opkg(\e[0m" # Light Blue + echo -e "\e[94m5) Set root password\e[0m" # Light Blue + echo -e "\e[94m6) Tailscale Management\e[0m" # Light Blue + echo -e "\e[92m7) Install Speedtest.net CLI app (speedtest command)\e[0m" # Light Green + echo -e "\e[93m8) Exit\e[0m" # Yellow (repeated color for exit option) read -p "Enter your choice: " choice case $choice in 1) send_at_commands_using_atcmd ;; - 2) remount_rw; basic_55x_setup ;; + 2) remount_rw; install_mount_fix ;; 3) overlay_check if [ $? -eq 1 ]; then continue; fi ttl_setup ;; - 4) + 4) + overlay_check + if [ $? -eq 1 ]; then continue; fi + basic_55x_setup + ;; + + 5) overlay_check if [ $? -eq 1 ]; then continue; fi set_root_passwd ;; - 5) tailscale_menu ;; - 6) + 6) tailscale_menu ;; + 7) overlay_check if [ $? -eq 1 ]; then continue; fi echo -e "\e[1;32mInstalling Speedtest.net CLI (speedtest command)\e[0m" - cd /usr/bin - curl -O https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-aarch64.tgz - tar -xzf ookla-speedtest-1.2.0-linux-aarch64.tgz - rm ookla-speedtest-1.2.0-linux-aarch64.tgz - rm speedtest.7 - rm speedtest.md - cd / + cd /tmp + curl -O https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/ipk/ookla-speedtest_1.2.0_aarch64_cortex-a53.ipk + opkg install ookla-speedtest_1.2.0_aarch64_cortex-a53.ipk echo -e "\e[1;32mSpeedtest CLI (speedtest command) installed!!\e[0m" echo -e "\e[1;32mTry running the command 'speedtest'\e[0m" echo -e "\e[1;32mNote that it will not work unless you login to the root account first\e[0m" echo -e "\e[1;32mNormally only an issue in adb, ttyd, and ssh you are forced to login\e[0m" echo -e "\e[1;32mIf in adb just type login and then try to run the speedtest command\e[0m" ;; - 7) echo -e "\e[1;32mGoodbye!\e[0m"; break ;; + 8) echo -e "\e[1;32mGoodbye!\e[0m"; break ;; *) echo -e "\e[1;31mInvalid option\e[0m" ;; esac done diff --git a/speedtest.md b/speedtest.md new file mode 100644 index 0000000..2f22866 --- /dev/null +++ b/speedtest.md @@ -0,0 +1,352 @@ +speedtest(5) - Speedtest CLI by Ookla is the official command line client for testing the speed and performance of your internet connection. +============ + +## SYNOPSIS +**speedtest** [**help**] [**-aAbBfhiIpPsv**] [**--ca-certificate=path**] [**--format=**] +[**--interface=interface**] [**--ip=ip_address**] [**--output-header**] [**--precision**=] +[**--progress**=] [**--selection-details**] [**--server-id**=] [**--servers**] [**--unit**=] [**--version**] + +## DESCRIPTION +**speedtest** is an application that measures the latency, jitter, packet loss, download bandwidth, and +upload bandwidth of the network connection between the client and a nearby Speedtest +Server. + +## OPTIONS + +* **-h, --help**: + Print usage information + +* **-v**: + Logging verbosity, specify multiple times for higher verbosity (e.g. **-vvv**) + +* **-V, --version**: + Print version number + +* **-L, --servers**: + List nearest servers + +* **--selection-details**: + Show server selection details + +* **-s** *id*, **--server-id**=: + Specify a server from the server list using its id + +* **-o** *hostname*, **--host**=: + Specify a server from the server list using its hostname + +* **-f** , **--format**=: + Output format (default is ). See [OUTPUT FORMATS][] below for details. + +* **--progress-update-interval**=: + Progress update interval (100-1000 milliseconds) + +* **--output-header**: + Show output header for CSV and TSV formats + +* **-u** , **--unit**=: + Output unit for displaying speeds when using the + output format. The default unit is Mbps. See [UNITS OF MEASURE][] for + more details. + +* **-a**: + Shortcut for [**-u** ] + +* **-A**: + Shortcut for [**-u** ] + +* **-b**: + Shortcut for [**-u** ] + +* **-B**: + Shortcut for [**-u** ] + +* **-P** , **--precision**=: + Number of decimal places to use (default = 2, valid = 0-8). Only applicable to the + output format. + +* **-p** |, **--progress**=|: + Enable or disable progress bar (default is when interactive) + +* **-I** , **--interface**=: + Attempt to bind to the specified interface when connecting to servers + +* **-i** , **--ip**=: + Attempt to bind to the specified IP address when connecting to servers + +* **--ca-certificate**=: + Path to CA Certificate bundle, see [SSL CERTIFICATE LOCATIONS][] below. + +## OUTPUT FORMATS + +These are the available output formats for Speedtest CLI specified with the **-f** or **--format** flags. All machine readable formats +(csv, tsv, json, jsonl, json-pretty) use bytes for data sizes, bytes per seconds for speeds and milliseconds for durations. They also always use maximum precision output. + +* **human-readable**: + human readable output +* **csv**: + comma separated values +* **tsv**: + tab separated values +* **json**: + javascript object notation (compact) +* **jsonl**: + javascript object notation (lines) +* **json-pretty**: + javascript object notation (pretty) + +## UNITS OF MEASURE + +For the human-readable output format, you can specify the unit of measure to use. The default unit +is . The supported units are listed below. + +These units do not apply to machine readable output formats (json, jsonl, csv and tsv). + +### Decimal options (multipliers of 1000) + +* **bps**: + bits per second +* **kbps**: + kilobits per second +* **Mbps**: + megabits per second +* **Gbps**: + gigabits per second +* **B/s**: + bytes per second +* **kB/s**: + kilobytes per second +* **MB/s**: + megabytes per second +* **GB/s**: + gigabytes per second + +### Binary options (multipliers of 1024) +* **kibps**: + kibibits per second +* **Mibps**: + mebibits per second +* **Gibps**: + gibibits per second +* **kiB/s**: + kibibytes per second +* **MiB/s**: + mebibytes per second +* **GiB/s**: + gibibytes per second + +### Auto-scaling options +Automatic units will scale the prefix depending on the measured speed. + +* **auto-decimal-bits**: + automatic in decimal bits +* **auto-decimal-bytes**: + automatic in decimal bytes +* **auto-binary-bits**: + automatic in binary bits +* **auto-binary-bytes**: + automatic in binary bytes + +## TERMS OF USE AND PRIVACY POLICY NOTICES +You may only use this Speedtest software and information generated from it for personal, non-commercial use, +through a command line interface on a personal computer. Your use of this software is subject to the End User +License Agreement, Terms of Use and Privacy Policy at these URLs: + +* [https://www.speedtest.net/about/eula](https://www.speedtest.net/about/eula) +* [https://www.speedtest.net/about/terms](https://www.speedtest.net/about/terms) +* [https://www.speedtest.net/about/privacy](https://www.speedtest.net/about/privacy) + +## OUTPUT +Upon successful execution, the application will exit with an exit code of 0. The result will include +latency, jitter, download, upload, packet loss (where available), and a result URL. + +Latency and jitter will be represented in milliseconds. Download and upload units will depend on the output +format as well as if a unit was specified. The human-readable format defaults to Mbps and any machine-readable +formats (csv, tsv, json, jsonl, json-pretty) use bytes as the unit of measure with max precision. Packet loss is represented as a percentage, or **Not available** when packet loss is unavailable in the executing network environment. + +The bytes per second measurements can be transformed into the human-readable output format +default unit of megabits (Mbps) by dividing the bytes per second value by 125,000. For example: + +38404104 bytes per second = 38404104 / 125 = 307232.832 kilobits per second = 307232.832 / 1000 = 307.232832 megabits per second + +The value 125 is derived from 1000 / 8 as follows: + +1 byte = 8 bits +1 kilobit = 1000 bits + +38404104 bytes per second = 38404104 * 8 bits per byte = 307232832 bits per second = 307232832 / 1000 bits per kilobit = 307232.832 kilobits per second + +The Result URL is available to share your result, appending **.png** to the Result URL will create a +shareable result image. + +*Example human-readable result:* + +``` +$ speedtest + Speedtest by Ookla + + Server: SUNET - Stockholm (id: 26852) + ISP: Bahnhof AB +Idle Latency: 5.04 ms (jitter: 0.04ms, low: 5.01ms, high: 5.07ms) + Download: 968.73 Mbps (data used: 117.5 MB) + 12.10 ms (jitter: 1.71ms, low: 6.71ms, high: 18.82ms) + Upload: 942.13 Mbps (data used: 114.8 MB) + 9.94 ms (jitter: 1.10ms, low: 5.30ms, high: 12.72ms) + Packet Loss: 0.0% + Result URL: https://www.speedtest.net/result/c/d1c46724-50a3-4a59-87ca-ffc09ea014b2 +``` + +## NETWORK TIMEOUT VALUES +By default, network requests set a timeout of **10** seconds. The only exception to this +is latency testing, which sets a timeout of **15** seconds. + +## FATAL ERRORS +Upon fatal errors, the application will exit with a non-zero exit code. + +**Initialization Fatal Error Examples:** + +*Configuration - Couldn't connect to server (Network is unreachable)* + +*Configuration - Could not retrieve or read configuration (ConfigurationError)* + +**Stage Execution Fatal Error Example:** + +*[error] Error: [1] Latency test failed for HTTP* + +*[error] Error: [36] Cannot open socket: Operation now in progress* + +*[error] Failed to resolve host name. Cancelling test suite.* + +*[error] Host resolve failed: Exec format error* + +*[error] Cannot open socket: No route to host* + +*[error] Server Selection - Failed to find a working test server. (NoServers)* + +## SSL CERTIFICATE LOCATIONS +By default the following paths are checked for CA certificate bundles on linux machines: + + /etc/ssl/certs/ca-certificates.crt + /etc/pki/tls/certs/ca-bundle.crt + /usr/share/ssl/certs/ca-bundle.crt + /usr/local/share/certs/ca-root-nss.crt + /etc/ssl/cert.pem + +If the device under test does *not* have one of the above mentioned files, then the canonical and up to date CA certificate bundle provided by the curl project can be manually +downloaded into a specific location. This specific location can be provided as a parameter per the following example: + + wget https://curl.se/ca/cacert.pem + ./ookla --ca-certificate=./cacert.pem + +## RELEASE NOTES + +### 1.2.0 (2022-07-27) +* Cleaned up formatting in human-readable output for additional data within parenthesis (now using `label: value` consistently) +* Compressed result upload data to reduce data usage +* Added support for measuring responsiveness (latency during load) +* Added experimental support for multi-server testing +* Updated third-party dependencies: cURL 7.83.1, mbed TLS 3.1.0, Boost 1.79.0 +* Added stability improvements + +### 1.1.1 (2021-11-15) +* Fixed issue with reported client version in uploaded results + +### 1.1.0 (2021-10-27) +* Use server-side upload measurements +* Performance enhancement on upload tests for CPU constrained devices +* Security enhancements +* Fix for deadlock bug +* Fix crash due to race condition +* Fix crash in hostname resolution during test initialization +* Fix potential buffer overflow +* Update Boost to 1.77.0 +* Update mbed TLS to 2.27.0 +* Update cURL to 7.78.0 + +### 1.0.0 (2019-10-29) +* Initial release + +## COPYRIGHT NOTICES FOR THIRD-PARTY PRODUCTS/LIBRARIES +This software incorporates free and open source third-party libraries, including: + +* [boost](https://www.boost.org/) +* [libcurl](https://curl.haxx.se/libcurl/) +* [petopt](https://www.lysator.liu.se/~pen/petopt/) +* [mbed TLS](https://tls.mbed.org/) +* [ca-certificates extract](https://curl.haxx.se/docs/caextract.html) +* [L. Peter Deutsch’s md5](https://sourceforge.net/projects/libmd5-rfc/files/) +* [getopt.h](in Windows version of this software) +* [tiny-aes](https://github.com/kokke/tiny-AES-c) +* [PicoSHA2](https://github.com/okdshin/PicoSHA2) +* [musl](https://www.musl-libc.org/) + +Inclusion of mbed TLS is subject to presentation of the following license terms +to recipients of this software: [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) +(a copy of which is included with the documentation of this software) + +### Inclusion of libcurl is subject to distribution of the software with the following notice: + + Copyright (c) 1996 - 2019, Daniel Stenberg, daniel@haxx.se, and many contributors, + see the THANKS file. All rights reserved. Permission to use, copy, modify, and distribute + this software for any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all copies. + +### Inclusion of getopt.h is subject to distribution of the software with the following notice: + + DISCLAIMER + This file is part of the mingw-w64 runtime package. + + The mingw-w64 runtime package and its code is distributed in the hope that it + will be useful but WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESSED OR + IMPLIED ARE HEREBY DISCLAIMED. This includes but is not limited to + warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + Copyright (c) 2002 Todd C. Miller + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + Copyright (c) 2000 The NetBSD Foundation, Inc. + All rights reserved. + + This code is derived from software contributed to The NetBSD Foundation + by Dieter Baron and Thomas Klausner. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +### Inclusion of PicoSHA2 is subject to distribution of the software with the following notice: + + Copyright (c) 2017 okdshin + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + +### Inclusion of musl is subject to distribution of the software with the following notice: + + Copyright © 2005-2019 Rich Felker, et al. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software.