Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions .github/actions/setup-build-environment/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,14 @@ runs:
- name: Extract Version from Git Tag
shell: bash
run: |
GIT_TAG_NAME="${GITHUB_REF#refs/tags/}"
echo "GIT_TAG_VERSION=${GIT_TAG_NAME##*-}" >> $GITHUB_ENV
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
# triggered by a tag push (e.g: refs/tags/companion-v1.2.3)
GIT_TAG_NAME="${GITHUB_REF#refs/tags/}"
VERSION_STRING="${GIT_TAG_NAME##*-}"
else
# triggered by a workflow dispatch (e.g: refs/heads/main)
# strip "refs/heads/" prefix and replace any remaining "/" with "-" to protect file paths
BRANCH_NAME="${GITHUB_REF#refs/heads/}"
VERSION_STRING=$(echo "$BRANCH_NAME" | tr '/' '-')
fi
echo "GIT_TAG_VERSION=${VERSION_STRING}" >> $GITHUB_ENV
35 changes: 5 additions & 30 deletions .github/workflows/build-companion-firmwares.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,8 @@ on:
- 'companion-*'

jobs:

build:
runs-on: ubuntu-latest
steps:

- name: Clone Repo
uses: actions/checkout@v6

- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment

- name: Build Firmwares
env:
FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }}
run: /usr/bin/env bash build.sh build-companion-firmwares

- name: Upload Workflow Artifacts
uses: actions/upload-artifact@v7
with:
name: companion-firmwares
path: out

