Use CI-CD-Github-Actions for spelling and formatting, add in the bot formatting action, update the CI-CD workflow files. Fix incorrect spelling and formatting on files. (#1083)

* Use new version of CI-CD Actions,  checkout@v3 instead of checkout@v2 on all jobs
* Use cSpell spell check, and use ubuntu-20.04 for formatting check
* Add in bot formatting action
* Update freertos_demo.yml and freertos_plus_demo.yml files to increase github log readability
* Add in a Qemu demo onto the workflows.
pull/1087/head
Soren Ptak 1 year ago committed by GitHub
parent 537007d96c
commit 3a2f6646f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

File diff suppressed because it is too large Load Diff

@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# /* # /*
# * FreeRTOS V202212.00 # * FreeRTOS V202212.00
# * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# * # *
# * Permission is hereby granted, free of charge, to any person obtaining a copy of # * 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 # * this software and associated documentation files (the "Software"), to deal in

@ -1,14 +1,14 @@
certifi==2023.7.22 Deprecated
chardet==4.0.0 GitPython
PyGithub
PyJWT
PyYAML
certifi
chardet
colorama colorama
Deprecated==1.2.10 gitdb
gitdb==4.0.5 idna
GitPython==3.1.32
idna==2.10
PyGithub==1.55
PyJWT==2.4.0
PyYAML==5.4
requests requests
smmap==3.0.4 smmap
urllib3==1.26.5 urllib3
wrapt==1.12.1 wrapt

@ -119,6 +119,7 @@ FREERTOS_IGNORED_EXTENSIONS = [
'.ipcf', '.ipcf',
'.ise', '.ise',
'.jlink', '.jlink',
'.js',
'.json', '.json',
'.la', '.la',
'.launch', '.launch',
@ -172,6 +173,7 @@ FREERTOS_IGNORED_EXTENSIONS = [
'.pl', '.pl',
'.plg', '.plg',
'.png', '.png',
'.props',
'.prc', '.prc',
'.pref', '.pref',
'.prefs', '.prefs',
@ -216,6 +218,7 @@ FREERTOS_IGNORED_EXTENSIONS = [
'.tags', '.tags',
'.tcl', '.tcl',
'.tdt', '.tdt',
'.templ',
'.template', '.template',
'.tgt', '.tgt',
'.tps', '.tps',
@ -250,14 +253,12 @@ FREERTOS_IGNORED_EXTENSIONS = [
'.xmsgs', '.xmsgs',
'.xsl', '.xsl',
'.yml', '.yml',
'.md',
'.zip' '.zip'
] ]
FREERTOS_IGNORED_PATTERNS = [ FREERTOS_IGNORED_PATTERNS = [
r'.*\.git.*', r'.*\.git.*',
r'.*mbedtls_config\.h.*', r'.*mbedtls_config\.h.*',
r'.*mbedtls_config\.h.*',
r'.*CMSIS.*', r'.*CMSIS.*',
r'.*/Nordic_Code/*', r'.*/Nordic_Code/*',
r'.*/Nuvoton_Code/*', r'.*/Nuvoton_Code/*',
@ -275,8 +276,40 @@ FREERTOS_IGNORED_PATTERNS = [
r'.*/trcKernelPortSnapshotConfig\.h.*', r'.*/trcKernelPortSnapshotConfig\.h.*',
r'.*/MicroZed_hw_platform.*', r'.*/MicroZed_hw_platform.*',
r'.*/ThirdParty/.*', r'.*/ThirdParty/.*',
r'FreeRTOS\-Plus/Demo/Common/WinPCap/.*', r'.*/WinPCap/.*',
r'FreeRTOS\-Plus/Source/FreeRTOS-Plus-Trace/.*', r'.*/DRIVERS/.*',
r'.*/FreeRTOS-Plus-Trace/.*',
r'.*/Reliance-Edge/.*',
r'.*/HCS12_CodeWarrior_banked/.*',
r'.*/ARM7_STR75x_GCC/.*',
r'.*/ARM7_STR75x_IAR/.*',
r'.*/lwip-1.4.0/.*',
r'.*/lwip-1.1.0/.*',
r'.*/MSP430X_MSP430F5438_CCS/.*',
r'.*/Atmel/.*',
r'.*/drivers/.*',
r'.*/lwIP/.*',
r'.*/ARM7_AT91FR40008_GCC/.*',
r'.*/ARM7_AT91SAM7S64_IAR/.*',
r'.*/ARM7_LPC2106_GCC/.*',
r'.*/CORTEX_A9_Cyclone_V_SoC_DK/.*',
r'.*/CORTEX_A9_Zynq_ZC702/.*',
r'.*/FreeRTOS-Plus/Demo/FreeRTOS_Plus_Reliance_Edge_and_CLI_Windows_Simulator/ConfigurationFiles//.*',
r'.*/ARM7_AT91FR40008_GCC/.*',
r'.*/ARM7_STR71x_IAR/.*',
r'FreeRTOS/Demo/HCS12_GCC_banked/.*',
r'FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/.*',
r'FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/.*',
r'FreeRTOS/Demo/CORTEX_STM32L152_Discovery_IAR/include/.*',
r'FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC/.*',
r'FreeRTOS/Demo/CORTEX_M4F_Infineon_XMC4000_Keil/.*',
r'FreeRTOS/Demo/AVR_ATMega4809_Atmel_Studio/RTOSDemo/.*',
r'FreeRTOS/Demo/AVR32_UC3/.*',
r'FreeRTOS/Demo/ARM7_STR75x_GCC/STLibrary/inc/.*',
r'FreeRTOS/Demo/ARM7_STR75x_IAR/STLibrary/inc/.*',
r'FreeRTOS/Demo/CORTEX_R4F_RZ_T_GCC_IAR/System/GCC/inc/.*',
r'FreeRTOS/Demo/CORTEX_A5_SAMA5D2x_Xplained_IAR/AtmelFiles/drivers/misc/.*',
r'FreeRTOS/Demo/CORTEX_ATSAM3X_Atmel_Studio/src/.*',
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Trace_Recorder_Configuration/.*', r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Trace_Recorder_Configuration/.*',
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_IPv6_Demo/common/WinPCap/.*', r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_IPv6_Demo/common/WinPCap/.*',
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_IPv6_Demo/common/WinPCap/pcap/.*', r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_IPv6_Demo/common/WinPCap/pcap/.*',
@ -291,6 +324,7 @@ FREERTOS_IGNORED_PATTERNS = [
] ]
FREERTOS_IGNORED_FILES = [ FREERTOS_IGNORED_FILES = [
'cspell.config.yaml',
'.cproject', '.cproject',
'.project', '.project',
'fyi-another-way-to-ignore-file.txt', 'fyi-another-way-to-ignore-file.txt',
@ -310,12 +344,28 @@ FREERTOS_IGNORED_FILES = [
'reg_test.S', 'reg_test.S',
'gdbinit', 'gdbinit',
'libslirp-version.h', 'libslirp-version.h',
'LPC21xx.h',
'lpc221x.h',
'winbase.h',
'windows.h',
'direct.h',
'stm32f10x_conf.h',
'lwipopts.h',
'lwipopts.h',
'xil_assert.h',
'alt_i2c.h',
'alt_clkmgr.h',
'hal_lcd.c',
'adc.h',
'redconf.c',
'redconf.h',
'redtypes.h',
] ]
FREERTOS_HEADER = [ FREERTOS_HEADER = [
'/*\n', '/*\n',
' * FreeRTOS V202212.00\n', ' * FreeRTOS V202212.00\n',
' * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n', ' * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n',
' *\n', ' *\n',
' * Permission is hereby granted, free of charge, to any person obtaining a copy of\n', ' * Permission is hereby granted, free of charge, to any person obtaining a copy of\n',
' * this software and associated documentation files (the "Software"), to deal in\n', ' * this software and associated documentation files (the "Software"), to deal in\n',
@ -340,7 +390,7 @@ FREERTOS_HEADER = [
' */\n', ' */\n',
] ]
FREERTOS_COPYRIGHT_REGEX = r"^( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$" FREERTOS_COPYRIGHT_REGEX = r"^( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$"
def main(): def main():
parser = HeaderChecker.configArgParser() parser = HeaderChecker.configArgParser()

@ -0,0 +1,38 @@
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char * argv[] )
{
setvbuf( stdout, NULL, _IONBF, 0 );
FILE * fp;
char path[ 256 ];
char cmd[ 256 ];
/* Open the command for reading. */
fp = popen("find . -name RTOSDemo.out", "r");
/* Read the output a line at a time - output it. */
while( fgets( path, sizeof( path ), fp ) != NULL )
{
printf( "Path: %s\n", path );
}
sprintf(cmd, "qemu-system-arm -machine mps2-an385 -monitor null -semihosting --semihosting-config enable=on,target=native -serial stdio -nographic -kernel %s", path);
printf("cmd= %s\n", cmd);
fp = popen( cmd, "r" );
if( fp == NULL )
{
printf( "Failed to run command\n" );
exit( 1 );
}
/* Read the output a line at a time - output it. */
while( fgets( path, sizeof( path ), fp ) != NULL )
{
printf( "%s", path );
}
/* close */
pclose( fp );
return 0;
}

@ -1,13 +1,14 @@
certifi>=2020.12.5 Deprecated
chardet>=3.0.4 GitPython
Deprecated>=1.2.10 PyGithub
gitdb>=4.0.5 PyJWT
GitPython>=3.1.11 PyYAML
idna>=2.10 certifi
PyGithub>=1.54 chardet
PyJWT>=1.7.1 colorama
PyYAML>=5.3.1 gitdb
requests>=2.24.0 idna
smmap>=3.0.4 requests
urllib3>=1.25.11 smmap
wrapt>=1.12.1 urllib3
wrapt

@ -26,13 +26,13 @@ jobs:
# Source the release tools from FreeRTOS/FreeRTOS # Source the release tools from FreeRTOS/FreeRTOS
- name: Checkout FreeRTOS Release Tools - name: Checkout FreeRTOS Release Tools
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
path: tools path: tools
# Simpler git auth if we use checkout action and forward the repo to release script # Simpler git auth if we use checkout action and forward the repo to release script
- name: Checkout FreeRTOS - name: Checkout FreeRTOS
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
path: local_core path: local_core
fetch-depth: 0 fetch-depth: 0

@ -1,93 +1,80 @@
name: CI Checks name: CI Checks
env:
bashPass: \033[32;1mPASSED -
bashWarn: \033[33;1mWARNING -
bashFail: \033[31;1mFAILED -
bashEnd: \033[0m
on: on:
push: push:
pull_request: pull_request:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
git-secrets: git-secrets:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
with: with:
submodules: recursive submodules: recursive
- name: Checkout awslabs/git-secrets - name: Checkout awslabs/git-secrets
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
repository: awslabs/git-secrets repository: awslabs/git-secrets
ref: master ref: master
path: git-secrets path: git-secrets
- name: Install git-secrets - name: Install git-secrets
run: cd git-secrets && sudo make install && cd .. run: cd git-secrets && sudo make install && cd ..
- name: Run git-secrets - name: Run git-secrets
run: | run: |
git-secrets --register-aws git-secrets --register-aws
git-secrets --scan git-secrets --scan
formatting: formatting:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Install Uncrustify
run: sudo apt-get install uncrustify=0.69.0+dfsg1-1build1 - name: Check Formatting of Common Demo Files
- name: Run Uncrustify uses: FreeRTOS/CI-CD-Github-Actions/formatting@main
run: | with:
# Uncrustify on C files while ignoring symlinks. path: FreeRTOS/Demo/Common
# Make a collapsible section in the log to run uncrustify exclude-dirs: ethernet, drivers
echo "::group::Uncrustify Check"
# GitHub automtically use "set -e" which causes scripts to fail on the first exit code - name: Check Formatting
# This would mean the first time a file fails the check that we exit without formatting all files. uses: FreeRTOS/CI-CD-Github-Actions/formatting@main
set +e with:
uncrustify --version exclude-dirs: ethernet, drivers, FreeRTOS/Demo
find FreeRTOS/Demo/Common FreeRTOS/Test \( -name ethernet -o -name drivers -o -path 'FreeRTOS/Test/CMock/CMock' \) -prune -false -o -name "*.[hc]" | xargs uncrustify --no-backup --replace --if-changed -c tools/uncrustify.cfg -l C
echo "::endgroup::" spell-check:
# Run a git diff to print the differences if any exist, return an error code if there are any runs-on: ubuntu-latest
git diff --exit-code steps:
if [ "$?" = "0" ]; then - name: Checkout Parent Repo
echo -e "\033[32;3mUncrustify check passed\033[0m" uses: actions/checkout@v3
exit 0
else - name: Check Spelling of Common Demo Files
echo -e "\033[32;31mFormatting check (using Uncrustify) failed...\033[0m" uses: FreeRTOS/CI-CD-GitHub-Actions/spellings@main
# If there is an error, set this flag high again so the exit 1 fails the run with:
set -e path: FreeRTOS/Demo/Common
exit 1 exclude-dirs: ethernet, drivers
fi
- name: Check For Trailing Whitespace - name: Check Spelling
run: | uses: FreeRTOS/CI-CD-GitHub-Actions/spellings@main
# Trailing Whitespace Check with:
set +e exclude-dirs: ethernet, drivers, FreeRTOS/Demo
ERROR=0
find . \( -name '.git' -o -path "./FreeRTOS/Test/CBMC/patches" -o -path "./FreeRTOS-Plus" -o -path "./FreeRTOS/Source" -o -path "./FreeRTOS/Test/CMock/CMock" -o -path "./FreeRTOS/Demo" \) -prune -false -o -type f -a -name "*" -exec grep -In -e "[[:blank:]]$" {} +
if [ "$?" = "0" ]; then
ERROR=1
fi
find FreeRTOS/Demo/Common \( -name "ethernet" \) -prune -o -false -o -type f -a -name "*" -exec grep --color=yes -In -e "[[:blank:]]$" {} +
if [ "$?" = "0" ]; then
echo -e "\033[32;31mFiles have trailing whitespace.\033[0m"
exit 1
else
if [ "$ERROR" -eq "1" ]; then
echo -e "\033[32;31mFiles have trailing whitespace.\033[0m"
exit 1
fi
echo -e "\033[32;3mTrailing whitespace check passed\033[0m"
exit 0
fi
doxygen: doxygen:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
submodules: recursive submodules: recursive
path: freertos path: freertos
- name: Install Python3 - name: Install Python3
uses: actions/setup-python@v2 uses: actions/setup-python@v3
with:
python-version: '3.8'
- name: Download tag dependency of coreMQTT-Agent - name: Download tag dependency of coreMQTT-Agent
run: | run: |
# We don't need to generate the coreMQTT docs, we only need the tag file. # We don't need to generate the coreMQTT docs, we only need the tag file.
@ -95,8 +82,9 @@ jobs:
mkdir -p freertos/FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/docs/doxygen/output mkdir -p freertos/FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/docs/doxygen/output
wget -O freertos/FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/docs/doxygen/output/mqtt.tag \ wget -O freertos/FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/docs/doxygen/output/mqtt.tag \
"https://freertos.org/Documentation/api-ref/coreMQTT/docs/doxygen/output/mqtt.tag" "https://freertos.org/Documentation/api-ref/coreMQTT/docs/doxygen/output/mqtt.tag"
- name: Generate doxygen ZIP - name: Generate doxygen ZIP
uses: FreeRTOS/CI-CD-GitHub-Actions/doxygen@main uses: FreeRTOS/CI-CD-Github-Actions/doxygen@main
with: with:
path: ./freertos path: ./freertos
# List of directories containing libraries whose doxygen output will be generated. # List of directories containing libraries whose doxygen output will be generated.
@ -112,77 +100,49 @@ jobs:
path: ./freertos/doxygen.zip path: ./freertos/doxygen.zip
retention-days: 2 retention-days: 2
spell-check:
runs-on: ubuntu-20.04
steps:
- name: Checkout Parent Repo
uses: actions/checkout@v2
with:
ref: main
repository: FreeRTOS/CI-CD-Github-Actions
path: commonCI
- name: Clone This Repo
uses: actions/checkout@v2
with:
path: ./FreeRTOS
- name: Install spell
run: |
sudo apt-get install spell
sudo apt-get install util-linux
- name: Check spelling
run: |
# Add path to the tool to the environment variable.
PATH=$PATH:commonCI/spellings/tools
# Make sure that only Amazon licenced files are checked.
sed -i 's/`find $DIRNAME \\( -iname \\\*\.\[ch\] -o -iname \\\*\.dox \\) -type f`/`grep -ril "copyright \(c\) \[0-9\]\[0-9\]\[0-9\]\[0-9\] amazon.com" | grep "\\.\[ch\]" | grep -v "FreeRTOS\/FreeRTOS\/Test\/VeriFast"`/g' commonCI/spellings/tools/find-unknown-comment-words
# Run the spell check script.
find-unknown-comment-words --directory FreeRTOS/ --lexicon FreeRTOS/lexicon.txt
# Check the exit status.
if [ "$?" = "0" ]; then
exit 0
else
exit 1
fi
verify-manifest: verify-manifest:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
with: with:
submodules: true submodules: true
fetch-depth: 0 fetch-depth: 0
- name: Install Python3
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Run manifest verifier - name: Run manifest verifier
uses: FreeRTOS/CI-CD-Github-Actions/manifest-verifier@main uses: FreeRTOS/CI-CD-GitHub-Actions/manifest-verifier@v2
with: with:
path: ./ path: ./
exclude-submodules: FreeRTOS-Plus/Test/CMock,FreeRTOS/Test/CMock/CMock,FreeRTOS/Test/litani
fail-on-incorrect-version: true fail-on-incorrect-version: true
memory-statistics: memory-statistics:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
env: env:
ARM_GCC_TOOLCHAIN_URL: "https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2?revision=05382cca-1721-44e1-ae19-1e7c3dc96118&la=en&hash=D7C9D18FCA2DD9F894FD9F3C3DC9228498FA281A" ARM_GCC_TOOLCHAIN_URL: "https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2?revision=05382cca-1721-44e1-ae19-1e7c3dc96118&la=en&hash=D7C9D18FCA2DD9F894FD9F3C3DC9228498FA281A"
steps: steps:
- name: Install ARM GCC - name: Install ARM GCC
run: wget -qO- "${{ env.ARM_GCC_TOOLCHAIN_URL }}" | sudo tar --strip-components=1 -xj -C /usr/local run:
wget -qO- "${{ env.ARM_GCC_TOOLCHAIN_URL }}" | sudo tar
--strip-components=1 -xj -C /usr/local
- name: Clone FreeRTOS Repository with submodules - name: Clone FreeRTOS Repository with submodules
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
submodules: recursive submodules: recursive
- name: Clone mbedTLS submodule from corePKCS11 - name: Clone mbedTLS submodule from corePKCS11
run: git submodule update --init --recursive --checkout -- FreeRTOS-Plus/Source/corePKCS11 run:
git submodule update --init --recursive --checkout --
FreeRTOS-Plus/Source/corePKCS11
- name: Clone CI-CD-Github-Actions repository - name: Clone CI-CD-Github-Actions repository
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
repository: FreeRTOS/CI-CD-Github-Actions repository: FreeRTOS/CI-CD-GitHub-Actions
path: tools path: tools
- name: Run script to generate JSON memory statistics - name: Run script to generate JSON memory statistics
run: tools/memory_statistics/memory_statistics.py --json_report --config tools/memory_statistics/paths.json --output freertos_lts_memory_estimates.json run:
- name: Upload memory size report as artifact (for main and release-candidate ONLY) tools/memory_statistics/memory_statistics.py --json_report
--config tools/memory_statistics/paths.json --output
freertos_lts_memory_estimates.json
- name:
Upload memory size report as artifact (for main and
release-candidate ONLY)
if: success() && ( github.ref == 'refs/heads/main' || github.ref == 'refs/heads/release-candidate' ) if: success() && ( github.ref == 'refs/heads/main' || github.ref == 'refs/heads/release-candidate' )
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
with: with:
@ -191,16 +151,24 @@ jobs:
retention-days: 2 retention-days: 2
proof_ci: proof_ci:
if: ${{ github.event.pull_request }}
runs-on: cbmc_ubuntu-latest_16-core runs-on: cbmc_ubuntu-latest_16-core
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- run: | - env:
stepName: Install Dependencies
run: |
echo -e "::group::${{ env.stepName }}"
git submodule update --init --checkout --recursive --depth 1 git submodule update --init --checkout --recursive --depth 1
sudo apt-get update sudo apt-get update
sudo apt-get install --yes --no-install-recommends gcc-multilib sudo apt-get install --yes --no-install-recommends gcc-multilib
echo -e "::endgroup::"
echo -e "${{ env.bashPass }} ${{env.stepName}} ${{ env.bashEnd }}"
- name: Set up CBMC runner - name: Set up CBMC runner
uses: FreeRTOS/CI-CD-Github-Actions/set_up_cbmc_runner@main uses: FreeRTOS/CI-CD-Github-Actions/set_up_cbmc_runner@main
- name: Run CBMC - name: Run CBMC
uses: FreeRTOS/CI-CD-Github-Actions/run_cbmc@main uses: FreeRTOS/CI-CD-Github-Actions/run_cbmc@main
with: with:
proofs_dir: FreeRTOS/Test/CBMC/proofs proofs_dir: FreeRTOS/Test/CBMC/proofs

@ -18,14 +18,14 @@ jobs:
# Use the checks as defined by the user, so they can locally adjust as needed # Use the checks as defined by the user, so they can locally adjust as needed
- name: Checkout FreeRTOS Tools - name: Checkout FreeRTOS Tools
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
path: tools path: tools
# Checkout user pull request changes # Checkout user pull request changes
- name: Checkout Pull Request - name: Checkout Pull Request
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
path: inspect path: inspect

@ -0,0 +1,23 @@
name: Format Pull Request Files
on:
issue_comment:
types: [created]
env:
bashPass: \033[32;1mPASSED -
bashInfo: \033[33;1mINFO -
bashFail: \033[31;1mFAILED -
bashEnd: \033[0m
jobs:
Formatting:
name: Run Formatting Check
if: ${{ github.event.issue.pull_request }} &&
( ( github.event.comment.body == '/bot run uncrustify' ) ||
( github.event.comment.body == '/bot run formatting' ) )
runs-on: ubuntu-20.04
steps:
- name: Apply Formatting Fix
uses: FreeRTOS/CI-CD-Github-Actions/formatting-bot@main
id: check-formatting

@ -1,195 +1,230 @@
name: FreeRTOS Demos name: FreeRTOS Demos
on: on:
push: push:
pull_request: pull_request:
workflow_dispatch: workflow_dispatch:
env:
bashPass: \033[32;1mPASSED -
bashWarn: \033[33;1mWARNING -
bashFail: \033[31;1mFAILED -
bashEnd: \033[0m
pwshPass: "`e[32;1mPASSED -"
pwshWarn: "`e[33;1mWARNING -"
pwshFail: "`e[31;1mFAILED -"
pwshEnd: "`e[0m"
jobs: jobs:
WIN32-MSVC: WIN32-MSVC:
name: WIN32 MSVC name: WIN32 MSVC
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- name: Checkout Repository - env:
uses: actions/checkout@v2 stepName: Checkout Repository
name: ${{ env.stepName }}
- name: Fetch Kernel Submodule uses: actions/checkout@v3
- env:
stepName: Fetch Kernel Submodule
name: ${{ env.stepName }}
shell: bash shell: bash
run: | run: |
# Fetch Kernel Submodule # ${{ env.stepName }}
echo "::group::Fetch Kernel Submodule" echo -e "::group::${{ env.stepName }}"
set +e
git submodule update --checkout --init --depth 1 FreeRTOS/Source git submodule update --checkout --init --depth 1 FreeRTOS/Source
echo "::endgroup::" exitStatus=$?
if [[ "$?" = "0" ]] set -e
then echo -e "::endgroup::"
echo -e "\033[32;3mCloned the Kernel\033[0m" if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{env.stepName}} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mKernel Clone Failed...\033[0m" echo -e "${{ env.bashFail }} ${{env.stepName}} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Add msbuild to PATH - env:
stepName: Add msbuild to PATH
name: ${{ env.stepName }}
uses: microsoft/setup-msbuild@v1.1 uses: microsoft/setup-msbuild@v1.1
- name: Build WIN32-MSVC Full Demo - env:
stepName: Build WIN32-MSVC Full Demo
name: ${{ env.stepName }}
id: build-win32-msvs-full-demo id: build-win32-msvs-full-demo
working-directory: FreeRTOS/Demo/WIN32-MSVC working-directory: FreeRTOS/Demo/WIN32-MSVC
run: | run: |
# Build WIN32-MSVC Full Demo # ${{ env.stepName }}
echo "::group::Build WIN32-MSVC Full Demo" echo "::group::${{ env.stepName }}"
$content = Get-Content -Path 'main.c' -Raw $content = Get-Content -Path 'main.c' -Raw
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );' $newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
$newContent | Set-Content -Path 'main.c' $newContent | Set-Content -Path 'main.c'
msbuild WIN32.sln -t:rebuild msbuild WIN32.sln -t:rebuild
$exitStatus = $?
echo "::endgroup::" echo "::endgroup::"
if($? -eq 1) { if($exitStatus -eq 1) {
Write-Host -ForegroundColor green "Built the WIN32-MSVC Full Demo" echo "${{ env.pwshPass }} ${{env.stepName}} ${{ env.pwshEnd }}"
}else { }else {
Write-Host -ForegroundColor red "Build WIN32-MSVC Full Demo Failed..." echo "${{ env.pwshFail }} ${{env.stepName}} ${{ env.pwshEnd }}"
exit 1 exit 1
} }
- name: Run and monitor WIN32-MSVC Full Demo - env:
if: success() || failure() && steps.build-win32-msvs-full-demo.outcome == 'success' stepName: Run and monitor WIN32-MSVC Full Demo
name: ${{ env.stepName }}
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
with: with:
exe-path: FreeRTOS/Demo/WIN32-MSVC/Debug/RTOSDemo.exe exe-path: FreeRTOS/Demo/WIN32-MSVC/Debug/RTOSDemo.exe
log-dir: demo_run_logs
timeout-seconds: 60 timeout-seconds: 60
success-line: "No errors - tick count" success-line: "No errors - tick count"
retry-attempts: 3
- name: Build WIN32-MSVC Blinky Demo - env:
stepName: Build WIN32-MSVC Blinky Demo
name: ${{ env.stepName }}
id: build-win32-msvs-blinky-demo id: build-win32-msvs-blinky-demo
working-directory: FreeRTOS/Demo/WIN32-MSVC working-directory: FreeRTOS/Demo/WIN32-MSVC
run: | run: |
# Build WIN32-MSVC Blinky Demo # ${{ env.stepName }}
echo "::group::MSBuild of WIN32-MSVC Blinky Demo" echo "::group::${{ env.stepName }}"
$content = Get-Content -Path 'main.c' -Raw $content = Get-Content -Path 'main.c' -Raw
$newContent = $content -replace '#define\s+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\s+0', '#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1' $newContent = $content -replace '#define\s+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\s+0', '#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1'
$newContent | Set-Content -Path 'main.c' $newContent | Set-Content -Path 'main.c'
# Perform MSBuild of WIN32-MSVC Blinky Demo
msbuild WIN32.sln -t:rebuild msbuild WIN32.sln -t:rebuild
echo "::endgroup::" echo "::endgroup::"
if($? -eq 1) { $exitStatus = $?
Write-Host -ForegroundColor green "Built the WIN32-MSVC Blinky Demo" if($exitStatus -eq 1) {
echo "${{ env.pwshPass }} ${{ env.stepName }} ${{ env.pwshEnd }}"
}else { }else {
Write-Host -ForegroundColor red "Build WIN32-MSVC Blinky Demo Failed..." echo "${{ env.pwshFail }} ${{ env.stepName }} ${{ env.pwshEnd }}"
exit 1 exit 1
} }
- name: Run and monitor WIN32-MSVC Blinky Demo - env:
if: success() || failure() && steps.build-win32-msvs-blinky-demo.outcome == 'success' stepName: Run and monitor WIN32-MSVC Blinky Demo
name: ${{ env.stepName }}
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
with: with:
exe-path: FreeRTOS/Demo/WIN32-MSVC/Debug/RTOSDemo.exe exe-path: FreeRTOS/Demo/WIN32-MSVC/Debug/RTOSDemo.exe
log-dir: demo_run_logs timeout-seconds: 60
timeout-seconds: 60 success-line: "Message received from software timer"
success-line: "Message received from software timer" retry-attempts: 3
- name: Build WIN32-MSVC-Static-Allocation-Only Demo - env:
stepName: Build WIN32-MSVC-Static-Allocation-Only Demo
name: ${{ env.stepName }}
id: build-win32-msvs-static-allocation-only-demo id: build-win32-msvs-static-allocation-only-demo
working-directory: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only working-directory: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only
run: | run: |
# Build WIN32-MSVC-Static-Allocation-Only Demo # ${{ env.stepName }}
echo "::group::Build WIN32-MSVC-Static-Allocation-Only Demo" echo "::group::${{ env.stepName }}"
$content = Get-Content -Path 'main.c' -Raw $content = Get-Content -Path 'main.c' -Raw
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );' $newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
$newContent | Set-Content -Path 'main.c' $newContent | Set-Content -Path 'main.c'
msbuild WIN32.sln -t:rebuild msbuild WIN32.sln -t:rebuild
$exitStatus = $?
echo "::endgroup::" echo "::endgroup::"
if($? -eq 1) { if($exitStatus -eq 1) {
Write-Host -ForegroundColor green "Built the WIN32-MSVC-Static-Allocation-Only Demo" echo "${{ env.pwshPass }} ${{ env.stepName }} ${{ env.pwshEnd }}"
}else { }else {
Write-Host -ForegroundColor red "Build WIN32-MSVC-Static-Allocation-Only Demo Failed..." echo "${{ env.pwshFail }} ${{ env.stepName }} ${{ env.pwshEnd }}"
exit 1 exit 1
} }
- name: Run and monitor WIN32-MSVC-Static-Allocation-Only Demo - env:
if: success() || failure() && steps.build-win32-msvs-static-allocation-only-demo.outcome == 'success' stepName:
Run and monitor WIN32-MSVC-Static-Allocation-Only Demo
name: ${{ env.stepName }}
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
with: with:
exe-path: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only/Debug/RTOSDemo.exe exe-path: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only/Debug/RTOSDemo.exe
log-dir: demo_run_logs timeout-seconds: 60
timeout-seconds: 60 success-line: "No errors - tick count"
success-line: "No errors - tick count" retry-attempts: 3
WIN32-MingW: WIN32-MingW:
name: WIN32 MingW name: WIN32 MingW
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- name: Checkout Repository - env:
uses: actions/checkout@v2 stepName: Checkout Repository
name: ${{ env.stepName }}
- name: Fetch Kernel Submodule uses: actions/checkout@v3
- env:
stepName: Fetch Kernel Submodule
name: ${{ env.stepName }}
shell: bash shell: bash
run: | run: |
# Fetch Kernel Submodule # ${{ env.stepName }}
echo "::group::Fetch Kernel Submodule" echo -e "::group::${{ env.stepName }}"
git submodule update --checkout --init --depth 1 FreeRTOS/Source git submodule update --checkout --init --depth 1 FreeRTOS/Source
echo "::endgroup::" echo -e "::endgroup::"
if [[ "$?" = "0" ]] echo -e "${{ env.bashPass }} ${{env.stepName}} ${{ env.bashEnd }}"
then
echo -e "\033[32;3mCloned the Kernel\033[0m"
else
echo -e "\033[32;31mKernel Clone Failed...\033[0m"
exit 1
fi
- env:
- name: Build WIN32-MingW Full Demo stepName: Build WIN32-MingW Full Demo
name: ${{ env.stepName }}
id: build-win32-mingw-full-demo id: build-win32-mingw-full-demo
working-directory: FreeRTOS/Demo/WIN32-MingW working-directory: FreeRTOS/Demo/WIN32-MingW
run: | run: |
# Build WIN32-MingW Full Demo # ${{ env.stepName }}
echo "::group::Build WIN32-MingW Full Demo" echo "::group::${{ env.stepName }}"
$content = Get-Content -Path 'main.c' -Raw $content = Get-Content -Path 'main.c' -Raw
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );' $newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
$newContent | Set-Content -Path 'main.c' $newContent | Set-Content -Path 'main.c'
gcc --version gcc --version
make --version make --version
make make
$exitStatus = $?
echo "::endgroup::" echo "::endgroup::"
if($? -eq 1) { if($exitStatus -eq 1) {
Write-Host -ForegroundColor green "Built the WIN32-MingW Full Demo" echo "${{ env.pwshPass }} ${{ env.stepName }} ${{env.pwshEnd}}"
}else { }else {
Write-Host -ForegroundColor red "Build WIN32-MingW Full Demo Failed..." echo "${{ env.pwshFail }} ${{ env.stepName }} ${{env.pwshEnd}}"
exit 1 exit 1
} }
- name: Run and monitor WIN32-MingW Full Demo - env:
if: success() || failure() && steps.build-win32-mingw-full-demo.outcome == 'success' stepName: Run and monitor WIN32-MingW Full Demo
name: ${{ env.stepName }}
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
with: with:
exe-path: FreeRTOS/Demo/WIN32-MingW/build/RTOSDemo.exe exe-path: FreeRTOS/Demo/WIN32-MingW/build/RTOSDemo.exe
log-dir: demo_run_logs
timeout-seconds: 60 timeout-seconds: 60
success-line: "No errors - tick count" success-line: "No errors - tick count"
- name: Build WIN32-MingW Blinky Demo - env:
stepName: Build WIN32-MingW Blinky Demo
name: ${{ env.stepName }}
id: build-win32-mingw-blinky-demo id: build-win32-mingw-blinky-demo
working-directory: FreeRTOS/Demo/WIN32-MingW working-directory: FreeRTOS/Demo/WIN32-MingW
run: | run: |
# Build WIN32-MingW Blinky Demo # ${{ env.stepName }}
echo "::group::Build WIN32-MingW Blinky Demo" echo "::group::${{ env.stepName }}"
$content = Get-Content -Path 'main.c' -Raw $content = Get-Content -Path 'main.c' -Raw
$newContent = $content -replace '#define\s+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\s+0', '#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1' $newContent = $content -replace '#define\s+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\s+0', '#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1'
$newContent = $newContent -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
$newContent | Set-Content -Path 'main.c' $newContent | Set-Content -Path 'main.c'
gcc --version gcc --version
make --version make --version
make make
$exitStatus = $?
echo "::endgroup::" echo "::endgroup::"
if($? -eq 1) { if($exitStatus -eq 1) {
Write-Host -ForegroundColor green "Built the WIN32-MingW Blinky Demo" echo "${{ env.pwshPass }} ${{ env.stepName }} ${{ env.pwshEnd }}"
}else { }else {
Write-Host -ForegroundColor red "Build WIN32-MingW Blinky Demo Failed..." echo "${{ env.pwshFail }} ${{ env.stepName }} ${{ env.pwshEnd }}"
exit 1 exit 1
} }
- name: Run and monitor WIN32-MingW Blinky Demo - env:
if: success() || failure() && steps.build-win32-mingw-blinky-demo.outcome == 'success' stepName: Run and monitor WIN32-MingW Blinky Demo
name: ${{ env.stepName }}
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
with: with:
exe-path: FreeRTOS/Demo/WIN32-MingW/build/RTOSDemo.exe exe-path: FreeRTOS/Demo/WIN32-MingW/build/RTOSDemo.exe
log-dir: demo_run_logs
timeout-seconds: 60 timeout-seconds: 60
success-line: "Message received from software timer" success-line: "Message received from software timer"
@ -197,96 +232,111 @@ jobs:
name: Posix GCC name: Posix GCC
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - env:
uses: actions/checkout@v2 stepName: Checkout Repository
name: ${{ env.stepName }}
- name: Fetch Kernel Submodule uses: actions/checkout@v3
- env:
stepName: Fetch Kernel Submodule
name: ${{ env.stepName }}
shell: bash shell: bash
run: | run: |
# Fetch Kernel Submodule # ${{ env.stepName }}
echo "::group::Fetch Kernel Submodule" echo -e "::group::${{ env.stepName }}"
set +e
git submodule update --checkout --init --depth 1 FreeRTOS/Source git submodule update --checkout --init --depth 1 FreeRTOS/Source
echo "::endgroup::" set -e
if [ "$?" = "0" ]; then exitStatus=$?
echo -e "\033[32;3mCloned the Kernel\033[0m" set -e
echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mKernel Clone Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Install GCC - env:
stepName: Install GCC
name: ${{ env.stepName }}
shell: bash shell: bash
run: | run: |
# Install GCC # ${{ env.stepName }}
echo "::group::Install GCC" echo -e "::group::${{ env.stepName }}"
set +e
sudo apt-get -y update sudo apt-get -y update
sudo apt-get -y install build-essential sudo apt-get -y install build-essential
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\e[0;32mInstall GCC Passed\e[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\e[0;32mInstall GCC Failed\e[0m" echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
# If there is an error, set this flag high again so the exit 1 fails the run
set -e
exit 1 exit 1
fi fi
- name: Build Posix_GCC Demo for Coverage Test - env:
shell: bash stepName: Build Posix_GCC Full Demo
working-directory: FreeRTOS/Demo/Posix_GCC name: ${{ env.stepName }}
run: make -j COVERAGE_TEST=1
- name: Build Posix_GCC Full Demo
id: build-posix-gcc-full-demo id: build-posix-gcc-full-demo
shell: bash shell: bash
working-directory: FreeRTOS/Demo/Posix_GCC working-directory: FreeRTOS/Demo/Posix_GCC
run: | run: |
# Build Posix_GCC Full Demo # ${{ env.stepName }}
echo "::group::Build Posix_GCC Full Demo" echo -e "::group::${{ env.stepName }}"
set +e
sed -i -z "s/int[[:space:]]*main[[:space:]]*([[:space:]]*void[[:space:]]*)\n{/int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );/g" main.c sed -i -z "s/int[[:space:]]*main[[:space:]]*([[:space:]]*void[[:space:]]*)\n{/int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );/g" main.c
make clean
make -j make -j
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\033[32;3mBuild Posix_GCC Full Demo Passed\033[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild Posix_GCC Full Demo Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Run and monitor Posix_GCC Full Demo - env:
if: success() || failure() && steps.build-posix-gcc-full-demo.outcome == 'success' stepName: Run and monitor Posix_GCC Full Demo
name: ${{ env.stepName }}
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
with: with:
exe-path: FreeRTOS/Demo/Posix_GCC/build/posix_demo exe-path: FreeRTOS/Demo/Posix_GCC/build/posix_demo
log-dir: demo_run_logs timeout-seconds: 60
timeout-seconds: 60 success-line: "OK: No errors"
success-line: "OK: No errors" retry-attempts: 3
- name: Build Posix_GCC Blinky Demo - env:
stepName: Build Posix_GCC Blinky Demo
name: ${{ env.stepName }}
id: build-posix-gcc-blinky-demo id: build-posix-gcc-blinky-demo
if: success() || failure()
shell: bash shell: bash
working-directory: FreeRTOS/Demo/Posix_GCC working-directory: FreeRTOS/Demo/Posix_GCC
run: | run: |
# Build Posix_GCC Blinky Demo # ${{ env.stepName }}
echo "::group::Build Posix_GCC Blinky Demo" echo -e "::group::${{ env.stepName }}"
rm -rf build rm -rf build
set +e
make -j USER_DEMO=BLINKY_DEMO make -j USER_DEMO=BLINKY_DEMO
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\033[32;3mBuilt the Posix_GCC Blinky Demo\033[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild Posix_GCC Blinky Demo Failed...\033[0m" echo -e "${{ env.bashFail }} ${{env.stepName}} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Run and monitor Posix_GCC Blinky Demo - env:
if: success() || failure() && steps.build-posix-gcc-blinky-demo.outcome == 'success' stepName: Run and monitor Posix_GCC Blinky Demo
name: ${{ env.stepName }}
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
with: with:
exe-path: FreeRTOS/Demo/Posix_GCC/build/posix_demo exe-path: FreeRTOS/Demo/Posix_GCC/build/posix_demo
log-dir: demo_run_logs
timeout-seconds: 60 timeout-seconds: 60
success-line: "Message received from software timer" success-line: "Message received from software timer"
@ -294,208 +344,290 @@ jobs:
name: GNU MSP430 Toolchain name: GNU MSP430 Toolchain
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - env:
uses: actions/checkout@v2 stepName: Checkout Repository
name: ${{ env.stepName }}
- name: Fetch Kernel Submodule uses: actions/checkout@v3
shell: bash with:
run: | submodules: true
# Fetch Kernel Submodule
echo "::group::Fetch Kernel Submodule" - env:
git submodule update --checkout --init --depth 1 FreeRTOS/Source stepName: Fetch Kernel Submodule
echo "::endgroup::" name: ${{ env.stepName }}
if [ "$?" = "0" ]; then shell: bash
echo -e "\033[32;3mCloned the Kernel\033[0m" run: |
else # ${{ env.stepName }}
echo -e "\033[32;31mKernel Clone Failed...\033[0m" echo -e "::group::${{ env.stepName }}"
exit 1 set +e
fi git submodule update --checkout --init --depth 1 FreeRTOS/Source
exitStatus=$?
- name: Install MSP430 Toolchain set -e
shell: bash echo -e "::endgroup::"
run: | if [ $exitStatus -eq 0 ]; then
# Install MSP430 Toolchain echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
echo "::group::Install MSP430 Toolchain" else
sudo apt-get -y update echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
sudo apt-get -y install gcc-msp430 build-essential exit 1
echo "::endgroup::" fi
if [ "$?" = "0" ]; then
echo -e "\033[32;3mInstalled the MSP430 Toolchain\033[0m" - env:
else stepName: Install MSP430 Toolchain
echo -e "\033[32;31mInstalling the MSP430 ToolchainFailed...\033[0m" name: ${{ env.stepName }}
exit 1 shell: bash
fi run: |
# ${{ env.stepName }}
- name: Build msp430_GCC Demo echo -e "::group::${{ env.stepName }}"
shell: bash set +e
working-directory: FreeRTOS/Demo/msp430_GCC sudo apt-get -y update
run: | sudo apt-get -y install gcc-msp430 build-essential
# Build msp430_GCC Demo exitStatus=$?
echo "::group::Build msp430_GCC Demo" set -e
make -j echo -e "::endgroup::"
echo "::endgroup::" if [ $exitStatus -eq 0 ]; then
if [ "$?" = "0" ]; then echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
echo -e "\033[32;3mBuilt the msp430_GCC Demo\033[0m" else
else echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
echo -e "\033[32;31mBuilding the msp430_GCC Demo Failed...\033[0m" exit 1
exit 1 fi
fi
- env:
stepName: Build msp430_GCC Demo
name: ${{ env.stepName }}
shell: bash
working-directory: FreeRTOS/Demo/msp430_GCC
run: |
# ${{ env.stepName }}
echo -e "::group::${{ env.stepName }}"
set +e
make -j
exitStatus=$?
set -e
echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1
fi
ARM-GCC: ARM-GCC:
name: GNU ARM Toolchain name: GNU ARM Toolchain
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - env:
uses: actions/checkout@v2 stepName: Checkout Repository
name: ${{ env.stepName }}
- name: Fetch Kernel Submodule uses: actions/checkout@v3
- env:
stepName: Fetch Kernel Submodule
name: ${{ env.stepName }}
shell: bash shell: bash
run: | run: |
# Fetch Kernel Submodule # ${{ env.stepName }}
echo "::group::Fetch Kernel Submodule" echo -e "::group::${{ env.stepName }}"
git submodule update --checkout --init --depth 1 FreeRTOS/Source set +e
echo "::endgroup::" git submodule update --checkout --init --depth 1 FreeRTOS/Source FreeRTOS/Demo/ThirdParty/Community-Supported-Demos
if [ "$?" = "0" ]; then exitStatus=$?
echo -e "\033[32;3mCloned the Kernel\033[0m" set -e
echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mKernel Clone Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Fetch Community-Supported-Demos Submodule - env:
stepName: Install GNU ARM Toolchain
name: Install GNU ARM Toolchain
shell: bash shell: bash
run: | run: |
# Fetch Community-Supported-Demos Submodule # ${{ env.stepName }}
echo "::group::Fetch Community-Supported-Demos Submodule" echo -e "::group::${{ env.stepName }}"
git submodule update --checkout --init --depth 1 FreeRTOS/Demo/ThirdParty/Community-Supported-Demos set +e
echo "::engdroup::"
if [ "$?" = "0" ]; then
echo -e "\033[32;3mCloned the Community-Supported-Demos\033[0m"
else
echo -e "\033[32;31mCommunity-Supported-Demos Clone Failed...\033[0m"
exit 1
fi
- name: Install GNU ARM Toolchain
shell: bash
run: |
# Install GNU ARM Toolchain
echo "::group::Install GNU ARM Toolchain"
sudo apt-get -y update sudo apt-get -y update
sudo apt-get -y install gcc-arm-none-eabi build-essential cmake git ninja-build python3-minimal sudo apt-get -y install gcc-arm-none-eabi build-essential cmake git ninja-build python3-minimal
echo "::endgroup::" sudo apt-get -y install qemu-system-arm qemu-efi
if [ "$?" = "0" ]; then exitStatus=$?
echo -e "\033[32;3mInstalled the GNU ARM Toolchain\033[0m" set -e
echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mInstalling GNU ARM Toolchain Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo - env:
stepName: Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo
name: ${{ env.stepName }}
shell: bash shell: bash
working-directory: FreeRTOS/Demo/CORTEX_MPU_M3_MPS2_QEMU_GCC working-directory: FreeRTOS/Demo/CORTEX_MPU_M3_MPS2_QEMU_GCC
run: | run: |
# Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo # ${{ env.stepName }}
echo "::group::Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo" echo -e "::group::${{ env.stepName }}"
set +e
make -j make -j
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\033[32;3mBuild CORTEX_MPU_M3_MPS2_QEMU_GCC Demo\033[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild CORTEX_MPU_M3_MPS2_QEMU_GCC Demo Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Build CORTEX_LM3S102_GCC Demo - env:
stepName: Build CORTEX_LM3S102_GCC Demo
name: ${{ env.stepName }}
shell: bash shell: bash
working-directory: FreeRTOS/Demo/CORTEX_LM3S102_GCC working-directory: FreeRTOS/Demo/CORTEX_LM3S102_GCC
run: | run: |
# Build CORTEX_LM3S102_GCC Demo # ${{ env.stepName }}
echo "::group::Build CORTEX_LM3S102_GCC Demo" echo -e "::group::${{ env.stepName }}"
set +e
make clean
make -j make -j
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\033[32;3mBuilt the CORTEX_LM3S102_GCC Demo Kernel\033[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild CORTEX_LM3S102_GCC Demo Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Build CORTEX_M3_MPS2_QEMU_GCC Demo - env:
stepName: Build CORTEX_M3_MPS2_QEMU_GCC Demo
name: ${{ env.stepName }}
shell: bash shell: bash
working-directory: FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC working-directory: FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC
run: | run: |
# Build CORTEX_M3_MPS2_QEMU_GCC Demo # ${{ env.stepName }}
echo "::group::Build CORTEX_M3_MPS2_QEMU_GCC Demo" echo -e "::group::${{ env.stepName }}"
set +e
make clean make clean
make -j make -j
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\033[32;3mBuilt the CORTEX_M3_MPS2_QEMU_GCC Demo\033[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild CORTEX_M3_MPS2_QEMU_GCC Demo Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Build CORTEX_M3_MPS2_QEMU_GCC Full Demo - env:
stepName: Build CORTEX_M3_MPS2_QEMU_GCC Full Demo
name: ${{ env.stepName }}
shell: bash shell: bash
working-directory: FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC working-directory: FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC
run: | run: |
# Build CORTEX_M3_MPS2_QEMU_GCC Full Demo # ${{ env.stepName }}
echo "::group::Build CORTEX_M3_MPS2_QEMU_GCC Full Demo" echo -e "::group::${{ env.stepName }}"
set +e
make clean make clean
make FULL_DEMO=1 -j make FULL_DEMO=1 -j
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\033[32;3mBuilt the CORTEX_M3_MPS2_QEMU_GCC Full Demo\033[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild CORTEX_M3_MPS2_QEMU_GCC Full Demo Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Build CORTEX_LM3S811_GCC Demo - env:
stepName: Build CORTEX_LM3S811_GCC Demo
name: ${{ env.stepName }}
shell: bash shell: bash
working-directory: FreeRTOS/Demo/CORTEX_LM3S811_GCC working-directory: FreeRTOS/Demo/CORTEX_LM3S811_GCC
run: | run: |
# Build CORTEX_LM3S811_GCC Demo # ${{ env.stepName }}
echo "::group::Build CORTEX_LM3S811_GCC Demo" echo -e "::group::${{ env.stepName }}"
set +e
make -j make -j
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\033[32;3mBuilt the CORTEX_LM3S811_GCC Demo\033[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild CORTEX_LM3S811_GCC Demo Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Build CORTEX_M0+_RP2040 Demos - env:
stepName: Build CORTEX_M0+_RP2040 Demos
name: ${{ env.stepName }}
shell: bash shell: bash
working-directory: FreeRTOS/Demo/ThirdParty/Community-Supported-Demos/CORTEX_M0+_RP2040 working-directory: FreeRTOS/Demo/ThirdParty/Community-Supported-Demos/CORTEX_M0+_RP2040
run: | run: |
# Build CORTEX_M0+_RP2040 Demos # ${{ env.stepName }}
echo "::group::Build CORTEX_M0+_RP2040 Demos" echo -e "::group::${{ env.stepName }}"
git clone https://github.com/raspberrypi/pico-sdk.git set +e
cmake -B build -DPICO_SDK_PATH=pico-sdk -GNinja git clone https://github.com/raspberrypi/pico-sdk.git
ninja -C build --verbose cmake -B build -DPICO_SDK_PATH=pico-sdk -GNinja
echo "::endgroup::" ninja -C build --verbose
if [ "$?" = "0" ]; then exitStatus=$?
echo -e "\033[32;3mBuilt CORTEX_M0+_RP2040 Demos\033[0m" set -e
echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1
fi
- env:
stepName: Build Qemu Runner File
name: ${{ env.stepName }}
shell: bash
working-directory: .github/scripts
run: |
# ${{ env.stepName }}
echo -e "::group::${{ env.stepName }}"
gcc qemu_reader.c -o ../../FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/qemu_reader.out
exitStatus=$?
echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild CORTEX_M0+_RP2040 Demos Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- name: Build CORTEX_MPS2_QEMU_IAR_GCC Demo - env:
stepName: Build CORTEX_MPS2_QEMU_IAR_GCC Demo
name: ${{ env.stepName }}
shell: bash shell: bash
working-directory: FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC working-directory: FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC
run: | run: |
# Build CORTEX_MPS2_QEMU_IAR_GCC Demo # ${{ env.stepName }}
echo "::group::Build CORTEX_MPS2_QEMU_IAR_GCC Demo" echo -e "::group::${{ env.stepName }}"
set +e
make -C build/gcc -j make -C build/gcc -j
echo "::endgroup::" exitStatus=$?
if [ "$?" = "0" ]; then set -e
echo -e "\033[32;3mBuilt the CORTEX_MPS2_QEMU_IAR_GCC Demo\033[0m" echo -e "::endgroup::"
if [ $exitStatus -eq 0 ]; then
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
else else
echo -e "\033[32;31mBuild CORTEX_MPS2_QEMU_IAR_GCC Demo Failed...\033[0m" echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
exit 1 exit 1
fi fi
- env:
stepName: Run and monitor CORTEX_MPS2_QEMU_IAR_GCC Demo
name: ${{ env.stepName }}
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
with:
exe-path: FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/qemu_reader.out
timeout-seconds: 20
success-line: "Message received from software timer"
retry-attempts: 1

File diff suppressed because it is too large Load Diff

@ -7,7 +7,7 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
submodules: 'recursive' submodules: 'recursive'
fetch-depth: 5 fetch-depth: 5
@ -42,12 +42,12 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
submodules: 'recursive' submodules: 'recursive'
fetch-depth: 5 fetch-depth: 5
- name: Checkout the main branch from the FreeRTOS-Kernel repository - name: Checkout the main branch from the FreeRTOS-Kernel repository
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
path: ./FreeRTOS/Source path: ./FreeRTOS/Source
ref: main ref: main

@ -1,5 +1,5 @@
[{000214A0-0000-0000-C000-000000000046}] [{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2 Prop3=19,2
[InternetShortcut] [InternetShortcut]
URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html
IDList= IDList=

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="Source Files"> <Filter Include="Source Files">

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134 VisualStudioVersion = 16.0.31205.134

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -160,8 +160,8 @@ static eReportBuilderStatus prvWritePortsArray( char * pcBuffer,
lCharactersWritten = snprintf( pcCurrentWritePos, lCharactersWritten = snprintf( pcCurrentWritePos,
xRemainingBufferLength, xRemainingBufferLength,
"{" "{"
"\"" DEFENDER_REPORT_PORT_KEY "\":%u" "\"" DEFENDER_REPORT_PORT_KEY "\":%u"
"},", "},",
( unsigned int ) pusOpenPortsArray[ uxIdx ] ); ( unsigned int ) pusOpenPortsArray[ uxIdx ] );
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) ) if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )
@ -238,9 +238,9 @@ static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer,
lCharactersWritten = snprintf( pcCurrentWritePos, lCharactersWritten = snprintf( pcCurrentWritePos,
xRemainingBufferLength, xRemainingBufferLength,
"{" "{"
"\""DEFENDER_REPORT_LOCAL_PORT_KEY"\": %u," "\""DEFENDER_REPORT_LOCAL_PORT_KEY "\": %u,"
"\""DEFENDER_REPORT_REMOTE_ADDR_KEY"\": \"%u.%u.%u.%u:%u\"" "\""DEFENDER_REPORT_REMOTE_ADDR_KEY "\": \"%u.%u.%u.%u:%u\""
"},", "},",
( unsigned int ) pxConn->usLocalPort, ( unsigned int ) pxConn->usLocalPort,
( unsigned int ) ( pxConn->ulRemoteIp >> 24 ) & 0xFF, ( unsigned int ) ( pxConn->ulRemoteIp >> 24 ) & 0xFF,
( unsigned int ) ( pxConn->ulRemoteIp >> 16 ) & 0xFF, ( unsigned int ) ( pxConn->ulRemoteIp >> 16 ) & 0xFF,
@ -399,13 +399,13 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
lCharactersWritten = snprintf( pcCurrentWritePos, lCharactersWritten = snprintf( pcCurrentWritePos,
xRemainingBufferLength, xRemainingBufferLength,
"{" "{"
"\""DEFENDER_REPORT_HEADER_KEY"\": {" "\""DEFENDER_REPORT_HEADER_KEY "\": {"
"\""DEFENDER_REPORT_ID_KEY"\": %u," "\""DEFENDER_REPORT_ID_KEY "\": %u,"
"\""DEFENDER_REPORT_VERSION_KEY"\": \"%u.%u\"" "\""DEFENDER_REPORT_VERSION_KEY "\": \"%u.%u\""
"}," "},"
"\""DEFENDER_REPORT_METRICS_KEY"\": {" "\""DEFENDER_REPORT_METRICS_KEY "\": {"
"\""DEFENDER_REPORT_TCP_LISTENING_PORTS_KEY"\": {" "\""DEFENDER_REPORT_TCP_LISTENING_PORTS_KEY "\": {"
"\""DEFENDER_REPORT_PORTS_KEY"\": ", "\""DEFENDER_REPORT_PORTS_KEY "\": ",
( unsigned int ) ulReportId, ( unsigned int ) ulReportId,
( unsigned int ) ulMajorReportVersion, ( unsigned int ) ulMajorReportVersion,
( unsigned int ) ulMinorReportVersion ); ( unsigned int ) ulMinorReportVersion );
@ -447,11 +447,11 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
{ {
lCharactersWritten = snprintf( pcCurrentWritePos, lCharactersWritten = snprintf( pcCurrentWritePos,
xRemainingBufferLength, xRemainingBufferLength,
"," ","
"\""DEFENDER_REPORT_TOTAL_KEY"\": %u" "\""DEFENDER_REPORT_TOTAL_KEY "\": %u"
"}," "},"
"\""DEFENDER_REPORT_UDP_LISTENING_PORTS_KEY"\": {" "\""DEFENDER_REPORT_UDP_LISTENING_PORTS_KEY "\": {"
"\""DEFENDER_REPORT_PORTS_KEY"\": ", "\""DEFENDER_REPORT_PORTS_KEY "\": ",
( unsigned int ) pxMetrics->xOpenTcpPortsArrayLength ); ( unsigned int ) pxMetrics->xOpenTcpPortsArrayLength );
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) ) if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )
@ -491,18 +491,18 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
{ {
lCharactersWritten = snprintf( pcCurrentWritePos, lCharactersWritten = snprintf( pcCurrentWritePos,
xRemainingBufferLength, xRemainingBufferLength,
"," ","
"\""DEFENDER_REPORT_TOTAL_KEY"\": %u" "\""DEFENDER_REPORT_TOTAL_KEY "\": %u"
"}," "},"
"\""DEFENDER_REPORT_NETWORK_STATS_KEY"\": {" "\""DEFENDER_REPORT_NETWORK_STATS_KEY "\": {"
"\""DEFENDER_REPORT_BYTES_IN_KEY"\": %u," "\""DEFENDER_REPORT_BYTES_IN_KEY "\": %u,"
"\""DEFENDER_REPORT_BYTES_OUT_KEY"\": %u," "\""DEFENDER_REPORT_BYTES_OUT_KEY "\": %u,"
"\""DEFENDER_REPORT_PKTS_IN_KEY"\": %u," "\""DEFENDER_REPORT_PKTS_IN_KEY "\": %u,"
"\""DEFENDER_REPORT_PKTS_OUT_KEY"\": %u" "\""DEFENDER_REPORT_PKTS_OUT_KEY "\": %u"
"}," "},"
"\""DEFENDER_REPORT_TCP_CONNECTIONS_KEY"\": {" "\""DEFENDER_REPORT_TCP_CONNECTIONS_KEY "\": {"
"\""DEFENDER_REPORT_ESTABLISHED_CONNECTIONS_KEY"\": {" "\""DEFENDER_REPORT_ESTABLISHED_CONNECTIONS_KEY "\": {"
"\""DEFENDER_REPORT_CONNECTIONS_KEY"\": ", "\""DEFENDER_REPORT_CONNECTIONS_KEY "\": ",
( unsigned int ) pxMetrics->xOpenUdpPortsArrayLength, ( unsigned int ) pxMetrics->xOpenUdpPortsArrayLength,
( unsigned int ) pxMetrics->pxNetworkStats->uxBytesReceived, ( unsigned int ) pxMetrics->pxNetworkStats->uxBytesReceived,
( unsigned int ) pxMetrics->pxNetworkStats->uxBytesSent, ( unsigned int ) pxMetrics->pxNetworkStats->uxBytesSent,
@ -546,20 +546,20 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
{ {
lCharactersWritten = snprintf( pcCurrentWritePos, lCharactersWritten = snprintf( pcCurrentWritePos,
xRemainingBufferLength, xRemainingBufferLength,
"," ","
"\""DEFENDER_REPORT_TOTAL_KEY"\": %u" "\""DEFENDER_REPORT_TOTAL_KEY "\": %u"
"}" "}"
"}" "}"
"}," "},"
"\""DEFENDER_REPORT_CUSTOM_METRICS_KEY"\": {" "\""DEFENDER_REPORT_CUSTOM_METRICS_KEY "\": {"
"\"stack_high_water_mark\": [" "\"stack_high_water_mark\": ["
"{" "{"
"\""DEFENDER_REPORT_NUMBER_KEY"\": %u" "\""DEFENDER_REPORT_NUMBER_KEY "\": %u"
"}" "}"
"]," "],"
"\"task_numbers\": [" "\"task_numbers\": ["
"{" "{"
"\""DEFENDER_REPORT_NUMBER_LIST_KEY"\": ", "\""DEFENDER_REPORT_NUMBER_LIST_KEY "\": ",
( unsigned int ) pxMetrics->xEstablishedConnectionsArrayLength, ( unsigned int ) pxMetrics->xEstablishedConnectionsArrayLength,
( unsigned int ) pxMetrics->ulStackHighWaterMark ); ( unsigned int ) pxMetrics->ulStackHighWaterMark );
@ -600,9 +600,9 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
{ {
lCharactersWritten = snprintf( pcCurrentWritePos, lCharactersWritten = snprintf( pcCurrentWritePos,
xRemainingBufferLength, xRemainingBufferLength,
"}" "}"
"]" "]"
"}" "}"
"}" ); "}" );
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) ) if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="Source Files"> <Filter Include="Source Files">

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -20,8 +20,10 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://aws.amazon.com/freertos * https://github.com/FreeRTOS
*
*/ */
#ifndef CORE_MQTT_CONFIG_H #ifndef CORE_MQTT_CONFIG_H
#define CORE_MQTT_CONFIG_H #define CORE_MQTT_CONFIG_H

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -220,7 +220,7 @@ extern void vLoggingPrintf( const char * pcFormatString,
* @brief The name of the MQTT library used and its version, following an "@" * @brief The name of the MQTT library used and its version, following an "@"
* symbol. * symbol.
*/ */
#include "core_mqtt.h" /* Include coreMQTT header for MQTT_LIBRARY_VERSION macro. */ #include "core_mqtt.h" /* Include coreMQTT header for MQTT_LIBRARY_VERSION macro. */
#define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION #define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION
/** /**

@ -1,6 +1,6 @@
/* /*
* AWS IoT Device SDK for Embedded C V202009.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -18,6 +18,10 @@
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/ */
#ifndef SHADOW_CONFIG_H #ifndef SHADOW_CONFIG_H

@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134 VisualStudioVersion = 16.0.31205.134

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -316,11 +316,11 @@ static void prvProvisioningPublishCallback( MQTTContext_t * pxMqttContext,
configASSERT( pxDeserializedInfo->pPublishInfo != NULL ); configASSERT( pxDeserializedInfo->pPublishInfo != NULL );
pxPublishInfo = pxDeserializedInfo->pPublishInfo; pxPublishInfo = pxDeserializedInfo->pPublishInfo;
xStatus = FleetProvisioning_MatchTopic(pxPublishInfo->pTopicName, xStatus = FleetProvisioning_MatchTopic( pxPublishInfo->pTopicName,
pxPublishInfo->topicNameLength, pxPublishInfo->topicNameLength,
&xApi); &xApi );
if (xStatus != FleetProvisioningSuccess) if( xStatus != FleetProvisioningSuccess )
{ {
LogWarn( ( "Unexpected publish message received. Topic: %.*s.", LogWarn( ( "Unexpected publish message received. Topic: %.*s.",
( int ) pxPublishInfo->topicNameLength, ( int ) pxPublishInfo->topicNameLength,
@ -328,7 +328,7 @@ static void prvProvisioningPublishCallback( MQTTContext_t * pxMqttContext,
} }
else else
{ {
if (xApi == FleetProvCborCreateCertFromCsrAccepted) if( xApi == FleetProvCborCreateCertFromCsrAccepted )
{ {
LogInfo( ( "Received accepted response from Fleet Provisioning CreateCertificateFromCsr API." ) ); LogInfo( ( "Received accepted response from Fleet Provisioning CreateCertificateFromCsr API." ) );
@ -341,13 +341,13 @@ static void prvProvisioningPublishCallback( MQTTContext_t * pxMqttContext,
xPayloadLength = pxPublishInfo->payloadLength; xPayloadLength = pxPublishInfo->payloadLength;
} }
else if (xApi == FleetProvCborCreateCertFromCsrRejected) else if( xApi == FleetProvCborCreateCertFromCsrRejected )
{ {
LogError( ( "Received rejected response from Fleet Provisioning CreateCertificateFromCsr API." ) ); LogError( ( "Received rejected response from Fleet Provisioning CreateCertificateFromCsr API." ) );
xResponseStatus = ResponseRejected; xResponseStatus = ResponseRejected;
} }
else if (xApi == FleetProvCborRegisterThingAccepted) else if( xApi == FleetProvCborRegisterThingAccepted )
{ {
LogInfo( ( "Received accepted response from Fleet Provisioning RegisterThing API." ) ); LogInfo( ( "Received accepted response from Fleet Provisioning RegisterThing API." ) );
@ -360,7 +360,7 @@ static void prvProvisioningPublishCallback( MQTTContext_t * pxMqttContext,
xPayloadLength = pxPublishInfo->payloadLength; xPayloadLength = pxPublishInfo->payloadLength;
} }
else if (xApi == FleetProvCborRegisterThingRejected) else if( xApi == FleetProvCborRegisterThingRejected )
{ {
LogError( ( "Received rejected response from Fleet Provisioning RegisterThing API." ) ); LogError( ( "Received rejected response from Fleet Provisioning RegisterThing API." ) );
@ -804,7 +804,7 @@ int prvFleetProvisioningTask( void * pvParameters )
} }
else else
{ {
LogInfo( ( "Sucessfully established connection with provisioned credentials." ) ); LogInfo( ( "Successfully established connection with provisioned credentials." ) );
xConnectionEstablished = true; xConnectionEstablished = true;
} }
} }

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.33027.164 VisualStudioVersion = 16.0.33027.164

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="Source"> <Filter Include="Source">

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="Source Files"> <Filter Include="Source Files">

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -20,8 +20,10 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://aws.amazon.com/freertos * https://github.com/FreeRTOS
*
*/ */
#ifndef CORE_MQTT_CONFIG_H #ifndef CORE_MQTT_CONFIG_H
#define CORE_MQTT_CONFIG_H #define CORE_MQTT_CONFIG_H

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -213,7 +213,7 @@ extern void vLoggingPrintf( const char * pcFormatString,
* @brief The name of the MQTT library used and its version, following an "@" * @brief The name of the MQTT library used and its version, following an "@"
* symbol. * symbol.
*/ */
#include "core_mqtt.h" /* Include coreMQTT header for MQTT_LIBRARY_VERSION macro. */ #include "core_mqtt.h" /* Include coreMQTT header for MQTT_LIBRARY_VERSION macro. */
#define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION #define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION
/** /**

@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134 VisualStudioVersion = 16.0.31205.134

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -379,26 +379,28 @@ static TlsTransportStatus_t prvConnectToServerWithBackoffRetries( NetworkContext
uint16_t usNextRetryBackOff = 0U; uint16_t usNextRetryBackOff = 0U;
#if defined( democonfigCLIENT_USERNAME ) #if defined( democonfigCLIENT_USERNAME )
/*
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect /*
* to AWS IoT Core with Custom Authentication on port 443. * When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
* * to AWS IoT Core with Custom Authentication on port 443.
* Custom Authentication uses the contents of the username and password *
* fields of the MQTT CONNECT packet to authenticate the client. * Custom Authentication uses the contents of the username and password
* * fields of the MQTT CONNECT packet to authenticate the client.
* For more information, refer to the documentation at: *
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html * For more information, refer to the documentation at:
*/ * https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
static const char * ppcAlpnProtocols[] = { "mqtt", NULL }; */
#if democonfigMQTT_BROKER_PORT != 443U static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn." #if democonfigMQTT_BROKER_PORT != 443U
#endif /* democonfigMQTT_BROKER_PORT != 443U */ #error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
#endif /* democonfigMQTT_BROKER_PORT != 443U */
#else /* if !defined( democonfigCLIENT_USERNAME ) */ #else /* if !defined( democonfigCLIENT_USERNAME ) */
/*
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using /*
* x509 Certificate Authentication. * Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
*/ * x509 Certificate Authentication.
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL }; */
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
#endif /* !defined( democonfigCLIENT_USERNAME ) */ #endif /* !defined( democonfigCLIENT_USERNAME ) */
/* /*

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -377,26 +377,28 @@ static TlsTransportStatus_t prvConnectToServerWithBackoffRetries( NetworkContext
uint16_t usNextRetryBackOff = 0U; uint16_t usNextRetryBackOff = 0U;
#if defined( democonfigCLIENT_USERNAME ) #if defined( democonfigCLIENT_USERNAME )
/*
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect /*
* to AWS IoT Core with Custom Authentication on port 443. * When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
* * to AWS IoT Core with Custom Authentication on port 443.
* Custom Authentication uses the contents of the username and password *
* fields of the MQTT CONNECT packet to authenticate the client. * Custom Authentication uses the contents of the username and password
* * fields of the MQTT CONNECT packet to authenticate the client.
* For more information, refer to the documentation at: *
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html * For more information, refer to the documentation at:
*/ * https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
static const char * ppcAlpnProtocols[] = { "mqtt", NULL }; */
#if democonfigMQTT_BROKER_PORT != 443U static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn." #if democonfigMQTT_BROKER_PORT != 443U
#endif /* democonfigMQTT_BROKER_PORT != 443U */ #error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
#endif /* democonfigMQTT_BROKER_PORT != 443U */
#else /* if !defined( democonfigCLIENT_USERNAME ) */ #else /* if !defined( democonfigCLIENT_USERNAME ) */
/*
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using /*
* x509 Certificate Authentication. * Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
*/ * x509 Certificate Authentication.
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL }; */
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
#endif /* !defined( democonfigCLIENT_USERNAME ) */ #endif /* !defined( democonfigCLIENT_USERNAME ) */
/* /*

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -63,8 +63,8 @@
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/** /**
* @brief Each compilation unit that consumes the NetworkContext must define it. * @brief Each compilation unit that consumes the NetworkContext must define it.
* It should contain a single pointer to the type of your desired transport. * It should contain a single pointer to the type of your desired transport.
* This utility is used by both TLS and plaintext HTTP demos, so define this pointer as void *. * This utility is used by both TLS and plaintext HTTP demos, so define this pointer as void *.
* *

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -24,14 +24,14 @@
* *
*/ */
/** /**
* @file aws_ota_codesigner_certificate.h * @file aws_ota_codesigner_certificate.h
* @brief Code signer certificate as char array. * @brief Code signer certificate as char array.
* *
* Define this char array containing the PEM encode signing certificate. * Define this char array containing the PEM encode signing certificate.
* Note - It is highly recommended to use this for demo purpose and store * Note - It is highly recommended to use this for demo purpose and store
* certificates in secure location in production devices. * certificates in secure location in production devices.
*/ */
#ifndef __CODESIGNER_CERTIFICATE__H__ #ifndef __CODESIGNER_CERTIFICATE__H__
#define __CODESIGNER_CERTIFICATE__H__ #define __CODESIGNER_CERTIFICATE__H__

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -24,22 +24,22 @@
* *
*/ */
/** /**
* @file code_signature_verification.h * @file code_signature_verification.h
* @brief Interface for code signature verification functions. * @brief Interface for code signature verification functions.
* *
*/ */
#ifndef CODE_SIGNATURE_VERIFICATION_H #ifndef CODE_SIGNATURE_VERIFICATION_H
#define CODE_SIGNATURE_VERIFICATION_H #define CODE_SIGNATURE_VERIFICATION_H
#include "FreeRTOS.h" #include "FreeRTOS.h"
/** /**
* @brief Validate the integrity of the new image to be activated. * @brief Validate the integrity of the new image to be activated.
* @param[in] pFileContext pointer to File context * @param[in] pFileContext pointer to File context
* @return OtaPalMainStatus_t , OtaPalSuccess if the signature of the image is valid. * @return OtaPalMainStatus_t , OtaPalSuccess if the signature of the image is valid.
*/ */
OtaPalMainStatus_t xValidateImageSignature( OtaFileContext_t* const pFileContext ); OtaPalMainStatus_t xValidateImageSignature( OtaFileContext_t * const pFileContext );
#endif #endif

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -24,25 +24,25 @@
* *
*/ */
/** /**
* @file code_signature_verification_mbedtls.c * @file code_signature_verification_mbedtls.c
* @brief Code signature verification using mbedtls crypto. * @brief Code signature verification using mbedtls crypto.
* *
* The file demonstrates implements the code signature verification functionality on * The file demonstrates implements the code signature verification functionality on
* the specified file using mbedtls for SHA256 ECDSA. * the specified file using mbedtls for SHA256 ECDSA.
*/ */
/* C runtime includes. */ /* C runtime includes. */
#include <string.h> #include <string.h>
/* FreeRTOS includes. */ /* FreeRTOS includes. */
#include "FreeRTOS.h" #include "FreeRTOS.h"
/* mbedTLS includes. */ /* mbedTLS includes. */
#if !defined( MBEDTLS_CONFIG_FILE ) #if !defined( MBEDTLS_CONFIG_FILE )
#include "mbedtls_config_v3.2.1.h" #include "mbedtls_config_v3.2.1.h"
#else #else
#include MBEDTLS_CONFIG_FILE #include MBEDTLS_CONFIG_FILE
#endif #endif
#include "mbedtls/platform.h" #include "mbedtls/platform.h"
#include "mbedtls/sha256.h" #include "mbedtls/sha256.h"
@ -60,10 +60,10 @@
/** /**
* @brief SHA256 buffer size for storing cryptographic hash computation results. * @brief SHA256 buffer size for storing cryptographic hash computation results.
*/ */
#define SHA256_DIGEST_BYTES 32 #define SHA256_DIGEST_BYTES 32
/* Size of buffer used in file operations on this platform (Windows). */ /* Size of buffer used in file operations on this platform (Windows). */
#define OTA_PAL_WIN_BUF_SIZE ( ( size_t ) 4096UL ) #define OTA_PAL_WIN_BUF_SIZE ( ( size_t ) 4096UL )
/** /**
* @brief Library-independent cryptographic algorithm identifiers. * @brief Library-independent cryptographic algorithm identifiers.
@ -73,9 +73,9 @@
#define ASYMMETRIC_ALGORITHM_RSA 1 #define ASYMMETRIC_ALGORITHM_RSA 1
#define ASYMMETRIC_ALGORITHM_ECDSA 2 #define ASYMMETRIC_ALGORITHM_ECDSA 2
/** /**
* @brief Internal signature verification context structure. * @brief Internal signature verification context structure.
*/ */
typedef struct SignatureVerificationState typedef struct SignatureVerificationState
{ {
BaseType_t xAsymmetricAlgorithm; BaseType_t xAsymmetricAlgorithm;
@ -92,9 +92,9 @@ typedef struct SignatureVerificationState
* *
* @return pdTRUE if initialization succeeds, or pdFALSE otherwise. * @return pdTRUE if initialization succeeds, or pdFALSE otherwise.
*/ */
static BaseType_t prvSignatureVerificationStart(void** ppvContext, static BaseType_t prvSignatureVerificationStart( void ** ppvContext,
BaseType_t xAsymmetricAlgorithm, BaseType_t xAsymmetricAlgorithm,
BaseType_t xHashAlgorithm); BaseType_t xHashAlgorithm );
/** /**
* @brief Updates a cryptographic hash computation with the specified byte array. * @brief Updates a cryptographic hash computation with the specified byte array.
@ -103,9 +103,9 @@ static BaseType_t prvSignatureVerificationStart(void** ppvContext,
* @param[in] pucData Byte array that was signed. * @param[in] pucData Byte array that was signed.
* @param[in] xDataLength Length in bytes of data that was signed. * @param[in] xDataLength Length in bytes of data that was signed.
*/ */
static void prvSignatureVerificationUpdate(void* pvContext, static void prvSignatureVerificationUpdate( void * pvContext,
const uint8_t* pucData, const uint8_t * pucData,
size_t xDataLength); size_t xDataLength );
/** /**
* @brief Verifies a digital signature computation using the public key from the * @brief Verifies a digital signature computation using the public key from the
@ -120,41 +120,41 @@ static void prvSignatureVerificationUpdate(void* pvContext,
* *
* @return pdTRUE if the signature is correct or pdFALSE if the signature is invalid. * @return pdTRUE if the signature is correct or pdFALSE if the signature is invalid.
*/ */
static BaseType_t prvSignatureVerificationFinal(void* pvContext, static BaseType_t prvSignatureVerificationFinal( void * pvContext,
char* pcSignerCertificate, char * pcSignerCertificate,
size_t xSignerCertificateLength, size_t xSignerCertificateLength,
uint8_t* pucSignature, uint8_t * pucSignature,
size_t xSignatureLength); size_t xSignatureLength );
/* Read the specified signer certificate from the filesystem into a local buffer. The allocated /* Read the specified signer certificate from the filesystem into a local buffer. The allocated
* memory becomes the property of the caller who is responsible for freeing it. * memory becomes the property of the caller who is responsible for freeing it.
*/ */
static uint8_t* otaPal_ReadAndAssumeCertificate(const uint8_t* const pucCertName, static uint8_t * otaPal_ReadAndAssumeCertificate( const uint8_t * const pucCertName,
uint32_t* const ulSignerCertSize) uint32_t * const ulSignerCertSize )
{ {
FILE* pFile; FILE * pFile;
uint8_t* pucSignerCert = NULL; uint8_t * pucSignerCert = NULL;
uint8_t* pucCertData = NULL; uint8_t * pucCertData = NULL;
int32_t lSize = 0; /* For MISRA mandatory. */ int32_t lSize = 0; /* For MISRA mandatory. */
int32_t lWindowsError; int32_t lWindowsError;
pFile = fopen((const char*)pucCertName, "rb"); /*lint !e586 pFile = fopen( ( const char * ) pucCertName, "rb" ); /*lint !e586
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
if (pFile != NULL) if( pFile != NULL )
{ {
lWindowsError = fseek(pFile, 0, SEEK_END); /*lint !e586 lWindowsError = fseek( pFile, 0, SEEK_END ); /*lint !e586
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
if (lWindowsError == 0) /* fseek returns a non-zero value on error. */ if( lWindowsError == 0 ) /* fseek returns a non-zero value on error. */
{ {
lSize = (int32_t)ftell(pFile); /*lint !e586 Allow call in this context. */ lSize = ( int32_t ) ftell( pFile ); /*lint !e586 Allow call in this context. */
if (lSize != -1L) /* ftell returns -1 on error. */ if( lSize != -1L ) /* ftell returns -1 on error. */
{ {
lWindowsError = fseek(pFile, 0, SEEK_SET); /*lint !e586 lWindowsError = fseek( pFile, 0, SEEK_SET ); /*lint !e586
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
} }
else /* ftell returned an error, pucSignerCert remains NULL. */ else /* ftell returned an error, pucSignerCert remains NULL. */
{ {
@ -162,60 +162,60 @@ static uint8_t* otaPal_ReadAndAssumeCertificate(const uint8_t* const pucCertName
} }
} /* else fseek returned an error, pucSignerCert remains NULL. */ } /* else fseek returned an error, pucSignerCert remains NULL. */
if (lWindowsError == 0) if( lWindowsError == 0 )
{ {
/* Allocate memory for the signer certificate plus a terminating zero so we can load and return it to the caller. */ /* Allocate memory for the signer certificate plus a terminating zero so we can load and return it to the caller. */
pucSignerCert = pvPortMalloc(lSize + 1); /*lint !e732 !e9034 !e9079 Allow conversion. */ pucSignerCert = pvPortMalloc( lSize + 1 ); /*lint !e732 !e9034 !e9079 Allow conversion. */
} }
if (pucSignerCert != NULL) if( pucSignerCert != NULL )
{ {
if (fread(pucSignerCert, 1, lSize, pFile) == (size_t)lSize) /*lint !e586 !e732 !e9034 if( fread( pucSignerCert, 1, lSize, pFile ) == ( size_t ) lSize ) /*lint !e586 !e732 !e9034
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
{ {
/* The crypto code requires the terminating zero to be part of the length so add 1 to the size. */ /* The crypto code requires the terminating zero to be part of the length so add 1 to the size. */
*ulSignerCertSize = lSize + 1; *ulSignerCertSize = lSize + 1;
pucSignerCert[lSize] = 0; pucSignerCert[ lSize ] = 0;
} }
else else
{ /* There was a problem reading the certificate file so free the memory and abort. */ { /* There was a problem reading the certificate file so free the memory and abort. */
vPortFree(pucSignerCert); vPortFree( pucSignerCert );
pucSignerCert = NULL; pucSignerCert = NULL;
} }
} }
else else
{ {
LogError(("Failed to allocate memory for signer cert contents.\r\n")); LogError( ( "Failed to allocate memory for signer cert contents.\r\n" ) );
/* Nothing special to do. */ /* Nothing special to do. */
} }
lWindowsError = fclose(pFile); /*lint !e586 lWindowsError = fclose( pFile ); /*lint !e586
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
if (lWindowsError != 0) if( lWindowsError != 0 )
{ {
LogError(("File pointer operation failed.\r\n")); LogError( ( "File pointer operation failed.\r\n" ) );
pucSignerCert = NULL; pucSignerCert = NULL;
} }
} }
else else
{ {
LogError(("No such certificate file: %s. Using aws_ota_codesigner_certificate.h.\r\n", LogError( ( "No such certificate file: %s. Using aws_ota_codesigner_certificate.h.\r\n",
(const char*)pucCertName)); ( const char * ) pucCertName ) );
/* Allocate memory for the signer certificate plus a terminating zero so we can copy it and return to the caller. */ /* Allocate memory for the signer certificate plus a terminating zero so we can copy it and return to the caller. */
lSize = sizeof(signingcredentialSIGNING_CERTIFICATE_PEM); lSize = sizeof( signingcredentialSIGNING_CERTIFICATE_PEM );
pucSignerCert = pvPortMalloc(lSize); /*lint !e9029 !e9079 !e838 malloc proto requires void*. */ pucSignerCert = pvPortMalloc( lSize ); /*lint !e9029 !e9079 !e838 malloc proto requires void*. */
pucCertData = (uint8_t*)signingcredentialSIGNING_CERTIFICATE_PEM; /*lint !e9005 we don't modify the cert but it could be set by PKCS11 so it's not const. */ pucCertData = ( uint8_t * ) signingcredentialSIGNING_CERTIFICATE_PEM; /*lint !e9005 we don't modify the cert but it could be set by PKCS11 so it's not const. */
if (pucSignerCert != NULL) if( pucSignerCert != NULL )
{ {
memcpy(pucSignerCert, pucCertData, lSize); memcpy( pucSignerCert, pucCertData, lSize );
*ulSignerCertSize = lSize; *ulSignerCertSize = lSize;
} }
else else
{ {
LogError(("No memory for certificate of size %d!\r\n", lSize)); LogError( ( "No memory for certificate of size %d!\r\n", lSize ) );
} }
} }
@ -226,29 +226,29 @@ static uint8_t* otaPal_ReadAndAssumeCertificate(const uint8_t* const pucCertName
* @brief Verifies a cryptographic signature based on the signer * @brief Verifies a cryptographic signature based on the signer
* certificate, hash algorithm, and the data that was signed. * certificate, hash algorithm, and the data that was signed.
*/ */
static BaseType_t prvVerifySignature(char* pcSignerCertificate, static BaseType_t prvVerifySignature( char * pcSignerCertificate,
size_t xSignerCertificateLength, size_t xSignerCertificateLength,
BaseType_t xHashAlgorithm, BaseType_t xHashAlgorithm,
uint8_t* pucHash, uint8_t * pucHash,
size_t xHashLength, size_t xHashLength,
uint8_t* pucSignature, uint8_t * pucSignature,
size_t xSignatureLength) size_t xSignatureLength )
{ {
BaseType_t xResult = pdTRUE; BaseType_t xResult = pdTRUE;
mbedtls_x509_crt xCertCtx; mbedtls_x509_crt xCertCtx;
mbedtls_md_type_t xMbedHashAlg = MBEDTLS_MD_SHA256; mbedtls_md_type_t xMbedHashAlg = MBEDTLS_MD_SHA256;
(void)xHashAlgorithm; ( void ) xHashAlgorithm;
memset(&xCertCtx, 0, sizeof(mbedtls_x509_crt)); memset( &xCertCtx, 0, sizeof( mbedtls_x509_crt ) );
/* /*
* Decode and create a certificate context * Decode and create a certificate context
*/ */
mbedtls_x509_crt_init(&xCertCtx); mbedtls_x509_crt_init( &xCertCtx );
if (0 != mbedtls_x509_crt_parse( if( 0 != mbedtls_x509_crt_parse(
&xCertCtx, (const unsigned char*)pcSignerCertificate, xSignerCertificateLength)) &xCertCtx, ( const unsigned char * ) pcSignerCertificate, xSignerCertificateLength ) )
{ {
xResult = pdFALSE; xResult = pdFALSE;
} }
@ -256,15 +256,15 @@ static BaseType_t prvVerifySignature(char* pcSignerCertificate,
/* /*
* Verify the signature using the public key from the decoded certificate * Verify the signature using the public key from the decoded certificate
*/ */
if (pdTRUE == xResult) if( pdTRUE == xResult )
{ {
if (0 != mbedtls_pk_verify( if( 0 != mbedtls_pk_verify(
&xCertCtx.pk, &xCertCtx.pk,
xMbedHashAlg, xMbedHashAlg,
pucHash, pucHash,
xHashLength, xHashLength,
pucSignature, pucSignature,
xSignatureLength)) xSignatureLength ) )
{ {
xResult = pdFALSE; xResult = pdFALSE;
} }
@ -273,7 +273,7 @@ static BaseType_t prvVerifySignature(char* pcSignerCertificate,
/* /*
* Clean-up * Clean-up
*/ */
mbedtls_x509_crt_free(&xCertCtx); mbedtls_x509_crt_free( &xCertCtx );
return xResult; return xResult;
} }
@ -283,23 +283,23 @@ static BaseType_t prvVerifySignature(char* pcSignerCertificate,
/** /**
* @brief Creates signature verification context. * @brief Creates signature verification context.
*/ */
static BaseType_t prvSignatureVerificationStart(void** ppvContext, static BaseType_t prvSignatureVerificationStart( void ** ppvContext,
BaseType_t xAsymmetricAlgorithm, BaseType_t xAsymmetricAlgorithm,
BaseType_t xHashAlgorithm) BaseType_t xHashAlgorithm )
{ {
BaseType_t xResult = pdTRUE; BaseType_t xResult = pdTRUE;
SignatureVerificationState_t* pxCtx = NULL; SignatureVerificationState_t * pxCtx = NULL;
/* /*
* Allocate the context * Allocate the context
*/ */
if (NULL == (pxCtx = (SignatureVerificationStatePtr_t)pvPortMalloc( if( NULL == ( pxCtx = ( SignatureVerificationStatePtr_t ) pvPortMalloc(
sizeof(*pxCtx)))) /*lint !e9087 Allow casting void* to other types. */ sizeof( *pxCtx ) ) ) ) /*lint !e9087 Allow casting void* to other types. */
{ {
xResult = pdFALSE; xResult = pdFALSE;
} }
if (pdTRUE == xResult) if( pdTRUE == xResult )
{ {
*ppvContext = pxCtx; *ppvContext = pxCtx;
@ -312,8 +312,8 @@ static BaseType_t prvSignatureVerificationStart(void** ppvContext,
/* /*
* Initialize the requested hash type * Initialize the requested hash type
*/ */
mbedtls_sha256_init(&pxCtx->xSHA256Context); mbedtls_sha256_init( &pxCtx->xSHA256Context );
(void)mbedtls_sha256_starts(&pxCtx->xSHA256Context, 0); ( void ) mbedtls_sha256_starts( &pxCtx->xSHA256Context, 0 );
} }
return xResult; return xResult;
@ -322,59 +322,58 @@ static BaseType_t prvSignatureVerificationStart(void** ppvContext,
/** /**
* @brief Adds bytes to an in-progress hash for subsequent signature verification. * @brief Adds bytes to an in-progress hash for subsequent signature verification.
*/ */
static void prvSignatureVerificationUpdate(void* pvContext, static void prvSignatureVerificationUpdate( void * pvContext,
const uint8_t* pucData, const uint8_t * pucData,
size_t xDataLength) size_t xDataLength )
{ {
SignatureVerificationState_t* pxCtx = (SignatureVerificationStatePtr_t)pvContext; /*lint !e9087 Allow casting void* to other types. */ SignatureVerificationState_t * pxCtx = ( SignatureVerificationStatePtr_t ) pvContext; /*lint !e9087 Allow casting void* to other types. */
/* /*
* Add the data to the hash of the requested type * Add the data to the hash of the requested type
*/ */
(void)mbedtls_sha256_update(&pxCtx->xSHA256Context, pucData, xDataLength); ( void ) mbedtls_sha256_update( &pxCtx->xSHA256Context, pucData, xDataLength );
} }
/** /**
* @brief Performs signature verification on a cryptographic hash. * @brief Performs signature verification on a cryptographic hash.
*/ */
static BaseType_t prvSignatureVerificationFinal(void* pvContext, static BaseType_t prvSignatureVerificationFinal( void * pvContext,
char* pcSignerCertificate, char * pcSignerCertificate,
size_t xSignerCertificateLength, size_t xSignerCertificateLength,
uint8_t* pucSignature, uint8_t * pucSignature,
size_t xSignatureLength) size_t xSignatureLength )
{ {
BaseType_t xResult = pdFALSE; BaseType_t xResult = pdFALSE;
if (pvContext != NULL) if( pvContext != NULL )
{ {
SignatureVerificationStatePtr_t pxCtx = (SignatureVerificationStatePtr_t)pvContext; /*lint !e9087 Allow casting void* to other types. */ SignatureVerificationStatePtr_t pxCtx = ( SignatureVerificationStatePtr_t ) pvContext; /*lint !e9087 Allow casting void* to other types. */
uint8_t ucSHA256[SHA256_DIGEST_BYTES]; /* Reserve enough space for the larger for SHA256 results. */ uint8_t ucSHA256[ SHA256_DIGEST_BYTES ]; /* Reserve enough space for the larger for SHA256 results. */
uint8_t* pucHash = NULL; uint8_t * pucHash = NULL;
size_t xHashLength = 0; size_t xHashLength = 0;
if ((pcSignerCertificate != NULL) && if( ( pcSignerCertificate != NULL ) &&
(pucSignature != NULL) && ( pucSignature != NULL ) &&
(xSignerCertificateLength > 0UL) && ( xSignerCertificateLength > 0UL ) &&
(xSignatureLength > 0UL)) ( xSignatureLength > 0UL ) )
{ {
/* /*
* Finish the hash. * Finish the hash.
*/ */
(void)mbedtls_sha256_finish(&pxCtx->xSHA256Context, ucSHA256); ( void ) mbedtls_sha256_finish( &pxCtx->xSHA256Context, ucSHA256 );
pucHash = ucSHA256; pucHash = ucSHA256;
xHashLength = SHA256_DIGEST_BYTES; xHashLength = SHA256_DIGEST_BYTES;
/* /*
* Verify the signature. * Verify the signature.
*/ */
xResult = prvVerifySignature(pcSignerCertificate, xResult = prvVerifySignature( pcSignerCertificate,
xSignerCertificateLength, xSignerCertificateLength,
pxCtx->xHashAlgorithm, pxCtx->xHashAlgorithm,
pucHash, pucHash,
xHashLength, xHashLength,
pucSignature, pucSignature,
xSignatureLength); xSignatureLength );
} }
else else
{ {
@ -384,82 +383,83 @@ static BaseType_t prvSignatureVerificationFinal(void* pvContext,
/* /*
* Clean-up * Clean-up
*/ */
vPortFree(pxCtx); vPortFree( pxCtx );
} }
return xResult; return xResult;
} }
/* Verify the signature of the specified file. */ /* Verify the signature of the specified file. */
OtaPalMainStatus_t xValidateImageSignature(OtaFileContext_t* const C) OtaPalMainStatus_t xValidateImageSignature( OtaFileContext_t * const C )
{ {
OtaPalMainStatus_t eResult = OtaPalSuccess; OtaPalMainStatus_t eResult = OtaPalSuccess;
uint32_t ulBytesRead; uint32_t ulBytesRead;
uint32_t ulSignerCertSize; uint32_t ulSignerCertSize;
uint8_t* pucBuf, * pucSignerCert; uint8_t * pucBuf, * pucSignerCert;
void* pvSigVerifyContext; void * pvSigVerifyContext;
/* Verify an ECDSA-SHA256 signature. */ /* Verify an ECDSA-SHA256 signature. */
if (pdFALSE == prvSignatureVerificationStart(&pvSigVerifyContext, ASYMMETRIC_ALGORITHM_ECDSA, HASH_ALGORITHM_SHA256)) if( pdFALSE == prvSignatureVerificationStart( &pvSigVerifyContext, ASYMMETRIC_ALGORITHM_ECDSA, HASH_ALGORITHM_SHA256 ) )
{ {
eResult = OtaPalSignatureCheckFailed; eResult = OtaPalSignatureCheckFailed;
} }
else else
{
LogInfo( ( "Started %s signature verification, file: %s\r\n",
OTA_JsonFileSignatureKey, ( const char * ) C->pCertFilepath ) );
pucSignerCert = otaPal_ReadAndAssumeCertificate( ( const uint8_t * const ) C->pCertFilepath, &ulSignerCertSize );
if( pucSignerCert != NULL )
{ {
LogInfo(("Started %s signature verification, file: %s\r\n", pucBuf = pvPortMalloc( OTA_PAL_WIN_BUF_SIZE ); /*lint !e9079 Allow conversion. */
OTA_JsonFileSignatureKey, (const char*)C->pCertFilepath));
pucSignerCert = otaPal_ReadAndAssumeCertificate((const uint8_t* const)C->pCertFilepath, &ulSignerCertSize);
if (pucSignerCert != NULL) if( pucBuf != NULL )
{ {
pucBuf = pvPortMalloc( OTA_PAL_WIN_BUF_SIZE ); /*lint !e9079 Allow conversion. */ /* Rewind the received file to the beginning. */
if( fseek( C->pFile, 0L, SEEK_SET ) == 0 ) /*lint !e586
if (pucBuf != NULL) * C standard library call is being used for portability. */
{ {
/* Rewind the received file to the beginning. */ do
if (fseek(C->pFile, 0L, SEEK_SET) == 0) /*lint !e586
* C standard library call is being used for portability. */
{ {
do ulBytesRead = fread( pucBuf, 1, OTA_PAL_WIN_BUF_SIZE, C->pFile ); /*lint !e586
{ * C standard library call is being used for portability. */
ulBytesRead = fread(pucBuf, 1, OTA_PAL_WIN_BUF_SIZE, C->pFile); /*lint !e586 /* Include the file chunk in the signature validation. Zero size is OK. */
* C standard library call is being used for portability. */ prvSignatureVerificationUpdate( pvSigVerifyContext, pucBuf, ulBytesRead );
/* Include the file chunk in the signature validation. Zero size is OK. */ } while( ulBytesRead > 0UL );
prvSignatureVerificationUpdate(pvSigVerifyContext, pucBuf, ulBytesRead);
} while (ulBytesRead > 0UL); if( pdFALSE == prvSignatureVerificationFinal( pvSigVerifyContext,
( char * ) pucSignerCert,
if (pdFALSE == prvSignatureVerificationFinal(pvSigVerifyContext, ( size_t ) ulSignerCertSize,
(char*)pucSignerCert, C->pSignature->data,
(size_t)ulSignerCertSize, C->pSignature->size ) ) /*lint !e732 !e9034 Allow comparison in this context. */
C->pSignature->data,
C->pSignature->size)) /*lint !e732 !e9034 Allow comparison in this context. */
{
eResult = OtaPalSignatureCheckFailed;
}
pvSigVerifyContext = NULL; /* The context has been freed by prvSignatureVerificationFinal(). */
}
else
{ {
/* Nothing special to do. */ eResult = OtaPalSignatureCheckFailed;
} }
/* Free the temporary file page buffer. */ pvSigVerifyContext = NULL; /* The context has been freed by prvSignatureVerificationFinal(). */
vPortFree(pucBuf);
} }
else else
{ {
LogError(("Failed to allocate buffer memory.\r\n")); /* Nothing special to do. */
eResult = OtaPalOutOfMemory;
} }
/* Free the signer certificate that we now own after prvReadAndAssumeCertificate(). */ /* Free the temporary file page buffer. */
vPortFree(pucSignerCert); vPortFree( pucBuf );
} }
else else
{ {
eResult = OtaPalBadSignerCert; LogError( ( "Failed to allocate buffer memory.\r\n" ) );
eResult = OtaPalOutOfMemory;
} }
/* Free the signer certificate that we now own after prvReadAndAssumeCertificate(). */
vPortFree( pucSignerCert );
} }
else
{
eResult = OtaPalBadSignerCert;
}
}
return eResult; return eResult;
} }

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -52,7 +52,7 @@ static OtaPalMainStatus_t otaPal_CheckFileSignature( OtaFileContext_t * const C
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
static inline BaseType_t prvContextValidate( OtaFileContext_t* pFileContext ) static inline BaseType_t prvContextValidate( OtaFileContext_t * pFileContext )
{ {
return( ( pFileContext != NULL ) && return( ( pFileContext != NULL ) &&
( pFileContext->pFile != NULL ) ); /*lint !e9034 Comparison is correct for file pointer type. */ ( pFileContext->pFile != NULL ) ); /*lint !e9034 Comparison is correct for file pointer type. */
@ -63,19 +63,19 @@ static inline BaseType_t prvContextValidate( OtaFileContext_t* pFileContext )
/* Attempt to create a new receive file for the file chunks as they come in. */ /* Attempt to create a new receive file for the file chunks as they come in. */
OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t* const C ) OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t * const C )
{ {
OtaPalMainStatus_t mainErr = OtaPalUninitialized; OtaPalMainStatus_t mainErr = OtaPalUninitialized;
OtaPalSubStatus_t subErr = 0; OtaPalSubStatus_t subErr = 0;
if( C != NULL ) if( C != NULL )
{ {
if ( C->pFilePath != NULL ) if( C->pFilePath != NULL )
{ {
C->pFile = fopen( ( const char * )C->pFilePath, "w+b" ); /*lint !e586 C->pFile = fopen( ( const char * ) C->pFilePath, "w+b" ); /*lint !e586
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
if ( C->pFile != NULL ) if( C->pFile != NULL )
{ {
mainErr = OtaPalSuccess; mainErr = OtaPalSuccess;
LogInfo( ( "Receive file created.\r\n" ) ); LogInfo( ( "Receive file created.\r\n" ) );
@ -99,7 +99,7 @@ OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t* const C )
LogError( ( "ERROR - Invalid file context provided.\r\n" ) ); LogError( ( "ERROR - Invalid file context provided.\r\n" ) );
} }
return OTA_PAL_COMBINE_ERR(mainErr,subErr); return OTA_PAL_COMBINE_ERR( mainErr, subErr );
} }
@ -118,7 +118,7 @@ OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C )
if( NULL != C->pFile ) if( NULL != C->pFile )
{ {
lFileCloseResult = fclose( C->pFile ); /*lint !e482 !e586 lFileCloseResult = fclose( C->pFile ); /*lint !e482 !e586
* Context file handle state is managed by this API. */ * Context file handle state is managed by this API. */
C->pFile = NULL; C->pFile = NULL;
if( 0 == lFileCloseResult ) if( 0 == lFileCloseResult )
@ -145,7 +145,7 @@ OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C )
mainErr = OtaPalFileAbort; mainErr = OtaPalFileAbort;
} }
return OTA_PAL_COMBINE_ERR(mainErr,subErr); return OTA_PAL_COMBINE_ERR( mainErr, subErr );
} }
/* Write a block of data to the specified file. */ /* Write a block of data to the specified file. */
@ -159,12 +159,12 @@ int16_t otaPal_WriteBlock( OtaFileContext_t * const C,
if( prvContextValidate( C ) == pdTRUE ) if( prvContextValidate( C ) == pdTRUE )
{ {
lResult = fseek( C->pFile, ulOffset, SEEK_SET ); /*lint !e586 !e713 !e9034 lResult = fseek( C->pFile, ulOffset, SEEK_SET ); /*lint !e586 !e713 !e9034
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
if( 0 == lResult ) if( 0 == lResult )
{ {
lResult = fwrite( pacData, 1, ulBlockSize, C->pFile ); /*lint !e586 !e713 !e9034 lResult = fwrite( pacData, 1, ulBlockSize, C->pFile ); /*lint !e586 !e713 !e9034
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
if( lResult < 0 ) if( lResult < 0 )
{ {
@ -216,7 +216,7 @@ OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C )
/* Close the file. */ /* Close the file. */
lWindowsError = fclose( C->pFile ); /*lint !e482 !e586 lWindowsError = fclose( C->pFile ); /*lint !e482 !e586
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
C->pFile = NULL; C->pFile = NULL;
if( lWindowsError != 0 ) if( lWindowsError != 0 )
@ -233,11 +233,10 @@ OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C )
else else
{ {
LogError( ( "Failed to pass %s signature verification: %d.\r\n", LogError( ( "Failed to pass %s signature verification: %d.\r\n",
OTA_JsonFileSignatureKey, OTA_PAL_COMBINE_ERR(mainErr,subErr) ) ); OTA_JsonFileSignatureKey, OTA_PAL_COMBINE_ERR( mainErr, subErr ) ) );
/* If we fail to verify the file signature that means the image is not valid. We need to set the image state to aborted. */ /* If we fail to verify the file signature that means the image is not valid. We need to set the image state to aborted. */
otaPal_SetPlatformImageState( C, OtaImageStateAborted ); otaPal_SetPlatformImageState( C, OtaImageStateAborted );
} }
} }
else /* Invalid OTA Context. */ else /* Invalid OTA Context. */
@ -247,17 +246,17 @@ OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C )
mainErr = OtaPalFileClose; mainErr = OtaPalFileClose;
} }
return OTA_PAL_COMBINE_ERR(mainErr,subErr); return OTA_PAL_COMBINE_ERR( mainErr, subErr );
} }
/* Verify the signature of the specified file. */ /* Verify the signature of the specified file. */
static OtaPalMainStatus_t otaPal_CheckFileSignature( OtaFileContext_t* const C ) static OtaPalMainStatus_t otaPal_CheckFileSignature( OtaFileContext_t * const C )
{ {
OtaPalMainStatus_t eResult = OtaPalSignatureCheckFailed; OtaPalMainStatus_t eResult = OtaPalSignatureCheckFailed;
if ( prvContextValidate( C ) == pdTRUE ) if( prvContextValidate( C ) == pdTRUE )
{ {
eResult = xValidateImageSignature( C ); eResult = xValidateImageSignature( C );
} }
@ -271,40 +270,41 @@ static OtaPalMainStatus_t otaPal_CheckFileSignature( OtaFileContext_t* const C )
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t* const pFileContext ) OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t * const pFileContext )
{ {
(void)pFileContext; ( void ) pFileContext;
/* Return no error. Windows implementation does not reset device. */ /* Return no error. Windows implementation does not reset device. */
return OTA_PAL_COMBINE_ERR(OtaPalSuccess,0); return OTA_PAL_COMBINE_ERR( OtaPalSuccess, 0 );
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t* const pFileContext ) OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t * const pFileContext )
{ {
(void)pFileContext; ( void ) pFileContext;
/* Return no error. Windows implementation simply does nothing on activate. /* Return no error. Windows implementation simply does nothing on activate.
* To run the new firmware image, double click the newly downloaded exe */ * To run the new firmware image, double click the newly downloaded exe */
return OTA_PAL_COMBINE_ERR(OtaPalSuccess,0); return OTA_PAL_COMBINE_ERR( OtaPalSuccess, 0 );
} }
/* /*
* Set the final state of the last transferred (final) OTA file (or bundle). * Set the final state of the last transferred (final) OTA file (or bundle).
* On Windows, the state of the OTA image is stored in PlaformImageState.txt. * On Windows, the state of the OTA image is stored in PlatformImageState.txt.
*/ */
OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileContext, OtaImageState_t eState ) OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileContext,
OtaImageState_t eState )
{ {
(void)pFileContext; ( void ) pFileContext;
OtaPalMainStatus_t mainErr = OtaPalSuccess; OtaPalMainStatus_t mainErr = OtaPalSuccess;
OtaPalSubStatus_t subErr = 0; OtaPalSubStatus_t subErr = 0;
FILE * pstPlatformImageState; FILE * pstPlatformImageState;
if( eState != OtaImageStateUnknown && eState <= OtaLastImageState ) if( ( eState != OtaImageStateUnknown ) && ( eState <= OtaLastImageState ) )
{ {
pstPlatformImageState = fopen( "PlatformImageState.txt", "w+b" ); /*lint !e586 pstPlatformImageState = fopen( "PlatformImageState.txt", "w+b" ); /*lint !e586
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
@ -313,7 +313,7 @@ OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileConte
{ {
/* Write the image state to PlatformImageState.txt. */ /* Write the image state to PlatformImageState.txt. */
if( 1 != fwrite( &eState, sizeof( OtaImageState_t ), 1, pstPlatformImageState ) ) /*lint !e586 !e9029 if( 1 != fwrite( &eState, sizeof( OtaImageState_t ), 1, pstPlatformImageState ) ) /*lint !e586 !e9029
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
{ {
LogError( ( "Unable to write to image state file.\r\n" ) ); LogError( ( "Unable to write to image state file.\r\n" ) );
mainErr = OtaPalBadImageState; mainErr = OtaPalBadImageState;
@ -334,14 +334,14 @@ OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileConte
mainErr = OtaPalBadImageState; mainErr = OtaPalBadImageState;
subErr = errno; subErr = errno;
} }
} /*lint !e481 Allow fopen and fclose calls in this context. */ } /*lint !e481 Allow fopen and fclose calls in this context. */
else /* Image state invalid. */ else /* Image state invalid. */
{ {
LogError( ( "ERROR - Invalid image state provided.\r\n" ) ); LogError( ( "ERROR - Invalid image state provided.\r\n" ) );
mainErr = OtaPalBadImageState; mainErr = OtaPalBadImageState;
} }
return OTA_PAL_COMBINE_ERR(mainErr,subErr); return OTA_PAL_COMBINE_ERR( mainErr, subErr );
} }
/* Get the state of the currently running image. /* Get the state of the currently running image.
@ -358,7 +358,7 @@ OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileConte
*/ */
OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileContext ) OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileContext )
{ {
(void)pFileContext; ( void ) pFileContext;
FILE * pstPlatformImageState; FILE * pstPlatformImageState;
OtaImageState_t eSavedAgentState = OtaImageStateUnknown; OtaImageState_t eSavedAgentState = OtaImageStateUnknown;
@ -369,23 +369,25 @@ OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileC
if( pstPlatformImageState != NULL ) if( pstPlatformImageState != NULL )
{ {
if( 1 != fread( &eSavedAgentState, sizeof(OtaImageState_t), 1, pstPlatformImageState ) ) /*lint !e586 !e9029 if( 1 != fread( &eSavedAgentState, sizeof( OtaImageState_t ), 1, pstPlatformImageState ) ) /*lint !e586 !e9029
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
{ {
/* If an error occurred reading the file, mark the state as aborted. */ /* If an error occurred reading the file, mark the state as aborted. */
LogError( ( "Unable to read image state file.\r\n" ) ); LogError( ( "Unable to read image state file.\r\n" ) );
ePalState = ( OtaPalImageStateInvalid | (errno & OTA_PAL_ERR_MASK) ); ePalState = ( OtaPalImageStateInvalid | ( errno & OTA_PAL_ERR_MASK ) );
} }
else else
{ {
switch (eSavedAgentState) switch( eSavedAgentState )
{ {
case OtaImageStateTesting: case OtaImageStateTesting:
ePalState = OtaPalImageStatePendingCommit; ePalState = OtaPalImageStatePendingCommit;
break; break;
case OtaImageStateAccepted: case OtaImageStateAccepted:
ePalState = OtaPalImageStateValid; ePalState = OtaPalImageStateValid;
break; break;
case OtaImageStateRejected: case OtaImageStateRejected:
case OtaImageStateAborted: case OtaImageStateAborted:
default: default:
@ -394,12 +396,11 @@ OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileC
} }
} }
if( 0 != fclose( pstPlatformImageState ) ) /*lint !e586 if( 0 != fclose( pstPlatformImageState ) ) /*lint !e586
* C standard library call is being used for portability. */ * C standard library call is being used for portability. */
{ {
LogError( ( "Unable to close image state file.\r\n" ) ); LogError( ( "Unable to close image state file.\r\n" ) );
ePalState = (OtaPalImageStateInvalid | ( errno & OTA_PAL_ERR_MASK ) ); ePalState = ( OtaPalImageStateInvalid | ( errno & OTA_PAL_ERR_MASK ) );
} }
} }
else else
@ -415,5 +416,5 @@ OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileC
/* Provide access to private members for testing. */ /* Provide access to private members for testing. */
#ifdef FREERTOS_ENABLE_UNIT_TESTS #ifdef FREERTOS_ENABLE_UNIT_TESTS
#include "aws_ota_pal_test_access_define.h" #include "aws_ota_pal_test_access_define.h"
#endif #endif

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -26,7 +26,7 @@
/** /**
* @file ota_pal.h * @file ota_pal.h
* @brief Function declarations for ota_ptal.c. * @brief Function declarations for ota_pal.c.
*/ */
#ifndef _OTA_PAL_H_ #ifndef _OTA_PAL_H_
@ -54,7 +54,7 @@
* OTA_ERR_NONE is returned when aborting access to the open file was successful. * OTA_ERR_NONE is returned when aborting access to the open file was successful.
* OTA_ERR_FILE_ABORT is returned when aborting access to the open file context was unsuccessful. * OTA_ERR_FILE_ABORT is returned when aborting access to the open file context was unsuccessful.
*/ */
OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C ); OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C );
/** /**
* @brief Create a new receive file for the data chunks as they come in. * @brief Create a new receive file for the data chunks as they come in.
@ -79,7 +79,7 @@ OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C );
* OTA_ERR_BOOT_INFO_CREATE_FAILED is returned if the bootloader information file creation fails. * OTA_ERR_BOOT_INFO_CREATE_FAILED is returned if the bootloader information file creation fails.
* OTA_ERR_RX_FILE_CREATE_FAILED is returned for other errors creating the file in the device's non-volatile memory. * OTA_ERR_RX_FILE_CREATE_FAILED is returned for other errors creating the file in the device's non-volatile memory.
*/ */
OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t * const C ); OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t * const C );
/* @brief Authenticate and close the underlying receive file in the specified OTA context. /* @brief Authenticate and close the underlying receive file in the specified OTA context.
* *
@ -104,7 +104,7 @@ OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t * const C );
* OTA_ERR_BAD_SIGNER_CERT is returned for errors in the certificate itself. * OTA_ERR_BAD_SIGNER_CERT is returned for errors in the certificate itself.
* OTA_ERR_FILE_CLOSE is returned when closing the file fails. * OTA_ERR_FILE_CLOSE is returned when closing the file fails.
*/ */
OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C ); OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C );
/** /**
* @brief Write a block of data to the specified file at the given offset. * @brief Write a block of data to the specified file at the given offset.
@ -141,7 +141,7 @@ int16_t otaPal_WriteBlock( OtaFileContext_t * const C,
* @return The OTA PAL layer error code combined with the MCU specific error code. See OTA Agent * @return The OTA PAL layer error code combined with the MCU specific error code. See OTA Agent
* error codes information in ota.h. * error codes information in ota.h.
*/ */
OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t * const C ); OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t * const C );
/** /**
* @brief Reset the device. * @brief Reset the device.
@ -155,7 +155,7 @@ OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t * const C );
* error codes information in ota.h. * error codes information in ota.h.
*/ */
OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t * const C ); OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t * const C );
/** /**
* @brief Attempt to set the state of the OTA update image. * @brief Attempt to set the state of the OTA update image.
@ -176,8 +176,8 @@ OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t * const C );
* OTA_ERR_REJECT_FAILED: failed to roll back the update image as requested by OtaImageStateRejected. * OTA_ERR_REJECT_FAILED: failed to roll back the update image as requested by OtaImageStateRejected.
* OTA_ERR_COMMIT_FAILED: failed to make the update image permanent as requested by OtaImageStateAccepted. * OTA_ERR_COMMIT_FAILED: failed to make the update image permanent as requested by OtaImageStateAccepted.
*/ */
OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const C, OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const C,
OtaImageState_t eState ); OtaImageState_t eState );
/** /**
* @brief Get the state of the OTA update image. * @brief Get the state of the OTA update image.
@ -202,4 +202,4 @@ OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const C,
*/ */
OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const C ); OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const C );
#endif /* ifndef _OTA_PAL_H_ */ #endif /* ifndef _OTA_PAL_H_ */

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -672,7 +672,7 @@ static void prvMQTTAgentTask( void * pParam );
* *
* The implementation uses MQTT agent to queue a publish request. It then waits * The implementation uses MQTT agent to queue a publish request. It then waits
* for the request complete notification from the agent. The notification along with result of the * for the request complete notification from the agent. The notification along with result of the
* operation is sent back to the caller task using xTaksNotify API. For publishes involving QOS 1 and * operation is sent back to the caller task using xTaskNotify API. For publishes involving QOS 1 and
* QOS2 the operation is complete once an acknowledgment (PUBACK) is received. OTA agent uses this function * QOS2 the operation is complete once an acknowledgment (PUBACK) is received. OTA agent uses this function
* to fetch new job, provide status update and send other control related messages to the MQTT broker. * to fetch new job, provide status update and send other control related messages to the MQTT broker.
* *
@ -808,7 +808,7 @@ static void prvMqttDataCallback( void * pContext,
* *
* The callback is not subscribed with MQTT broker, but only with local subscription manager. * The callback is not subscribed with MQTT broker, but only with local subscription manager.
* A wildcard OTA job topic is used for subscription so that all unsolicited messages related to OTA is * A wildcard OTA job topic is used for subscription so that all unsolicited messages related to OTA is
* forwarded to this callback for filteration. Right now the callback is used to filter responses to job requests * forwarded to this callback for filtration. Right now the callback is used to filter responses to job requests
* from the OTA service. * from the OTA service.
* *
* @param[in] pvIncomingPublishCallbackContext MQTT context which stores the connection. * @param[in] pvIncomingPublishCallbackContext MQTT context which stores the connection.
@ -1186,12 +1186,12 @@ static void prvCommandCallback( MQTTAgentCommandContext_t * pxCommandContext,
static void prvMQTTSubscribeCompleteCallback( MQTTAgentCommandContext_t * pxCommandContext, static void prvMQTTSubscribeCompleteCallback( MQTTAgentCommandContext_t * pxCommandContext,
MQTTAgentReturnInfo_t * pxReturnInfo ) MQTTAgentReturnInfo_t * pxReturnInfo )
{ {
MQTTAgentSubscribeArgs_t * pSubsribeArgs; MQTTAgentSubscribeArgs_t * pSubscribeArgs;
if( pxReturnInfo->returnCode == MQTTSuccess ) if( pxReturnInfo->returnCode == MQTTSuccess )
{ {
pSubsribeArgs = ( MQTTAgentSubscribeArgs_t * ) ( pxCommandContext->pArgs ); pSubscribeArgs = ( MQTTAgentSubscribeArgs_t * ) ( pxCommandContext->pArgs );
prvRegisterOTACallback( pSubsribeArgs->pSubscribeInfo->pTopicFilter, pSubsribeArgs->pSubscribeInfo->topicFilterLength ); prvRegisterOTACallback( pSubscribeArgs->pSubscribeInfo->pTopicFilter, pSubscribeArgs->pSubscribeInfo->topicFilterLength );
} }
/* Store the result in the application defined context so the task that /* Store the result in the application defined context so the task that
@ -1431,41 +1431,43 @@ static BaseType_t prvSocketConnect( NetworkContext_t * pxNetworkContext )
NetworkCredentials_t xNetworkCredentials = { 0 }; NetworkCredentials_t xNetworkCredentials = { 0 };
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER ) #if defined( democonfigUSE_AWS_IOT_CORE_BROKER )
#if defined( democonfigCLIENT_USERNAME ) #if defined( democonfigCLIENT_USERNAME )
/*
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
* to AWS IoT Core with Custom Authentication on port 443.
*
* Custom Authentication uses the contents of the username and password
* fields of the MQTT CONNECT packet to authenticate the client.
*
* For more information, refer to the documentation at:
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
*/
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
#if democonfigMQTT_BROKER_PORT != 443U
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
#endif /* democonfigMQTT_BROKER_PORT != 443U */
#else /* if !defined( democonfigCLIENT_USERNAME ) */
/*
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
* x509 Certificate Authentication.
*/
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
#endif /* !defined( democonfigCLIENT_USERNAME ) */
/* /*
* An ALPN identifier is only required when connecting to AWS IoT core on port 443. * When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
* https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html * to AWS IoT Core with Custom Authentication on port 443.
*
* Custom Authentication uses the contents of the username and password
* fields of the MQTT CONNECT packet to authenticate the client.
*
* For more information, refer to the documentation at:
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
*/ */
#if democonfigMQTT_BROKER_PORT == 443U static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
xNetworkCredentials.pAlpnProtos = ppcAlpnProtocols; #if democonfigMQTT_BROKER_PORT != 443U
#elif democonfigMQTT_BROKER_PORT == 8883U #error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
xNetworkCredentials.pAlpnProtos = NULL;
#else /* democonfigMQTT_BROKER_PORT != 8883U */
xNetworkCredentials.pAlpnProtos = NULL;
#error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883."
#endif /* democonfigMQTT_BROKER_PORT != 443U */ #endif /* democonfigMQTT_BROKER_PORT != 443U */
#else /* if !defined( democonfigCLIENT_USERNAME ) */
/*
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
* x509 Certificate Authentication.
*/
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
#endif /* !defined( democonfigCLIENT_USERNAME ) */
/*
* An ALPN identifier is only required when connecting to AWS IoT core on port 443.
* https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
*/
#if democonfigMQTT_BROKER_PORT == 443U
xNetworkCredentials.pAlpnProtos = ppcAlpnProtocols;
#elif democonfigMQTT_BROKER_PORT == 8883U
xNetworkCredentials.pAlpnProtos = NULL;
#else /* democonfigMQTT_BROKER_PORT != 8883U */
xNetworkCredentials.pAlpnProtos = NULL;
#error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883."
#endif /* democonfigMQTT_BROKER_PORT != 443U */
#else /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */ #else /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
xNetworkCredentials.pAlpnProtos = NULL; xNetworkCredentials.pAlpnProtos = NULL;
#endif /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */ #endif /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
@ -2501,7 +2503,7 @@ static BaseType_t prvRunOTADemo( void )
} }
/** /**
* Remvove callback for receiving messages intended for OTA agent from broker, * Remove callback for receiving messages intended for OTA agent from broker,
* for which the topic has not been subscribed for. * for which the topic has not been subscribed for.
*/ */
removeSubscription( ( SubscriptionElement_t * ) xGlobalMqttAgentContext.pIncomingCallbackContext, removeSubscription( ( SubscriptionElement_t * ) xGlobalMqttAgentContext.pIncomingCallbackContext,

@ -1,249 +1,249 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32"> <ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64"> <ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release|x64"> <ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
</ProjectConfiguration> </ProjectConfiguration>
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion> <VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<ProjectGuid>{4be4e103-5bf4-4a85-9656-ec20852a2b8e}</ProjectGuid> <ProjectGuid>{4be4e103-5bf4-4a85-9656-ec20852a2b8e}</ProjectGuid>
<RootNamespace>OtaOverHttpDemo</RootNamespace> <RootNamespace>OtaOverHttpDemo</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
</ImportGroup> </ImportGroup>
<ImportGroup Label="Shared"> <ImportGroup Label="Shared">
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
<TargetName>RTOSDemo</TargetName> <TargetName>RTOSDemo</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<TargetName>RTOSDemo</TargetName> <TargetName>RTOSDemo</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
<TargetName>RTOSDemo</TargetName> <TargetName>RTOSDemo</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<TargetName>RTOSDemo</TargetName> <TargetName>RTOSDemo</TargetName>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;_DEBUG;_CONSOLE;WIN32;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;_DEBUG;_CONSOLE;WIN32;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;WIN32;NDEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;WIN32;NDEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;_DEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;_DEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;NDEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;NDEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\coreHTTP\coreHTTP.vcxproj"> <ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\coreHTTP\coreHTTP.vcxproj">
<Project>{ee39fa0f-cefb-4c29-a571-05a28fdd47fd}</Project> <Project>{ee39fa0f-cefb-4c29-a571-05a28fdd47fd}</Project>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj"> <ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj">
<Project>{c90e6cc5-818b-4c97-8876-0986d989387c}</Project> <Project>{c90e6cc5-818b-4c97-8876-0986d989387c}</Project>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj"> <ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj">
<Project>{72c209c4-49a4-4942-a201-44706c9d77ec}</Project> <Project>{72c209c4-49a4-4942-a201-44706c9d77ec}</Project>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\Logging\Logging.vcxproj"> <ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\Logging\Logging.vcxproj">
<Project>{be362ac0-b10b-4276-b84e-6304652ba228}</Project> <Project>{be362ac0-b10b-4276-b84e-6304652ba228}</Project>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\MbedTLS\MbedTLS.vcxproj"> <ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\MbedTLS\MbedTLS.vcxproj">
<Project>{e1016f3e-94e9-4864-9fd8-1d7c1fefbfd7}</Project> <Project>{e1016f3e-94e9-4864-9fd8-1d7c1fefbfd7}</Project>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\core_mqtt_agent.c" /> <ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\core_mqtt_agent.c" />
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\core_mqtt_agent_command_functions.c" /> <ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\core_mqtt_agent_command_functions.c" />
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt.c" /> <ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt.c" />
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt_serializer.c" /> <ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt_serializer.c" />
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt_state.c" /> <ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt_state.c" />
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\mbedtls_bio_tcp_sockets_wrapper.c" /> <ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\mbedtls_bio_tcp_sockets_wrapper.c" />
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\ports\freertos_plus_tcp\tcp_sockets_wrapper.c" /> <ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\ports\freertos_plus_tcp\tcp_sockets_wrapper.c" />
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\transport_mbedtls.c" /> <ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\transport_mbedtls.c" />
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota.c" /> <ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota.c" />
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_base64.c" /> <ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_base64.c" />
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_cbor.c" /> <ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_cbor.c" />
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_http.c" /> <ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_http.c" />
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_interface.c" /> <ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_interface.c" />
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_mqtt.c" /> <ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_mqtt.c" />
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\portable\os\ota_os_freertos.c" /> <ClCompile Include="..\..\..\..\Source\AWS\ota\source\portable\os\ota_os_freertos.c" />
<ClCompile Include="..\..\..\..\Source\coreJSON\source\core_json.c" /> <ClCompile Include="..\..\..\..\Source\coreJSON\source\core_json.c" />
<ClCompile Include="..\..\..\..\Source\Utilities\backoff_algorithm\source\backoff_algorithm.c" /> <ClCompile Include="..\..\..\..\Source\Utilities\backoff_algorithm\source\backoff_algorithm.c" />
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborencoder.c" /> <ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborencoder.c" />
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborencoder_close_container_checked.c" /> <ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborencoder_close_container_checked.c" />
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborerrorstrings.c" /> <ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborerrorstrings.c" />
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborparser.c" /> <ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborparser.c" />
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborparser_dup_string.c" /> <ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborparser_dup_string.c" />
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborpretty.c" /> <ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborpretty.c" />
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborpretty_stdio.c" /> <ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborpretty_stdio.c" />
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborvalidation.c" /> <ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborvalidation.c" />
<ClCompile Include="..\..\..\Common\coreMQTT_Agent_Interface\freertos_agent_message.c" /> <ClCompile Include="..\..\..\Common\coreMQTT_Agent_Interface\freertos_agent_message.c" />
<ClCompile Include="..\..\..\Common\coreMQTT_Agent_Interface\freertos_command_pool.c" /> <ClCompile Include="..\..\..\Common\coreMQTT_Agent_Interface\freertos_command_pool.c" />
<ClCompile Include="..\Common\HTTP_Utils\http_demo_utils.c" /> <ClCompile Include="..\Common\HTTP_Utils\http_demo_utils.c" />
<ClCompile Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\code_signature_verification_mbedtls.c" /> <ClCompile Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\code_signature_verification_mbedtls.c" />
<ClCompile Include="..\Common\Ota_PAL\Win32\ota_pal.c" /> <ClCompile Include="..\Common\Ota_PAL\Win32\ota_pal.c" />
<ClCompile Include="..\Common\subscription-manager\subscription_manager.c" /> <ClCompile Include="..\Common\subscription-manager\subscription_manager.c" />
<ClCompile Include="DemoTasks\OtaOverHttpDemoExample.c" /> <ClCompile Include="DemoTasks\OtaOverHttpDemoExample.c" />
<ClCompile Include="main.c" /> <ClCompile Include="main.c" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent_command_functions.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent_command_functions.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent_message_interface.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent_message_interface.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_config_defaults.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_config_defaults.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_serializer.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_serializer.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_state.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_state.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface\transport_interface.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface\transport_interface.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\mbedtls_bio_tcp_sockets_wrapper.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\mbedtls_bio_tcp_sockets_wrapper.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include\tcp_sockets_wrapper.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include\tcp_sockets_wrapper.h" />
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\transport_mbedtls.h" /> <ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\transport_mbedtls.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_appversion32.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_appversion32.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_base64_private.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_base64_private.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_cbor_private.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_cbor_private.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_config_defaults.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_config_defaults.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_http_interface.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_http_interface.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_http_private.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_http_private.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_interface_private.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_interface_private.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_mqtt_interface.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_mqtt_interface.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_mqtt_private.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_mqtt_private.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_os_interface.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_os_interface.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_platform_interface.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_platform_interface.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_private.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_private.h" />
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\portable\os\ota_os_freertos.h" /> <ClInclude Include="..\..\..\..\Source\AWS\ota\source\portable\os\ota_os_freertos.h" />
<ClInclude Include="..\..\..\..\Source\coreJSON\source\include\core_json.h" /> <ClInclude Include="..\..\..\..\Source\coreJSON\source\include\core_json.h" />
<ClInclude Include="..\..\..\..\Source\Utilities\backoff_algorithm\source\include\backoff_algorithm.h" /> <ClInclude Include="..\..\..\..\Source\Utilities\backoff_algorithm\source\include\backoff_algorithm.h" />
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cbor.h" /> <ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cbor.h" />
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cborinternal_p.h" /> <ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cborinternal_p.h" />
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cborjson.h" /> <ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cborjson.h" />
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\compilersupport_p.h" /> <ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\compilersupport_p.h" />
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\tinycbor-version.h" /> <ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\tinycbor-version.h" />
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\utf8_p.h" /> <ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\utf8_p.h" />
<ClInclude Include="..\..\..\Common\coreMQTT_Agent_Interface\include\freertos_agent_message.h" /> <ClInclude Include="..\..\..\Common\coreMQTT_Agent_Interface\include\freertos_agent_message.h" />
<ClInclude Include="..\..\..\Common\coreMQTT_Agent_Interface\include\freertos_command_pool.h" /> <ClInclude Include="..\..\..\Common\coreMQTT_Agent_Interface\include\freertos_command_pool.h" />
<ClInclude Include="..\Common\HTTP_Utils\http_demo_utils.h" /> <ClInclude Include="..\Common\HTTP_Utils\http_demo_utils.h" />
<ClInclude Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\aws_ota_codesigner_certificate.h" /> <ClInclude Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\aws_ota_codesigner_certificate.h" />
<ClInclude Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\code_signature_verification.h" /> <ClInclude Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\code_signature_verification.h" />
<ClInclude Include="..\Common\Ota_PAL\Win32\ota_pal.h" /> <ClInclude Include="..\Common\Ota_PAL\Win32\ota_pal.h" />
<ClInclude Include="..\Common\subscription-manager\subscription_manager.h" /> <ClInclude Include="..\Common\subscription-manager\subscription_manager.h" />
<ClInclude Include="core_mqtt_config.h" /> <ClInclude Include="core_mqtt_config.h" />
<ClInclude Include="demo_config.h" /> <ClInclude Include="demo_config.h" />
<ClInclude Include="ota_config.h" /> <ClInclude Include="ota_config.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>
</Project> </Project>

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="Source Files"> <Filter Include="Source Files">

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -23,7 +23,7 @@
* https://github.com/FreeRTOS * https://github.com/FreeRTOS
* *
*/ */
#ifndef CORE_MQTT_CONFIG_H #ifndef CORE_MQTT_CONFIG_H
#define CORE_MQTT_CONFIG_H #define CORE_MQTT_CONFIG_H
@ -76,33 +76,34 @@ extern void vLoggingPrintf( const char * pcFormatString,
*/ */
#define MQTT_STATE_ARRAY_MAX_COUNT 10U #define MQTT_STATE_ARRAY_MAX_COUNT 10U
/*********************** coreMQTT Agent Configurations **********************/ /*********************** coreMQTT Agent Configurations **********************/
/**
* @brief The maximum number of pending acknowledgments to track for a single /**
* connection. * @brief The maximum number of pending acknowledgments to track for a single
* * connection.
* @note The MQTT agent tracks MQTT commands (such as PUBLISH and SUBSCRIBE) th *
* at are still waiting to be acknowledged. MQTT_AGENT_MAX_OUTSTANDING_ACKS set * @note The MQTT agent tracks MQTT commands (such as PUBLISH and SUBSCRIBE) th
* the maximum number of acknowledgments that can be outstanding at any one time. * at are still waiting to be acknowledged. MQTT_AGENT_MAX_OUTSTANDING_ACKS set
* The higher this number is the greater the agent's RAM consumption will be. * the maximum number of acknowledgments that can be outstanding at any one time.
*/ * The higher this number is the greater the agent's RAM consumption will be.
*/
#define MQTT_AGENT_MAX_OUTSTANDING_ACKS ( 20U ) #define MQTT_AGENT_MAX_OUTSTANDING_ACKS ( 20U )
/** /**
* @brief Time in MS that the MQTT agent task will wait in the Blocked state (so * @brief Time in MS that the MQTT agent task will wait in the Blocked state (so
* not using any CPU time) for a command to arrive in its command queue before * not using any CPU time) for a command to arrive in its command queue before
* exiting the blocked state so it can call MQTT_ProcessLoop(). * exiting the blocked state so it can call MQTT_ProcessLoop().
* *
* @note It is important MQTT_ProcessLoop() is called often if there is known * @note It is important MQTT_ProcessLoop() is called often if there is known
* MQTT traffic, but calling it too often can take processing time away from * MQTT traffic, but calling it too often can take processing time away from
* lower priority tasks and waste CPU time and power. * lower priority tasks and waste CPU time and power.
*/ */
#define MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME ( 1000 ) #define MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME ( 1000 )
/** /**
* @brief The number of command structures to allocate in the pool * @brief The number of command structures to allocate in the pool
* for the agent. * for the agent.
*/ */
#define MQTT_COMMAND_CONTEXTS_POOL_SIZE 10 #define MQTT_COMMAND_CONTEXTS_POOL_SIZE 10

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -179,8 +179,8 @@ extern void vLoggingPrintf( const char * pcFormatString,
* can be set to following - * can be set to following -
* Enable data over MQTT - ( OTA_DATA_OVER_MQTT ) * Enable data over MQTT - ( OTA_DATA_OVER_MQTT )
* Enable data over HTTP - ( OTA_DATA_OVER_HTTP) * Enable data over HTTP - ( OTA_DATA_OVER_HTTP)
* *
* Note - Please check the OTA over MQTT demo which has the MQTT data transfer functionality and * Note - Please check the OTA over MQTT demo which has the MQTT data transfer functionality and
* and this configuration is set to OTA_DATA_OVER_MQTT. * and this configuration is set to OTA_DATA_OVER_MQTT.
*/ */
#define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_HTTP ) #define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_HTTP )

@ -1,116 +1,116 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134 VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ota_Over_Http_Demo", "Ota_Over_Http_Demo.vcxproj", "{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ota_Over_Http_Demo", "Ota_Over_Http_Demo.vcxproj", "{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Statically Linked Libraries", "Statically Linked Libraries", "{9799AFF4-25E2-43CD-8829-C066177E3748}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Statically Linked Libraries", "Statically Linked Libraries", "{9799AFF4-25E2-43CD-8829-C066177E3748}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeRTOS+TCP", "..\..\..\..\VisualStudio_StaticProjects\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj", "{C90E6CC5-818B-4C97-8876-0986D989387C}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeRTOS+TCP", "..\..\..\..\VisualStudio_StaticProjects\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj", "{C90E6CC5-818B-4C97-8876-0986D989387C}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ww", "..\..\..\..\VisualStudio_StaticProjects\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj", "{72C209C4-49A4-4942-A201-44706C9D77EC}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ww", "..\..\..\..\VisualStudio_StaticProjects\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj", "{72C209C4-49A4-4942-A201-44706C9D77EC}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Logging", "..\..\..\..\VisualStudio_StaticProjects\Logging\Logging.vcxproj", "{BE362AC0-B10B-4276-B84E-6304652BA228}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Logging", "..\..\..\..\VisualStudio_StaticProjects\Logging\Logging.vcxproj", "{BE362AC0-B10B-4276-B84E-6304652BA228}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MbedTLS", "..\..\..\..\VisualStudio_StaticProjects\MbedTLS\MbedTLS.vcxproj", "{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MbedTLS", "..\..\..\..\VisualStudio_StaticProjects\MbedTLS\MbedTLS.vcxproj", "{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "coreHTTP", "..\..\..\..\VisualStudio_StaticProjects\coreHTTP\coreHTTP.vcxproj", "{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "coreHTTP", "..\..\..\..\VisualStudio_StaticProjects\coreHTTP\coreHTTP.vcxproj", "{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
Debug|x86 = Debug|x86 Debug|x86 = Debug|x86
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
Release|x64 = Release|x64 Release|x64 = Release|x64
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|Win32.ActiveCfg = Debug|Win32 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|Win32.ActiveCfg = Debug|Win32
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|Win32.Build.0 = Debug|Win32 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|Win32.Build.0 = Debug|Win32
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x64.ActiveCfg = Debug|x64 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x64.ActiveCfg = Debug|x64
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x64.Build.0 = Debug|x64 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x64.Build.0 = Debug|x64
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x86.ActiveCfg = Debug|Win32 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x86.ActiveCfg = Debug|Win32
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x86.Build.0 = Debug|Win32 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x86.Build.0 = Debug|Win32
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|Win32.ActiveCfg = Release|Win32 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|Win32.ActiveCfg = Release|Win32
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|Win32.Build.0 = Release|Win32 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|Win32.Build.0 = Release|Win32
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x64.ActiveCfg = Release|x64 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x64.ActiveCfg = Release|x64
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x64.Build.0 = Release|x64 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x64.Build.0 = Release|x64
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x86.ActiveCfg = Release|Win32 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x86.ActiveCfg = Release|Win32
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x86.Build.0 = Release|Win32 {4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x86.Build.0 = Release|Win32
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|Win32.ActiveCfg = Debug|Win32 {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|Win32.ActiveCfg = Debug|Win32
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|Win32.Build.0 = Debug|Win32 {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|Win32.Build.0 = Debug|Win32
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.ActiveCfg = Debug|x64 {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.ActiveCfg = Debug|x64
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.Build.0 = Debug|x64 {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.Build.0 = Debug|x64
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.ActiveCfg = Debug|Win32 {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.ActiveCfg = Debug|Win32
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.Build.0 = Debug|Win32 {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.Build.0 = Debug|Win32
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|Win32.ActiveCfg = Release|Win32 {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|Win32.ActiveCfg = Release|Win32
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|Win32.Build.0 = Release|Win32 {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|Win32.Build.0 = Release|Win32
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.ActiveCfg = Release|x64 {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.ActiveCfg = Release|x64
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.Build.0 = Release|x64 {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.Build.0 = Release|x64
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.ActiveCfg = Release|Win32 {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.ActiveCfg = Release|Win32
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.Build.0 = Release|Win32 {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.Build.0 = Release|Win32
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|Win32.ActiveCfg = Debug|Win32 {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|Win32.ActiveCfg = Debug|Win32
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|Win32.Build.0 = Debug|Win32 {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|Win32.Build.0 = Debug|Win32
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.ActiveCfg = Debug|x64 {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.ActiveCfg = Debug|x64
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.Build.0 = Debug|x64 {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.Build.0 = Debug|x64
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.ActiveCfg = Debug|Win32 {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.ActiveCfg = Debug|Win32
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.Build.0 = Debug|Win32 {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.Build.0 = Debug|Win32
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|Win32.ActiveCfg = Release|Win32 {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|Win32.ActiveCfg = Release|Win32
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|Win32.Build.0 = Release|Win32 {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|Win32.Build.0 = Release|Win32
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.ActiveCfg = Release|x64 {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.ActiveCfg = Release|x64
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.Build.0 = Release|x64 {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.Build.0 = Release|x64
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.ActiveCfg = Release|Win32 {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.ActiveCfg = Release|Win32
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.Build.0 = Release|Win32 {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.Build.0 = Release|Win32
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|Win32.ActiveCfg = Debug|Win32 {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|Win32.ActiveCfg = Debug|Win32
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|Win32.Build.0 = Debug|Win32 {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|Win32.Build.0 = Debug|Win32
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.ActiveCfg = Debug|x64 {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.ActiveCfg = Debug|x64
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.Build.0 = Debug|x64 {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.Build.0 = Debug|x64
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.ActiveCfg = Debug|Win32 {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.ActiveCfg = Debug|Win32
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.Build.0 = Debug|Win32 {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.Build.0 = Debug|Win32
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|Win32.ActiveCfg = Release|Win32 {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|Win32.ActiveCfg = Release|Win32
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|Win32.Build.0 = Release|Win32 {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|Win32.Build.0 = Release|Win32
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.ActiveCfg = Release|x64 {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.ActiveCfg = Release|x64
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.Build.0 = Release|x64 {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.Build.0 = Release|x64
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.ActiveCfg = Release|Win32 {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.ActiveCfg = Release|Win32
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.Build.0 = Release|Win32 {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.Build.0 = Release|Win32
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|Win32.ActiveCfg = Debug|Win32 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|Win32.ActiveCfg = Debug|Win32
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|Win32.Build.0 = Debug|Win32 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|Win32.Build.0 = Debug|Win32
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.ActiveCfg = Debug|x64 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.ActiveCfg = Debug|x64
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.Build.0 = Debug|x64 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.Build.0 = Debug|x64
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.ActiveCfg = Debug|Win32 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.ActiveCfg = Debug|Win32
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.Build.0 = Debug|Win32 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.Build.0 = Debug|Win32
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|Win32.ActiveCfg = Release|Win32 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|Win32.ActiveCfg = Release|Win32
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|Win32.Build.0 = Release|Win32 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|Win32.Build.0 = Release|Win32
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.ActiveCfg = Release|x64 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.ActiveCfg = Release|x64
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.Build.0 = Release|x64 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.Build.0 = Release|x64
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.ActiveCfg = Release|Win32 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.ActiveCfg = Release|Win32
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.Build.0 = Release|Win32 {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.Build.0 = Release|Win32
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|Win32.ActiveCfg = Debug|Win32 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|Win32.ActiveCfg = Debug|Win32
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|Win32.Build.0 = Debug|Win32 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|Win32.Build.0 = Debug|Win32
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x64.ActiveCfg = Debug|x64 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x64.ActiveCfg = Debug|x64
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x64.Build.0 = Debug|x64 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x64.Build.0 = Debug|x64
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x86.ActiveCfg = Debug|Win32 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x86.ActiveCfg = Debug|Win32
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x86.Build.0 = Debug|Win32 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x86.Build.0 = Debug|Win32
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|Win32.ActiveCfg = Release|Win32 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|Win32.ActiveCfg = Release|Win32
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|Win32.Build.0 = Release|Win32 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|Win32.Build.0 = Release|Win32
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x64.ActiveCfg = Release|x64 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x64.ActiveCfg = Release|x64
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x64.Build.0 = Release|x64 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x64.Build.0 = Release|x64
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x86.ActiveCfg = Release|Win32 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x86.ActiveCfg = Release|Win32
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x86.Build.0 = Release|Win32 {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x86.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
{C90E6CC5-818B-4C97-8876-0986D989387C} = {9799AFF4-25E2-43CD-8829-C066177E3748} {C90E6CC5-818B-4C97-8876-0986D989387C} = {9799AFF4-25E2-43CD-8829-C066177E3748}
{72C209C4-49A4-4942-A201-44706C9D77EC} = {9799AFF4-25E2-43CD-8829-C066177E3748} {72C209C4-49A4-4942-A201-44706C9D77EC} = {9799AFF4-25E2-43CD-8829-C066177E3748}
{BE362AC0-B10B-4276-B84E-6304652BA228} = {9799AFF4-25E2-43CD-8829-C066177E3748} {BE362AC0-B10B-4276-B84E-6304652BA228} = {9799AFF4-25E2-43CD-8829-C066177E3748}
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7} = {9799AFF4-25E2-43CD-8829-C066177E3748} {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7} = {9799AFF4-25E2-43CD-8829-C066177E3748}
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD} = {9799AFF4-25E2-43CD-8829-C066177E3748} {EE39FA0F-CEFB-4C29-A571-05A28FDD47FD} = {9799AFF4-25E2-43CD-8829-C066177E3748}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {03800DFF-BAFA-4654-8E51-C4E654A54416} SolutionGuid = {03800DFF-BAFA-4654-8E51-C4E654A54416}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -304,13 +304,13 @@
#ifndef democonfigCLIENT_IDENTIFIER #ifndef democonfigCLIENT_IDENTIFIER
/** /**
* @brief The MQTT client identifier used in this example. Each client identifier * @brief The MQTT client identifier used in this example. Each client identifier
* must be unique so edit as required to ensure no two clients connecting to the * must be unique so edit as required to ensure no two clients connecting to the
* same broker use the same client identifier. Using a #define is for convenience * same broker use the same client identifier. Using a #define is for convenience
* of demonstration only - production devices should use something unique to the * of demonstration only - production devices should use something unique to the
* device that can be read from software - such as a production serial number. * device that can be read from software - such as a production serial number.
*/ */
#error "Please define democonfigCLIENT_IDENTIFIER in demo_config.h to something unique for this device." #error "Please define democonfigCLIENT_IDENTIFIER in demo_config.h to something unique for this device."
#endif #endif
@ -320,14 +320,14 @@
#error "Please define Root CA certificate of the MQTT broker(democonfigROOT_CA_PEM) in demo_config.h." #error "Please define Root CA certificate of the MQTT broker(democonfigROOT_CA_PEM) in demo_config.h."
#endif #endif
/* If no username is defined, then a client certificate/key is required. */ /* If no username is defined, then a client certificate/key is required. */
#ifndef democonfigCLIENT_USERNAME #ifndef democonfigCLIENT_USERNAME
/* /*
*!!! Please note democonfigCLIENT_PRIVATE_KEY_PEM in used for *!!! Please note democonfigCLIENT_PRIVATE_KEY_PEM in used for
*!!! convenience of demonstration only. Production devices should *!!! convenience of demonstration only. Production devices should
*!!! store keys securely, such as within a secure element. *!!! store keys securely, such as within a secure element.
*/ */
#ifndef democonfigCLIENT_CERTIFICATE_PEM #ifndef democonfigCLIENT_CERTIFICATE_PEM
#error "Please define client certificate(democonfigCLIENT_CERTIFICATE_PEM) in demo_config.h." #error "Please define client certificate(democonfigCLIENT_CERTIFICATE_PEM) in demo_config.h."
@ -337,14 +337,14 @@
#endif #endif
#else #else
/* If a username is defined, a client password also would need to be defined for /* If a username is defined, a client password also would need to be defined for
* client authentication. */ * client authentication. */
#ifndef democonfigCLIENT_PASSWORD #ifndef democonfigCLIENT_PASSWORD
#error "Please define client password(democonfigCLIENT_PASSWORD) in demo_config.h for client authentication based on username/password." #error "Please define client password(democonfigCLIENT_PASSWORD) in demo_config.h for client authentication based on username/password."
#endif #endif
/* AWS IoT MQTT broker port needs to be 443 for client authentication based on /* AWS IoT MQTT broker port needs to be 443 for client authentication based on
* username/password. */ * username/password. */
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER ) && democonfigMQTT_BROKER_PORT != 443 #if defined( democonfigUSE_AWS_IOT_CORE_BROKER ) && democonfigMQTT_BROKER_PORT != 443
#error "Broker port(democonfigMQTT_BROKER_PORT) should be defined as 443 in demo_config.h for client authentication based on username/password in AWS IoT Core." #error "Broker port(democonfigMQTT_BROKER_PORT) should be defined as 443 in demo_config.h for client authentication based on username/password in AWS IoT Core."
#endif #endif
@ -529,7 +529,7 @@ static void prvMQTTAgentTask( void * pParam );
* *
* The implementation uses MQTT agent to queue a publish request. It then waits * The implementation uses MQTT agent to queue a publish request. It then waits
* for the request complete notification from the agent. The notification along with result of the * for the request complete notification from the agent. The notification along with result of the
* operation is sent back to the caller task using xTaksNotify API. For publishes involving QOS 1 and * operation is sent back to the caller task using xTaskNotify API. For publishes involving QOS 1 and
* QOS2 the operation is complete once an acknowledgment (PUBACK) is received. OTA agent uses this function * QOS2 the operation is complete once an acknowledgment (PUBACK) is received. OTA agent uses this function
* to fetch new job, provide status update and send other control related messages to the MQTT broker. * to fetch new job, provide status update and send other control related messages to the MQTT broker.
* *
@ -593,7 +593,7 @@ static OtaMqttStatus_t prvMQTTUnsubscribe( const char * pTopicFilter,
* within ota_config.h. This function is used to fetch a free buffer from the pool for processing * within ota_config.h. This function is used to fetch a free buffer from the pool for processing
* by the OTA agent task. It uses a mutex for thread safe access to the pool. * by the OTA agent task. It uses a mutex for thread safe access to the pool.
* *
* @return A pointer to an unusued buffer. NULL if there are no buffers available. * @return A pointer to an unused buffer. NULL if there are no buffers available.
*/ */
static OtaEventData_t * prvOTAEventBufferGet( void ); static OtaEventData_t * prvOTAEventBufferGet( void );
@ -667,7 +667,7 @@ static void prvMqttDataCallback( void * pContext,
* *
* The callback is not subscribed with MQTT broker, but only with local subscription manager. * The callback is not subscribed with MQTT broker, but only with local subscription manager.
* A wildcard OTA job topic is used for subscription so that all unsolicited messages related to OTA is * A wildcard OTA job topic is used for subscription so that all unsolicited messages related to OTA is
* forwarded to this callback for filteration. Right now the callback is used to filter responses to job requests * forwarded to this callback for filtration. Right now the callback is used to filter responses to job requests
* from the OTA service. * from the OTA service.
* *
* @param[in] pvIncomingPublishCallbackContext MQTT context which stores the connection. * @param[in] pvIncomingPublishCallbackContext MQTT context which stores the connection.
@ -1043,12 +1043,12 @@ static void prvCommandCallback( MQTTAgentCommandContext_t * pxCommandContext,
static void prvMQTTSubscribeCompleteCallback( MQTTAgentCommandContext_t * pxCommandContext, static void prvMQTTSubscribeCompleteCallback( MQTTAgentCommandContext_t * pxCommandContext,
MQTTAgentReturnInfo_t * pxReturnInfo ) MQTTAgentReturnInfo_t * pxReturnInfo )
{ {
MQTTAgentSubscribeArgs_t * pSubsribeArgs; MQTTAgentSubscribeArgs_t * pSubscribeArgs;
if( pxReturnInfo->returnCode == MQTTSuccess ) if( pxReturnInfo->returnCode == MQTTSuccess )
{ {
pSubsribeArgs = ( MQTTAgentSubscribeArgs_t * ) ( pxCommandContext->pArgs ); pSubscribeArgs = ( MQTTAgentSubscribeArgs_t * ) ( pxCommandContext->pArgs );
prvRegisterOTACallback( pSubsribeArgs->pSubscribeInfo->pTopicFilter, pSubsribeArgs->pSubscribeInfo->topicFilterLength ); prvRegisterOTACallback( pSubscribeArgs->pSubscribeInfo->pTopicFilter, pSubscribeArgs->pSubscribeInfo->topicFilterLength );
} }
/* Store the result in the application defined context so the task that /* Store the result in the application defined context so the task that
@ -1288,42 +1288,43 @@ static BaseType_t prvSocketConnect( NetworkContext_t * pxNetworkContext )
NetworkCredentials_t xNetworkCredentials = { 0 }; NetworkCredentials_t xNetworkCredentials = { 0 };
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER ) #if defined( democonfigUSE_AWS_IOT_CORE_BROKER )
#if defined( democonfigCLIENT_USERNAME ) #if defined( democonfigCLIENT_USERNAME )
/*
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
* to AWS IoT Core with Custom Authentication on port 443.
*
* Custom Authentication uses the contents of the username and password
* fields of the MQTT CONNECT packet to authenticate the client.
*
* For more information, refer to the documentation at:
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
*/
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
#if democonfigMQTT_BROKER_PORT != 443U
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
#endif /* democonfigMQTT_BROKER_PORT != 443U */
#else /* if !defined( democonfigCLIENT_USERNAME ) */
/*
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
* x509 Certificate Authentication.
*/
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
#endif /* !defined( democonfigCLIENT_USERNAME ) */
/* /*
* An ALPN identifier is only required when connecting to AWS IoT core on port 443. * When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
* https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html * to AWS IoT Core with Custom Authentication on port 443.
*/ *
#if democonfigMQTT_BROKER_PORT == 443U * Custom Authentication uses the contents of the username and password
xNetworkCredentials.pAlpnProtos = ppcAlpnProtocols; * fields of the MQTT CONNECT packet to authenticate the client.
#elif democonfigMQTT_BROKER_PORT == 8883U *
xNetworkCredentials.pAlpnProtos = NULL; * For more information, refer to the documentation at:
#else /* democonfigMQTT_BROKER_PORT != 8883U */ * https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
xNetworkCredentials.pAlpnProtos = NULL; */
#error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883." static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
#if democonfigMQTT_BROKER_PORT != 443U
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
#endif /* democonfigMQTT_BROKER_PORT != 443U */ #endif /* democonfigMQTT_BROKER_PORT != 443U */
#else /* if !defined( democonfigCLIENT_USERNAME ) */
/*
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
* x509 Certificate Authentication.
*/
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
#endif /* !defined( democonfigCLIENT_USERNAME ) */
/*
* An ALPN identifier is only required when connecting to AWS IoT core on port 443.
* https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
*/
#if democonfigMQTT_BROKER_PORT == 443U
xNetworkCredentials.pAlpnProtos = ppcAlpnProtocols;
#elif democonfigMQTT_BROKER_PORT == 8883U
xNetworkCredentials.pAlpnProtos = NULL;
#else /* democonfigMQTT_BROKER_PORT != 8883U */
xNetworkCredentials.pAlpnProtos = NULL;
#error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883."
#endif /* democonfigMQTT_BROKER_PORT != 443U */
#else /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */ #else /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
xNetworkCredentials.pAlpnProtos = NULL; xNetworkCredentials.pAlpnProtos = NULL;
#endif /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */ #endif /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
@ -2037,7 +2038,7 @@ static BaseType_t prvRunOTADemo( void )
} }
/** /**
* Remvove callback for receiving messages intended for OTA agent from broker, * Remove callback for receiving messages intended for OTA agent from broker,
* for which the topic has not been subscribed for. * for which the topic has not been subscribed for.
*/ */
removeSubscription( ( SubscriptionElement_t * ) xGlobalMqttAgentContext.pIncomingCallbackContext, removeSubscription( ( SubscriptionElement_t * ) xGlobalMqttAgentContext.pIncomingCallbackContext,
@ -2086,6 +2087,7 @@ void vOtaDemoTask( void * pvParam )
if( xPlatformIsNetworkUp() == pdFALSE ) if( xPlatformIsNetworkUp() == pdFALSE )
{ {
LogInfo( ( "Waiting for the network link up event..." ) ); LogInfo( ( "Waiting for the network link up event..." ) );
while( xPlatformIsNetworkUp() == pdFALSE ) while( xPlatformIsNetworkUp() == pdFALSE )
{ {
vTaskDelay( pdMS_TO_TICKS( 1000U ) ); vTaskDelay( pdMS_TO_TICKS( 1000U ) );

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="Source Files"> <Filter Include="Source Files">

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -23,7 +23,7 @@
* https://github.com/FreeRTOS * https://github.com/FreeRTOS
* *
*/ */
#ifndef CORE_MQTT_CONFIG_H #ifndef CORE_MQTT_CONFIG_H
#define CORE_MQTT_CONFIG_H #define CORE_MQTT_CONFIG_H
@ -76,33 +76,34 @@ extern void vLoggingPrintf( const char * pcFormatString,
*/ */
#define MQTT_STATE_ARRAY_MAX_COUNT 10U #define MQTT_STATE_ARRAY_MAX_COUNT 10U
/*********************** coreMQTT Agent Configurations **********************/ /*********************** coreMQTT Agent Configurations **********************/
/**
* @brief The maximum number of pending acknowledgments to track for a single /**
* connection. * @brief The maximum number of pending acknowledgments to track for a single
* * connection.
* @note The MQTT agent tracks MQTT commands (such as PUBLISH and SUBSCRIBE) th *
* at are still waiting to be acknowledged. MQTT_AGENT_MAX_OUTSTANDING_ACKS set * @note The MQTT agent tracks MQTT commands (such as PUBLISH and SUBSCRIBE) th
* the maximum number of acknowledgments that can be outstanding at any one time. * at are still waiting to be acknowledged. MQTT_AGENT_MAX_OUTSTANDING_ACKS set
* The higher this number is the greater the agent's RAM consumption will be. * the maximum number of acknowledgments that can be outstanding at any one time.
*/ * The higher this number is the greater the agent's RAM consumption will be.
*/
#define MQTT_AGENT_MAX_OUTSTANDING_ACKS ( 20U ) #define MQTT_AGENT_MAX_OUTSTANDING_ACKS ( 20U )
/** /**
* @brief Time in MS that the MQTT agent task will wait in the Blocked state (so * @brief Time in MS that the MQTT agent task will wait in the Blocked state (so
* not using any CPU time) for a command to arrive in its command queue before * not using any CPU time) for a command to arrive in its command queue before
* exiting the blocked state so it can call MQTT_ProcessLoop(). * exiting the blocked state so it can call MQTT_ProcessLoop().
* *
* @note It is important MQTT_ProcessLoop() is called often if there is known * @note It is important MQTT_ProcessLoop() is called often if there is known
* MQTT traffic, but calling it too often can take processing time away from * MQTT traffic, but calling it too often can take processing time away from
* lower priority tasks and waste CPU time and power. * lower priority tasks and waste CPU time and power.
*/ */
#define MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME ( 1000 ) #define MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME ( 1000 )
/** /**
* @brief The number of command structures to allocate in the pool * @brief The number of command structures to allocate in the pool
* for the agent. * for the agent.
*/ */
#define MQTT_COMMAND_CONTEXTS_POOL_SIZE 10 #define MQTT_COMMAND_CONTEXTS_POOL_SIZE 10

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in

@ -1,6 +1,6 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
@ -179,8 +179,8 @@ extern void vLoggingPrintf( const char * pcFormatString,
* can be set to following - * can be set to following -
* Enable data over MQTT - ( OTA_DATA_OVER_MQTT ) * Enable data over MQTT - ( OTA_DATA_OVER_MQTT )
* Enable data over HTTP - ( OTA_DATA_OVER_HTTP) * Enable data over HTTP - ( OTA_DATA_OVER_HTTP)
* *
* Note - Please check the OTA over HTTP demo which has the HTTP data transfer functionality and * Note - Please check the OTA over HTTP demo which has the HTTP data transfer functionality and
* and this configuration is set to OTA_DATA_OVER_HTTP. * and this configuration is set to OTA_DATA_OVER_HTTP.
*/ */
#define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_MQTT ) #define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_MQTT )

@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134 VisualStudioVersion = 16.0.31205.134

@ -1,5 +1,5 @@
[{000214A0-0000-0000-C000-000000000046}] [{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2 Prop3=19,2
[InternetShortcut] [InternetShortcut]
URL=http://www.freertos.org/labs URL=http://www.freertos.org/labs
IDList= IDList=

@ -1,372 +1,385 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://github.com/FreeRTOS * https://github.com/FreeRTOS
* *
*/ */
/* Standard includes. */ /* Standard includes. */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/* FreeRTOS includes. */ /* FreeRTOS includes. */
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
/* FreeRTOS+TCP includes. */ /* FreeRTOS+TCP includes. */
#include "FreeRTOS_IP.h" #include "FreeRTOS_IP.h"
#include "FreeRTOS_Sockets.h" #include "FreeRTOS_Sockets.h"
#include "FreeRTOS_TCP_server.h" #include "FreeRTOS_TCP_server.h"
#include "FreeRTOS_server_private.h" #include "FreeRTOS_server_private.h"
/* Remove the entire file if TCP is not being used. */ /* Remove the entire file if TCP is not being used. */
#if( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) ) #if ( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) )
#if !defined( ARRAY_SIZE ) #if !defined( ARRAY_SIZE )
#define ARRAY_SIZE(x) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] ) #define ARRAY_SIZE( x ) ( BaseType_t ) ( sizeof( x ) / sizeof( x )[ 0 ] )
#endif #endif
static void prvReceiveNewClient( TCPServer_t *pxServer, BaseType_t xIndex, Socket_t xNexSocket ); static void prvReceiveNewClient( TCPServer_t * pxServer,
static char *strnew( const char *pcString ); BaseType_t xIndex,
/* Remove slashes at the end of a path. */ Socket_t xNexSocket );
static void prvRemoveSlash( char *pcDir ); static char * strnew( const char * pcString );
/* Remove slashes at the end of a path. */
TCPServer_t *FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG *pxConfigs, BaseType_t xCount ) static void prvRemoveSlash( char * pcDir );
{
TCPServer_t *pxServer; TCPServer_t * FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG * pxConfigs,
SocketSet_t xSocketSet; BaseType_t xCount )
{
/* Create a new server. TCPServer_t * pxServer;
xPort / xPortAlt : Make the service available on 1 or 2 public port numbers. */ SocketSet_t xSocketSet;
xSocketSet = FreeRTOS_CreateSocketSet();
/* Create a new server.
if( xSocketSet != NULL ) * xPort / xPortAlt : Make the service available on 1 or 2 public port numbers. */
{ xSocketSet = FreeRTOS_CreateSocketSet();
BaseType_t xSize;
if( xSocketSet != NULL )
xSize = sizeof( *pxServer ) - sizeof( pxServer->xServers ) + xCount * sizeof( pxServer->xServers[ 0 ] ); {
BaseType_t xSize;
pxServer = ( TCPServer_t * ) pvPortMallocLarge( xSize );
if( pxServer != NULL ) xSize = sizeof( *pxServer ) - sizeof( pxServer->xServers ) + xCount * sizeof( pxServer->xServers[ 0 ] );
{
struct freertos_sockaddr xAddress; pxServer = ( TCPServer_t * ) pvPortMallocLarge( xSize );
BaseType_t xNoTimeout = 0;
BaseType_t xIndex; if( pxServer != NULL )
{
memset( pxServer, '\0', xSize ); struct freertos_sockaddr xAddress;
pxServer->xServerCount = xCount; BaseType_t xNoTimeout = 0;
pxServer->xSocketSet = xSocketSet; BaseType_t xIndex;
for( xIndex = 0; xIndex < xCount; xIndex++ ) memset( pxServer, '\0', xSize );
{ pxServer->xServerCount = xCount;
BaseType_t xPortNumber = pxConfigs[ xIndex ].xPortNumber; pxServer->xSocketSet = xSocketSet;
if( xPortNumber > 0 ) for( xIndex = 0; xIndex < xCount; xIndex++ )
{ {
Socket_t xSocket; BaseType_t xPortNumber = pxConfigs[ xIndex ].xPortNumber;
xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP ); if( xPortNumber > 0 )
FreeRTOS_printf( ( "TCP socket on port %d\n", ( int )xPortNumber ) ); {
Socket_t xSocket;
if( xSocket != FREERTOS_INVALID_SOCKET )
{ xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) FreeRTOS_printf( ( "TCP socket on port %d\n", ( int ) xPortNumber ) );
{
xAddress.sin_address.ulIP_IPv4 = FreeRTOS_GetIPAddress(); /* Single NIC, currently not used */ if( xSocket != FREERTOS_INVALID_SOCKET )
} {
#else #if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
{ {
xAddress.sin_addr = FreeRTOS_GetIPAddress(); /* Single NIC, currently not used */ xAddress.sin_address.ulIP_IPv4 = FreeRTOS_GetIPAddress(); /* Single NIC, currently not used */
} }
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ #else
{
xAddress.sin_port = FreeRTOS_htons( xPortNumber ); xAddress.sin_addr = FreeRTOS_GetIPAddress(); /* Single NIC, currently not used */
xAddress.sin_family = FREERTOS_AF_INET; }
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
FreeRTOS_bind( xSocket, &xAddress, sizeof( xAddress ) );
FreeRTOS_listen( xSocket, pxConfigs[ xIndex ].xBackLog ); xAddress.sin_port = FreeRTOS_htons( xPortNumber );
xAddress.sin_family = FREERTOS_AF_INET;
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) ); FreeRTOS_bind( xSocket, &xAddress, sizeof( xAddress ) );
FreeRTOS_listen( xSocket, pxConfigs[ xIndex ].xBackLog );
#if( ipconfigHTTP_RX_BUFSIZE > 0 )
{ FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
if( pxConfigs[ xIndex ].eType == eSERVER_HTTP ) FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
{
WinProperties_t xWinProps; #if ( ipconfigHTTP_RX_BUFSIZE > 0 )
{
memset( &xWinProps, '\0', sizeof( xWinProps ) ); if( pxConfigs[ xIndex ].eType == eSERVER_HTTP )
/* The parent socket itself won't get connected. The properties below {
will be inherited by each new child socket. */ WinProperties_t xWinProps;
xWinProps.lTxBufSize = ipconfigHTTP_TX_BUFSIZE;
xWinProps.lTxWinSize = ipconfigHTTP_TX_WINSIZE; memset( &xWinProps, '\0', sizeof( xWinProps ) );
xWinProps.lRxBufSize = ipconfigHTTP_RX_BUFSIZE;
xWinProps.lRxWinSize = ipconfigHTTP_RX_WINSIZE; /* The parent socket itself won't get connected. The properties below
* will be inherited by each new child socket. */
/* Set the window and buffer sizes. */ xWinProps.lTxBufSize = ipconfigHTTP_TX_BUFSIZE;
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) ); xWinProps.lTxWinSize = ipconfigHTTP_TX_WINSIZE;
} xWinProps.lRxBufSize = ipconfigHTTP_RX_BUFSIZE;
} xWinProps.lRxWinSize = ipconfigHTTP_RX_WINSIZE;
#endif
/* Set the window and buffer sizes. */
FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ|eSELECT_EXCEPT ); FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
pxServer->xServers[ xIndex ].xSocket = xSocket; }
pxServer->xServers[ xIndex ].eType = pxConfigs[ xIndex ].eType; }
pxServer->xServers[ xIndex ].pcRootDir = strnew( pxConfigs[ xIndex ].pcRootDir ); #endif /* if ( ipconfigHTTP_RX_BUFSIZE > 0 ) */
prvRemoveSlash( ( char * ) pxServer->xServers[ xIndex ].pcRootDir );
} FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ | eSELECT_EXCEPT );
} pxServer->xServers[ xIndex ].xSocket = xSocket;
} pxServer->xServers[ xIndex ].eType = pxConfigs[ xIndex ].eType;
} pxServer->xServers[ xIndex ].pcRootDir = strnew( pxConfigs[ xIndex ].pcRootDir );
else prvRemoveSlash( ( char * ) pxServer->xServers[ xIndex ].pcRootDir );
{ }
/* Could not allocate the server, delete the socket set */ }
FreeRTOS_DeleteSocketSet( xSocketSet ); }
} }
} else
else {
{ /* Could not allocate the server, delete the socket set */
/* Could not create a socket set, return NULL */ FreeRTOS_DeleteSocketSet( xSocketSet );
pxServer = NULL; }
} }
else
return pxServer; {
} /* Could not create a socket set, return NULL */
/*-----------------------------------------------------------*/ pxServer = NULL;
}
static void prvReceiveNewClient( TCPServer_t *pxServer, BaseType_t xIndex, Socket_t xNexSocket )
{ return pxServer;
TCPClient_t *pxClient = NULL; }
BaseType_t xSize = 0; /*-----------------------------------------------------------*/
FTCPWorkFunction fWorkFunc = NULL;
FTCPDeleteFunction fDeleteFunc = NULL; static void prvReceiveNewClient( TCPServer_t * pxServer,
const char *pcType = "Unknown"; BaseType_t xIndex,
Socket_t xNexSocket )
/*_RB_ Can the work and delete functions be part of the xSERVER_CONFIG structure {
becomes generic, with no pre-processing required? */ TCPClient_t * pxClient = NULL;
#if( ipconfigUSE_HTTP != 0 ) BaseType_t xSize = 0;
{ FTCPWorkFunction fWorkFunc = NULL;
if( pxServer->xServers[ xIndex ].eType == eSERVER_HTTP ) FTCPDeleteFunction fDeleteFunc = NULL;
{ const char * pcType = "Unknown";
xSize = sizeof( HTTPClient_t );
fWorkFunc = xHTTPClientWork; /*_RB_ Can the work and delete functions be part of the xSERVER_CONFIG structure
fDeleteFunc = vHTTPClientDelete; * becomes generic, with no pre-processing required? */
pcType = "HTTP"; #if ( ipconfigUSE_HTTP != 0 )
} {
} if( pxServer->xServers[ xIndex ].eType == eSERVER_HTTP )
#endif /* ipconfigUSE_HTTP != 0 */ {
xSize = sizeof( HTTPClient_t );
#if( ipconfigUSE_FTP != 0 ) fWorkFunc = xHTTPClientWork;
{ fDeleteFunc = vHTTPClientDelete;
if( pxServer->xServers[ xIndex ].eType == eSERVER_FTP ) pcType = "HTTP";
{ }
xSize = sizeof( FTPClient_t ); }
fWorkFunc = xFTPClientWork; #endif /* ipconfigUSE_HTTP != 0 */
fDeleteFunc = vFTPClientDelete;
pcType = "FTP"; #if ( ipconfigUSE_FTP != 0 )
} {
} if( pxServer->xServers[ xIndex ].eType == eSERVER_FTP )
#endif /* ipconfigUSE_FTP != 0 */ {
xSize = sizeof( FTPClient_t );
/* Malloc enough space for a new HTTP-client */ fWorkFunc = xFTPClientWork;
if( xSize ) fDeleteFunc = vFTPClientDelete;
{ pcType = "FTP";
pxClient = ( TCPClient_t* ) pvPortMallocLarge( xSize ); }
} }
#endif /* ipconfigUSE_FTP != 0 */
if( pxClient != NULL )
{ /* Malloc enough space for a new HTTP-client */
memset( pxClient, '\0', xSize ); if( xSize )
{
/* Put the new client in front of the list. */ pxClient = ( TCPClient_t * ) pvPortMallocLarge( xSize );
pxClient->eType = pxServer->xServers[ xIndex ].eType; }
pxClient->pcRootDir = pxServer->xServers[ xIndex ].pcRootDir;
pxClient->pxParent = pxServer; if( pxClient != NULL )
pxClient->xSocket = xNexSocket; {
pxClient->pxNextClient = pxServer->pxClients; memset( pxClient, '\0', xSize );
pxClient->fWorkFunction = fWorkFunc;
pxClient->fDeleteFunction = fDeleteFunc; /* Put the new client in front of the list. */
pxServer->pxClients = pxClient; pxClient->eType = pxServer->xServers[ xIndex ].eType;
pxClient->pcRootDir = pxServer->xServers[ xIndex ].pcRootDir;
FreeRTOS_FD_SET( xNexSocket, pxServer->xSocketSet, eSELECT_READ|eSELECT_EXCEPT ); pxClient->pxParent = pxServer;
} pxClient->xSocket = xNexSocket;
else pxClient->pxNextClient = pxServer->pxClients;
{ pxClient->fWorkFunction = fWorkFunc;
pcType = "closed"; pxClient->fDeleteFunction = fDeleteFunc;
FreeRTOS_closesocket( xNexSocket ); pxServer->pxClients = pxClient;
}
{ FreeRTOS_FD_SET( xNexSocket, pxServer->xSocketSet, eSELECT_READ | eSELECT_EXCEPT );
struct freertos_sockaddr xRemoteAddress; }
FreeRTOS_GetRemoteAddress( pxClient->xSocket, &xRemoteAddress ); else
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) {
{ pcType = "closed";
FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, (unsigned)FreeRTOS_ntohl( xRemoteAddress.sin_address.ulIP_IPv4 ) ) ); FreeRTOS_closesocket( xNexSocket );
} }
#else
{ {
FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, (unsigned)FreeRTOS_ntohl( xRemoteAddress.sin_addr ) ) ); struct freertos_sockaddr xRemoteAddress;
} FreeRTOS_GetRemoteAddress( pxClient->xSocket, &xRemoteAddress );
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ #if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
} {
FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, ( unsigned ) FreeRTOS_ntohl( xRemoteAddress.sin_address.ulIP_IPv4 ) ) );
/* Remove compiler warnings in case FreeRTOS_printf() is not used. */ }
( void ) pcType; #else
} {
/*-----------------------------------------------------------*/ FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, ( unsigned ) FreeRTOS_ntohl( xRemoteAddress.sin_addr ) ) );
}
void FreeRTOS_TCPServerWork( TCPServer_t *pxServer, TickType_t xBlockingTime ) #endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
{ }
TCPClient_t **ppxClient;
BaseType_t xIndex; /* Remove compiler warnings in case FreeRTOS_printf() is not used. */
BaseType_t xRc; ( void ) pcType;
}
/* Let the server do one working cycle */ /*-----------------------------------------------------------*/
xRc = FreeRTOS_select( pxServer->xSocketSet, xBlockingTime );
void FreeRTOS_TCPServerWork( TCPServer_t * pxServer,
if( xRc != 0 ) TickType_t xBlockingTime )
{ {
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ ) TCPClient_t ** ppxClient;
{ BaseType_t xIndex;
struct freertos_sockaddr xAddress; BaseType_t xRc;
Socket_t xNexSocket;
socklen_t xSocketLength; /* Let the server do one working cycle */
xRc = FreeRTOS_select( pxServer->xSocketSet, xBlockingTime );
if( pxServer->xServers[ xIndex ].xSocket == FREERTOS_NO_SOCKET )
{ if( xRc != 0 )
continue; {
} for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
{
xSocketLength = sizeof( xAddress ); struct freertos_sockaddr xAddress;
xNexSocket = FreeRTOS_accept( pxServer->xServers[ xIndex ].xSocket, &xAddress, &xSocketLength); Socket_t xNexSocket;
socklen_t xSocketLength;
if( ( xNexSocket != FREERTOS_NO_SOCKET ) && ( xNexSocket != FREERTOS_INVALID_SOCKET ) )
{ if( pxServer->xServers[ xIndex ].xSocket == FREERTOS_NO_SOCKET )
prvReceiveNewClient( pxServer, xIndex, xNexSocket ); {
} continue;
} }
}
xSocketLength = sizeof( xAddress );
ppxClient = &pxServer->pxClients; xNexSocket = FreeRTOS_accept( pxServer->xServers[ xIndex ].xSocket, &xAddress, &xSocketLength );
while( ( * ppxClient ) != NULL ) if( ( xNexSocket != FREERTOS_NO_SOCKET ) && ( xNexSocket != FREERTOS_INVALID_SOCKET ) )
{ {
TCPClient_t *pxThis = *ppxClient; prvReceiveNewClient( pxServer, xIndex, xNexSocket );
}
/* Almost C++ */ }
xRc = pxThis->fWorkFunction( pxThis ); }
if (xRc < 0 ) ppxClient = &pxServer->pxClients;
{
*ppxClient = pxThis->pxNextClient; while( ( *ppxClient ) != NULL )
/* Close handles, resources */ {
pxThis->fDeleteFunction( pxThis ); TCPClient_t * pxThis = *ppxClient;
/* Free the space */
vPortFreeLarge( pxThis ); /* Almost C++ */
} xRc = pxThis->fWorkFunction( pxThis );
else
{ if( xRc < 0 )
ppxClient = &( pxThis->pxNextClient ); {
} *ppxClient = pxThis->pxNextClient;
} /* Close handles, resources */
} pxThis->fDeleteFunction( pxThis );
/*-----------------------------------------------------------*/ /* Free the space */
vPortFreeLarge( pxThis );
static char *strnew( const char *pcString ) }
{ else
BaseType_t xLength; {
char *pxBuffer; ppxClient = &( pxThis->pxNextClient );
}
xLength = strlen( pcString ) + 1; }
pxBuffer = ( char * ) pvPortMalloc( xLength ); }
if( pxBuffer != NULL ) /*-----------------------------------------------------------*/
{
memcpy( pxBuffer, pcString, xLength ); static char * strnew( const char * pcString )
} {
BaseType_t xLength;
return pxBuffer; char * pxBuffer;
}
/*-----------------------------------------------------------*/ xLength = strlen( pcString ) + 1;
pxBuffer = ( char * ) pvPortMalloc( xLength );
static void prvRemoveSlash( char *pcDir )
{ if( pxBuffer != NULL )
BaseType_t xLength = strlen( pcDir ); {
memcpy( pxBuffer, pcString, xLength );
while( ( xLength > 0 ) && ( pcDir[ xLength - 1 ] == '/' ) ) }
{
pcDir[ --xLength ] = '\0'; return pxBuffer;
} }
} /*-----------------------------------------------------------*/
/*-----------------------------------------------------------*/
static void prvRemoveSlash( char * pcDir )
#if( ipconfigSUPPORT_SIGNALS != 0 ) {
BaseType_t xLength = strlen( pcDir );
/* FreeRTOS_TCPServerWork() calls select().
The two functions below provide a possibility to interrupt while( ( xLength > 0 ) && ( pcDir[ xLength - 1 ] == '/' ) )
the call to select(). After the interruption, resume {
by calling FreeRTOS_TCPServerWork() again. */ pcDir[ --xLength ] = '\0';
BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t *pxServer ) }
{ }
BaseType_t xIndex; /*-----------------------------------------------------------*/
BaseType_t xResult = pdFALSE;
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ ) #if ( ipconfigSUPPORT_SIGNALS != 0 )
{
if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET ) /* FreeRTOS_TCPServerWork() calls select().
{ * The two functions below provide a possibility to interrupt
FreeRTOS_SignalSocket( pxServer->xServers[ xIndex ].xSocket ); * the call to select(). After the interruption, resume
xResult = pdTRUE; * by calling FreeRTOS_TCPServerWork() again. */
break; BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t * pxServer )
} {
} BaseType_t xIndex;
BaseType_t xResult = pdFALSE;
return xResult;
} for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
{
#endif /* ipconfigSUPPORT_SIGNALS */ if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
/*-----------------------------------------------------------*/ {
FreeRTOS_SignalSocket( pxServer->xServers[ xIndex ].xSocket );
#if( ipconfigSUPPORT_SIGNALS != 0 ) xResult = pdTRUE;
break;
/* Same as above: this function may be called from an ISR, }
for instance a GPIO interrupt. */ }
BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t *pxServer, BaseType_t *pxHigherPriorityTaskWoken )
{ return xResult;
BaseType_t xIndex; }
BaseType_t xResult = pdFALSE;
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ ) #endif /* ipconfigSUPPORT_SIGNALS */
{ /*-----------------------------------------------------------*/
if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
{ #if ( ipconfigSUPPORT_SIGNALS != 0 )
FreeRTOS_SignalSocketFromISR( pxServer->xServers[ xIndex ].xSocket, pxHigherPriorityTaskWoken );
xResult = pdTRUE; /* Same as above: this function may be called from an ISR,
break; * for instance a GPIO interrupt. */
} BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t * pxServer,
} BaseType_t * pxHigherPriorityTaskWoken )
{
return xResult; BaseType_t xIndex;
} BaseType_t xResult = pdFALSE;
#endif /* ipconfigSUPPORT_SIGNALS */
/*-----------------------------------------------------------*/ for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
{
#endif /* ( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) ) */ if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
{
FreeRTOS_SignalSocketFromISR( pxServer->xServers[ xIndex ].xSocket, pxHigherPriorityTaskWoken );
xResult = pdTRUE;
break;
}
}
return xResult;
}
#endif /* ipconfigSUPPORT_SIGNALS */
/*-----------------------------------------------------------*/
#endif /* ( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) ) */

@ -1,74 +1,75 @@
/* /*
* FreeRTOS+TCP V2.0.3 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://aws.amazon.com/freertos * https://www.FreeRTOS.org
* https://www.FreeRTOS.org * https://github.com/FreeRTOS
*/ *
*/
/* FreeRTOS includes. */
#include "FreeRTOS.h" /* FreeRTOS includes. */
#include "FreeRTOS.h"
/* FreeRTOS+TCP includes. */
#include "FreeRTOS_FTP_commands.h" /* FreeRTOS+TCP includes. */
#include "FreeRTOS_FTP_commands.h"
const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ] =
{ const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ] =
/* cmdLen cmdName[7] cmdType checkLogin checkNullArg */ {
{ 4, "USER", ECMD_USER, pdFALSE, pdFALSE }, /* cmdLen cmdName[7] cmdType checkLogin checkNullArg */
{ 4, "PASS", ECMD_PASS, pdFALSE, pdFALSE }, { 4, "USER", ECMD_USER, pdFALSE, pdFALSE },
{ 4, "ACCT", ECMD_ACCT, pdTRUE, pdFALSE }, { 4, "PASS", ECMD_PASS, pdFALSE, pdFALSE },
{ 3, "CWD", ECMD_CWD, pdTRUE, pdTRUE }, { 4, "ACCT", ECMD_ACCT, pdTRUE, pdFALSE },
{ 4, "CDUP", ECMD_CDUP, pdTRUE, pdFALSE }, { 3, "CWD", ECMD_CWD, pdTRUE, pdTRUE },
{ 4, "SMNT", ECMD_SMNT, pdTRUE, pdFALSE }, { 4, "CDUP", ECMD_CDUP, pdTRUE, pdFALSE },
{ 4, "QUIT", ECMD_QUIT, pdTRUE, pdFALSE }, { 4, "SMNT", ECMD_SMNT, pdTRUE, pdFALSE },
{ 4, "REIN", ECMD_REIN, pdTRUE, pdFALSE }, { 4, "QUIT", ECMD_QUIT, pdTRUE, pdFALSE },
{ 4, "PORT", ECMD_PORT, pdTRUE, pdFALSE }, { 4, "REIN", ECMD_REIN, pdTRUE, pdFALSE },
{ 4, "PASV", ECMD_PASV, pdTRUE, pdFALSE }, { 4, "PORT", ECMD_PORT, pdTRUE, pdFALSE },
{ 4, "TYPE", ECMD_TYPE, pdTRUE, pdFALSE }, { 4, "PASV", ECMD_PASV, pdTRUE, pdFALSE },
{ 4, "STRU", ECMD_STRU, pdTRUE, pdFALSE }, { 4, "TYPE", ECMD_TYPE, pdTRUE, pdFALSE },
{ 4, "MODE", ECMD_MODE, pdTRUE, pdFALSE }, { 4, "STRU", ECMD_STRU, pdTRUE, pdFALSE },
{ 4, "RETR", ECMD_RETR, pdTRUE, pdTRUE }, { 4, "MODE", ECMD_MODE, pdTRUE, pdFALSE },
{ 4, "STOR", ECMD_STOR, pdTRUE, pdTRUE }, { 4, "RETR", ECMD_RETR, pdTRUE, pdTRUE },
{ 4, "STOU", ECMD_STOU, pdTRUE, pdFALSE }, { 4, "STOR", ECMD_STOR, pdTRUE, pdTRUE },
{ 4, "APPE", ECMD_APPE, pdTRUE, pdFALSE }, { 4, "STOU", ECMD_STOU, pdTRUE, pdFALSE },
{ 4, "ALLO", ECMD_ALLO, pdTRUE, pdFALSE }, { 4, "APPE", ECMD_APPE, pdTRUE, pdFALSE },
{ 4, "REST", ECMD_REST, pdTRUE, pdFALSE }, { 4, "ALLO", ECMD_ALLO, pdTRUE, pdFALSE },
{ 4, "RNFR", ECMD_RNFR, pdTRUE, pdTRUE }, { 4, "REST", ECMD_REST, pdTRUE, pdFALSE },
{ 4, "RNTO", ECMD_RNTO, pdTRUE, pdTRUE }, { 4, "RNFR", ECMD_RNFR, pdTRUE, pdTRUE },
{ 4, "ABOR", ECMD_ABOR, pdTRUE, pdFALSE }, { 4, "RNTO", ECMD_RNTO, pdTRUE, pdTRUE },
{ 4, "SIZE", ECMD_SIZE, pdTRUE, pdTRUE }, { 4, "ABOR", ECMD_ABOR, pdTRUE, pdFALSE },
{ 4, "MDTM", ECMD_MDTM, pdTRUE, pdTRUE }, { 4, "SIZE", ECMD_SIZE, pdTRUE, pdTRUE },
{ 4, "DELE", ECMD_DELE, pdTRUE, pdTRUE }, { 4, "MDTM", ECMD_MDTM, pdTRUE, pdTRUE },
{ 3, "RMD", ECMD_RMD, pdTRUE, pdTRUE }, { 4, "DELE", ECMD_DELE, pdTRUE, pdTRUE },
{ 3, "MKD", ECMD_MKD, pdTRUE, pdTRUE }, { 3, "RMD", ECMD_RMD, pdTRUE, pdTRUE },
{ 3, "PWD", ECMD_PWD, pdTRUE, pdFALSE }, { 3, "MKD", ECMD_MKD, pdTRUE, pdTRUE },
{ 4, "LIST", ECMD_LIST, pdTRUE, pdFALSE }, { 3, "PWD", ECMD_PWD, pdTRUE, pdFALSE },
{ 4, "NLST", ECMD_NLST, pdTRUE, pdFALSE }, { 4, "LIST", ECMD_LIST, pdTRUE, pdFALSE },
{ 4, "SITE", ECMD_SITE, pdTRUE, pdFALSE }, { 4, "NLST", ECMD_NLST, pdTRUE, pdFALSE },
{ 4, "SYST", ECMD_SYST, pdFALSE, pdFALSE }, { 4, "SITE", ECMD_SITE, pdTRUE, pdFALSE },
{ 4, "FEAT", ECMD_FEAT, pdFALSE, pdFALSE }, { 4, "SYST", ECMD_SYST, pdFALSE, pdFALSE },
{ 4, "STAT", ECMD_STAT, pdTRUE, pdFALSE }, { 4, "FEAT", ECMD_FEAT, pdFALSE, pdFALSE },
{ 4, "HELP", ECMD_HELP, pdFALSE, pdFALSE }, { 4, "STAT", ECMD_STAT, pdTRUE, pdFALSE },
{ 4, "NOOP", ECMD_NOOP, pdFALSE, pdFALSE }, { 4, "HELP", ECMD_HELP, pdFALSE, pdFALSE },
{ 4, "EMPT", ECMD_EMPTY, pdFALSE, pdFALSE }, { 4, "NOOP", ECMD_NOOP, pdFALSE, pdFALSE },
{ 4, "CLOS", ECMD_CLOSE, pdTRUE, pdFALSE }, { 4, "EMPT", ECMD_EMPTY, pdFALSE, pdFALSE },
{ 4, "UNKN", ECMD_UNKNOWN, pdFALSE, pdFALSE }, { 4, "CLOS", ECMD_CLOSE, pdTRUE, pdFALSE },
}; { 4, "UNKN", ECMD_UNKNOWN, pdFALSE, pdFALSE },
};

@ -1,76 +1,87 @@
/* /*
*! * FreeRTOS V202212.00
*! The protocols implemented in this file are intended to be demo quality only, * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*! and not for production devices. *
*! * 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
* FreeRTOS+TCP V2.0.3 * the Software without restriction, including without limitation the rights to
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * 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,
* Permission is hereby granted, free of charge, to any person obtaining a copy of * subject to the following conditions:
* this software and associated documentation files (the "Software"), to deal in *
* the Software without restriction, including without limitation the rights to * The above copyright notice and this permission notice shall be included in all
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * copies or substantial portions of the Software.
* the Software, and to permit persons to whom the Software is furnished to do so, *
* subject to the following conditions: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* The above copyright notice and this permission notice shall be included in all * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* copies or substantial portions of the Software. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS *
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * https://www.FreeRTOS.org
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * https://github.com/FreeRTOS
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN *
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
*
* https://aws.amazon.com/freertos /**
* https://www.FreeRTOS.org *!
*/ *! The protocols implemented in this file are intended to be demo quality only,
*! and not for production devices.
*!
/* Standard includes. */ */
#include <stdio.h>
#include <stdlib.h> /* Standard includes. */
#include <stdio.h>
/* FreeRTOS includes. */ #include <stdlib.h>
#include "FreeRTOS.h"
/* FreeRTOS includes. */
#include "FreeRTOS_HTTP_commands.h" #include "FreeRTOS.h"
const struct xWEB_COMMAND xWebCommands[ WEB_CMD_COUNT ] = #include "FreeRTOS_HTTP_commands.h"
{
{ 3, "GET", ECMD_GET }, const struct xWEB_COMMAND xWebCommands[ WEB_CMD_COUNT ] =
{ 4, "HEAD", ECMD_HEAD }, {
{ 4, "POST", ECMD_POST }, { 3, "GET", ECMD_GET },
{ 3, "PUT", ECMD_PUT }, { 4, "HEAD", ECMD_HEAD },
{ 6, "DELETE", ECMD_DELETE }, { 4, "POST", ECMD_POST },
{ 5, "TRACE", ECMD_TRACE }, { 3, "PUT", ECMD_PUT },
{ 7, "OPTIONS", ECMD_OPTIONS }, { 6, "DELETE", ECMD_DELETE },
{ 7, "CONNECT", ECMD_CONNECT }, { 5, "TRACE", ECMD_TRACE },
{ 5, "PATCH", ECMD_PATCH }, { 7, "OPTIONS", ECMD_OPTIONS },
{ 4, "UNKN", ECMD_UNK }, { 7, "CONNECT", ECMD_CONNECT },
}; { 5, "PATCH", ECMD_PATCH },
{ 4, "UNKN", ECMD_UNK },
const char *webCodename (int aCode) };
{
switch (aCode) { const char * webCodename( int aCode )
case WEB_REPLY_OK: // = 200, {
return "OK"; switch( aCode )
case WEB_NO_CONTENT: // 204 {
return "No content"; case WEB_REPLY_OK: /* = 200, */
case WEB_BAD_REQUEST: // = 400, return "OK";
return "Bad request";
case WEB_UNAUTHORIZED: // = 401, case WEB_NO_CONTENT: /* 204 */
return "Authorization Required"; return "No content";
case WEB_NOT_FOUND: // = 404,
return "Not Found"; case WEB_BAD_REQUEST: /* = 400, */
case WEB_GONE: // = 410, return "Bad request";
return "Done";
case WEB_PRECONDITION_FAILED: // = 412, case WEB_UNAUTHORIZED: /* = 401, */
return "Precondition Failed"; return "Authorization Required";
case WEB_INTERNAL_SERVER_ERROR: // = 500,
return "Internal Server Error"; case WEB_NOT_FOUND: /* = 404, */
} return "Not Found";
return "Unknown";
} case WEB_GONE: /* = 410, */
return "Done";
case WEB_PRECONDITION_FAILED: /* = 412, */
return "Precondition Failed";
case WEB_INTERNAL_SERVER_ERROR: /* = 500, */
return "Internal Server Error";
}
return "Unknown";
}

@ -1,433 +1,464 @@
/* /*
*! * FreeRTOS V202212.00
*! The protocols implemented in this file are intended to be demo quality only, * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*! and not for production devices. *
*! * 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
* FreeRTOS+TCP V2.0.3 * the Software without restriction, including without limitation the rights to
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * 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,
* Permission is hereby granted, free of charge, to any person obtaining a copy of * subject to the following conditions:
* this software and associated documentation files (the "Software"), to deal in *
* the Software without restriction, including without limitation the rights to * The above copyright notice and this permission notice shall be included in all
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * copies or substantial portions of the Software.
* the Software, and to permit persons to whom the Software is furnished to do so, *
* subject to the following conditions: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* The above copyright notice and this permission notice shall be included in all * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* copies or substantial portions of the Software. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS *
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * https://www.FreeRTOS.org
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * https://github.com/FreeRTOS
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN *
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
*
* https://aws.amazon.com/freertos /**
* https://www.FreeRTOS.org *!
*/ *! The protocols implemented in this file are intended to be demo quality only,
*! and not for production devices.
/* Standard includes. */ *!
#include <stdio.h> */
#include <stdlib.h>
/* Standard includes. */
/* FreeRTOS includes. */ #include <stdio.h>
#include "FreeRTOS.h" #include <stdlib.h>
#include "task.h"
/* FreeRTOS includes. */
/* FreeRTOS+TCP includes. */ #include "FreeRTOS.h"
#include "FreeRTOS_IP.h" #include "task.h"
#include "FreeRTOS_Sockets.h"
/* FreeRTOS+TCP includes. */
/* FreeRTOS Protocol includes. */ #include "FreeRTOS_IP.h"
#include "FreeRTOS_HTTP_commands.h" #include "FreeRTOS_Sockets.h"
#include "FreeRTOS_TCP_server.h"
#include "FreeRTOS_server_private.h" /* FreeRTOS Protocol includes. */
#include "FreeRTOS_HTTP_commands.h"
/* Remove the whole file if HTTP is not supported. */ #include "FreeRTOS_TCP_server.h"
#if( ipconfigUSE_HTTP == 1 ) #include "FreeRTOS_server_private.h"
/* FreeRTOS+FAT includes. */ /* Remove the whole file if HTTP is not supported. */
#include "ff_stdio.h" #if ( ipconfigUSE_HTTP == 1 )
#ifndef HTTP_SERVER_BACKLOG /* FreeRTOS+FAT includes. */
#define HTTP_SERVER_BACKLOG ( 12 ) #include "ff_stdio.h"
#endif
#ifndef HTTP_SERVER_BACKLOG
#ifndef USE_HTML_CHUNKS #define HTTP_SERVER_BACKLOG ( 12 )
#define USE_HTML_CHUNKS ( 0 ) #endif
#endif
#ifndef USE_HTML_CHUNKS
#if !defined( ARRAY_SIZE ) #define USE_HTML_CHUNKS ( 0 )
#define ARRAY_SIZE(x) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] ) #endif
#endif
#if !defined( ARRAY_SIZE )
/* Some defines to make the code more readbale */ #define ARRAY_SIZE( x ) ( BaseType_t ) ( sizeof( x ) / sizeof( x )[ 0 ] )
#define pcCOMMAND_BUFFER pxClient->pxParent->pcCommandBuffer #endif
#define pcNEW_DIR pxClient->pxParent->pcNewDir
#define pcFILE_BUFFER pxClient->pxParent->pcFileBuffer /* Some defines to make the code more readbale */
#define pcCOMMAND_BUFFER pxClient->pxParent->pcCommandBuffer
#ifndef ipconfigHTTP_REQUEST_CHARACTER #define pcNEW_DIR pxClient->pxParent->pcNewDir
#define ipconfigHTTP_REQUEST_CHARACTER '?' #define pcFILE_BUFFER pxClient->pxParent->pcFileBuffer
#endif
#ifndef ipconfigHTTP_REQUEST_CHARACTER
/*_RB_ Need comment block, although fairly self evident. */ #define ipconfigHTTP_REQUEST_CHARACTER '?'
static void prvFileClose( HTTPClient_t *pxClient ); #endif
static BaseType_t prvProcessCmd( HTTPClient_t *pxClient, BaseType_t xIndex );
static const char *pcGetContentsType( const char *apFname ); /*_RB_ Need comment block, although fairly self evident. */
static BaseType_t prvOpenURL( HTTPClient_t *pxClient ); static void prvFileClose( HTTPClient_t * pxClient );
static BaseType_t prvSendFile( HTTPClient_t *pxClient ); static BaseType_t prvProcessCmd( HTTPClient_t * pxClient,
static BaseType_t prvSendReply( HTTPClient_t *pxClient, BaseType_t xCode ); BaseType_t xIndex );
static const char * pcGetContentsType( const char * apFname );
static const char pcEmptyString[1] = { '\0' }; static BaseType_t prvOpenURL( HTTPClient_t * pxClient );
static BaseType_t prvSendFile( HTTPClient_t * pxClient );
typedef struct xTYPE_COUPLE static BaseType_t prvSendReply( HTTPClient_t * pxClient,
{ BaseType_t xCode );
const char *pcExtension;
const char *pcType; static const char pcEmptyString[ 1 ] = { '\0' };
} TypeCouple_t;
typedef struct xTYPE_COUPLE
static TypeCouple_t pxTypeCouples[ ] = {
{ const char * pcExtension;
{ "html", "text/html" }, const char * pcType;
{ "css", "text/css" }, } TypeCouple_t;
{ "js", "text/javascript" },
{ "png", "image/png" }, static TypeCouple_t pxTypeCouples[] =
{ "jpg", "image/jpeg" }, {
{ "gif", "image/gif" }, { "html", "text/html" },
{ "txt", "text/plain" }, { "css", "text/css" },
{ "mp3", "audio/mpeg3" }, { "js", "text/javascript" },
{ "wav", "audio/wav" }, { "png", "image/png" },
{ "flac", "audio/ogg" }, { "jpg", "image/jpeg" },
{ "pdf", "application/pdf" }, { "gif", "image/gif" },
{ "ttf", "application/x-font-ttf" }, { "txt", "text/plain" },
{ "ttc", "application/x-font-ttf" } { "mp3", "audio/mpeg3" },
}; { "wav", "audio/wav" },
{ "flac", "audio/ogg" },
void vHTTPClientDelete( TCPClient_t *pxTCPClient ) { "pdf", "application/pdf" },
{ { "ttf", "application/x-font-ttf" },
HTTPClient_t *pxClient = ( HTTPClient_t * ) pxTCPClient; { "ttc", "application/x-font-ttf" }
};
/* This HTTP client stops, close / release all resources. */
if( pxClient->xSocket != FREERTOS_NO_SOCKET ) void vHTTPClientDelete( TCPClient_t * pxTCPClient )
{ {
FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_ALL ); HTTPClient_t * pxClient = ( HTTPClient_t * ) pxTCPClient;
FreeRTOS_closesocket( pxClient->xSocket );
pxClient->xSocket = FREERTOS_NO_SOCKET; /* This HTTP client stops, close / release all resources. */
} if( pxClient->xSocket != FREERTOS_NO_SOCKET )
prvFileClose( pxClient ); {
} FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_ALL );
/*-----------------------------------------------------------*/ FreeRTOS_closesocket( pxClient->xSocket );
pxClient->xSocket = FREERTOS_NO_SOCKET;
static void prvFileClose( HTTPClient_t *pxClient ) }
{
if( pxClient->pxFileHandle != NULL ) prvFileClose( pxClient );
{ }
FreeRTOS_printf( ( "Closing file: %s\n", pxClient->pcCurrentFilename ) ); /*-----------------------------------------------------------*/
ff_fclose( pxClient->pxFileHandle );
pxClient->pxFileHandle = NULL; static void prvFileClose( HTTPClient_t * pxClient )
} {
} if( pxClient->pxFileHandle != NULL )
/*-----------------------------------------------------------*/ {
FreeRTOS_printf( ( "Closing file: %s\n", pxClient->pcCurrentFilename ) );
static BaseType_t prvSendReply( HTTPClient_t *pxClient, BaseType_t xCode ) ff_fclose( pxClient->pxFileHandle );
{ pxClient->pxFileHandle = NULL;
struct xTCP_SERVER *pxParent = pxClient->pxParent; }
BaseType_t xRc; }
/*-----------------------------------------------------------*/
/* A normal command reply on the main socket (port 21). */
char *pcBuffer = pxParent->pcFileBuffer; static BaseType_t prvSendReply( HTTPClient_t * pxClient,
BaseType_t xCode )
xRc = snprintf( pcBuffer, sizeof( pxParent->pcFileBuffer ), {
"HTTP/1.1 %d %s\r\n" struct xTCP_SERVER * pxParent = pxClient->pxParent;
#if USE_HTML_CHUNKS BaseType_t xRc;
"Transfer-Encoding: chunked\r\n"
#endif /* A normal command reply on the main socket (port 21). */
"Content-Type: %s\r\n" char * pcBuffer = pxParent->pcFileBuffer;
"Connection: keep-alive\r\n"
"%s\r\n", xRc = snprintf( pcBuffer, sizeof( pxParent->pcFileBuffer ),
( int ) xCode, "HTTP/1.1 %d %s\r\n"
webCodename (xCode), #if USE_HTML_CHUNKS
pxParent->pcContentsType[0] ? pxParent->pcContentsType : "text/html", "Transfer-Encoding: chunked\r\n"
pxParent->pcExtraContents ); #endif
"Content-Type: %s\r\n"
pxParent->pcContentsType[0] = '\0'; "Connection: keep-alive\r\n"
pxParent->pcExtraContents[0] = '\0'; "%s\r\n",
( int ) xCode,
xRc = FreeRTOS_send( pxClient->xSocket, ( const void * ) pcBuffer, xRc, 0 ); webCodename( xCode ),
pxClient->bits.bReplySent = pdTRUE_UNSIGNED; pxParent->pcContentsType[ 0 ] ? pxParent->pcContentsType : "text/html",
pxParent->pcExtraContents );
return xRc;
} pxParent->pcContentsType[ 0 ] = '\0';
/*-----------------------------------------------------------*/ pxParent->pcExtraContents[ 0 ] = '\0';
static BaseType_t prvSendFile( HTTPClient_t *pxClient ) xRc = FreeRTOS_send( pxClient->xSocket, ( const void * ) pcBuffer, xRc, 0 );
{ pxClient->bits.bReplySent = pdTRUE_UNSIGNED;
size_t uxSpace;
size_t uxCount; return xRc;
BaseType_t xRc = 0; }
/*-----------------------------------------------------------*/
if( pxClient->bits.bReplySent == pdFALSE_UNSIGNED )
{ static BaseType_t prvSendFile( HTTPClient_t * pxClient )
pxClient->bits.bReplySent = pdTRUE_UNSIGNED; {
size_t uxSpace;
strcpy( pxClient->pxParent->pcContentsType, pcGetContentsType( pxClient->pcCurrentFilename ) ); size_t uxCount;
snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ), BaseType_t xRc = 0;
"Content-Length: %d\r\n", ( int ) pxClient->uxBytesLeft );
if( pxClient->bits.bReplySent == pdFALSE_UNSIGNED )
/* "Requested file action OK". */ {
xRc = prvSendReply( pxClient, WEB_REPLY_OK ); pxClient->bits.bReplySent = pdTRUE_UNSIGNED;
}
strcpy( pxClient->pxParent->pcContentsType, pcGetContentsType( pxClient->pcCurrentFilename ) );
if( xRc >= 0 ) do snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ),
{ "Content-Length: %d\r\n", ( int ) pxClient->uxBytesLeft );
uxSpace = FreeRTOS_tx_space( pxClient->xSocket );
/* "Requested file action OK". */
if( pxClient->uxBytesLeft < uxSpace ) xRc = prvSendReply( pxClient, WEB_REPLY_OK );
{ }
uxCount = pxClient->uxBytesLeft;
} if( xRc >= 0 )
else {
{ do
uxCount = uxSpace; {
} uxSpace = FreeRTOS_tx_space( pxClient->xSocket );
if( uxCount > 0u ) if( pxClient->uxBytesLeft < uxSpace )
{ {
if( uxCount > sizeof( pxClient->pxParent->pcFileBuffer ) ) uxCount = pxClient->uxBytesLeft;
{ }
uxCount = sizeof( pxClient->pxParent->pcFileBuffer ); else
} {
ff_fread( pxClient->pxParent->pcFileBuffer, 1, uxCount, pxClient->pxFileHandle ); uxCount = uxSpace;
pxClient->uxBytesLeft -= uxCount; }
xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pxParent->pcFileBuffer, uxCount, 0 ); if( uxCount > 0u )
if( xRc < 0 ) {
{ if( uxCount > sizeof( pxClient->pxParent->pcFileBuffer ) )
break; {
} uxCount = sizeof( pxClient->pxParent->pcFileBuffer );
} }
} while( uxCount > 0u );
ff_fread( pxClient->pxParent->pcFileBuffer, 1, uxCount, pxClient->pxFileHandle );
if( pxClient->uxBytesLeft == 0u ) pxClient->uxBytesLeft -= uxCount;
{
/* Writing is ready, no need for further 'eSELECT_WRITE' events. */ xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pxParent->pcFileBuffer, uxCount, 0 );
FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
prvFileClose( pxClient ); if( xRc < 0 )
} {
else break;
{ }
/* Wake up the TCP task as soon as this socket may be written to. */ }
FreeRTOS_FD_SET( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE ); } while( uxCount > 0u );
} }
return xRc; if( pxClient->uxBytesLeft == 0u )
} {
/*-----------------------------------------------------------*/ /* Writing is ready, no need for further 'eSELECT_WRITE' events. */
FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
static BaseType_t prvOpenURL( HTTPClient_t *pxClient ) prvFileClose( pxClient );
{ }
BaseType_t xRc; else
char pcSlash[ 2 ]; {
/* Wake up the TCP task as soon as this socket may be written to. */
pxClient->bits.ulFlags = 0; FreeRTOS_FD_SET( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
}
#if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
{ return xRc;
if( strchr( pxClient->pcUrlData, ipconfigHTTP_REQUEST_CHARACTER ) != NULL ) }
{ /*-----------------------------------------------------------*/
size_t xResult;
static BaseType_t prvOpenURL( HTTPClient_t * pxClient )
xResult = uxApplicationHTTPHandleRequestHook( pxClient->pcUrlData, pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ) ); {
if( xResult > 0 ) BaseType_t xRc;
{ char pcSlash[ 2 ];
strcpy( pxClient->pxParent->pcContentsType, "text/html" );
snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ), pxClient->bits.ulFlags = 0;
"Content-Length: %d\r\n", ( int ) xResult );
xRc = prvSendReply( pxClient, WEB_REPLY_OK ); /* "Requested file action OK" */ #if ( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
if( xRc > 0 ) {
{ if( strchr( pxClient->pcUrlData, ipconfigHTTP_REQUEST_CHARACTER ) != NULL )
xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pcCurrentFilename, xResult, 0 ); {
} size_t xResult;
/* Although against the coding standard of FreeRTOS, a return is
done here to simplify this conditional code. */ xResult = uxApplicationHTTPHandleRequestHook( pxClient->pcUrlData, pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ) );
return xRc;
} if( xResult > 0 )
} {
} strcpy( pxClient->pxParent->pcContentsType, "text/html" );
#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */ snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ),
"Content-Length: %d\r\n", ( int ) xResult );
if( pxClient->pcUrlData[ 0 ] != '/' ) xRc = prvSendReply( pxClient, WEB_REPLY_OK ); /* "Requested file action OK" */
{
/* Insert a slash before the file name. */ if( xRc > 0 )
pcSlash[ 0 ] = '/'; {
pcSlash[ 1 ] = '\0'; xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pcCurrentFilename, xResult, 0 );
} }
else
{ /* Although against the coding standard of FreeRTOS, a return is
/* The browser provided a starting '/' already. */ * done here to simplify this conditional code. */
pcSlash[ 0 ] = '\0'; return xRc;
} }
snprintf( pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ), "%s%s%s", }
pxClient->pcRootDir, }
pcSlash, #endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
pxClient->pcUrlData);
if( pxClient->pcUrlData[ 0 ] != '/' )
pxClient->pxFileHandle = ff_fopen( pxClient->pcCurrentFilename, "rb" ); {
/* Insert a slash before the file name. */
FreeRTOS_printf( ( "Open file '%s': %s\n", pxClient->pcCurrentFilename, pcSlash[ 0 ] = '/';
pxClient->pxFileHandle != NULL ? "Ok" : strerror( stdioGET_ERRNO() ) ) ); pcSlash[ 1 ] = '\0';
}
if( pxClient->pxFileHandle == NULL ) else
{ {
/* "404 File not found". */ /* The browser provided a starting '/' already. */
xRc = prvSendReply( pxClient, WEB_NOT_FOUND ); pcSlash[ 0 ] = '\0';
} }
else
{ snprintf( pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ), "%s%s%s",
pxClient->uxBytesLeft = ( size_t ) pxClient->pxFileHandle->ulFileSize; pxClient->pcRootDir,
xRc = prvSendFile( pxClient ); pcSlash,
} pxClient->pcUrlData );
return xRc; pxClient->pxFileHandle = ff_fopen( pxClient->pcCurrentFilename, "rb" );
}
/*-----------------------------------------------------------*/ FreeRTOS_printf( ( "Open file '%s': %s\n", pxClient->pcCurrentFilename,
pxClient->pxFileHandle != NULL ? "Ok" : strerror( stdioGET_ERRNO() ) ) );
static BaseType_t prvProcessCmd( HTTPClient_t *pxClient, BaseType_t xIndex )
{ if( pxClient->pxFileHandle == NULL )
BaseType_t xResult = 0; {
/* "404 File not found". */
/* A new command has been received. Process it. */ xRc = prvSendReply( pxClient, WEB_NOT_FOUND );
switch( xIndex ) }
{ else
case ECMD_GET: {
xResult = prvOpenURL( pxClient ); pxClient->uxBytesLeft = ( size_t ) pxClient->pxFileHandle->ulFileSize;
break; xRc = prvSendFile( pxClient );
}
case ECMD_HEAD:
case ECMD_POST: return xRc;
case ECMD_PUT: }
case ECMD_DELETE: /*-----------------------------------------------------------*/
case ECMD_TRACE:
case ECMD_OPTIONS: static BaseType_t prvProcessCmd( HTTPClient_t * pxClient,
case ECMD_CONNECT: BaseType_t xIndex )
case ECMD_PATCH: {
case ECMD_UNK: BaseType_t xResult = 0;
{
FreeRTOS_printf( ( "prvProcessCmd: Not implemented: %s\n", /* A new command has been received. Process it. */
xWebCommands[xIndex].pcCommandName ) ); switch( xIndex )
} {
break; case ECMD_GET:
} xResult = prvOpenURL( pxClient );
break;
return xResult;
} case ECMD_HEAD:
/*-----------------------------------------------------------*/ case ECMD_POST:
case ECMD_PUT:
BaseType_t xHTTPClientWork( TCPClient_t *pxTCPClient ) case ECMD_DELETE:
{ case ECMD_TRACE:
BaseType_t xRc; case ECMD_OPTIONS:
HTTPClient_t *pxClient = ( HTTPClient_t * ) pxTCPClient; case ECMD_CONNECT:
case ECMD_PATCH:
if( pxClient->pxFileHandle != NULL ) case ECMD_UNK:
{ FreeRTOS_printf( ( "prvProcessCmd: Not implemented: %s\n",
prvSendFile( pxClient ); xWebCommands[ xIndex ].pcCommandName ) );
} break;
}
xRc = FreeRTOS_recv( pxClient->xSocket, ( void * )pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), 0 );
return xResult;
if( xRc > 0 ) }
{ /*-----------------------------------------------------------*/
BaseType_t xIndex;
const char *pcEndOfCmd; BaseType_t xHTTPClientWork( TCPClient_t * pxTCPClient )
const struct xWEB_COMMAND *curCmd; {
char *pcBuffer = pcCOMMAND_BUFFER; BaseType_t xRc;
HTTPClient_t * pxClient = ( HTTPClient_t * ) pxTCPClient;
if( xRc < ( BaseType_t ) sizeof( pcCOMMAND_BUFFER ) )
{ if( pxClient->pxFileHandle != NULL )
pcBuffer[ xRc ] = '\0'; {
} prvSendFile( pxClient );
while( xRc && ( pcBuffer[ xRc - 1 ] == 13 || pcBuffer[ xRc - 1 ] == 10 ) ) }
{
pcBuffer[ --xRc ] = '\0'; xRc = FreeRTOS_recv( pxClient->xSocket, ( void * ) pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), 0 );
}
pcEndOfCmd = pcBuffer + xRc; if( xRc > 0 )
{
curCmd = xWebCommands; BaseType_t xIndex;
const char * pcEndOfCmd;
/* Pointing to "/index.html HTTP/1.1". */ const struct xWEB_COMMAND * curCmd;
pxClient->pcUrlData = pcBuffer; char * pcBuffer = pcCOMMAND_BUFFER;
/* Pointing to "HTTP/1.1". */ if( xRc < ( BaseType_t ) sizeof( pcCOMMAND_BUFFER ) )
pxClient->pcRestData = pcEmptyString; {
pcBuffer[ xRc ] = '\0';
/* Last entry is "ECMD_UNK". */ }
for( xIndex = 0; xIndex < WEB_CMD_COUNT - 1; xIndex++, curCmd++ )
{ while( xRc && ( pcBuffer[ xRc - 1 ] == 13 || pcBuffer[ xRc - 1 ] == 10 ) )
BaseType_t xLength; {
pcBuffer[ --xRc ] = '\0';
xLength = curCmd->xCommandLength; }
if( ( xRc >= xLength ) && ( memcmp( curCmd->pcCommandName, pcBuffer, xLength ) == 0 ) )
{ pcEndOfCmd = pcBuffer + xRc;
char *pcLastPtr;
curCmd = xWebCommands;
pxClient->pcUrlData += xLength + 1;
for( pcLastPtr = (char *)pxClient->pcUrlData; pcLastPtr < pcEndOfCmd; pcLastPtr++ ) /* Pointing to "/index.html HTTP/1.1". */
{ pxClient->pcUrlData = pcBuffer;
char ch = *pcLastPtr;
if( ( ch == '\0' ) || ( strchr( "\n\r \t", ch ) != NULL ) ) /* Pointing to "HTTP/1.1". */
{ pxClient->pcRestData = pcEmptyString;
*pcLastPtr = '\0';
pxClient->pcRestData = pcLastPtr + 1; /* Last entry is "ECMD_UNK". */
break; for( xIndex = 0; xIndex < WEB_CMD_COUNT - 1; xIndex++, curCmd++ )
} {
} BaseType_t xLength;
break;
} xLength = curCmd->xCommandLength;
}
if( ( xRc >= xLength ) && ( memcmp( curCmd->pcCommandName, pcBuffer, xLength ) == 0 ) )
if( xIndex < ( WEB_CMD_COUNT - 1 ) ) {
{ char * pcLastPtr;
xRc = prvProcessCmd( pxClient, xIndex );
} pxClient->pcUrlData += xLength + 1;
}
else if( xRc < 0 ) for( pcLastPtr = ( char * ) pxClient->pcUrlData; pcLastPtr < pcEndOfCmd; pcLastPtr++ )
{ {
/* The connection will be closed and the client will be deleted. */ char ch = *pcLastPtr;
FreeRTOS_printf( ( "xHTTPClientWork: rc = %ld\n", xRc ) );
} if( ( ch == '\0' ) || ( strchr( "\n\r \t", ch ) != NULL ) )
return xRc; {
} *pcLastPtr = '\0';
/*-----------------------------------------------------------*/ pxClient->pcRestData = pcLastPtr + 1;
break;
static const char *pcGetContentsType (const char *apFname) }
{ }
const char *slash = NULL;
const char *dot = NULL; break;
const char *ptr; }
const char *pcResult = "text/html"; }
BaseType_t x;
if( xIndex < ( WEB_CMD_COUNT - 1 ) )
for( ptr = apFname; *ptr; ptr++ ) {
{ xRc = prvProcessCmd( pxClient, xIndex );
if (*ptr == '.') dot = ptr; }
if (*ptr == '/') slash = ptr; }
} else if( xRc < 0 )
if( dot > slash ) {
{ /* The connection will be closed and the client will be deleted. */
dot++; FreeRTOS_printf( ( "xHTTPClientWork: rc = %ld\n", xRc ) );
for( x = 0; x < ARRAY_SIZE( pxTypeCouples ); x++ ) }
{
if( strcasecmp( dot, pxTypeCouples[ x ].pcExtension ) == 0 ) return xRc;
{ }
pcResult = pxTypeCouples[ x ].pcType; /*-----------------------------------------------------------*/
break;
} static const char * pcGetContentsType( const char * apFname )
} {
} const char * slash = NULL;
return pcResult; const char * dot = NULL;
} const char * ptr;
const char * pcResult = "text/html";
#endif /* ipconfigUSE_HTTP */ BaseType_t x;
for( ptr = apFname; *ptr; ptr++ )
{
if( *ptr == '.' )
{
dot = ptr;
}
if( *ptr == '/' )
{
slash = ptr;
}
}
if( dot > slash )
{
dot++;
for( x = 0; x < ARRAY_SIZE( pxTypeCouples ); x++ )
{
if( strcasecmp( dot, pxTypeCouples[ x ].pcExtension ) == 0 )
{
pcResult = pxTypeCouples[ x ].pcType;
break;
}
}
}
return pcResult;
}
#endif /* ipconfigUSE_HTTP */

@ -1,469 +1,498 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://github.com/FreeRTOS * https://github.com/FreeRTOS
* *
*/ */
/* /*
*! *!
*! The protocols implemented in this file are intended to be demo quality only, *! The protocols implemented in this file are intended to be demo quality only,
*! and not for production devices. *! and not for production devices.
*! *!
* *
* NTPDemo.c * NTPDemo.c
* *
* An example of how to lookup a domain using DNS * An example of how to lookup a domain using DNS
* And also how to send and receive UDP messages to get the NTP time * And also how to send and receive UDP messages to get the NTP time
* *
*/ */
/* Standard includes. */ /* Standard includes. */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
/* FreeRTOS includes. */ /* FreeRTOS includes. */
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
#include "semphr.h" #include "semphr.h"
/* FreeRTOS+TCP includes. */ /* FreeRTOS+TCP includes. */
#include "FreeRTOS_IP.h" #include "FreeRTOS_IP.h"
#include "FreeRTOS_Sockets.h" #include "FreeRTOS_Sockets.h"
#include "FreeRTOS_DNS.h" #include "FreeRTOS_DNS.h"
#include "FreeRTOS_Stream_Buffer.h" #include "FreeRTOS_Stream_Buffer.h"
/* Use the date & time functions from +FAT. */ /* Use the date & time functions from +FAT. */
#include "ff_time.h" #include "ff_time.h"
#include "NTPDemo.h" #include "NTPDemo.h"
#include "ntpClient.h" #include "ntpClient.h"
#include "date_and_time.h" #include "date_and_time.h"
enum EStatus { enum EStatus
EStatusLookup, {
EStatusAsking, EStatusLookup,
EStatusPause, EStatusAsking,
EStatusFailed, EStatusPause,
}; EStatusFailed,
};
static struct SNtpPacket xNTPPacket;
static struct SNtpPacket xNTPPacket;
#if( ipconfigUSE_CALLBACKS == 0 )
static char cRecvBuffer[ sizeof( struct SNtpPacket ) + 64 ]; #if ( ipconfigUSE_CALLBACKS == 0 )
#endif static char cRecvBuffer[ sizeof( struct SNtpPacket ) + 64 ];
#endif
static enum EStatus xStatus = EStatusLookup;
static enum EStatus xStatus = EStatusLookup;
static const char *pcTimeServers[] = {
"0.asia.pool.ntp.org", static const char * pcTimeServers[] =
"0.europe.pool.ntp.org", {
"0.id.pool.ntp.org", "0.asia.pool.ntp.org",
"0.south-america.pool.ntp.org", "0.europe.pool.ntp.org",
"0.oceania.pool.ntp.org", "0.id.pool.ntp.org",
"0.north-america.pool.ntp.org" "0.south-america.pool.ntp.org",
}; "0.oceania.pool.ntp.org",
"0.north-america.pool.ntp.org"
static SemaphoreHandle_t xNTPWakeupSem = NULL; };
static uint32_t ulIPAddressFound;
static Socket_t xUDPSocket = NULL; static SemaphoreHandle_t xNTPWakeupSem = NULL;
static TaskHandle_t xNTPTaskhandle = NULL; static uint32_t ulIPAddressFound;
static TickType_t uxSendTime; static Socket_t xUDPSocket = NULL;
static TaskHandle_t xNTPTaskhandle = NULL;
static void prvNTPTask( void *pvParameters ); static TickType_t uxSendTime;
static void vSignalTask( void ) static void prvNTPTask( void * pvParameters );
{
#if( ipconfigUSE_CALLBACKS == 0 ) static void vSignalTask( void )
if( xUDPSocket != NULL ) {
{ #if ( ipconfigUSE_CALLBACKS == 0 )
/* Send a signal to the socket so that the if( xUDPSocket != NULL )
FreeRTOS_recvfrom will get interrupted. */ {
FreeRTOS_SignalSocket( xUDPSocket ); /* Send a signal to the socket so that the
} * FreeRTOS_recvfrom will get interrupted. */
else FreeRTOS_SignalSocket( xUDPSocket );
#endif }
if( xNTPWakeupSem != NULL ) else
{ #endif
xSemaphoreGive( xNTPWakeupSem );
} if( xNTPWakeupSem != NULL )
} {
xSemaphoreGive( xNTPWakeupSem );
void vStartNTPTask( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority ) }
{ }
/* The only public function in this module: start a task to contact
some NTP server. */ void vStartNTPTask( uint16_t usTaskStackSize,
UBaseType_t uxTaskPriority )
if( xNTPTaskhandle != NULL ) {
{ /* The only public function in this module: start a task to contact
switch( xStatus ) * some NTP server. */
{
case EStatusPause: if( xNTPTaskhandle != NULL )
xStatus = EStatusAsking; {
vSignalTask(); switch( xStatus )
break; {
case EStatusLookup: case EStatusPause:
FreeRTOS_printf( ( "NTP looking up server\n" ) ); xStatus = EStatusAsking;
break; vSignalTask();
case EStatusAsking: break;
FreeRTOS_printf( ( "NTP still asking\n" ) );
break; case EStatusLookup:
case EStatusFailed: FreeRTOS_printf( ( "NTP looking up server\n" ) );
FreeRTOS_printf( ( "NTP failed somehow\n" ) ); break;
ulIPAddressFound = 0ul;
xStatus = EStatusLookup; case EStatusAsking:
vSignalTask(); FreeRTOS_printf( ( "NTP still asking\n" ) );
break; break;
}
} case EStatusFailed:
else FreeRTOS_printf( ( "NTP failed somehow\n" ) );
{ ulIPAddressFound = 0ul;
xUDPSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); xStatus = EStatusLookup;
if( xUDPSocket != FREERTOS_INVALID_SOCKET ) vSignalTask();
{ break;
struct freertos_sockaddr xAddress; }
#if( ipconfigUSE_CALLBACKS != 0 ) }
BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 0 ); else
#else {
BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 5000 ); xUDPSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );
#endif
if( xUDPSocket != FREERTOS_INVALID_SOCKET )
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) {
{ struct freertos_sockaddr xAddress;
xAddress.sin_address.ulIP_IPv4 = 0ul; #if ( ipconfigUSE_CALLBACKS != 0 )
} BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 0 );
#else #else
{ BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 5000 );
xAddress.sin_addr = 0ul; #endif
}
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ #if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
{
xAddress.sin_port = FreeRTOS_htons( NTP_PORT ); xAddress.sin_address.ulIP_IPv4 = 0ul;
xAddress.sin_family = FREERTOS_AF_INET; }
#else
FreeRTOS_bind( xUDPSocket, &xAddress, sizeof( xAddress ) ); {
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) ); xAddress.sin_addr = 0ul;
xTaskCreate( prvNTPTask, /* The function that implements the task. */ }
( const char * ) "NTP client", /* Just a text name for the task to aid debugging. */ #endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
usTaskStackSize, /* The stack size is defined in FreeRTOSIPConfig.h. */
NULL, /* The task parameter, not used in this case. */ xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
uxTaskPriority, /* The priority assigned to the task is defined in FreeRTOSConfig.h. */ xAddress.sin_family = FREERTOS_AF_INET;
&xNTPTaskhandle ); /* The task handle. */
} FreeRTOS_bind( xUDPSocket, &xAddress, sizeof( xAddress ) );
else FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
{ xTaskCreate( prvNTPTask, /* The function that implements the task. */
FreeRTOS_printf( ( "Creating socket failed\n" ) ); ( const char * ) "NTP client", /* Just a text name for the task to aid debugging. */
} usTaskStackSize, /* The stack size is defined in FreeRTOSIPConfig.h. */
} NULL, /* The task parameter, not used in this case. */
} uxTaskPriority, /* The priority assigned to the task is defined in FreeRTOSConfig.h. */
/*-----------------------------------------------------------*/ &xNTPTaskhandle ); /* The task handle. */
}
static void vDNS_callback( const char *pcName, void *pvSearchID, uint32_t ulIPAddress ) else
{ {
char pcBuf[16]; FreeRTOS_printf( ( "Creating socket failed\n" ) );
}
/* The DNS lookup has a result, or it has reached the time-out. */ }
FreeRTOS_inet_ntoa( ulIPAddress, pcBuf ); }
FreeRTOS_printf( ( "IP address of %s found: %s\n", pcName, pcBuf ) ); /*-----------------------------------------------------------*/
if( ulIPAddressFound == 0ul )
{ static void vDNS_callback( const char * pcName,
ulIPAddressFound = ulIPAddress; void * pvSearchID,
} uint32_t ulIPAddress )
/* For testing: in case DNS doen't respond, still try some NTP server {
with a known IP-address. */ char pcBuf[ 16 ];
if( ulIPAddressFound == 0ul )
{ /* The DNS lookup has a result, or it has reached the time-out. */
ulIPAddressFound = FreeRTOS_inet_addr_quick( 184, 105, 182, 7 ); FreeRTOS_inet_ntoa( ulIPAddress, pcBuf );
/* ulIPAddressFound = FreeRTOS_inet_addr_quick( 103, 242, 70, 4 ); */ FreeRTOS_printf( ( "IP address of %s found: %s\n", pcName, pcBuf ) );
}
xStatus = EStatusAsking; if( ulIPAddressFound == 0ul )
{
vSignalTask(); ulIPAddressFound = ulIPAddress;
} }
/*-----------------------------------------------------------*/
/* For testing: in case DNS doesn't respond, still try some NTP server
static void prvSwapFields( struct SNtpPacket *pxPacket) * with a known IP-address. */
{ if( ulIPAddressFound == 0ul )
/* NTP messages are big-endian */ {
pxPacket->rootDelay = FreeRTOS_htonl( pxPacket->rootDelay ); ulIPAddressFound = FreeRTOS_inet_addr_quick( 184, 105, 182, 7 );
pxPacket->rootDispersion = FreeRTOS_htonl( pxPacket->rootDispersion ); /* ulIPAddressFound = FreeRTOS_inet_addr_quick( 103, 242, 70, 4 ); */
}
pxPacket->referenceTimestamp.seconds = FreeRTOS_htonl( pxPacket->referenceTimestamp.seconds );
pxPacket->referenceTimestamp.fraction = FreeRTOS_htonl( pxPacket->referenceTimestamp.fraction ); xStatus = EStatusAsking;
pxPacket->originateTimestamp.seconds = FreeRTOS_htonl( pxPacket->originateTimestamp.seconds ); vSignalTask();
pxPacket->originateTimestamp.fraction = FreeRTOS_htonl( pxPacket->originateTimestamp.fraction ); }
/*-----------------------------------------------------------*/
pxPacket->receiveTimestamp.seconds = FreeRTOS_htonl( pxPacket->receiveTimestamp.seconds );
pxPacket->receiveTimestamp.fraction = FreeRTOS_htonl( pxPacket->receiveTimestamp.fraction ); static void prvSwapFields( struct SNtpPacket * pxPacket )
{
pxPacket->transmitTimestamp.seconds = FreeRTOS_htonl( pxPacket->transmitTimestamp.seconds ); /* NTP messages are big-endian */
pxPacket->transmitTimestamp.fraction = FreeRTOS_htonl( pxPacket->transmitTimestamp.fraction ); pxPacket->rootDelay = FreeRTOS_htonl( pxPacket->rootDelay );
} pxPacket->rootDispersion = FreeRTOS_htonl( pxPacket->rootDispersion );
/*-----------------------------------------------------------*/
pxPacket->referenceTimestamp.seconds = FreeRTOS_htonl( pxPacket->referenceTimestamp.seconds );
static void prvNTPPacketInit( ) pxPacket->referenceTimestamp.fraction = FreeRTOS_htonl( pxPacket->referenceTimestamp.fraction );
{
memset (&xNTPPacket, '\0', sizeof( xNTPPacket ) ); pxPacket->originateTimestamp.seconds = FreeRTOS_htonl( pxPacket->originateTimestamp.seconds );
pxPacket->originateTimestamp.fraction = FreeRTOS_htonl( pxPacket->originateTimestamp.fraction );
xNTPPacket.flags = 0xDB; /* value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 */
xNTPPacket.poll = 10; /* 10 means 1 << 10 = 1024 seconds */ pxPacket->receiveTimestamp.seconds = FreeRTOS_htonl( pxPacket->receiveTimestamp.seconds );
xNTPPacket.precision = 0xFA; /* = 250 = 0.015625 seconds */ pxPacket->receiveTimestamp.fraction = FreeRTOS_htonl( pxPacket->receiveTimestamp.fraction );
xNTPPacket.rootDelay = 0x5D2E; /* 0x5D2E = 23854 or (23854/65535)= 0.3640 sec */
xNTPPacket.rootDispersion = 0x0008CAC8; /* 0x0008CAC8 = 8.7912 seconds */ pxPacket->transmitTimestamp.seconds = FreeRTOS_htonl( pxPacket->transmitTimestamp.seconds );
pxPacket->transmitTimestamp.fraction = FreeRTOS_htonl( pxPacket->transmitTimestamp.fraction );
/* use the recorded NTP time */ }
time_t uxSecs = FreeRTOS_time( NULL );/* apTime may be NULL, returns seconds */ /*-----------------------------------------------------------*/
xNTPPacket.referenceTimestamp.seconds = uxSecs; /* Current time */ static void prvNTPPacketInit()
xNTPPacket.transmitTimestamp.seconds = uxSecs + 3; {
memset( &xNTPPacket, '\0', sizeof( xNTPPacket ) );
/* Transform the contents of the fields from native to big endian. */
prvSwapFields( &xNTPPacket ); xNTPPacket.flags = 0xDB; /* value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 */
} xNTPPacket.poll = 10; /* 10 means 1 << 10 = 1024 seconds */
/*-----------------------------------------------------------*/ xNTPPacket.precision = 0xFA; /* = 250 = 0.015625 seconds */
xNTPPacket.rootDelay = 0x5D2E; /* 0x5D2E = 23854 or (23854/65535)= 0.3640 sec */
static void prvReadTime( struct SNtpPacket * pxPacket ) xNTPPacket.rootDispersion = 0x0008CAC8; /* 0x0008CAC8 = 8.7912 seconds */
{
FF_TimeStruct_t xTimeStruct; /* use the recorded NTP time */
time_t uxPreviousSeconds; time_t uxSecs = FreeRTOS_time( NULL ); /* apTime may be NULL, returns seconds */
time_t uxPreviousMS;
xNTPPacket.referenceTimestamp.seconds = uxSecs; /* Current time */
time_t uxCurrentSeconds; xNTPPacket.transmitTimestamp.seconds = uxSecs + 3;
time_t uxCurrentMS;
/* Transform the contents of the fields from native to big endian. */
const char *pcTimeUnit; prvSwapFields( &xNTPPacket );
int32_t ilDiff; }
TickType_t uxTravelTime; /*-----------------------------------------------------------*/
uxTravelTime = xTaskGetTickCount() - uxSendTime; static void prvReadTime( struct SNtpPacket * pxPacket )
{
/* Transform the contents of the fields from big to native endian. */ FF_TimeStruct_t xTimeStruct;
prvSwapFields( pxPacket ); time_t uxPreviousSeconds;
time_t uxPreviousMS;
uxCurrentSeconds = pxPacket->receiveTimestamp.seconds - TIME1970;
uxCurrentMS = pxPacket->receiveTimestamp.fraction / 4294967; time_t uxCurrentSeconds;
uxCurrentSeconds += uxCurrentMS / 1000; time_t uxCurrentMS;
uxCurrentMS = uxCurrentMS % 1000;
const char * pcTimeUnit;
// Get the last time recorded int32_t ilDiff;
uxPreviousSeconds = FreeRTOS_get_secs_msec( &uxPreviousMS ); TickType_t uxTravelTime;
// Set the new time with precision in msec. */ uxTravelTime = xTaskGetTickCount() - uxSendTime;
FreeRTOS_set_secs_msec( &uxCurrentSeconds, &uxCurrentMS );
/* Transform the contents of the fields from big to native endian. */
if( uxCurrentSeconds >= uxPreviousSeconds ) prvSwapFields( pxPacket );
{
ilDiff = ( int32_t ) ( uxCurrentSeconds - uxPreviousSeconds ); uxCurrentSeconds = pxPacket->receiveTimestamp.seconds - TIME1970;
} uxCurrentMS = pxPacket->receiveTimestamp.fraction / 4294967;
else uxCurrentSeconds += uxCurrentMS / 1000;
{ uxCurrentMS = uxCurrentMS % 1000;
ilDiff = 0 - ( int32_t ) ( uxPreviousSeconds - uxCurrentSeconds );
} /* Get the last time recorded */
uxPreviousSeconds = FreeRTOS_get_secs_msec( &uxPreviousMS );
if( ( ilDiff < -5 ) || ( ilDiff > 5 ) )
{ /* Set the new time with precision in msec. * / */
/* More than 5 seconds difference. */ FreeRTOS_set_secs_msec( &uxCurrentSeconds, &uxCurrentMS );
pcTimeUnit = "sec";
} if( uxCurrentSeconds >= uxPreviousSeconds )
else {
{ ilDiff = ( int32_t ) ( uxCurrentSeconds - uxPreviousSeconds );
/* Less than or equal to 5 second difference. */ }
pcTimeUnit = "ms"; else
uint32_t ulLowest = ( uxCurrentSeconds <= uxPreviousSeconds ) ? uxCurrentSeconds : uxPreviousSeconds; {
int32_t iCurMS = 1000 * ( uxCurrentSeconds - ulLowest ) + uxCurrentMS; ilDiff = 0 - ( int32_t ) ( uxPreviousSeconds - uxCurrentSeconds );
int32_t iPrevMS = 1000 * ( uxPreviousSeconds - ulLowest ) + uxPreviousMS; }
ilDiff = iCurMS - iPrevMS;
} if( ( ilDiff < -5 ) || ( ilDiff > 5 ) )
uxCurrentSeconds -= iTimeZone; {
/* More than 5 seconds difference. */
FreeRTOS_gmtime_r( &uxCurrentSeconds, &xTimeStruct ); pcTimeUnit = "sec";
}
/* else
378.067 [NTP client] NTP time: 9/11/2015 16:11:19.559 Diff -20 ms (289 ms) {
379.441 [NTP client] NTP time: 9/11/2015 16:11:20.933 Diff 0 ms (263 ms) /* Less than or equal to 5 second difference. */
*/ pcTimeUnit = "ms";
uint32_t ulLowest = ( uxCurrentSeconds <= uxPreviousSeconds ) ? uxCurrentSeconds : uxPreviousSeconds;
FreeRTOS_printf( ("NTP time: %d/%d/%02d %2d:%02d:%02d.%03u Diff %d %s (%lu ms)\n", int32_t iCurMS = 1000 * ( uxCurrentSeconds - ulLowest ) + uxCurrentMS;
xTimeStruct.tm_mday, int32_t iPrevMS = 1000 * ( uxPreviousSeconds - ulLowest ) + uxPreviousMS;
xTimeStruct.tm_mon + 1, ilDiff = iCurMS - iPrevMS;
xTimeStruct.tm_year + 1900, }
xTimeStruct.tm_hour,
xTimeStruct.tm_min, uxCurrentSeconds -= iTimeZone;
xTimeStruct.tm_sec,
( unsigned )uxCurrentMS, FreeRTOS_gmtime_r( &uxCurrentSeconds, &xTimeStruct );
( unsigned )ilDiff,
pcTimeUnit, /*
uxTravelTime ) ); * 378.067 [NTP client] NTP time: 9/11/2015 16:11:19.559 Diff -20 ms (289 ms)
* 379.441 [NTP client] NTP time: 9/11/2015 16:11:20.933 Diff 0 ms (263 ms)
/* Remove compiler warnings in case FreeRTOS_printf() is not used. */ */
( void ) pcTimeUnit;
( void ) uxTravelTime; FreeRTOS_printf( ( "NTP time: %d/%d/%02d %2d:%02d:%02d.%03u Diff %d %s (%lu ms)\n",
} xTimeStruct.tm_mday,
/*-----------------------------------------------------------*/ xTimeStruct.tm_mon + 1,
xTimeStruct.tm_year + 1900,
#if( ipconfigUSE_CALLBACKS != 0 ) xTimeStruct.tm_hour,
xTimeStruct.tm_min,
static BaseType_t xOnUDPReceive( Socket_t xSocket, void * pvData, size_t xLength, xTimeStruct.tm_sec,
const struct freertos_sockaddr *pxFrom, const struct freertos_sockaddr *pxDest ) ( unsigned ) uxCurrentMS,
{ ( unsigned ) ilDiff,
if( xLength >= sizeof( xNTPPacket ) ) pcTimeUnit,
{ uxTravelTime ) );
prvReadTime( ( struct SNtpPacket *)pvData );
if( xStatus != EStatusPause ) /* Remove compiler warnings in case FreeRTOS_printf() is not used. */
{ ( void ) pcTimeUnit;
xStatus = EStatusPause; ( void ) uxTravelTime;
} }
} /*-----------------------------------------------------------*/
vSignalTask();
/* Tell the driver not to store the RX data */ #if ( ipconfigUSE_CALLBACKS != 0 )
return 1;
} static BaseType_t xOnUDPReceive( Socket_t xSocket,
/*-----------------------------------------------------------*/ void * pvData,
size_t xLength,
#endif /* ipconfigUSE_CALLBACKS != 0 */ const struct freertos_sockaddr * pxFrom,
const struct freertos_sockaddr * pxDest )
static void prvNTPTask( void *pvParameters ) {
{ if( xLength >= sizeof( xNTPPacket ) )
BaseType_t xServerIndex = 3; {
struct freertos_sockaddr xAddress; prvReadTime( ( struct SNtpPacket * ) pvData );
#if( ipconfigUSE_CALLBACKS != 0 )
F_TCP_UDP_Handler_t xHandler; if( xStatus != EStatusPause )
#endif /* ipconfigUSE_CALLBACKS != 0 */ {
xStatus = EStatusPause;
xStatus = EStatusLookup; }
#if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) || ( ipconfigUSE_CALLBACKS != 0 ) }
{
xNTPWakeupSem = xSemaphoreCreateBinary(); vSignalTask();
} /* Tell the driver not to store the RX data */
#endif return 1;
}
#if( ipconfigUSE_CALLBACKS != 0 ) /*-----------------------------------------------------------*/
{
memset( &xHandler, '\0', sizeof( xHandler ) ); #endif /* ipconfigUSE_CALLBACKS != 0 */
xHandler.pxOnUDPReceive = xOnUDPReceive;
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_UDP_RECV_HANDLER, ( void * ) &xHandler, sizeof( xHandler ) ); static void prvNTPTask( void * pvParameters )
} {
#endif BaseType_t xServerIndex = 3;
#if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) struct freertos_sockaddr xAddress;
{
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_SET_SEMAPHORE, ( void * ) &xNTPWakeupSem, sizeof( xNTPWakeupSem ) ); #if ( ipconfigUSE_CALLBACKS != 0 )
} F_TCP_UDP_Handler_t xHandler;
#endif #endif /* ipconfigUSE_CALLBACKS != 0 */
for( ; ; )
{ xStatus = EStatusLookup;
switch( xStatus ) #if ( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) || ( ipconfigUSE_CALLBACKS != 0 )
{ {
case EStatusLookup: xNTPWakeupSem = xSemaphoreCreateBinary();
if( ( ulIPAddressFound == 0ul ) || ( ulIPAddressFound == ~0ul ) ) }
{ #endif
if( ++xServerIndex == sizeof( pcTimeServers ) / sizeof( pcTimeServers[ 0 ] ) )
{ #if ( ipconfigUSE_CALLBACKS != 0 )
xServerIndex = 0; {
} memset( &xHandler, '\0', sizeof( xHandler ) );
FreeRTOS_printf( ( "Looking up server '%s'\n", pcTimeServers[ xServerIndex ] ) ); xHandler.pxOnUDPReceive = xOnUDPReceive;
FreeRTOS_gethostbyname_a( pcTimeServers[ xServerIndex ], vDNS_callback, (void *)NULL, 1200 ); FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_UDP_RECV_HANDLER, ( void * ) &xHandler, sizeof( xHandler ) );
} }
else #endif
{ #if ( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 )
xStatus = EStatusAsking; {
} FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_SET_SEMAPHORE, ( void * ) &xNTPWakeupSem, sizeof( xNTPWakeupSem ) );
break; }
#endif
case EStatusAsking:
{ for( ; ; )
char pcBuf[16]; {
switch( xStatus )
prvNTPPacketInit( ); {
case EStatusLookup:
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
{ if( ( ulIPAddressFound == 0ul ) || ( ulIPAddressFound == ~0ul ) )
xAddress.sin_address.ulIP_IPv4 = ulIPAddressFound; {
xAddress.sin_port = FreeRTOS_htons( NTP_PORT ); if( ++xServerIndex == sizeof( pcTimeServers ) / sizeof( pcTimeServers[ 0 ] ) )
FreeRTOS_inet_ntoa( xAddress.sin_address.ulIP_IPv4, pcBuf ); {
} xServerIndex = 0;
#else }
{
xAddress.sin_addr = ulIPAddressFound; FreeRTOS_printf( ( "Looking up server '%s'\n", pcTimeServers[ xServerIndex ] ) );
xAddress.sin_port = FreeRTOS_htons( NTP_PORT ); FreeRTOS_gethostbyname_a( pcTimeServers[ xServerIndex ], vDNS_callback, ( void * ) NULL, 1200 );
FreeRTOS_inet_ntoa( xAddress.sin_addr, pcBuf ); }
} else
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ {
xStatus = EStatusAsking;
xAddress.sin_family = FREERTOS_AF_INET; }
FreeRTOS_printf( ( "Sending UDP message to %s:%u\n", break;
pcBuf,
FreeRTOS_ntohs( xAddress.sin_port ) ) ); case EStatusAsking:
{
uxSendTime = xTaskGetTickCount( ); char pcBuf[ 16 ];
FreeRTOS_sendto( xUDPSocket, ( void * )&xNTPPacket, sizeof( xNTPPacket ), 0, &xAddress, sizeof( xAddress ) );
} prvNTPPacketInit();
break;
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
case EStatusPause: {
break; xAddress.sin_address.ulIP_IPv4 = ulIPAddressFound;
xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
case EStatusFailed: FreeRTOS_inet_ntoa( xAddress.sin_address.ulIP_IPv4, pcBuf );
break; }
} #else
{
#if( ipconfigUSE_CALLBACKS != 0 ) xAddress.sin_addr = ulIPAddressFound;
{ xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
xSemaphoreTake( xNTPWakeupSem, 5000 ); FreeRTOS_inet_ntoa( xAddress.sin_addr, pcBuf );
} }
#else #endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
{
uint32_t xAddressSize; xAddress.sin_family = FREERTOS_AF_INET;
BaseType_t xReturned;
FreeRTOS_printf( ( "Sending UDP message to %s:%u\n",
xAddressSize = sizeof( xAddress ); pcBuf,
xReturned = FreeRTOS_recvfrom( xUDPSocket, ( void * ) cRecvBuffer, sizeof( cRecvBuffer ), 0, &xAddress, &xAddressSize ); FreeRTOS_ntohs( xAddress.sin_port ) ) );
switch( xReturned )
{ uxSendTime = xTaskGetTickCount();
case 0: FreeRTOS_sendto( xUDPSocket, ( void * ) &xNTPPacket, sizeof( xNTPPacket ), 0, &xAddress, sizeof( xAddress ) );
case -pdFREERTOS_ERRNO_EAGAIN: }
case -pdFREERTOS_ERRNO_EINTR: break;
break;
default: case EStatusPause:
if( xReturned < sizeof( xNTPPacket ) ) break;
{
FreeRTOS_printf( ( "FreeRTOS_recvfrom: returns %ld\n", xReturned ) ); case EStatusFailed:
} break;
else }
{
prvReadTime( ( struct SNtpPacket *)cRecvBuffer ); #if ( ipconfigUSE_CALLBACKS != 0 )
if( xStatus != EStatusPause ) {
{ xSemaphoreTake( xNTPWakeupSem, 5000 );
xStatus = EStatusPause; }
} #else
} {
break; uint32_t xAddressSize;
} BaseType_t xReturned;
}
#endif xAddressSize = sizeof( xAddress );
} xReturned = FreeRTOS_recvfrom( xUDPSocket, ( void * ) cRecvBuffer, sizeof( cRecvBuffer ), 0, &xAddress, &xAddressSize );
}
/*-----------------------------------------------------------*/ switch( xReturned )
{
case 0:
case -pdFREERTOS_ERRNO_EAGAIN:
case -pdFREERTOS_ERRNO_EINTR:
break;
default:
if( xReturned < sizeof( xNTPPacket ) )
{
FreeRTOS_printf( ( "FreeRTOS_recvfrom: returns %ld\n", xReturned ) );
}
else
{
prvReadTime( ( struct SNtpPacket * ) cRecvBuffer );
if( xStatus != EStatusPause )
{
xStatus = EStatusPause;
}
}
break;
}
}
#endif /* if ( ipconfigUSE_CALLBACKS != 0 ) */
}
}
/*-----------------------------------------------------------*/

@ -1,5 +1,5 @@
FreeRTOS 2020107.00 adds a new SNTPv4 client library, [FreeRTOS/coreSNTP](https://github.com/FreeRTOS/coreSNTP), FreeRTOS 2020107.00 adds a new SNTPv4 client library, [FreeRTOS/coreSNTP](https://github.com/FreeRTOS/coreSNTP),
and an [accompanying demo](..\..\..\coreSNTP_Windows_Simulator) to showcase the setup of an SNTP client and system and an [accompanying demo](..\..\..\coreSNTP_Windows_Simulator) to showcase the setup of an SNTP client and system
wall-clock time using the library. Refer to wall-clock time using the library. Refer to
The protocols implemented in this directory are intended to be demo quality The protocols implemented in this directory are intended to be demo quality
examples only. They are not intended for inclusion in production devices. examples only. They are not intended for inclusion in production devices.

@ -1,133 +1,136 @@
/* /*
* FreeRTOS+TCP V2.0.1 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://aws.amazon.com/freertos * https://www.FreeRTOS.org
* https://www.FreeRTOS.org * https://github.com/FreeRTOS
*/ *
*/
#ifndef __FTPCMD_H__
#ifndef __FTPCMD_H__
#define __FTPCMD_H__
#define __FTPCMD_H__
#define REPL_110 "110 Restart marker reply.\r\n"
#define REPL_120 "120 Try again in 2 minutes.\r\n" #define REPL_110 "110 Restart marker reply.\r\n"
#define REPL_125 "125 Data connection already open; transfer starting.\r\n" #define REPL_120 "120 Try again in 2 minutes.\r\n"
#define REPL_150 "150 File status okay; about to open data connection.\r\n" #define REPL_125 "125 Data connection already open; transfer starting.\r\n"
#define REPL_200 "200 NOOP command successful.\r\n" #define REPL_150 "150 File status okay; about to open data connection.\r\n"
#define REPL_200_PROGRESS "200 NOOP: data transfer in progress.\r\n" #define REPL_200 "200 NOOP command successful.\r\n"
#define REPL_202 "202 Command not implemented, superfluous at this site.\r\n" #define REPL_200_PROGRESS "200 NOOP: data transfer in progress.\r\n"
#define REPL_211 "221 System status, or system help reply.\r\n" #define REPL_202 "202 Command not implemented, superfluous at this site.\r\n"
#define REPL_211_STATUS "221-status of %s.\r\n" #define REPL_211 "221 System status, or system help reply.\r\n"
#define REPL_211_END "221 End of status.\r\n" #define REPL_211_STATUS "221-status of %s.\r\n"
#define REPL_212 "212 Directory status.\r\n" #define REPL_211_END "221 End of status.\r\n"
#define REPL_213 "213 File status.\r\n" #define REPL_212 "212 Directory status.\r\n"
#define REPL_214 "214 Help message.\r\n" #define REPL_213 "213 File status.\r\n"
#define REPL_214_END "214 End Help message.\r\n" #define REPL_214 "214 Help message.\r\n"
#define REPL_215 "215 %s system type.\r\n" #define REPL_214_END "214 End Help message.\r\n"
#define REPL_220 "220 Service ready for new user.\r\n" #define REPL_215 "215 %s system type.\r\n"
#define REPL_221 "221 Service closing control connection.\r\n" #define REPL_220 "220 Service ready for new user.\r\n"
#define REPL_225 "225 Data connection open; no transfer in progress.\r\n" #define REPL_221 "221 Service closing control connection.\r\n"
#define REPL_226 "226 Closing data connection.\r\n" #define REPL_225 "225 Data connection open; no transfer in progress.\r\n"
#define REPL_227 "227 Entering Passive Mode (%s,%s,%s,%s,%s,%s).\r\n" #define REPL_226 "226 Closing data connection.\r\n"
#define REPL_227_D "227 Entering Passive Mode (%u,%u,%u,%u,%u,%u).\r\n" #define REPL_227 "227 Entering Passive Mode (%s,%s,%s,%s,%s,%s).\r\n"
#define REPL_230 "230 User logged in, proceed.\r\n" #define REPL_227_D "227 Entering Passive Mode (%u,%u,%u,%u,%u,%u).\r\n"
#define REPL_250 "250 Requested file action okay, completed.\r\n" #define REPL_230 "230 User logged in, proceed.\r\n"
#define REPL_257 "257 %s created.\r\n" #define REPL_250 "250 Requested file action okay, completed.\r\n"
// #define REPL_257_PWD "257 \"%s\" is current working dir.\r\n" #define REPL_257 "257 %s created.\r\n"
#define REPL_257_PWD "257 \"%s\"\r\n" /* #define REPL_257_PWD "257 \"%s\" is current working dir.\r\n" */
#define REPL_331 "331 Only anonymous user is accepted.\r\n" #define REPL_257_PWD "257 \"%s\"\r\n"
#define REPL_331_ANON "331 Anonymous login okay\r\n" #define REPL_331 "331 Only anonymous user is accepted.\r\n"
#define REPL_332 "332 Need account for login.\r\n" #define REPL_331_ANON "331 Anonymous login okay\r\n"
#define REPL_350 "350 Requested file action pending further information.\r\n" #define REPL_332 "332 Need account for login.\r\n"
#define REPL_421 "421 Service not available, closing control connection.\r\n" #define REPL_350 "350 Requested file action pending further information.\r\n"
#define REPL_425 "425 Can't open data connection.\r\n" #define REPL_421 "421 Service not available, closing control connection.\r\n"
#define REPL_426 "426 Connection closed; transfer aborted.\r\n" #define REPL_425 "425 Can't open data connection.\r\n"
#define REPL_450 "450 Requested file action not taken.\r\n" #define REPL_426 "426 Connection closed; transfer aborted.\r\n"
#define REPL_451 "451 Requested action aborted. Local error in processing.\r\n" #define REPL_450 "450 Requested file action not taken.\r\n"
#define REPL_452 "452 Requested action not taken.\r\n" #define REPL_451 "451 Requested action aborted. Local error in processing.\r\n"
#define REPL_500 "500 Syntax error, command unrecognized.\r\n" #define REPL_452 "452 Requested action not taken.\r\n"
#define REPL_501 "501 Syntax error in parameters or arguments.\r\n" #define REPL_500 "500 Syntax error, command unrecognized.\r\n"
#define REPL_502 "502 Command not implemented.\r\n" #define REPL_501 "501 Syntax error in parameters or arguments.\r\n"
#define REPL_503 "503 Bad sequence of commands.\r\n" #define REPL_502 "502 Command not implemented.\r\n"
#define REPL_504 "504 Command not implemented for that parameter.\r\n" #define REPL_503 "503 Bad sequence of commands.\r\n"
#define REPL_530 "530 Not logged in.\r\n" #define REPL_504 "504 Command not implemented for that parameter.\r\n"
#define REPL_532 "532 Need account for storing files.\r\n" #define REPL_530 "530 Not logged in.\r\n"
#define REPL_550 "550 Requested action not taken.\r\n" #define REPL_532 "532 Need account for storing files.\r\n"
#define REPL_551 "551 Requested action aborted. Page type unknown.\r\n" #define REPL_550 "550 Requested action not taken.\r\n"
#define REPL_552 "552 Requested file action aborted.\r\n" #define REPL_551 "551 Requested action aborted. Page type unknown.\r\n"
#define REPL_553 "553 Requested action not taken.\r\n" #define REPL_552 "552 Requested file action aborted.\r\n"
#define REPL_553_READ_ONLY "553 Read-only file-system.\r\n" #define REPL_553 "553 Requested action not taken.\r\n"
#define REPL_553_READ_ONLY "553 Read-only file-system.\r\n"
enum EFTPCommand {
ECMD_USER, enum EFTPCommand
ECMD_PASS, {
ECMD_ACCT, ECMD_USER,
ECMD_CWD, ECMD_PASS,
ECMD_CDUP, ECMD_ACCT,
ECMD_SMNT, ECMD_CWD,
ECMD_QUIT, ECMD_CDUP,
ECMD_REIN, ECMD_SMNT,
ECMD_PORT, ECMD_QUIT,
ECMD_PASV, ECMD_REIN,
ECMD_TYPE, ECMD_PORT,
ECMD_STRU, ECMD_PASV,
ECMD_MODE, ECMD_TYPE,
ECMD_RETR, ECMD_STRU,
ECMD_STOR, ECMD_MODE,
ECMD_STOU, ECMD_RETR,
ECMD_APPE, ECMD_STOR,
ECMD_ALLO, ECMD_STOU,
ECMD_REST, ECMD_APPE,
ECMD_RNFR, ECMD_ALLO,
ECMD_RNTO, ECMD_REST,
ECMD_ABOR, ECMD_RNFR,
ECMD_SIZE, ECMD_RNTO,
ECMD_MDTM, ECMD_ABOR,
ECMD_DELE, ECMD_SIZE,
ECMD_RMD, ECMD_MDTM,
ECMD_MKD, ECMD_DELE,
ECMD_PWD, ECMD_RMD,
ECMD_LIST, ECMD_MKD,
ECMD_NLST, ECMD_PWD,
ECMD_SITE, ECMD_LIST,
ECMD_SYST, ECMD_NLST,
ECMD_FEAT, ECMD_SITE,
ECMD_STAT, ECMD_SYST,
ECMD_HELP, ECMD_FEAT,
ECMD_NOOP, ECMD_STAT,
ECMD_EMPTY, ECMD_HELP,
ECMD_CLOSE, ECMD_NOOP,
ECMD_UNKNOWN, ECMD_EMPTY,
}; ECMD_CLOSE,
ECMD_UNKNOWN,
typedef struct xFTP_COMMAND { };
BaseType_t xCommandLength;
const char pcCommandName[7]; typedef struct xFTP_COMMAND
const unsigned char ucCommandType; {
const unsigned char checkLogin; BaseType_t xCommandLength;
const unsigned char checkNullArg; const char pcCommandName[ 7 ];
} FTPCommand_t; const unsigned char ucCommandType;
const unsigned char checkLogin;
#define FTP_CMD_COUNT (ECMD_UNKNOWN+1) const unsigned char checkNullArg;
} FTPCommand_t;
extern const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ];
#define FTP_CMD_COUNT ( ECMD_UNKNOWN + 1 )
#endif // __FTPCMD_H__
extern const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ];
#endif // __FTPCMD_H__

@ -1,67 +1,68 @@
/* /*
* FreeRTOS+TCP V2.0.3 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://aws.amazon.com/freertos * https://www.FreeRTOS.org
* https://www.FreeRTOS.org * https://github.com/FreeRTOS
*/ *
#ifndef FREERTOS_HTTP_COMMANDS_H */
#define FREERTOS_HTTP_COMMANDS_H #ifndef FREERTOS_HTTP_COMMANDS_H
#define FREERTOS_HTTP_COMMANDS_H
enum {
WEB_REPLY_OK = 200, enum
WEB_NO_CONTENT = 204, {
WEB_BAD_REQUEST = 400, WEB_REPLY_OK = 200,
WEB_UNAUTHORIZED = 401, WEB_NO_CONTENT = 204,
WEB_NOT_FOUND = 404, WEB_BAD_REQUEST = 400,
WEB_GONE = 410, WEB_UNAUTHORIZED = 401,
WEB_PRECONDITION_FAILED = 412, WEB_NOT_FOUND = 404,
WEB_INTERNAL_SERVER_ERROR = 500, WEB_GONE = 410,
}; WEB_PRECONDITION_FAILED = 412,
WEB_INTERNAL_SERVER_ERROR = 500,
enum EWebCommand { };
ECMD_GET,
ECMD_HEAD, enum EWebCommand
ECMD_POST, {
ECMD_PUT, ECMD_GET,
ECMD_DELETE, ECMD_HEAD,
ECMD_TRACE, ECMD_POST,
ECMD_OPTIONS, ECMD_PUT,
ECMD_CONNECT, ECMD_DELETE,
ECMD_PATCH, ECMD_TRACE,
ECMD_UNK, ECMD_OPTIONS,
}; ECMD_CONNECT,
ECMD_PATCH,
struct xWEB_COMMAND ECMD_UNK,
{ };
BaseType_t xCommandLength;
const char *pcCommandName; struct xWEB_COMMAND
const unsigned char ucCommandType; {
}; BaseType_t xCommandLength;
const char * pcCommandName;
#define WEB_CMD_COUNT (ECMD_UNK+1) const unsigned char ucCommandType;
};
extern const struct xWEB_COMMAND xWebCommands[WEB_CMD_COUNT];
#define WEB_CMD_COUNT ( ECMD_UNK + 1 )
extern const char *webCodename (int aCode);
extern const struct xWEB_COMMAND xWebCommands[ WEB_CMD_COUNT ];
#endif /* FREERTOS_HTTP_COMMANDS_H */
extern const char * webCodename( int aCode );
#endif /* FREERTOS_HTTP_COMMANDS_H */

@ -1,125 +1,141 @@
/* /*
* FreeRTOS+TCP V2.0.3 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://aws.amazon.com/freertos * https://www.FreeRTOS.org
* https://www.FreeRTOS.org * https://github.com/FreeRTOS
*/ *
*/
/*
Some code which is common to TCP servers like HTTP en FTP /*
*/ * Some code which is common to TCP servers like HTTP en FTP
*/
#ifndef FREERTOS_TCP_SERVER_H
#define FREERTOS_TCP_SERVER_H #ifndef FREERTOS_TCP_SERVER_H
#define FREERTOS_TCP_SERVER_H
#ifdef __cplusplus
extern "C" { #ifdef __cplusplus
#endif extern "C" {
#endif
#ifndef FTP_SERVER_USES_RELATIVE_DIRECTORY
#define FTP_SERVER_USES_RELATIVE_DIRECTORY 0 #ifndef FTP_SERVER_USES_RELATIVE_DIRECTORY
#endif #define FTP_SERVER_USES_RELATIVE_DIRECTORY 0
#endif
enum eSERVER_TYPE
{ enum eSERVER_TYPE
eSERVER_NONE, {
eSERVER_HTTP, eSERVER_NONE,
eSERVER_FTP, eSERVER_HTTP,
}; eSERVER_FTP,
};
struct xFTP_CLIENT;
struct xFTP_CLIENT;
#if( ipconfigFTP_HAS_RECEIVED_HOOK != 0 )
extern void vApplicationFTPReceivedHook( const char *pcFileName, uint32_t ulSize, struct xFTP_CLIENT *pxFTPClient ); #if ( ipconfigFTP_HAS_RECEIVED_HOOK != 0 )
extern void vFTPReplyMessage( struct xFTP_CLIENT *pxFTPClient, const char *pcMessage ); extern void vApplicationFTPReceivedHook( const char * pcFileName,
#endif /* ipconfigFTP_HAS_RECEIVED_HOOK != 0 */ uint32_t ulSize,
struct xFTP_CLIENT * pxFTPClient );
#if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 ) extern void vFTPReplyMessage( struct xFTP_CLIENT * pxFTPClient,
/* const char * pcMessage );
* Function is called when a user name has been submitted. #endif /* ipconfigFTP_HAS_RECEIVED_HOOK != 0 */
* The function may return a string such as: "331 Please enter your password"
* or return NULL to use the default reply. #if ( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
*/
extern const char *pcApplicationFTPUserHook( const char *pcUserName ); /*
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */ * Function is called when a user name has been submitted.
* The function may return a string such as: "331 Please enter your password"
#if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 ) * or return NULL to use the default reply.
/* */
* Function is called when a password was received. extern const char * pcApplicationFTPUserHook( const char * pcUserName );
* Return positive value to allow the user #endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
*/
extern BaseType_t xApplicationFTPPasswordHook( const char *pcUserName, const char *pcPassword ); #if ( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
/*
#if( ipconfigFTP_HAS_USER_PROPERTIES_HOOK != 0 ) * Function is called when a password was received.
/* * Return positive value to allow the user
* The FTP server is asking for user-specific properties */
*/ extern BaseType_t xApplicationFTPPasswordHook( const char * pcUserName,
typedef struct const char * pcPassword );
{ #endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
uint16_t usPortNumber; /* For reference only. Host-endian. */
const char *pcRootDir; #if ( ipconfigFTP_HAS_USER_PROPERTIES_HOOK != 0 )
BaseType_t xReadOnly;
} /*
FTPUserProperties_t; * The FTP server is asking for user-specific properties
extern void vApplicationFTPUserPropertiesHook( const char *pcUserName, FTPUserProperties_t *pxProperties ); */
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */ typedef struct
{
#if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 ) uint16_t usPortNumber; /* For reference only. Host-endian. */
/* const char * pcRootDir;
* A GET request is received containing a special character, BaseType_t xReadOnly;
* usually a question mark. }
* const char *pcURLData; // A request, e.g. "/request?limit=75" FTPUserProperties_t;
* char *pcBuffer; // Here the answer can be written extern void vApplicationFTPUserPropertiesHook( const char * pcUserName,
* size_t uxBufferLength; // Size of the buffer FTPUserProperties_t * pxProperties );
* #endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
*/
extern size_t uxApplicationHTTPHandleRequestHook( const char *pcURLData, char *pcBuffer, size_t uxBufferLength ); #if ( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
/*
struct xSERVER_CONFIG * A GET request is received containing a special character,
{ * usually a question mark.
enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */ * const char *pcURLData; // A request, e.g. "/request?limit=75"
BaseType_t xPortNumber; /* e.g. 80, 8080, 21 */ * char *pcBuffer; // Here the answer can be written
BaseType_t xBackLog; /* e.g. 10, maximum number of connected TCP clients */ * size_t uxBufferLength; // Size of the buffer
const char * const pcRootDir; /* Treat this directory as the root directory */ *
}; */
extern size_t uxApplicationHTTPHandleRequestHook( const char * pcURLData,
struct xTCP_SERVER; char * pcBuffer,
typedef struct xTCP_SERVER TCPServer_t; size_t uxBufferLength );
#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
TCPServer_t *FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG *pxConfigs, BaseType_t xCount );
void FreeRTOS_TCPServerWork( TCPServer_t *pxServer, TickType_t xBlockingTime ); struct xSERVER_CONFIG
{
#if( ipconfigSUPPORT_SIGNALS != 0 ) enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
/* FreeRTOS_TCPServerWork() calls select(). BaseType_t xPortNumber; /* e.g. 80, 8080, 21 */
The two functions below provide a possibility to interrupt BaseType_t xBackLog; /* e.g. 10, maximum number of connected TCP clients */
the call to select(). After the interruption, resume const char * const pcRootDir; /* Treat this directory as the root directory */
by calling FreeRTOS_TCPServerWork() again. */ };
BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t *pxServer );
BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t *pxServer, BaseType_t *pxHigherPriorityTaskWoken ); struct xTCP_SERVER;
#endif typedef struct xTCP_SERVER TCPServer_t;
#ifdef __cplusplus TCPServer_t * FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG * pxConfigs,
} /* extern "C" */ BaseType_t xCount );
#endif void FreeRTOS_TCPServerWork( TCPServer_t * pxServer,
TickType_t xBlockingTime );
#endif /* FREERTOS_TCP_SERVER_H */
#if ( ipconfigSUPPORT_SIGNALS != 0 )
/* FreeRTOS_TCPServerWork() calls select().
* The two functions below provide a possibility to interrupt
* the call to select(). After the interruption, resume
* by calling FreeRTOS_TCPServerWork() again. */
BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t * pxServer );
BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t * pxServer,
BaseType_t * pxHigherPriorityTaskWoken );
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* FREERTOS_TCP_SERVER_H */

@ -1,185 +1,201 @@
/* /*
* FreeRTOS+TCP V2.0.3 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://aws.amazon.com/freertos * https://www.FreeRTOS.org
* https://www.FreeRTOS.org * https://github.com/FreeRTOS
*/ *
*/
/*
Some code which is common to TCP servers like HTTP and FTP /*
*/ * Some code which is common to TCP servers like HTTP and FTP
*/
#ifndef FREERTOS_SERVER_PRIVATE_H
#define FREERTOS_SERVER_PRIVATE_H #ifndef FREERTOS_SERVER_PRIVATE_H
#define FREERTOS_SERVER_PRIVATE_H
#define FREERTOS_NO_SOCKET NULL
#define FREERTOS_NO_SOCKET NULL
/* FreeRTOS+FAT */
#include "ff_stdio.h" /* FreeRTOS+FAT */
#include "ff_stdio.h"
/* Each HTTP server has 1, at most 2 sockets */
#define HTTP_SOCKET_COUNT 2 /* Each HTTP server has 1, at most 2 sockets */
#define HTTP_SOCKET_COUNT 2
/*
* ipconfigTCP_COMMAND_BUFFER_SIZE sets the size of: /*
* pcCommandBuffer': a buffer to receive and send TCP commands * ipconfigTCP_COMMAND_BUFFER_SIZE sets the size of:
* * pcCommandBuffer': a buffer to receive and send TCP commands
* ipconfigTCP_FILE_BUFFER_SIZE sets the size of: *
* pcFileBuffer' : a buffer to access the file system: read or write data. * ipconfigTCP_FILE_BUFFER_SIZE sets the size of:
* * pcFileBuffer' : a buffer to access the file system: read or write data.
* The buffers are both used for FTP as well as HTTP. *
*/ * The buffers are both used for FTP as well as HTTP.
*/
#ifndef ipconfigTCP_COMMAND_BUFFER_SIZE
#define ipconfigTCP_COMMAND_BUFFER_SIZE ( 2048 ) #ifndef ipconfigTCP_COMMAND_BUFFER_SIZE
#endif #define ipconfigTCP_COMMAND_BUFFER_SIZE ( 2048 )
#endif
#ifndef ipconfigTCP_FILE_BUFFER_SIZE
#define ipconfigTCP_FILE_BUFFER_SIZE ( 2048 ) #ifndef ipconfigTCP_FILE_BUFFER_SIZE
#endif #define ipconfigTCP_FILE_BUFFER_SIZE ( 2048 )
#endif
struct xTCP_CLIENT;
struct xTCP_CLIENT;
typedef BaseType_t ( * FTCPWorkFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
typedef void ( * FTCPDeleteFunction ) ( struct xTCP_CLIENT * /* pxClient */ ); typedef BaseType_t ( * FTCPWorkFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
typedef void ( * FTCPDeleteFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
#define TCP_CLIENT_FIELDS \
enum eSERVER_TYPE eType; \ #define TCP_CLIENT_FIELDS \
struct xTCP_SERVER *pxParent; \ enum eSERVER_TYPE eType; \
Socket_t xSocket; \ struct xTCP_SERVER * pxParent; \
const char *pcRootDir; \ Socket_t xSocket; \
FTCPWorkFunction fWorkFunction; \ const char * pcRootDir; \
FTCPDeleteFunction fDeleteFunction; \ FTCPWorkFunction fWorkFunction; \
struct xTCP_CLIENT *pxNextClient FTCPDeleteFunction fDeleteFunction; \
struct xTCP_CLIENT * pxNextClient
typedef struct xTCP_CLIENT
{ typedef struct xTCP_CLIENT
/* This define contains fields which must come first within each of the client structs */ {
TCP_CLIENT_FIELDS; /* This define contains fields which must come first within each of the client structs */
/* --- Keep at the top --- */ TCP_CLIENT_FIELDS;
/* --- Keep at the top --- */
} TCPClient_t; } TCPClient_t;
struct xHTTP_CLIENT struct xHTTP_CLIENT
{ {
/* This define contains fields which must come first within each of the client structs */ /* This define contains fields which must come first within each of the client structs */
TCP_CLIENT_FIELDS; TCP_CLIENT_FIELDS;
/* --- Keep at the top --- */ /* --- Keep at the top --- */
const char *pcUrlData; const char * pcUrlData;
const char *pcRestData; const char * pcRestData;
char pcCurrentFilename[ ffconfigMAX_FILENAME ]; char pcCurrentFilename[ ffconfigMAX_FILENAME ];
size_t uxBytesLeft; size_t uxBytesLeft;
FF_FILE *pxFileHandle; FF_FILE * pxFileHandle;
union { union
struct { {
uint32_t struct
bReplySent : 1; {
}; uint32_t
uint32_t ulFlags; bReplySent : 1;
} bits; };
}; uint32_t ulFlags;
}
typedef struct xHTTP_CLIENT HTTPClient_t; bits;
};
struct xFTP_CLIENT
{ typedef struct xHTTP_CLIENT HTTPClient_t;
/* This define contains fields which must come first within each of the client structs */
TCP_CLIENT_FIELDS; struct xFTP_CLIENT
/* --- Keep at the top --- */ {
/* This define contains fields which must come first within each of the client structs */
uint32_t ulRestartOffset; TCP_CLIENT_FIELDS;
uint32_t ulRecvBytes; /* --- Keep at the top --- */
size_t uxBytesLeft; /* Bytes left to send */
uint32_t ulClientIP; uint32_t ulRestartOffset;
TickType_t xStartTime; uint32_t ulRecvBytes;
uint16_t usClientPort; size_t uxBytesLeft; /* Bytes left to send */
Socket_t xTransferSocket; uint32_t ulClientIP;
BaseType_t xTransType; TickType_t xStartTime;
BaseType_t xDirCount; uint16_t usClientPort;
FF_FindData_t xFindData; Socket_t xTransferSocket;
FF_FILE *pxReadHandle; BaseType_t xTransType;
FF_FILE *pxWriteHandle; BaseType_t xDirCount;
char pcCurrentDir[ ffconfigMAX_FILENAME ]; FF_FindData_t xFindData;
char pcFileName[ ffconfigMAX_FILENAME ]; FF_FILE * pxReadHandle;
char pcConnectionAck[ 128 ]; FF_FILE * pxWriteHandle;
char pcClientAck[ 128 ]; char pcCurrentDir[ ffconfigMAX_FILENAME ];
union { char pcFileName[ ffconfigMAX_FILENAME ];
struct { char pcConnectionAck[ 128 ];
uint32_t char pcClientAck[ 128 ];
bHelloSent : 1, union
bLoggedIn : 1, {
bStatusUser : 1, struct
bInRename : 1, {
bReadOnly : 1; uint32_t
}; bHelloSent : 1,
uint32_t ulFTPFlags; bLoggedIn : 1,
} bits; bStatusUser : 1,
union { bInRename : 1,
struct { bReadOnly : 1;
uint32_t };
bIsListen : 1, /* pdTRUE for passive data connections (using list()). */ uint32_t ulFTPFlags;
bDirHasEntry : 1, /* pdTRUE if ff_findfirst() was successful. */ }
bClientConnected : 1, /* pdTRUE after connect() or accept() has succeeded. */ bits;
bEmptyFile : 1, /* pdTRUE if a connection-without-data was received. */ union
bHadError : 1; /* pdTRUE if a transfer got aborted because of an error. */ {
}; struct
uint32_t ulConnFlags; {
} bits1; uint32_t
}; bIsListen : 1, /* pdTRUE for passive data connections (using list()). */
bDirHasEntry : 1, /* pdTRUE if ff_findfirst() was successful. */
typedef struct xFTP_CLIENT FTPClient_t; bClientConnected : 1, /* pdTRUE after connect() or accept() has succeeded. */
bEmptyFile : 1, /* pdTRUE if a connection-without-data was received. */
BaseType_t xHTTPClientWork( TCPClient_t *pxClient ); bHadError : 1; /* pdTRUE if a transfer got aborted because of an error. */
BaseType_t xFTPClientWork( TCPClient_t *pxClient ); };
uint32_t ulConnFlags;
void vHTTPClientDelete( TCPClient_t *pxClient ); }
void vFTPClientDelete( TCPClient_t *pxClient ); bits1;
};
BaseType_t xMakeAbsolute( struct xFTP_CLIENT *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName );
BaseType_t xMakeRelative( FTPClient_t *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName ); typedef struct xFTP_CLIENT FTPClient_t;
struct xTCP_SERVER BaseType_t xHTTPClientWork( TCPClient_t * pxClient );
{ BaseType_t xFTPClientWork( TCPClient_t * pxClient );
SocketSet_t xSocketSet;
/* A buffer to receive and send TCP commands, either HTTP of FTP. */ void vHTTPClientDelete( TCPClient_t * pxClient );
char pcCommandBuffer[ ipconfigTCP_COMMAND_BUFFER_SIZE ]; void vFTPClientDelete( TCPClient_t * pxClient );
/* A buffer to access the file system: read or write data. */
char pcFileBuffer[ ipconfigTCP_FILE_BUFFER_SIZE ]; BaseType_t xMakeAbsolute( struct xFTP_CLIENT * pxClient,
char * pcBuffer,
#if( ipconfigUSE_FTP != 0 ) BaseType_t xBufferLength,
char pcNewDir[ ffconfigMAX_FILENAME ]; const char * pcFileName );
#endif BaseType_t xMakeRelative( FTPClient_t * pxClient,
#if( ipconfigUSE_HTTP != 0 ) char * pcBuffer,
char pcContentsType[40]; /* Space for the msg: "text/javascript" */ BaseType_t xBufferLength,
char pcExtraContents[40]; /* Space for the msg: "Content-Length: 346500" */ const char * pcFileName );
#endif
BaseType_t xServerCount; struct xTCP_SERVER
TCPClient_t *pxClients; {
struct xSERVER SocketSet_t xSocketSet;
{ /* A buffer to receive and send TCP commands, either HTTP of FTP. */
enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */ char pcCommandBuffer[ ipconfigTCP_COMMAND_BUFFER_SIZE ];
const char *pcRootDir; /* A buffer to access the file system: read or write data. */
Socket_t xSocket; char pcFileBuffer[ ipconfigTCP_FILE_BUFFER_SIZE ];
} xServers[ 1 ];
}; #if ( ipconfigUSE_FTP != 0 )
char pcNewDir[ ffconfigMAX_FILENAME ];
#endif /* FREERTOS_SERVER_PRIVATE_H */ #endif
#if ( ipconfigUSE_HTTP != 0 )
char pcContentsType[ 40 ]; /* Space for the msg: "text/javascript" */
char pcExtraContents[ 40 ]; /* Space for the msg: "Content-Length: 346500" */
#endif
BaseType_t xServerCount;
TCPClient_t * pxClients;
struct xSERVER
{
enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
const char * pcRootDir;
Socket_t xSocket;
}
xServers[ 1 ];
};
#endif /* FREERTOS_SERVER_PRIVATE_H */

@ -1,71 +1,98 @@
// /*
// ntpClient.h * FreeRTOS V202212.00
// * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
#ifndef __NTPCLIENT_H__ * 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
#define __NTPCLIENT_H__ * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
#define NTP_PORT 123 * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
typedef uint32_t quint32; *
typedef int32_t qint32; * The above copyright notice and this permission notice shall be included in all
typedef uint8_t quint8; * copies or substantial portions of the Software.
typedef int8_t qint8; *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
typedef union _SNtpFlags SNtpFlags; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
/** * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* 64-bit NTP timestamp. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
*/ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
struct __attribute__ ((__packed__)) _SNtpTimestamp { *
/** Number of seconds passed since Jan 1 1900, in big-endian format. */ * https://www.FreeRTOS.org
quint32 seconds; * https://github.com/FreeRTOS
*
/** Fractional time part, in <tt>1/0xFFFFFFFF</tt>s of a second. */ */
quint32 fraction;
}; /* ntpClient.h */
typedef struct _SNtpTimestamp SNtpTimestamp; #ifndef __NTPCLIENT_H__
/**
* Mandatory part of an NTP packet #define __NTPCLIENT_H__
*/
struct SNtpPacket { #define NTP_PORT 123
/** Flags. */
unsigned char flags; // value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 typedef uint32_t quint32;
typedef int32_t qint32;
/** Stratum of the clock. */ typedef uint8_t quint8;
quint8 stratum; // value 0 : unspecified typedef int8_t qint8;
/** Maximum interval between successive messages, in log2 seconds. Note that the value is signed. */ typedef union _SNtpFlags SNtpFlags;
qint8 poll; // 10 means 1 << 10 = 1024 seconds
/**
/** Precision of the clock, in log2 seconds. Note that the value is signed. */ * 64-bit NTP timestamp.
qint8 precision; // 0xFA = 250 = 0.015625 seconds */
struct __attribute__( ( __packed__ ) ) _SNtpTimestamp
/** Round trip time to the primary reference source, in NTP short format. */ {
qint32 rootDelay; // 0x5D2E = 23854 or (23854/65535)= 0.3640 sec /** Number of seconds passed since Jan 1 1900, in big-endian format. */
quint32 seconds;
/** Nominal error relative to the primary reference source. */
qint32 rootDispersion; // 0x0008 CAC8 = 8.7912 seconds /** Fractional time part, in <tt>1/0xFFFFFFFF</tt>s of a second. */
quint32 fraction;
/** Reference identifier (either a 4 character string or an IP address). */ };
qint8 referenceID[4]; // or just 0000
typedef struct _SNtpTimestamp SNtpTimestamp;
/** The time at which the clock was last set or corrected. */
SNtpTimestamp referenceTimestamp; // Current time /**
* Mandatory part of an NTP packet
/** The time at which the request departed the client for the server. */ */
SNtpTimestamp originateTimestamp; // Keep 0 struct SNtpPacket
{
/** The time at which the request arrived at the server. */ /** Flags. */
SNtpTimestamp receiveTimestamp; // Keep 0 unsigned char flags; /* value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 */
/** The time at which the reply departed the server for client. */ /** Stratum of the clock. */
SNtpTimestamp transmitTimestamp; quint8 stratum; /* value 0 : unspecified */
};
/** Maximum interval between successive messages, in log2 seconds. Note that the value is signed. */
/* Add this number to get secs since 1-1-1900 */ qint8 poll; /* 10 means 1 << 10 = 1024 seconds */
#define TIME1970 2208988800UL
/** Precision of the clock, in log2 seconds. Note that the value is signed. */
#endif // __NTPCLIENT_H__ qint8 precision; /* 0xFA = 250 = 0.015625 seconds */
/** Round trip time to the primary reference source, in NTP short format. */
qint32 rootDelay; /* 0x5D2E = 23854 or (23854/65535)= 0.3640 sec */
/** Nominal error relative to the primary reference source. */
qint32 rootDispersion; /* 0x0008 CAC8 = 8.7912 seconds */
/** Reference identifier (either a 4 character string or an IP address). */
qint8 referenceID[ 4 ]; /* or just 0000 */
/** The time at which the clock was last set or corrected. */
SNtpTimestamp referenceTimestamp; /* Current time */
/** The time at which the request departed the client for the server. */
SNtpTimestamp originateTimestamp; /* Keep 0 */
/** The time at which the request arrived at the server. */
SNtpTimestamp receiveTimestamp; /* Keep 0 */
/** The time at which the reply departed the server for client. */
SNtpTimestamp transmitTimestamp;
};
/* Add this number to get secs since 1-1-1900 */
#define TIME1970 2208988800UL
#endif // __NTPCLIENT_H__

@ -1,11 +1,34 @@
/* /*
* A simple demo for NTP using FreeRTOS+TCP * FreeRTOS V202212.00
*/ * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
#ifndef NTPDEMO_H * 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
#define NTPDEMO_H * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
void vStartNTPTask( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority ); * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
#endif *
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/
#ifndef NTPDEMO_H
#define NTPDEMO_H
void vStartNTPTask( uint16_t usTaskStackSize,
UBaseType_t uxTaskPriority );
#endif

@ -1,479 +1,507 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://aws.amazon.com/freertos * https://github.com/FreeRTOS
* *
*/ */
/****************************************************************************** /******************************************************************************
* *
* https://www.FreeRTOS.org/cli * https://www.FreeRTOS.org/cli
* *
******************************************************************************/ ******************************************************************************/
/* FreeRTOS includes. */ /* FreeRTOS includes. */
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
/* Standard includes. */ /* Standard includes. */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
/* FreeRTOS+CLI includes. */ /* FreeRTOS+CLI includes. */
#include "FreeRTOS_CLI.h" #include "FreeRTOS_CLI.h"
#ifndef configINCLUDE_TRACE_RELATED_CLI_COMMANDS #ifndef configINCLUDE_TRACE_RELATED_CLI_COMMANDS
#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0 #define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0
#endif #endif
#ifndef configINCLUDE_QUERY_HEAP_COMMAND #ifndef configINCLUDE_QUERY_HEAP_COMMAND
#define configINCLUDE_QUERY_HEAP_COMMAND 0 #define configINCLUDE_QUERY_HEAP_COMMAND 0
#endif #endif
/* /*
* The function that registers the commands that are defined within this file. * The function that registers the commands that are defined within this file.
*/ */
void vRegisterSampleCLICommands( void ); void vRegisterSampleCLICommands( void );
/* /*
* Implements the task-stats command. * Implements the task-stats command.
*/ */
static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); static BaseType_t prvTaskStatsCommand( char * pcWriteBuffer,
size_t xWriteBufferLen,
/* const char * pcCommandString );
* Implements the run-time-stats command.
*/ /*
#if( configGENERATE_RUN_TIME_STATS == 1 ) * Implements the run-time-stats command.
static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); */
#endif /* configGENERATE_RUN_TIME_STATS */ #if ( configGENERATE_RUN_TIME_STATS == 1 )
static BaseType_t prvRunTimeStatsCommand( char * pcWriteBuffer,
/* size_t xWriteBufferLen,
* Implements the echo-three-parameters command. const char * pcCommandString );
*/ #endif /* configGENERATE_RUN_TIME_STATS */
static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
/*
/* * Implements the echo-three-parameters command.
* Implements the echo-parameters command. */
*/ static BaseType_t prvThreeParameterEchoCommand( char * pcWriteBuffer,
static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); size_t xWriteBufferLen,
const char * pcCommandString );
/*
* Implements the "query heap" command. /*
*/ * Implements the echo-parameters command.
#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 ) */
static BaseType_t prvQueryHeapCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); static BaseType_t prvParameterEchoCommand( char * pcWriteBuffer,
#endif size_t xWriteBufferLen,
const char * pcCommandString );
/*
* Implements the "trace start" and "trace stop" commands; /*
*/ * Implements the "query heap" command.
#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 ) */
static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); #if ( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
#endif static BaseType_t prvQueryHeapCommand( char * pcWriteBuffer,
size_t xWriteBufferLen,
/* Structure that defines the "task-stats" command line command. This generates const char * pcCommandString );
a table that gives information on each task in the system. */ #endif
static const CLI_Command_Definition_t xTaskStats =
{ /*
"task-stats", /* The command string to type. */ * Implements the "trace start" and "trace stop" commands;
"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n", */
prvTaskStatsCommand, /* The function to run. */ #if ( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )
0 /* No parameters are expected. */ static BaseType_t prvStartStopTraceCommand( char * pcWriteBuffer,
}; size_t xWriteBufferLen,
const char * pcCommandString );
/* Structure that defines the "echo_3_parameters" command line command. This #endif
takes exactly three parameters that the command simply echos back one at a
time. */ /* Structure that defines the "task-stats" command line command. This generates
static const CLI_Command_Definition_t xThreeParameterEcho = * a table that gives information on each task in the system. */
{ static const CLI_Command_Definition_t xTaskStats =
"echo-3-parameters", {
"\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n", "task-stats", /* The command string to type. */
prvThreeParameterEchoCommand, /* The function to run. */ "\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n",
3 /* Three parameters are expected, which can take any value. */ prvTaskStatsCommand, /* The function to run. */
}; 0 /* No parameters are expected. */
};
/* Structure that defines the "echo_parameters" command line command. This
takes a variable number of parameters that the command simply echos back one at /* Structure that defines the "echo_3_parameters" command line command. This
a time. */ * takes exactly three parameters that the command simply echos back one at a
static const CLI_Command_Definition_t xParameterEcho = * time. */
{ static const CLI_Command_Definition_t xThreeParameterEcho =
"echo-parameters", {
"\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n", "echo-3-parameters",
prvParameterEchoCommand, /* The function to run. */ "\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n",
-1 /* The user can enter any number of commands. */ prvThreeParameterEchoCommand, /* The function to run. */
}; 3 /* Three parameters are expected, which can take any value. */
};
#if( configGENERATE_RUN_TIME_STATS == 1 )
/* Structure that defines the "run-time-stats" command line command. This /* Structure that defines the "echo_parameters" command line command. This
generates a table that shows how much run time each task has */ * takes a variable number of parameters that the command simply echos back one at
static const CLI_Command_Definition_t xRunTimeStats = * a time. */
{ static const CLI_Command_Definition_t xParameterEcho =
"run-time-stats", /* The command string to type. */ {
"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n", "echo-parameters",
prvRunTimeStatsCommand, /* The function to run. */ "\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n",
0 /* No parameters are expected. */ prvParameterEchoCommand, /* The function to run. */
}; -1 /* The user can enter any number of commands. */
#endif /* configGENERATE_RUN_TIME_STATS */ };
#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 ) #if ( configGENERATE_RUN_TIME_STATS == 1 )
/* Structure that defines the "query_heap" command line command. */
static const CLI_Command_Definition_t xQueryHeap = /* Structure that defines the "run-time-stats" command line command. This
{ * generates a table that shows how much run time each task has */
"query-heap", static const CLI_Command_Definition_t xRunTimeStats =
"\r\nquery-heap:\r\n Displays the free heap space, and minimum ever free heap space.\r\n", {
prvQueryHeapCommand, /* The function to run. */ "run-time-stats", /* The command string to type. */
0 /* The user can enter any number of commands. */ "\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n",
}; prvRunTimeStatsCommand, /* The function to run. */
#endif /* configQUERY_HEAP_COMMAND */ 0 /* No parameters are expected. */
};
#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 #endif /* configGENERATE_RUN_TIME_STATS */
/* Structure that defines the "trace" command line command. This takes a single
parameter, which can be either "start" or "stop". */ #if ( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
static const CLI_Command_Definition_t xStartStopTrace = /* Structure that defines the "query_heap" command line command. */
{ static const CLI_Command_Definition_t xQueryHeap =
"trace", {
"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n", "query-heap",
prvStartStopTraceCommand, /* The function to run. */ "\r\nquery-heap:\r\n Displays the free heap space, and minimum ever free heap space.\r\n",
1 /* One parameter is expected. Valid values are "start" and "stop". */ prvQueryHeapCommand, /* The function to run. */
}; 0 /* The user can enter any number of commands. */
#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */ };
#endif /* configQUERY_HEAP_COMMAND */
/*-----------------------------------------------------------*/
#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
void vRegisterSampleCLICommands( void )
{ /* Structure that defines the "trace" command line command. This takes a single
/* Register all the command line commands defined immediately above. */ * parameter, which can be either "start" or "stop". */
FreeRTOS_CLIRegisterCommand( &xTaskStats ); static const CLI_Command_Definition_t xStartStopTrace =
FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho ); {
FreeRTOS_CLIRegisterCommand( &xParameterEcho ); "trace",
"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n",
#if( configGENERATE_RUN_TIME_STATS == 1 ) prvStartStopTraceCommand, /* The function to run. */
{ 1 /* One parameter is expected. Valid values are "start" and "stop". */
FreeRTOS_CLIRegisterCommand( &xRunTimeStats ); };
} #endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */
#endif
/*-----------------------------------------------------------*/
#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
{ void vRegisterSampleCLICommands( void )
FreeRTOS_CLIRegisterCommand( &xQueryHeap ); {
} /* Register all the command line commands defined immediately above. */
#endif FreeRTOS_CLIRegisterCommand( &xTaskStats );
FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );
#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 ) FreeRTOS_CLIRegisterCommand( &xParameterEcho );
{
FreeRTOS_CLIRegisterCommand( &xStartStopTrace ); #if ( configGENERATE_RUN_TIME_STATS == 1 )
} {
#endif FreeRTOS_CLIRegisterCommand( &xRunTimeStats );
} }
/*-----------------------------------------------------------*/ #endif
static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) #if ( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
{ {
const char *const pcHeader = " State Priority Stack #\r\n************************************************\r\n"; FreeRTOS_CLIRegisterCommand( &xQueryHeap );
BaseType_t xSpacePadding; }
#endif
/* Remove compile time warnings about unused parameters, and check the
write buffer is not NULL. NOTE - for simplicity, this example assumes the #if ( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )
write buffer length is adequate, so does not check for buffer overflows. */ {
( void ) pcCommandString; FreeRTOS_CLIRegisterCommand( &xStartStopTrace );
( void ) xWriteBufferLen; }
configASSERT( pcWriteBuffer ); #endif
}
/* Generate a table of task stats. */ /*-----------------------------------------------------------*/
strcpy( pcWriteBuffer, "Task" );
pcWriteBuffer += strlen( pcWriteBuffer ); static BaseType_t prvTaskStatsCommand( char * pcWriteBuffer,
size_t xWriteBufferLen,
/* Minus three for the null terminator and half the number of characters in const char * pcCommandString )
"Task" so the column lines up with the centre of the heading. */ {
configASSERT( configMAX_TASK_NAME_LEN > 3 ); const char * const pcHeader = " State Priority Stack #\r\n************************************************\r\n";
for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ ) BaseType_t xSpacePadding;
{
/* Add a space to align columns after the task's name. */ /* Remove compile time warnings about unused parameters, and check the
*pcWriteBuffer = ' '; * write buffer is not NULL. NOTE - for simplicity, this example assumes the
pcWriteBuffer++; * write buffer length is adequate, so does not check for buffer overflows. */
( void ) pcCommandString;
/* Ensure always terminated. */ ( void ) xWriteBufferLen;
*pcWriteBuffer = 0x00; configASSERT( pcWriteBuffer );
}
strcpy( pcWriteBuffer, pcHeader ); /* Generate a table of task stats. */
vTaskList( pcWriteBuffer + strlen( pcHeader ) ); strcpy( pcWriteBuffer, "Task" );
pcWriteBuffer += strlen( pcWriteBuffer );
/* There is no more data to return after this single string, so return
pdFALSE. */ /* Minus three for the null terminator and half the number of characters in
return pdFALSE; * "Task" so the column lines up with the centre of the heading. */
} configASSERT( configMAX_TASK_NAME_LEN > 3 );
/*-----------------------------------------------------------*/
for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ )
#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 ) {
/* Add a space to align columns after the task's name. */
static BaseType_t prvQueryHeapCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) *pcWriteBuffer = ' ';
{ pcWriteBuffer++;
/* Remove compile time warnings about unused parameters, and check the
write buffer is not NULL. NOTE - for simplicity, this example assumes the /* Ensure always terminated. */
write buffer length is adequate, so does not check for buffer overflows. */ *pcWriteBuffer = 0x00;
( void ) pcCommandString; }
( void ) xWriteBufferLen;
configASSERT( pcWriteBuffer ); strcpy( pcWriteBuffer, pcHeader );
vTaskList( pcWriteBuffer + strlen( pcHeader ) );
sprintf( pcWriteBuffer, "Current free heap %d bytes, minimum ever free heap %d bytes\r\n", ( int ) xPortGetFreeHeapSize(), ( int ) xPortGetMinimumEverFreeHeapSize() );
/* There is no more data to return after this single string, so return
/* There is no more data to return after this single string, so return * pdFALSE. */
pdFALSE. */ return pdFALSE;
return pdFALSE; }
} /*-----------------------------------------------------------*/
#endif /* configINCLUDE_QUERY_HEAP */ #if ( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
/*-----------------------------------------------------------*/
static BaseType_t prvQueryHeapCommand( char * pcWriteBuffer,
#if( configGENERATE_RUN_TIME_STATS == 1 ) size_t xWriteBufferLen,
const char * pcCommandString )
static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) {
{ /* Remove compile time warnings about unused parameters, and check the
const char * const pcHeader = " Abs Time % Time\r\n****************************************\r\n"; * write buffer is not NULL. NOTE - for simplicity, this example assumes the
BaseType_t xSpacePadding; * write buffer length is adequate, so does not check for buffer overflows. */
( void ) pcCommandString;
/* Remove compile time warnings about unused parameters, and check the ( void ) xWriteBufferLen;
write buffer is not NULL. NOTE - for simplicity, this example assumes the configASSERT( pcWriteBuffer );
write buffer length is adequate, so does not check for buffer overflows. */
( void ) pcCommandString; sprintf( pcWriteBuffer, "Current free heap %d bytes, minimum ever free heap %d bytes\r\n", ( int ) xPortGetFreeHeapSize(), ( int ) xPortGetMinimumEverFreeHeapSize() );
( void ) xWriteBufferLen;
configASSERT( pcWriteBuffer ); /* There is no more data to return after this single string, so return
* pdFALSE. */
/* Generate a table of task stats. */ return pdFALSE;
strcpy( pcWriteBuffer, "Task" ); }
pcWriteBuffer += strlen( pcWriteBuffer );
#endif /* configINCLUDE_QUERY_HEAP */
/* Pad the string "task" with however many bytes necessary to make it the /*-----------------------------------------------------------*/
length of a task name. Minus three for the null terminator and half the
number of characters in "Task" so the column lines up with the centre of #if ( configGENERATE_RUN_TIME_STATS == 1 )
the heading. */
for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ ) static BaseType_t prvRunTimeStatsCommand( char * pcWriteBuffer,
{ size_t xWriteBufferLen,
/* Add a space to align columns after the task's name. */ const char * pcCommandString )
*pcWriteBuffer = ' '; {
pcWriteBuffer++; const char * const pcHeader = " Abs Time % Time\r\n****************************************\r\n";
BaseType_t xSpacePadding;
/* Ensure always terminated. */
*pcWriteBuffer = 0x00; /* Remove compile time warnings about unused parameters, and check the
} * write buffer is not NULL. NOTE - for simplicity, this example assumes the
* write buffer length is adequate, so does not check for buffer overflows. */
strcpy( pcWriteBuffer, pcHeader ); ( void ) pcCommandString;
vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) ); ( void ) xWriteBufferLen;
configASSERT( pcWriteBuffer );
/* There is no more data to return after this single string, so return
pdFALSE. */ /* Generate a table of task stats. */
return pdFALSE; strcpy( pcWriteBuffer, "Task" );
} pcWriteBuffer += strlen( pcWriteBuffer );
#endif /* configGENERATE_RUN_TIME_STATS */ /* Pad the string "task" with however many bytes necessary to make it the
/*-----------------------------------------------------------*/ * length of a task name. Minus three for the null terminator and half the
* number of characters in "Task" so the column lines up with the centre of
static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) * the heading. */
{ for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ )
const char *pcParameter; {
BaseType_t xParameterStringLength, xReturn; /* Add a space to align columns after the task's name. */
static UBaseType_t uxParameterNumber = 0; *pcWriteBuffer = ' ';
pcWriteBuffer++;
/* Remove compile time warnings about unused parameters, and check the
write buffer is not NULL. NOTE - for simplicity, this example assumes the /* Ensure always terminated. */
write buffer length is adequate, so does not check for buffer overflows. */ *pcWriteBuffer = 0x00;
( void ) pcCommandString; }
( void ) xWriteBufferLen;
configASSERT( pcWriteBuffer ); strcpy( pcWriteBuffer, pcHeader );
vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );
if( uxParameterNumber == 0 )
{ /* There is no more data to return after this single string, so return
/* The first time the function is called after the command has been * pdFALSE. */
entered just a header string is returned. */ return pdFALSE;
sprintf( pcWriteBuffer, "The three parameters were:\r\n" ); }
/* Next time the function is called the first parameter will be echoed #endif /* configGENERATE_RUN_TIME_STATS */
back. */ /*-----------------------------------------------------------*/
uxParameterNumber = 1U;
static BaseType_t prvThreeParameterEchoCommand( char * pcWriteBuffer,
/* There is more data to be returned as no parameters have been echoed size_t xWriteBufferLen,
back yet. */ const char * pcCommandString )
xReturn = pdPASS; {
} const char * pcParameter;
else BaseType_t xParameterStringLength, xReturn;
{ static UBaseType_t uxParameterNumber = 0;
/* Obtain the parameter string. */
pcParameter = FreeRTOS_CLIGetParameter /* Remove compile time warnings about unused parameters, and check the
( * write buffer is not NULL. NOTE - for simplicity, this example assumes the
pcCommandString, /* The command string itself. */ * write buffer length is adequate, so does not check for buffer overflows. */
uxParameterNumber, /* Return the next parameter. */ ( void ) pcCommandString;
&xParameterStringLength /* Store the parameter string length. */ ( void ) xWriteBufferLen;
); configASSERT( pcWriteBuffer );
/* Sanity check something was returned. */ if( uxParameterNumber == 0 )
configASSERT( pcParameter ); {
/* The first time the function is called after the command has been
/* Return the parameter string. */ * entered just a header string is returned. */
memset( pcWriteBuffer, 0x00, xWriteBufferLen ); sprintf( pcWriteBuffer, "The three parameters were:\r\n" );
sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber );
strncat( pcWriteBuffer, pcParameter, ( size_t ) xParameterStringLength ); /* Next time the function is called the first parameter will be echoed
strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); * back. */
uxParameterNumber = 1U;
/* If this is the last of the three parameters then there are no more
strings to return after this one. */ /* There is more data to be returned as no parameters have been echoed
if( uxParameterNumber == 3U ) * back yet. */
{ xReturn = pdPASS;
/* If this is the last of the three parameters then there are no more }
strings to return after this one. */ else
xReturn = pdFALSE; {
uxParameterNumber = 0; /* Obtain the parameter string. */
} pcParameter = FreeRTOS_CLIGetParameter
else (
{ pcCommandString, /* The command string itself. */
/* There are more parameters to return after this one. */ uxParameterNumber, /* Return the next parameter. */
xReturn = pdTRUE; &xParameterStringLength /* Store the parameter string length. */
uxParameterNumber++; );
}
} /* Sanity check something was returned. */
configASSERT( pcParameter );
return xReturn;
} /* Return the parameter string. */
/*-----------------------------------------------------------*/ memset( pcWriteBuffer, 0x00, xWriteBufferLen );
sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber );
static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) strncat( pcWriteBuffer, pcParameter, ( size_t ) xParameterStringLength );
{ strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );
const char *pcParameter;
BaseType_t xParameterStringLength, xReturn; /* If this is the last of the three parameters then there are no more
static UBaseType_t uxParameterNumber = 0; * strings to return after this one. */
if( uxParameterNumber == 3U )
/* Remove compile time warnings about unused parameters, and check the {
write buffer is not NULL. NOTE - for simplicity, this example assumes the /* If this is the last of the three parameters then there are no more
write buffer length is adequate, so does not check for buffer overflows. */ * strings to return after this one. */
( void ) pcCommandString; xReturn = pdFALSE;
( void ) xWriteBufferLen; uxParameterNumber = 0;
configASSERT( pcWriteBuffer ); }
else
if( uxParameterNumber == 0 ) {
{ /* There are more parameters to return after this one. */
/* The first time the function is called after the command has been xReturn = pdTRUE;
entered just a header string is returned. */ uxParameterNumber++;
sprintf( pcWriteBuffer, "The parameters were:\r\n" ); }
}
/* Next time the function is called the first parameter will be echoed
back. */ return xReturn;
uxParameterNumber = 1U; }
/*-----------------------------------------------------------*/
/* There is more data to be returned as no parameters have been echoed
back yet. */ static BaseType_t prvParameterEchoCommand( char * pcWriteBuffer,
xReturn = pdPASS; size_t xWriteBufferLen,
} const char * pcCommandString )
else {
{ const char * pcParameter;
/* Obtain the parameter string. */ BaseType_t xParameterStringLength, xReturn;
pcParameter = FreeRTOS_CLIGetParameter static UBaseType_t uxParameterNumber = 0;
(
pcCommandString, /* The command string itself. */ /* Remove compile time warnings about unused parameters, and check the
uxParameterNumber, /* Return the next parameter. */ * write buffer is not NULL. NOTE - for simplicity, this example assumes the
&xParameterStringLength /* Store the parameter string length. */ * write buffer length is adequate, so does not check for buffer overflows. */
); ( void ) pcCommandString;
( void ) xWriteBufferLen;
if( pcParameter != NULL ) configASSERT( pcWriteBuffer );
{
/* Return the parameter string. */ if( uxParameterNumber == 0 )
memset( pcWriteBuffer, 0x00, xWriteBufferLen ); {
sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber ); /* The first time the function is called after the command has been
strncat( pcWriteBuffer, ( char * ) pcParameter, ( size_t ) xParameterStringLength ); * entered just a header string is returned. */
strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); sprintf( pcWriteBuffer, "The parameters were:\r\n" );
/* There might be more parameters to return after this one. */ /* Next time the function is called the first parameter will be echoed
xReturn = pdTRUE; * back. */
uxParameterNumber++; uxParameterNumber = 1U;
}
else /* There is more data to be returned as no parameters have been echoed
{ * back yet. */
/* No more parameters were found. Make sure the write buffer does xReturn = pdPASS;
not contain a valid string. */ }
pcWriteBuffer[ 0 ] = 0x00; else
{
/* No more data to return. */ /* Obtain the parameter string. */
xReturn = pdFALSE; pcParameter = FreeRTOS_CLIGetParameter
(
/* Start over the next time this command is executed. */ pcCommandString, /* The command string itself. */
uxParameterNumber = 0; uxParameterNumber, /* Return the next parameter. */
} &xParameterStringLength /* Store the parameter string length. */
} );
return xReturn; if( pcParameter != NULL )
} {
/*-----------------------------------------------------------*/ /* Return the parameter string. */
memset( pcWriteBuffer, 0x00, xWriteBufferLen );
#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber );
strncat( pcWriteBuffer, ( char * ) pcParameter, ( size_t ) xParameterStringLength );
static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );
{
const char *pcParameter; /* There might be more parameters to return after this one. */
BaseType_t lParameterStringLength; xReturn = pdTRUE;
uxParameterNumber++;
/* Remove compile time warnings about unused parameters, and check the }
write buffer is not NULL. NOTE - for simplicity, this example assumes the else
write buffer length is adequate, so does not check for buffer overflows. */ {
( void ) pcCommandString; /* No more parameters were found. Make sure the write buffer does
( void ) xWriteBufferLen; * not contain a valid string. */
configASSERT( pcWriteBuffer ); pcWriteBuffer[ 0 ] = 0x00;
/* Obtain the parameter string. */ /* No more data to return. */
pcParameter = FreeRTOS_CLIGetParameter xReturn = pdFALSE;
(
pcCommandString, /* The command string itself. */ /* Start over the next time this command is executed. */
1, /* Return the first parameter. */ uxParameterNumber = 0;
&lParameterStringLength /* Store the parameter string length. */ }
); }
/* Sanity check something was returned. */ return xReturn;
configASSERT( pcParameter ); }
/*-----------------------------------------------------------*/
/* There are only two valid parameter values. */
if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 ) #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
{
/* Start or restart the trace. */ static BaseType_t prvStartStopTraceCommand( char * pcWriteBuffer,
vTraceStop(); size_t xWriteBufferLen,
vTraceClear(); const char * pcCommandString )
vTraceStart(); {
const char * pcParameter;
sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" ); BaseType_t lParameterStringLength;
}
else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 ) /* Remove compile time warnings about unused parameters, and check the
{ * write buffer is not NULL. NOTE - for simplicity, this example assumes the
/* End the trace, if one is running. */ * write buffer length is adequate, so does not check for buffer overflows. */
vTraceStop(); ( void ) pcCommandString;
sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" ); ( void ) xWriteBufferLen;
} configASSERT( pcWriteBuffer );
else
{ /* Obtain the parameter string. */
sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" ); pcParameter = FreeRTOS_CLIGetParameter
} (
pcCommandString, /* The command string itself. */
/* There is no more data to return after this single string, so return 1, /* Return the first parameter. */
pdFALSE. */ &lParameterStringLength /* Store the parameter string length. */
return pdFALSE; );
}
/* Sanity check something was returned. */
#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */ configASSERT( pcParameter );
/* There are only two valid parameter values. */
if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )
{
/* Start or restart the trace. */
vTraceStop();
vTraceClear();
vTraceStart();
sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );
}
else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )
{
/* End the trace, if one is running. */
vTraceStop();
sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" );
}
else
{
sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );
}
/* There is no more data to return after this single string, so return
* pdFALSE. */
return pdFALSE;
}
#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

@ -1,225 +1,227 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://aws.amazon.com/freertos * https://github.com/FreeRTOS
* *
*/ */
/* /*
* NOTE: This file uses a third party USB CDC driver. * NOTE: This file uses a third party USB CDC driver.
*/ */
/* Standard includes. */ /* Standard includes. */
#include "string.h" #include "string.h"
#include "stdio.h" #include "stdio.h"
/* FreeRTOS includes. */ /* FreeRTOS includes. */
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
#include "semphr.h" #include "semphr.h"
/* Example includes. */ /* Example includes. */
#include "FreeRTOS_CLI.h" #include "FreeRTOS_CLI.h"
/* Demo application includes. */ /* Demo application includes. */
#include "serial.h" #include "serial.h"
/* Dimensions the buffer into which input characters are placed. */ /* Dimensions the buffer into which input characters are placed. */
#define cmdMAX_INPUT_SIZE 50 #define cmdMAX_INPUT_SIZE 50
/* Dimentions a buffer to be used by the UART driver, if the UART driver uses a /* Dimensions a buffer to be used by the UART driver, if the UART driver uses a
buffer at all. */ * buffer at all. */
#define cmdQUEUE_LENGTH 25 #define cmdQUEUE_LENGTH 25
/* DEL acts as a backspace. */ /* DEL acts as a backspace. */
#define cmdASCII_DEL ( 0x7F ) #define cmdASCII_DEL ( 0x7F )
/* The maximum time to wait for the mutex that guards the UART to become /* The maximum time to wait for the mutex that guards the UART to become
available. */ * available. */
#define cmdMAX_MUTEX_WAIT pdMS_TO_TICKS( 300 ) #define cmdMAX_MUTEX_WAIT pdMS_TO_TICKS( 300 )
#ifndef configCLI_BAUD_RATE #ifndef configCLI_BAUD_RATE
#define configCLI_BAUD_RATE 115200 #define configCLI_BAUD_RATE 115200
#endif #endif
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/* /*
* The task that implements the command console processing. * The task that implements the command console processing.
*/ */
static void prvUARTCommandConsoleTask( void *pvParameters ); static void prvUARTCommandConsoleTask( void * pvParameters );
void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority ); void vUARTCommandConsoleStart( uint16_t usStackSize,
UBaseType_t uxPriority );
/*-----------------------------------------------------------*/
/*-----------------------------------------------------------*/
/* Const messages output by the command console. */
static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>"; /* Const messages output by the command console. */
static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>"; static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>";
static const char * const pcNewLine = "\r\n"; static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";
static const char * const pcNewLine = "\r\n";
/* Used to guard access to the UART in case messages are sent to the UART from
more than one task. */ /* Used to guard access to the UART in case messages are sent to the UART from
static SemaphoreHandle_t xTxMutex = NULL; * more than one task. */
static SemaphoreHandle_t xTxMutex = NULL;
/* The handle to the UART port, which is not used by all ports. */
static xComPortHandle xPort = 0; /* The handle to the UART port, which is not used by all ports. */
static xComPortHandle xPort = 0;
/*-----------------------------------------------------------*/
/*-----------------------------------------------------------*/
void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority )
{ void vUARTCommandConsoleStart( uint16_t usStackSize,
/* Create the semaphore used to access the UART Tx. */ UBaseType_t uxPriority )
xTxMutex = xSemaphoreCreateMutex(); {
configASSERT( xTxMutex ); /* Create the semaphore used to access the UART Tx. */
xTxMutex = xSemaphoreCreateMutex();
/* Create that task that handles the console itself. */ configASSERT( xTxMutex );
xTaskCreate( prvUARTCommandConsoleTask, /* The task that implements the command console. */
"CLI", /* Text name assigned to the task. This is just to assist debugging. The kernel does not use this name itself. */ /* Create that task that handles the console itself. */
usStackSize, /* The size of the stack allocated to the task. */ xTaskCreate( prvUARTCommandConsoleTask, /* The task that implements the command console. */
NULL, /* The parameter is not used, so NULL is passed. */ "CLI", /* Text name assigned to the task. This is just to assist debugging. The kernel does not use this name itself. */
uxPriority, /* The priority allocated to the task. */ usStackSize, /* The size of the stack allocated to the task. */
NULL ); /* A handle is not required, so just pass NULL. */ NULL, /* The parameter is not used, so NULL is passed. */
} uxPriority, /* The priority allocated to the task. */
/*-----------------------------------------------------------*/ NULL ); /* A handle is not required, so just pass NULL. */
}
static void prvUARTCommandConsoleTask( void *pvParameters ) /*-----------------------------------------------------------*/
{
signed char cRxedChar; static void prvUARTCommandConsoleTask( void * pvParameters )
uint8_t ucInputIndex = 0; {
char *pcOutputString; signed char cRxedChar;
static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ]; uint8_t ucInputIndex = 0;
BaseType_t xReturned; char * pcOutputString;
xComPortHandle xPort; static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
BaseType_t xReturned;
( void ) pvParameters; xComPortHandle xPort;
/* Obtain the address of the output buffer. Note there is no mutual ( void ) pvParameters;
exclusion on this buffer as it is assumed only one command console interface
will be used at any one time. */ /* Obtain the address of the output buffer. Note there is no mutual
pcOutputString = FreeRTOS_CLIGetOutputBuffer(); * exclusion on this buffer as it is assumed only one command console interface
* will be used at any one time. */
/* Initialise the UART. */ pcOutputString = FreeRTOS_CLIGetOutputBuffer();
xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH );
/* Initialise the UART. */
/* Send the welcome message. */ xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH );
vSerialPutString( xPort, ( signed char * ) pcWelcomeMessage, ( unsigned short ) strlen( pcWelcomeMessage ) );
/* Send the welcome message. */
for( ;; ) vSerialPutString( xPort, ( signed char * ) pcWelcomeMessage, ( unsigned short ) strlen( pcWelcomeMessage ) );
{
/* Wait for the next character. The while loop is used in case for( ; ; )
INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will {
be a genuine block time rather than an infinite block time. */ /* Wait for the next character. The while loop is used in case
while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS ); * INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will
* be a genuine block time rather than an infinite block time. */
/* Ensure exclusive access to the UART Tx. */ while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS )
if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS ) {
{ }
/* Echo the character back. */
xSerialPutChar( xPort, cRxedChar, portMAX_DELAY ); /* Ensure exclusive access to the UART Tx. */
if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
/* Was it the end of the line? */ {
if( cRxedChar == '\n' || cRxedChar == '\r' ) /* Echo the character back. */
{ xSerialPutChar( xPort, cRxedChar, portMAX_DELAY );
/* Just to space the output from the input. */
vSerialPutString( xPort, ( signed char * ) pcNewLine, ( unsigned short ) strlen( pcNewLine ) ); /* Was it the end of the line? */
if( ( cRxedChar == '\n' ) || ( cRxedChar == '\r' ) )
/* See if the command is empty, indicating that the last command {
is to be executed again. */ /* Just to space the output from the input. */
if( ucInputIndex == 0 ) vSerialPutString( xPort, ( signed char * ) pcNewLine, ( unsigned short ) strlen( pcNewLine ) );
{
/* Copy the last command back into the input string. */ /* See if the command is empty, indicating that the last command
strcpy( cInputString, cLastInputString ); * is to be executed again. */
} if( ucInputIndex == 0 )
{
/* Pass the received command to the command interpreter. The /* Copy the last command back into the input string. */
command interpreter is called repeatedly until it returns strcpy( cInputString, cLastInputString );
pdFALSE (indicating there is no more output) as it might }
generate more than one string. */
do /* Pass the received command to the command interpreter. The
{ * command interpreter is called repeatedly until it returns
/* Get the next output string from the command interpreter. */ * pdFALSE (indicating there is no more output) as it might
xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE ); * generate more than one string. */
do
/* Write the generated string to the UART. */ {
vSerialPutString( xPort, ( signed char * ) pcOutputString, ( unsigned short ) strlen( pcOutputString ) ); /* Get the next output string from the command interpreter. */
xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
} while( xReturned != pdFALSE );
/* Write the generated string to the UART. */
/* All the strings generated by the input command have been vSerialPutString( xPort, ( signed char * ) pcOutputString, ( unsigned short ) strlen( pcOutputString ) );
sent. Clear the input string ready to receive the next command. } while( xReturned != pdFALSE );
Remember the command that was just processed first in case it is
to be processed again. */ /* All the strings generated by the input command have been
strcpy( cLastInputString, cInputString ); * sent. Clear the input string ready to receive the next command.
ucInputIndex = 0; * Remember the command that was just processed first in case it is
memset( cInputString, 0x00, cmdMAX_INPUT_SIZE ); * to be processed again. */
strcpy( cLastInputString, cInputString );
vSerialPutString( xPort, ( signed char * ) pcEndOfOutputMessage, ( unsigned short ) strlen( pcEndOfOutputMessage ) ); ucInputIndex = 0;
} memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
else
{ vSerialPutString( xPort, ( signed char * ) pcEndOfOutputMessage, ( unsigned short ) strlen( pcEndOfOutputMessage ) );
if( cRxedChar == '\r' ) }
{ else
/* Ignore the character. */ {
} if( cRxedChar == '\r' )
else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) ) {
{ /* Ignore the character. */
/* Backspace was pressed. Erase the last character in the }
string - if any. */ else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )
if( ucInputIndex > 0 ) {
{ /* Backspace was pressed. Erase the last character in the
ucInputIndex--; * string - if any. */
cInputString[ ucInputIndex ] = '\0'; if( ucInputIndex > 0 )
} {
} ucInputIndex--;
else cInputString[ ucInputIndex ] = '\0';
{ }
/* A character was entered. Add it to the string entered so }
far. When a \n is entered the complete string will be else
passed to the command interpreter. */ {
if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) ) /* A character was entered. Add it to the string entered so
{ * far. When a \n is entered the complete string will be
if( ucInputIndex < cmdMAX_INPUT_SIZE ) * passed to the command interpreter. */
{ if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )
cInputString[ ucInputIndex ] = cRxedChar; {
ucInputIndex++; if( ucInputIndex < cmdMAX_INPUT_SIZE )
} {
} cInputString[ ucInputIndex ] = cRxedChar;
} ucInputIndex++;
} }
}
/* Must ensure to give the mutex back. */ }
xSemaphoreGive( xTxMutex ); }
}
} /* Must ensure to give the mutex back. */
} xSemaphoreGive( xTxMutex );
/*-----------------------------------------------------------*/ }
}
void vOutputString( const char * const pcMessage ) }
{ /*-----------------------------------------------------------*/
if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
{ void vOutputString( const char * const pcMessage )
vSerialPutString( xPort, ( signed char * ) pcMessage, ( unsigned short ) strlen( pcMessage ) ); {
xSemaphoreGive( xTxMutex ); if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
} {
} vSerialPutString( xPort, ( signed char * ) pcMessage, ( unsigned short ) strlen( pcMessage ) );
/*-----------------------------------------------------------*/ xSemaphoreGive( xTxMutex );
}
}
/*-----------------------------------------------------------*/

@ -1,328 +1,339 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://github.com/FreeRTOS * https://github.com/FreeRTOS
* *
*/ */
/****************************************************************************** /******************************************************************************
* *
* See the following URL for information on the commands defined in this file: * See the following URL for information on the commands defined in this file:
* https://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml * https://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml
* *
******************************************************************************/ ******************************************************************************/
/* FreeRTOS includes. */ /* FreeRTOS includes. */
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
/* Standard includes. */ /* Standard includes. */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/* FreeRTOS+CLI includes. */ /* FreeRTOS+CLI includes. */
#include "FreeRTOS_CLI.h" #include "FreeRTOS_CLI.h"
/* FreeRTOS+UDP includes, just to make the stats available to the CLI /* FreeRTOS+UDP includes, just to make the stats available to the CLI
commands. */ * commands. */
#include "FreeRTOS_UDP_IP.h" #include "FreeRTOS_UDP_IP.h"
#include "FreeRTOS_Sockets.h" #include "FreeRTOS_Sockets.h"
/* /*
* Defines a command that prints out IP address information. * Defines a command that prints out IP address information.
*/ */
static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); static BaseType_t prvDisplayIPConfig( char * pcWriteBuffer,
size_t xWriteBufferLen,
/* const char * pcCommandString );
* Defines a command that prints out the gathered demo debug stats.
*/ /*
static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); * Defines a command that prints out the gathered demo debug stats.
*/
/* static BaseType_t prvDisplayIPDebugStats( char * pcWriteBuffer,
* Defines a command that sends an ICMP ping request to an IP address. size_t xWriteBufferLen,
*/ const char * pcCommandString );
static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
/*
/* Structure that defines the "ip-config" command line command. */ * Defines a command that sends an ICMP ping request to an IP address.
static const CLI_Command_Definition_t xIPConfig = */
{ static BaseType_t prvPingCommand( char * pcWriteBuffer,
"ip-config", size_t xWriteBufferLen,
"ip-config:\r\n Displays IP address configuration\r\n\r\n", const char * pcCommandString );
prvDisplayIPConfig,
0 /* Structure that defines the "ip-config" command line command. */
}; static const CLI_Command_Definition_t xIPConfig =
{
#if configINCLUDE_DEMO_DEBUG_STATS != 0 "ip-config",
/* Structure that defines the "ip-debug-stats" command line command. */ "ip-config:\r\n Displays IP address configuration\r\n\r\n",
static const CLI_Command_Definition_t xIPDebugStats = prvDisplayIPConfig,
{ 0
"ip-debug-stats", /* The command string to type. */ };
"ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n",
prvDisplayIPDebugStats, /* The function to run. */ #if configINCLUDE_DEMO_DEBUG_STATS != 0
0 /* No parameters are expected. */ /* Structure that defines the "ip-debug-stats" command line command. */
}; static const CLI_Command_Definition_t xIPDebugStats =
#endif /* configINCLUDE_DEMO_DEBUG_STATS */ {
"ip-debug-stats", /* The command string to type. */
#if ipconfigSUPPORT_OUTGOING_PINGS == 1 "ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n",
prvDisplayIPDebugStats, /* The function to run. */
/* Structure that defines the "ping" command line command. This takes an IP 0 /* No parameters are expected. */
address or host name and (optionally) the number of bytes to ping as };
parameters. */ #endif /* configINCLUDE_DEMO_DEBUG_STATS */
static const CLI_Command_Definition_t xPing =
{ #if ipconfigSUPPORT_OUTGOING_PINGS == 1
"ping",
"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n", /* Structure that defines the "ping" command line command. This takes an IP
prvPingCommand, /* The function to run. */ * address or host name and (optionally) the number of bytes to ping as
-1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */ * parameters. */
}; static const CLI_Command_Definition_t xPing =
{
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */ "ping",
"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n",
prvPingCommand, /* The function to run. */
/*-----------------------------------------------------------*/ -1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */
};
void vRegisterUDPCLICommands( void )
{ #endif /* ipconfigSUPPORT_OUTGOING_PINGS */
/* Register all the command line commands defined immediately above. */
FreeRTOS_CLIRegisterCommand( &xIPConfig );
/*-----------------------------------------------------------*/
#if configINCLUDE_DEMO_DEBUG_STATS == 1
{ void vRegisterUDPCLICommands( void )
FreeRTOS_CLIRegisterCommand( &xIPDebugStats ); {
} /* Register all the command line commands defined immediately above. */
#endif /* configINCLUDE_DEMO_DEBUG_STATS */ FreeRTOS_CLIRegisterCommand( &xIPConfig );
#if ipconfigSUPPORT_OUTGOING_PINGS == 1 #if configINCLUDE_DEMO_DEBUG_STATS == 1
{ {
FreeRTOS_CLIRegisterCommand( &xPing ); FreeRTOS_CLIRegisterCommand( &xIPDebugStats );
} }
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */ #endif /* configINCLUDE_DEMO_DEBUG_STATS */
}
/*-----------------------------------------------------------*/ #if ipconfigSUPPORT_OUTGOING_PINGS == 1
{
#if ipconfigSUPPORT_OUTGOING_PINGS == 1 FreeRTOS_CLIRegisterCommand( &xPing );
}
static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) #endif /* ipconfigSUPPORT_OUTGOING_PINGS */
{ }
char * pcParameter; /*-----------------------------------------------------------*/
BaseType_t lParameterStringLength, xReturn;
uint32_t ulIPAddress, ulBytesToPing; #if ipconfigSUPPORT_OUTGOING_PINGS == 1
const uint32_t ulDefaultBytesToPing = 8UL;
char cBuffer[ 16 ]; static BaseType_t prvPingCommand( char * pcWriteBuffer,
size_t xWriteBufferLen,
/* Remove compile time warnings about unused parameters, and check the const char * pcCommandString )
write buffer is not NULL. NOTE - for simplicity, this example assumes the {
write buffer length is adequate, so does not check for buffer overflows. */ char * pcParameter;
( void ) pcCommandString; BaseType_t lParameterStringLength, xReturn;
( void ) xWriteBufferLen; uint32_t ulIPAddress, ulBytesToPing;
configASSERT( pcWriteBuffer ); const uint32_t ulDefaultBytesToPing = 8UL;
char cBuffer[ 16 ];
/* Start with an empty string. */
pcWriteBuffer[ 0 ] = 0x00; /* Remove compile time warnings about unused parameters, and check the
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
/* Obtain the number of bytes to ping. */ * write buffer length is adequate, so does not check for buffer overflows. */
pcParameter = ( char * ) FreeRTOS_CLIGetParameter ( void ) pcCommandString;
( ( void ) xWriteBufferLen;
pcCommandString, /* The command string itself. */ configASSERT( pcWriteBuffer );
2, /* Return the second parameter. */
&lParameterStringLength /* Store the parameter string length. */ /* Start with an empty string. */
); pcWriteBuffer[ 0 ] = 0x00;
if( pcParameter == NULL ) /* Obtain the number of bytes to ping. */
{ pcParameter = ( char * ) FreeRTOS_CLIGetParameter
/* The number of bytes was not specified, so default it. */ (
ulBytesToPing = ulDefaultBytesToPing; pcCommandString, /* The command string itself. */
} 2, /* Return the second parameter. */
else &lParameterStringLength /* Store the parameter string length. */
{ );
ulBytesToPing = atol( pcParameter );
} if( pcParameter == NULL )
{
/* Obtain the IP address string. */ /* The number of bytes was not specified, so default it. */
pcParameter = ( char * ) FreeRTOS_CLIGetParameter ulBytesToPing = ulDefaultBytesToPing;
( }
pcCommandString, /* The command string itself. */ else
1, /* Return the first parameter. */ {
&lParameterStringLength /* Store the parameter string length. */ ulBytesToPing = atol( pcParameter );
); }
/* Sanity check something was returned. */ /* Obtain the IP address string. */
configASSERT( pcParameter ); pcParameter = ( char * ) FreeRTOS_CLIGetParameter
(
/* Attempt to obtain the IP address. If the first character is not a pcCommandString, /* The command string itself. */
digit, assume the host name has been passed in. */ 1, /* Return the first parameter. */
if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) ) &lParameterStringLength /* Store the parameter string length. */
{ );
ulIPAddress = FreeRTOS_inet_addr( pcParameter );
} /* Sanity check something was returned. */
else configASSERT( pcParameter );
{
/* Terminate the host name. */ /* Attempt to obtain the IP address. If the first character is not a
pcParameter[ lParameterStringLength ] = 0x00; * digit, assume the host name has been passed in. */
if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) )
/* Attempt to resolve host. */ {
ulIPAddress = FreeRTOS_gethostbyname( pcParameter ); ulIPAddress = FreeRTOS_inet_addr( pcParameter );
} }
else
/* Convert IP address, which may have come from a DNS lookup, to string. */ {
FreeRTOS_inet_ntoa( ulIPAddress, cBuffer ); /* Terminate the host name. */
pcParameter[ lParameterStringLength ] = 0x00;
if( ulIPAddress != 0 )
{ /* Attempt to resolve host. */
xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY ); ulIPAddress = FreeRTOS_gethostbyname( pcParameter );
} }
else
{ /* Convert IP address, which may have come from a DNS lookup, to string. */
xReturn = pdFALSE; FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );
}
if( ulIPAddress != 0 )
if( xReturn == pdFALSE ) {
{ xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY );
sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" ); }
} else
else {
{ xReturn = pdFALSE;
sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, ( int ) xReturn ); }
}
if( xReturn == pdFALSE )
return pdFALSE; {
} sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" );
/*-----------------------------------------------------------*/ }
else
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */ {
sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, ( int ) xReturn );
#if configINCLUDE_DEMO_DEBUG_STATS != 0 }
static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) return pdFALSE;
{ }
static BaseType_t xIndex = -1; /*-----------------------------------------------------------*/
extern xExampleDebugStatEntry_t xIPTraceValues[];
BaseType_t xReturn; #endif /* ipconfigSUPPORT_OUTGOING_PINGS */
/* Remove compile time warnings about unused parameters, and check the #if configINCLUDE_DEMO_DEBUG_STATS != 0
write buffer is not NULL. NOTE - for simplicity, this example assumes the
write buffer length is adequate, so does not check for buffer overflows. */ static BaseType_t prvDisplayIPDebugStats( char * pcWriteBuffer,
( void ) pcCommandString; size_t xWriteBufferLen,
( void ) xWriteBufferLen; const char * pcCommandString )
configASSERT( pcWriteBuffer ); {
static BaseType_t xIndex = -1;
xIndex++; extern xExampleDebugStatEntry_t xIPTraceValues[];
BaseType_t xReturn;
if( xIndex < xExampleDebugStatEntries() )
{ /* Remove compile time warnings about unused parameters, and check the
sprintf( pcWriteBuffer, "%s %d\r\n", ( char * ) xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData ); * write buffer is not NULL. NOTE - for simplicity, this example assumes the
xReturn = pdPASS; * write buffer length is adequate, so does not check for buffer overflows. */
} ( void ) pcCommandString;
else ( void ) xWriteBufferLen;
{ configASSERT( pcWriteBuffer );
/* Reset the index for the next time it is called. */
xIndex = -1; xIndex++;
/* Ensure nothing remains in the write buffer. */ if( xIndex < xExampleDebugStatEntries() )
pcWriteBuffer[ 0 ] = 0x00; {
xReturn = pdFALSE; sprintf( pcWriteBuffer, "%s %d\r\n", ( char * ) xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData );
} xReturn = pdPASS;
}
return xReturn; else
} {
/*-----------------------------------------------------------*/ /* Reset the index for the next time it is called. */
xIndex = -1;
#endif /* configINCLUDE_DEMO_DEBUG_STATS */
/* Ensure nothing remains in the write buffer. */
static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) pcWriteBuffer[ 0 ] = 0x00;
{ xReturn = pdFALSE;
static BaseType_t xIndex = 0; }
BaseType_t xReturn;
uint32_t ulAddress; return xReturn;
}
/* Remove compile time warnings about unused parameters, and check the /*-----------------------------------------------------------*/
write buffer is not NULL. NOTE - for simplicity, this example assumes the
write buffer length is adequate, so does not check for buffer overflows. */ #endif /* configINCLUDE_DEMO_DEBUG_STATS */
( void ) pcCommandString;
( void ) xWriteBufferLen; static BaseType_t prvDisplayIPConfig( char * pcWriteBuffer,
configASSERT( pcWriteBuffer ); size_t xWriteBufferLen,
const char * pcCommandString )
switch( xIndex ) {
{ static BaseType_t xIndex = 0;
case 0 : BaseType_t xReturn;
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) uint32_t ulAddress;
FreeRTOS_GetEndPointConfiguration( &ulAddress, NULL, NULL, NULL, pxNetworkEndPoints );
#else /* Remove compile time warnings about unused parameters, and check the
FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL ); * write buffer is not NULL. NOTE - for simplicity, this example assumes the
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ * write buffer length is adequate, so does not check for buffer overflows. */
sprintf( pcWriteBuffer, "\r\nIP address " ); ( void ) pcCommandString;
xReturn = pdTRUE; ( void ) xWriteBufferLen;
xIndex++; configASSERT( pcWriteBuffer );
break;
switch( xIndex )
case 1 : {
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) case 0:
FreeRTOS_GetEndPointConfiguration( NULL, &ulAddress, NULL, NULL, pxNetworkEndPoints ); #if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
#else FreeRTOS_GetEndPointConfiguration( &ulAddress, NULL, NULL, NULL, pxNetworkEndPoints );
FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL ); #else
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL );
sprintf( pcWriteBuffer, "\r\nNet mask " ); #endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
xReturn = pdTRUE; sprintf( pcWriteBuffer, "\r\nIP address " );
xIndex++; xReturn = pdTRUE;
break; xIndex++;
break;
case 2 :
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) case 1:
FreeRTOS_GetEndPointConfiguration( NULL, NULL, &ulAddress, NULL, pxNetworkEndPoints ); #if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
#else FreeRTOS_GetEndPointConfiguration( NULL, &ulAddress, NULL, NULL, pxNetworkEndPoints );
FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL ); #else
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL );
sprintf( pcWriteBuffer, "\r\nGateway address " ); #endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
xReturn = pdTRUE; sprintf( pcWriteBuffer, "\r\nNet mask " );
xIndex++; xReturn = pdTRUE;
break; xIndex++;
break;
case 3 :
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) case 2:
FreeRTOS_GetEndPointConfiguration( NULL, NULL, NULL, &ulAddress, pxNetworkEndPoints ); #if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
#else FreeRTOS_GetEndPointConfiguration( NULL, NULL, &ulAddress, NULL, pxNetworkEndPoints );
FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress ); #else
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL );
sprintf( pcWriteBuffer, "\r\nDNS server address " ); #endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
xReturn = pdTRUE; sprintf( pcWriteBuffer, "\r\nGateway address " );
xIndex++; xReturn = pdTRUE;
break; xIndex++;
break;
default :
ulAddress = 0; case 3:
sprintf( pcWriteBuffer, "\r\n\r\n" ); #if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
xReturn = pdFALSE; FreeRTOS_GetEndPointConfiguration( NULL, NULL, NULL, &ulAddress, pxNetworkEndPoints );
xIndex = 0; #else
break; FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress );
} #endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
sprintf( pcWriteBuffer, "\r\nDNS server address " );
if( ulAddress != 0 ) xReturn = pdTRUE;
{ xIndex++;
FreeRTOS_inet_ntoa( ulAddress, ( &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) ) ); break;
}
default:
return xReturn; ulAddress = 0;
} sprintf( pcWriteBuffer, "\r\n\r\n" );
/*-----------------------------------------------------------*/ xReturn = pdFALSE;
xIndex = 0;
break;
}
if( ulAddress != 0 )
{
FreeRTOS_inet_ntoa( ulAddress, ( &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) ) );
}
return xReturn;
}
/*-----------------------------------------------------------*/

@ -1,320 +1,316 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://aws.amazon.com/freertos * https://github.com/FreeRTOS
* *
*/ */
/******************************************************************************* /*******************************************************************************
* See the URL in the comments within main.c for the location of the online * See the URL in the comments within main.c for the location of the online
* documentation. * documentation.
******************************************************************************/ ******************************************************************************/
/* Standard includes. */ /* Standard includes. */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
/* FreeRTOS includes. */ /* FreeRTOS includes. */
#include "FreeRTOS.h" #include "FreeRTOS.h"
/* File system includes. */ /* File system includes. */
#include "fat_sl.h" #include "fat_sl.h"
#include "api_mdriver_ram.h" #include "api_mdriver_ram.h"
/* 8.3 format, plus null terminator. */ /* 8.3 format, plus null terminator. */
#define fsMAX_FILE_NAME_LEN 13 #define fsMAX_FILE_NAME_LEN 13
/* The number of bytes read/written to the example files at a time. */ /* The number of bytes read/written to the example files at a time. */
#define fsRAM_BUFFER_SIZE 200 #define fsRAM_BUFFER_SIZE 200
/* The number of bytes written to the file that uses f_putc() and f_getc(). */ /* The number of bytes written to the file that uses f_putc() and f_getc(). */
#define fsPUTC_FILE_SIZE 100 #define fsPUTC_FILE_SIZE 100
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/* /*
* Creates and verifies different files on the volume, demonstrating the use of * Creates and verifies different files on the volume, demonstrating the use of
* various different API functions. * various different API functions.
*/ */
void vCreateAndVerifySampleFiles( void ); void vCreateAndVerifySampleFiles( void );
/* /*
* Create a set of example files in the root directory of the volume using * Create a set of example files in the root directory of the volume using
* f_write(). * f_write().
*/ */
static void prvCreateDemoFilesUsing_f_write( void ); static void prvCreateDemoFilesUsing_f_write( void );
/* /*
* Use f_read() to read back and verify the files that were created by * Use f_read() to read back and verify the files that were created by
* prvCreateDemoFilesUsing_f_write(). * prvCreateDemoFilesUsing_f_write().
*/ */
static void prvVerifyDemoFileUsing_f_read( void ); static void prvVerifyDemoFileUsing_f_read( void );
/* /*
* Create an example file in a sub-directory using f_putc(). * Create an example file in a sub-directory using f_putc().
*/ */
static void prvCreateDemoFileUsing_f_putc( void ); static void prvCreateDemoFileUsing_f_putc( void );
/* /*
* Use f_getc() to read back and verify the file that was created by * Use f_getc() to read back and verify the file that was created by
* prvCreateDemoFileUsing_f_putc(). * prvCreateDemoFileUsing_f_putc().
*/ */
static void prvVerifyDemoFileUsing_f_getc( void ); static void prvVerifyDemoFileUsing_f_getc( void );
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/* A buffer used to both create content to write to disk, and read content back /* A buffer used to both create content to write to disk, and read content back
from a disk. Note there is no mutual exclusion on this buffer. */ * from a disk. Note there is no mutual exclusion on this buffer. */
static char cRAMBuffer[ fsRAM_BUFFER_SIZE ]; static char cRAMBuffer[ fsRAM_BUFFER_SIZE ];
/* Names of directories that are created. */ /* Names of directories that are created. */
static const char *pcRoot = "/", *pcDirectory1 = "SUB1", *pcDirectory2 = "SUB2", *pcFullPath = "/SUB1/SUB2"; static const char * pcRoot = "/", * pcDirectory1 = "SUB1", * pcDirectory2 = "SUB2", * pcFullPath = "/SUB1/SUB2";
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
void vCreateAndVerifySampleFiles( void ) void vCreateAndVerifySampleFiles( void )
{ {
unsigned char ucStatus; unsigned char ucStatus;
/* First create the volume. */ /* First create the volume. */
ucStatus = f_initvolume( ram_initfunc ); ucStatus = f_initvolume( ram_initfunc );
/* It is expected that the volume is not formatted. */ /* It is expected that the volume is not formatted. */
if( ucStatus == F_ERR_NOTFORMATTED ) if( ucStatus == F_ERR_NOTFORMATTED )
{ {
/* Format the created volume. */ /* Format the created volume. */
ucStatus = f_format( F_FAT12_MEDIA ); ucStatus = f_format( F_FAT12_MEDIA );
} }
if( ucStatus == F_NO_ERROR ) if( ucStatus == F_NO_ERROR )
{ {
/* Create a set of files using f_write(). */ /* Create a set of files using f_write(). */
prvCreateDemoFilesUsing_f_write(); prvCreateDemoFilesUsing_f_write();
/* Read back and verify the files that were created using f_write(). */ /* Read back and verify the files that were created using f_write(). */
prvVerifyDemoFileUsing_f_read(); prvVerifyDemoFileUsing_f_read();
/* Create sub directories two deep then create a file using putc. */ /* Create sub directories two deep then create a file using putc. */
prvCreateDemoFileUsing_f_putc(); prvCreateDemoFileUsing_f_putc();
/* Read back and verify the file created by /* Read back and verify the file created by
prvCreateDemoFileUsing_f_putc(). */ * prvCreateDemoFileUsing_f_putc(). */
prvVerifyDemoFileUsing_f_getc(); prvVerifyDemoFileUsing_f_getc();
} }
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
static void prvCreateDemoFilesUsing_f_write( void ) static void prvCreateDemoFilesUsing_f_write( void )
{ {
BaseType_t xFileNumber, xWriteNumber; BaseType_t xFileNumber, xWriteNumber;
char cFileName[ fsMAX_FILE_NAME_LEN ]; char cFileName[ fsMAX_FILE_NAME_LEN ];
const BaseType_t xMaxFiles = 5; const BaseType_t xMaxFiles = 5;
long lItemsWritten; long lItemsWritten;
F_FILE *pxFile; F_FILE * pxFile;
/* Create xMaxFiles files. Each created file will be /* Create xMaxFiles files. Each created file will be
( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled * ( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled
with a different repeating character. */ * with a different repeating character. */
for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ ) for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
{ {
/* Generate a file name. */ /* Generate a file name. */
sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber ); sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );
/* Obtain the current working directory and print out the file name and /* Obtain the current working directory and print out the file name and
the directory into which the file is being written. */ * the directory into which the file is being written. */
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
/* Open the file, creating the file if it does not already exist. */ /* Open the file, creating the file if it does not already exist. */
pxFile = f_open( cFileName, "w" ); pxFile = f_open( cFileName, "w" );
configASSERT( pxFile ); configASSERT( pxFile );
/* Fill the RAM buffer with data that will be written to the file. This /* Fill the RAM buffer with data that will be written to the file. This
is just a repeating ascii character that indicates the file number. */ * is just a repeating ascii character that indicates the file number. */
memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE ); memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE );
/* Write the RAM buffer to the opened file a number of times. The /* Write the RAM buffer to the opened file a number of times. The
number of times the RAM buffer is written to the file depends on the * number of times the RAM buffer is written to the file depends on the
file number, so the length of each created file will be different. */ * file number, so the length of each created file will be different. */
for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ ) for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ )
{ {
lItemsWritten = f_write( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile ); lItemsWritten = f_write( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
configASSERT( lItemsWritten == 1 ); configASSERT( lItemsWritten == 1 );
} }
/* Close the file so another file can be created. */ /* Close the file so another file can be created. */
f_close( pxFile ); f_close( pxFile );
} }
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
static void prvVerifyDemoFileUsing_f_read( void ) static void prvVerifyDemoFileUsing_f_read( void )
{ {
BaseType_t xFileNumber, xReadNumber; BaseType_t xFileNumber, xReadNumber;
char cFileName[ fsMAX_FILE_NAME_LEN ]; char cFileName[ fsMAX_FILE_NAME_LEN ];
const BaseType_t xMaxFiles = 5; const BaseType_t xMaxFiles = 5;
long lItemsRead, lChar; long lItemsRead, lChar;
F_FILE *pxFile; F_FILE * pxFile;
/* Read back the files that were created by /* Read back the files that were created by
prvCreateDemoFilesUsing_f_write(). */ * prvCreateDemoFilesUsing_f_write(). */
for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ ) for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
{ {
/* Generate the file name. */ /* Generate the file name. */
sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber ); sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );
/* Obtain the current working directory and print out the file name and /* Obtain the current working directory and print out the file name and
the directory from which the file is being read. */ * the directory from which the file is being read. */
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
/* Open the file for reading. */ /* Open the file for reading. */
pxFile = f_open( cFileName, "r" ); pxFile = f_open( cFileName, "r" );
configASSERT( pxFile ); configASSERT( pxFile );
/* Read the file into the RAM buffer, checking the file contents are as /* Read the file into the RAM buffer, checking the file contents are as
expected. The size of the file depends on the file number. */ * expected. The size of the file depends on the file number. */
for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ ) for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ )
{ {
/* Start with the RAM buffer clear. */ /* Start with the RAM buffer clear. */
memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE ); memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE );
lItemsRead = f_read( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile ); lItemsRead = f_read( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
configASSERT( lItemsRead == 1 ); configASSERT( lItemsRead == 1 );
/* Check the RAM buffer is filled with the expected data. Each /* Check the RAM buffer is filled with the expected data. Each
file contains a different repeating ascii character that indicates * file contains a different repeating ascii character that indicates
the number of the file. */ * the number of the file. */
for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ ) for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ )
{ {
configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) ); configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) );
} }
} }
/* Close the file. */ /* Close the file. */
f_close( pxFile ); f_close( pxFile );
} }
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
static void prvCreateDemoFileUsing_f_putc( void ) static void prvCreateDemoFileUsing_f_putc( void )
{ {
unsigned char ucReturn; unsigned char ucReturn;
int iByte, iReturned; int iByte, iReturned;
F_FILE *pxFile; F_FILE * pxFile;
char cFileName[ fsMAX_FILE_NAME_LEN ]; char cFileName[ fsMAX_FILE_NAME_LEN ];
/* Obtain and print out the working directory. */ /* Obtain and print out the working directory. */
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
/* Create a sub directory. */ /* Create a sub directory. */
ucReturn = f_mkdir( pcDirectory1 ); ucReturn = f_mkdir( pcDirectory1 );
configASSERT( ucReturn == F_NO_ERROR ); configASSERT( ucReturn == F_NO_ERROR );
/* Move into the created sub-directory. */ /* Move into the created sub-directory. */
ucReturn = f_chdir( pcDirectory1 ); ucReturn = f_chdir( pcDirectory1 );
configASSERT( ucReturn == F_NO_ERROR ); configASSERT( ucReturn == F_NO_ERROR );
/* Obtain and print out the working directory. */ /* Obtain and print out the working directory. */
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
/* Create a subdirectory in the new directory. */ /* Create a subdirectory in the new directory. */
ucReturn = f_mkdir( pcDirectory2 ); ucReturn = f_mkdir( pcDirectory2 );
configASSERT( ucReturn == F_NO_ERROR ); configASSERT( ucReturn == F_NO_ERROR );
/* Move into the directory just created - now two directories down from /* Move into the directory just created - now two directories down from
the root. */ * the root. */
ucReturn = f_chdir( pcDirectory2 ); ucReturn = f_chdir( pcDirectory2 );
configASSERT( ucReturn == F_NO_ERROR ); configASSERT( ucReturn == F_NO_ERROR );
/* Obtain and print out the working directory. */ /* Obtain and print out the working directory. */
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 ); configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );
/* Generate the file name. */ /* Generate the file name. */
sprintf( cFileName, "%s.txt", pcDirectory2 ); sprintf( cFileName, "%s.txt", pcDirectory2 );
/* Print out the file name and the directory into which the file is being /* Print out the file name and the directory into which the file is being
written. */ * written. */
pxFile = f_open( cFileName, "w" ); pxFile = f_open( cFileName, "w" );
/* Create a file 1 byte at a time. The file is filled with incrementing /* Create a file 1 byte at a time. The file is filled with incrementing
ascii characters starting from '0'. */ * ascii characters starting from '0'. */
for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ ) for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
{ {
iReturned = f_putc( ( ( int ) '0' + iByte ), pxFile ); iReturned = f_putc( ( ( int ) '0' + iByte ), pxFile );
configASSERT( iReturned == ( ( int ) '0' + iByte ) ); configASSERT( iReturned == ( ( int ) '0' + iByte ) );
} }
/* Finished so close the file. */ /* Finished so close the file. */
f_close( pxFile ); f_close( pxFile );
/* Move back to the root directory. */ /* Move back to the root directory. */
ucReturn = f_chdir( "../.." ); ucReturn = f_chdir( "../.." );
configASSERT( ucReturn == F_NO_ERROR ); configASSERT( ucReturn == F_NO_ERROR );
/* Obtain and print out the working directory. */ /* Obtain and print out the working directory. */
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
configASSERT( strcmp( cRAMBuffer, pcRoot ) == 0 ); configASSERT( strcmp( cRAMBuffer, pcRoot ) == 0 );
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
static void prvVerifyDemoFileUsing_f_getc( void ) static void prvVerifyDemoFileUsing_f_getc( void )
{ {
unsigned char ucReturn; unsigned char ucReturn;
int iByte, iReturned; int iByte, iReturned;
F_FILE *pxFile; F_FILE * pxFile;
char cFileName[ fsMAX_FILE_NAME_LEN ]; char cFileName[ fsMAX_FILE_NAME_LEN ];
/* Move into the directory in which the file was created. */ /* Move into the directory in which the file was created. */
ucReturn = f_chdir( pcFullPath ); ucReturn = f_chdir( pcFullPath );
configASSERT( ucReturn == F_NO_ERROR ); configASSERT( ucReturn == F_NO_ERROR );
/* Obtain and print out the working directory. */ /* Obtain and print out the working directory. */
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 ); configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );
/* Generate the file name. */ /* Generate the file name. */
sprintf( cFileName, "%s.txt", pcDirectory2 ); sprintf( cFileName, "%s.txt", pcDirectory2 );
/* This time the file is opened for reading. */ /* This time the file is opened for reading. */
pxFile = f_open( cFileName, "r" ); pxFile = f_open( cFileName, "r" );
/* Read the file 1 byte at a time. */ /* Read the file 1 byte at a time. */
for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ ) for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
{ {
iReturned = f_getc( pxFile ); iReturned = f_getc( pxFile );
configASSERT( iReturned == ( ( int ) '0' + iByte ) ); configASSERT( iReturned == ( ( int ) '0' + iByte ) );
} }
/* Finished so close the file. */ /* Finished so close the file. */
f_close( pxFile ); f_close( pxFile );
/* Move back to the root directory. */ /* Move back to the root directory. */
ucReturn = f_chdir( "../.." ); ucReturn = f_chdir( "../.." );
configASSERT( ucReturn == F_NO_ERROR ); configASSERT( ucReturn == F_NO_ERROR );
/* Obtain and print out the working directory. */ /* Obtain and print out the working directory. */
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
} }

@ -1,32 +1,34 @@
/* /*
* FreeRTOS V202212.00 * FreeRTOS V202212.00
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * 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 * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * 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, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* https://www.FreeRTOS.org * https://www.FreeRTOS.org
* https://aws.amazon.com/freertos * https://github.com/FreeRTOS
* *
*/ */
#ifndef UDP_COMMAND_INTERPRETER_H #ifndef UDP_COMMAND_INTERPRETER_H
#define UDP_COMMAND_INTERPRETER_H #define UDP_COMMAND_INTERPRETER_H
void vStartUDPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority ); void vStartUDPCommandInterpreterTask( uint16_t usStackSize,
uint32_t ulPort,
#endif /* UDP_COMMAND_INTERPRETER_H */ UBaseType_t uxPriority );
#endif /* UDP_COMMAND_INTERPRETER_H */

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save