- name: Create Release
uses: softprops/action-gh-release@v3
if: startsWith(github.ref, 'refs/tags/')
with:
name: Companion Firmware ${{ env.GIT_TAG_VERSION }}
body: ""
draft: true
files: out/*
build-companion-firmwares:
uses: ./.github/workflows/firmware-builder.yml
with:
firmware_type: 'companion'
release_title_prefix: 'Companion Firmware'
35 changes: 5 additions & 30 deletions .github/workflows/build-repeater-firmwares.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,8 @@ on:
- 'repeater-*'

jobs:

build:
runs-on: ubuntu-latest
steps:

- name: Clone Repo
uses: actions/checkout@v6

- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment

- name: Build Firmwares
env:
FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }}
run: /usr/bin/env bash build.sh build-repeater-firmwares

- name: Upload Workflow Artifacts
uses: actions/upload-artifact@v7
with:
name: repeater-firmwares
path: out

- name: Create Release
uses: softprops/action-gh-release@v3
if: startsWith(github.ref, 'refs/tags/')
with:
name: Repeater Firmware ${{ env.GIT_TAG_VERSION }}
body: ""
draft: true
files: out/*
build-repeater-firmwares:
uses: ./.github/workflows/firmware-builder.yml
with:
firmware_type: 'repeater'
release_title_prefix: 'Repeater Firmware'
35 changes: 5 additions & 30 deletions .github/workflows/build-room-server-firmwares.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,8 @@ on:
- 'room-server-*'

jobs:

build:
runs-on: ubuntu-latest
steps:

- name: Clone Repo
uses: actions/checkout@v6

- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment

- name: Build Firmwares
env:
FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }}
run: /usr/bin/env bash build.sh build-room-server-firmwares

- name: Upload Workflow Artifacts
uses: actions/upload-artifact@v7
with:
name: room-server-firmwares
path: out

- name: Create Release
uses: softprops/action-gh-release@v3
if: startsWith(github.ref, 'refs/tags/')
with:
name: Room Server Firmware ${{ env.GIT_TAG_VERSION }}
body: ""
draft: true
files: out/*
build-room-server-firmwares:
uses: ./.github/workflows/firmware-builder.yml
with:
firmware_type: 'room-server'
release_title_prefix: 'Room Server Firmware'
90 changes: 90 additions & 0 deletions .github/workflows/firmware-builder.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Firmware Builder

on:
workflow_call:
inputs:
firmware_type:
required: true
type: string
release_title_prefix:
required: true
type: string

jobs:

generate-build-matrix:
runs-on: ubuntu-latest
outputs:
targets: ${{ steps.get-build-targets.outputs.targets }}
steps:

- name: Clone Repo
uses: actions/checkout@v6

- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment

- name: Get Build Targets
id: get-build-targets
run: |
# get list of firmwares to build
TARGET_LIST=$(/usr/bin/env bash build.sh get-${{ inputs.firmware_type }}-firmwares-to-build)

# convert targets separated by new line into a json array string
JSON_ARRAY=$(echo "$TARGET_LIST" | jq -R -s -c 'split("\n") | map(select(length > 0))')

# use json array as targets result
echo "targets=$JSON_ARRAY" >> $GITHUB_OUTPUT

build:
needs: generate-build-matrix
runs-on: ubuntu-latest
continue-on-error: true # don't fail entire build if one board fails to build
strategy:
matrix:
target: ${{ fromJson(needs.generate-build-matrix.outputs.targets) }}
fail-fast: false # don't cancel other builds if one board fails to build
steps:

- name: Clone Repo
uses: actions/checkout@v6

- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment

- name: Build Firmware
env:
FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }}
run: /usr/bin/env bash build.sh build-firmware ${{ matrix.target }}

- name: Upload Workflow Artifacts
uses: actions/upload-artifact@v7
with:
name: "${{ matrix.target }}"
path: out

create-release:
needs: build
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/') # only create release for tagged builds
steps:

- name: Clone Repo
uses: actions/checkout@v6

- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment

- name: Download All Artifacts
uses: actions/download-artifact@v8
with:
merge-multiple: true
path: out

- name: Create Release
uses: softprops/action-gh-release@v3
with:
name: "${{ inputs.release_title_prefix }} ${{ env.GIT_TAG_VERSION }}"
body: ""
draft: true
files: out/*
32 changes: 32 additions & 0 deletions .github/workflows/stale-bot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: 'Run Stale Bot'
on:
schedule:
- cron: '30 1 * * *' # daily at 1:30am
workflow_dispatch: {}

permissions:
actions: write
issues: write
pull-requests: write

jobs:
close-issues:
# only run on main repo, not forks
if: github.repository == 'meshcore-dev/MeshCore'
runs-on: ubuntu-latest
steps:
- name: Close Stale Issues
uses: actions/stale@v10
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# auto close issues
days-before-issue-stale: 60
days-before-issue-close: 7
exempt-issue-labels: "keep-open"
stale-issue-label: "stale"
stale-issue-message: "This issue is stale because it has been open for 60 days with no activity. Remove the stale label or add a comment if this issue is still relevant, otherwise this issue will automatically close in 7 days."
close-issue-message: "This issue was closed because it has been inactive for 7 days since being marked as stale."
# don't auto close prs
days-before-pr-stale: -1
days-before-pr-close: -1

35 changes: 35 additions & 0 deletions FLASHING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Flashing RAK13800 Ethernet Companion Targets

Use the canonical PlatformIO target names:

- `RAK_RAK13800_companion_radio_eth`
- `RAK_RAK13800_companion_radio_eth_static_diag`

These are RAK13800 Ethernet Companion board-support targets built on the RAK4631 MCU platform. The MCU, bootloader, SoftDevice, and board package remain RAK4631 / nRF52840, but the hardware stack being supported is `RAK 4631 / RAK13800 + W5100S`.

## Production Target

- Target: `RAK_RAK13800_companion_radio_eth`
- Networking: DHCP first, or DHCP with static fallback
- TCP port: `4403`
- `ETH_DEBUG_LOGGING=0`
- `FORCE_CLIENT_REPEAT=0`
- `MAX_CONTACTS=128` unless RAM testing proves a higher value is safe

## Static Diagnostic Target

- Target: `RAK_RAK13800_companion_radio_eth_static_diag`
- IP: `10.245.94.47`
- Gateway: `10.245.94.33`
- DNS: `10.245.94.33`
- Subnet: `255.255.255.224`
- TCP port: `4403`
- `ETH_STATIC_ONLY=1`
- `ETH_DEBUG_LOGGING=1`

## Compatibility Aliases

The following names may remain temporarily for compatibility:

- `RAK_4631_companion_radio_eth_clean` -> `RAK_RAK13800_companion_radio_eth`
- `RAK_4631_companion_radio_eth_static_diag` -> `RAK_RAK13800_companion_radio_eth_static_diag`
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,32 @@ MeshCore provides the ability to create wireless mesh networks, similar to Mesht
- Flash the MeshCore firmware on a supported device.
- Connect with a supported client.

### RAK13800 Ethernet Companion Targets

- `RAK_RAK13800_companion_radio_eth` is the production board-support target.
- `RAK_RAK13800_companion_radio_eth_static_diag` is the static diagnostic target.
- The old `RAK_4631_companion_radio_eth_clean` and `RAK_4631_companion_radio_eth_static_diag` names remain compatibility aliases only.
- Static diagnostic settings:
- IP `10.245.94.47`
- Gateway `10.245.94.33`
- DNS `10.245.94.33`
- Subnet `255.255.255.224`
- TCP port `4403`
- `ETH_STATIC_ONLY=1`
- `ETH_DEBUG_LOGGING=1`
- Production settings:
- DHCP first or DHCP with static fallback
- TCP port `4403`
- `ETH_DEBUG_LOGGING=0`
- `FORCE_CLIENT_REPEAT=0`
- `MAX_CONTACTS=128` unless RAM testing proves a higher value is safe

For developers:

- Install [PlatformIO](https://docs.platformio.org) in [Visual Studio Code](https://code.visualstudio.com).
- Clone and open the MeshCore repository in Visual Studio Code.
- The RAK13800 Ethernet Companion board-support targets use the canonical PlatformIO env names `RAK_RAK13800_companion_radio_eth` and `RAK_RAK13800_companion_radio_eth_static_diag`.
- These targets extend the RAK4631 MCU platform, but the supported hardware stack is `RAK 4631 / RAK13800 + W5100S`.
- See the example applications you can modify and run:
- [Companion Radio](./examples/companion_radio) - For use with an external chat app, over BLE, USB or Wi-Fi.
- [KISS Modem](./examples/kiss_modem) - Serial KISS protocol bridge for host applications. ([protocol docs](./docs/kiss_modem_protocol.md))
Expand Down
57 changes: 57 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Security Policy

## Supported Versions

Security fixes are applied to the latest release only. We do not backport
fixes to older versions.

| Version | Supported |
|---------|-----------|
| 1.15+ | ✅ |
| <1.15 | ❌ |

## Reporting a Vulnerability

**Please do not report security vulnerabilities through public GitHub issues.**

Use GitHub's private vulnerability reporting instead:
1. Go to the **Security** tab of this repository
2. Click **Report a vulnerability**
3. Fill in the details and submit

### What to include

A useful report tells us:
- Which component or file is affected
- What an attacker can do (impact) and under what conditions
- A minimal reproduction case or proof-of-concept if you have one
- Whether you believe it is remotely exploitable

You do not need a working exploit to report. An incomplete report is better
than no report.

## What to expect

This is a volunteer-maintained open-source project. We will do our best to
respond in a reasonable timeframe, but cannot commit to specific deadlines.

We ask that you give us a fair opportunity to investigate and address the
issue before any public disclosure. If you have not heard back after
**90 days**, feel free to follow up or proceed with disclosure at your
discretion.

## Scope

In scope:
- Remote code execution, memory corruption, or denial-of-service via crafted
radio packets
- Authentication or encryption bypasses
- Vulnerabilities in the packet routing or path handling logic

Out of scope:
- Physical access attacks (e.g., JTAG, UART extraction of keys)
- Regulatory compliance (duty cycle, frequency restrictions)
- Jamming or other physical-layer radio interference
- Issues in third-party libraries (RadioLib, Crypto, etc.) — report those
upstream
- "Best practice" suggestions without a demonstrated attack path
Loading