Compare commits
91 commits
master
...
lede-17.01
Author | SHA1 | Date | |
---|---|---|---|
|
2f5c10f917 | ||
|
fb287c3e4b | ||
|
305cce9234 | ||
|
e924835c81 | ||
|
5cba01e37a | ||
|
f659697eff | ||
|
020c99a39b | ||
|
af18086ba8 | ||
|
e100856a69 | ||
|
96c6b449b4 | ||
|
0976335f1e | ||
|
a96c48c6b7 | ||
|
24b2a9af0e | ||
|
3020feba9b | ||
|
dca9b7e0ca | ||
|
4e4a032445 | ||
|
f622ffd9bc | ||
|
216512ca2c | ||
|
2c8de62f4a | ||
|
ad22c771eb | ||
|
2ac8e7b42b | ||
|
d09478290f | ||
|
01005bf2e2 | ||
|
79f1094690 | ||
|
c823456dcb | ||
|
ea1e2c9c4c | ||
|
f0fe2d33b5 | ||
|
f1875d656c | ||
|
3dd4096da2 | ||
|
9b777e6b13 | ||
|
190f1b079f | ||
|
6317b51ba2 | ||
|
45d25d4dc4 | ||
|
08935dfaa0 | ||
|
b82d7ccd0a | ||
|
b19d008932 | ||
|
bb47c193a8 | ||
|
e2ad7be7f6 | ||
|
04ba10ef68 | ||
|
5e9e710717 | ||
|
285c803c0a | ||
|
b2e7b1a301 | ||
|
d20f7161ce | ||
|
28d242ef56 | ||
|
b1be24bf48 | ||
|
f3c9c1df59 | ||
|
7b394394b5 | ||
|
d11075cd40 | ||
|
7c31a144b7 | ||
|
3e916a3652 | ||
|
4d06ab99b4 | ||
|
471d3660b4 | ||
|
b4c1d4c02b | ||
|
846b6ea1c1 | ||
|
73c749d279 | ||
|
8d7993d8f9 | ||
|
c39de0ab35 | ||
|
3d18d0cfc2 | ||
|
ae774f4a97 | ||
|
e5e48d9a86 | ||
|
ae6a0e45d8 | ||
|
dbbad84722 | ||
|
fa9090769e | ||
|
794225577c | ||
|
640d944921 | ||
|
bab07b6e03 | ||
|
3bb8cde2b1 | ||
|
04a37ef430 | ||
|
a0b3597bae | ||
|
3e5e64eb43 | ||
|
38e5d7ae23 | ||
|
3ef93ff5a1 | ||
|
66f5c56f93 | ||
|
2abfe229c3 | ||
|
269baa28fe | ||
|
878d02a39f | ||
|
dd36dd47bb | ||
|
b71f8bfccb | ||
|
c14c231423 | ||
|
8109d303bd | ||
|
67507b60a2 | ||
|
3e35062891 | ||
|
caee6388a3 | ||
|
8d7ed3d04b | ||
|
a6c7413594 | ||
|
cdaf1e2144 | ||
|
48af2015e6 | ||
|
d787ff40a8 | ||
|
7927519d2e | ||
|
864b8aebaa | ||
|
89926d825b |
338 changed files with 17835 additions and 7174 deletions
16
.github/issue_template
vendored
16
.github/issue_template
vendored
|
@ -1,16 +0,0 @@
|
|||
Please make sure that the issue subject starts with `<package-name>: `
|
||||
|
||||
Also make sure that the package is maintained in this repository and not in OpenWrt-base, OpenWrt-packages or OpenWrt-LuCI.
|
||||
|
||||
Issues related to releases below 18.06 and forks are not supported or maintained and will be closed.
|
||||
|
||||
# Issue template (remove lines from top till here)
|
||||
|
||||
Maintainer: @\<github-user> (find it by checking history of the package Makefile)
|
||||
Environment: (put here arch, model, OpenWrt version)
|
||||
|
||||
Description:
|
||||
|
||||
```
|
||||
Formating code blocks by wrapping them with pairs of ```
|
||||
```
|
5
.github/pull_request_template
vendored
5
.github/pull_request_template
vendored
|
@ -1,5 +0,0 @@
|
|||
Maintainer: me / @\<github-user> (find it by checking history of the package Makefile)
|
||||
Compile tested: (put here arch, model, OpenWrt version)
|
||||
Run tested: (put here arch, model, OpenWrt version, tests done)
|
||||
|
||||
Description:
|
6
.github/workflows/Dockerfile
vendored
6
.github/workflows/Dockerfile
vendored
|
@ -1,6 +0,0 @@
|
|||
ARG ARCH=x86-64
|
||||
FROM openwrt/rootfs:$ARCH
|
||||
|
||||
ADD entrypoint.sh /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh"]
|
|
@ -1,91 +0,0 @@
|
|||
name: Check autorelease deprecation
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, synchronize, converted_to_draft, ready_for_review, edited]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Check autorelease deprecation
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Determine branch name
|
||||
run: |
|
||||
BRANCH="${GITHUB_BASE_REF#refs/heads/}"
|
||||
echo "Building for $BRANCH"
|
||||
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
|
||||
|
||||
- name: Determine changed packages
|
||||
run: |
|
||||
RET=0
|
||||
|
||||
# only detect packages with changes
|
||||
PKG_ROOTS=$(find . -name Makefile | \
|
||||
grep -v ".*/src/Makefile" | \
|
||||
sed -e 's@./\(.*\)/Makefile@\1/@')
|
||||
CHANGES=$(git diff --diff-filter=d --name-only origin/$BRANCH...)
|
||||
|
||||
for ROOT in $PKG_ROOTS; do
|
||||
for CHANGE in $CHANGES; do
|
||||
if [[ "$CHANGE" == "$ROOT"* ]]; then
|
||||
if grep -q '$(AUTORELEASE)' "$ROOT/Makefile"; then
|
||||
CONTAINS_AUTORELEASE+="$ROOT"
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
if [ -n "$CONTAINS_AUTORELEASE" ]; then
|
||||
RET=1
|
||||
cat > "$GITHUB_WORKSPACE/pr_comment.md" << EOF
|
||||
Please do no longer set *PKG_RELEASE* to *AUTORELEASE* as the
|
||||
feature is deprecated. Please use an integer instead. Below is a
|
||||
list of affected packages including correct *PKG_RELEASE*:
|
||||
|
||||
EOF
|
||||
fi
|
||||
|
||||
for ROOT in $CONTAINS_AUTORELEASE; do
|
||||
echo -n " - ${ROOT}Makefile: PKG_RELEASE:=" >> "$GITHUB_WORKSPACE/pr_comment.md"
|
||||
last_bump="$(git log --pretty=format:'%h %s' "$ROOT" |
|
||||
grep --max-count=1 -e ': [uU]pdate to ' -e ': [bB]ump to ' |
|
||||
cut -f 1 -d ' ')"
|
||||
|
||||
if [ -n "$last_bump" ]; then
|
||||
echo -n $(($(git rev-list --count "$last_bump..HEAD" "$ROOT") + 2)) >> "$GITHUB_WORKSPACE/pr_comment.md"
|
||||
else
|
||||
echo -n $(($(git rev-list --count HEAD "$ROOT") + 2)) >> "$GITHUB_WORKSPACE/pr_comment.md"
|
||||
fi
|
||||
echo >> "$GITHUB_WORKSPACE/pr_comment.md"
|
||||
done
|
||||
|
||||
exit $RET
|
||||
|
||||
- name: Find Comment
|
||||
uses: peter-evans/find-comment@v2
|
||||
if: ${{ failure() }}
|
||||
id: fc
|
||||
with:
|
||||
issue-number: ${{ github.event.pull_request.number }}
|
||||
comment-author: 'github-actions[bot]'
|
||||
|
||||
- name: Create or update comment
|
||||
uses: peter-evans/create-or-update-comment@v2
|
||||
if: ${{ failure() }}
|
||||
with:
|
||||
comment-id: ${{ steps.fc.outputs.comment-id }}
|
||||
issue-number: ${{ github.event.pull_request.number }}
|
||||
body-file: 'pr_comment.md'
|
||||
edit-mode: replace
|
26
.github/workflows/ci_helpers.sh
vendored
26
.github/workflows/ci_helpers.sh
vendored
|
@ -1,26 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
color_out() {
|
||||
printf "\e[0;$1m$PKG_NAME: %s\e[0;0m\n" "$2"
|
||||
}
|
||||
|
||||
success() {
|
||||
color_out 32 "$1"
|
||||
}
|
||||
|
||||
info() {
|
||||
color_out 36 "$1"
|
||||
}
|
||||
|
||||
err() {
|
||||
color_out 31 "$1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
color_out 33 "$1"
|
||||
}
|
||||
|
||||
err_die() {
|
||||
err "$1"
|
||||
exit 1
|
||||
}
|
62
.github/workflows/entrypoint.sh
vendored
62
.github/workflows/entrypoint.sh
vendored
|
@ -1,62 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# not enabling `errtrace` and `pipefail` since those are bash specific
|
||||
set -o errexit # failing commands causes script to fail
|
||||
set -o nounset # undefined variables causes script to fail
|
||||
|
||||
echo "src/gz packages_ci file:///ci" >> /etc/opkg/distfeeds.conf
|
||||
|
||||
FINGERPRINT="$(usign -F -p /ci/packages_ci.pub)"
|
||||
cp /ci/packages_ci.pub "/etc/opkg/keys/$FINGERPRINT"
|
||||
|
||||
mkdir -p /var/lock/
|
||||
|
||||
opkg update
|
||||
|
||||
[ -n "${CI_HELPER:=''}" ] || CI_HELPER="/ci/.github/workflows/ci_helpers.sh"
|
||||
|
||||
for PKG in /ci/*.ipk; do
|
||||
tar -xzOf "$PKG" ./control.tar.gz | tar xzf - ./control
|
||||
# package name including variant
|
||||
PKG_NAME=$(sed -ne 's#^Package: \(.*\)$#\1#p' ./control)
|
||||
# package version without release
|
||||
PKG_VERSION=$(sed -ne 's#^Version: \(.*\)-[0-9]*$#\1#p' ./control)
|
||||
# package source contianing test.sh script
|
||||
PKG_SOURCE=$(sed -ne 's#^Source: .*/\(.*\)$#\1#p' ./control)
|
||||
|
||||
echo "Testing package $PKG_NAME in version $PKG_VERSION from $PKG_SOURCE"
|
||||
|
||||
export PKG_NAME PKG_VERSION CI_HELPER
|
||||
|
||||
PRE_TEST_SCRIPT=$(find /ci/ -name "$PKG_SOURCE" -type d)/pre-test.sh
|
||||
|
||||
if [ -f "$PRE_TEST_SCRIPT" ]; then
|
||||
echo "Use package specific pre-test.sh"
|
||||
if sh "$PRE_TEST_SCRIPT" "$PKG_NAME" "$PKG_VERSION"; then
|
||||
echo "Pre-test successful"
|
||||
else
|
||||
echo "Pre-test failed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "No pre-test.sh script available"
|
||||
fi
|
||||
|
||||
opkg install "$PKG"
|
||||
|
||||
TEST_SCRIPT=$(find /ci/ -name "$PKG_SOURCE" -type d)/test.sh
|
||||
|
||||
if [ -f "$TEST_SCRIPT" ]; then
|
||||
echo "Use package specific test.sh"
|
||||
if sh "$TEST_SCRIPT" "$PKG_NAME" "$PKG_VERSION"; then
|
||||
echo "Test succesful"
|
||||
else
|
||||
echo "Test failed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "No test.sh script available"
|
||||
fi
|
||||
|
||||
opkg remove "$PKG_NAME" --force-removal-of-dependent-packages --force-remove --autoremove || true
|
||||
done
|
63
.github/workflows/formal.yml
vendored
63
.github/workflows/formal.yml
vendored
|
@ -1,63 +0,0 @@
|
|||
name: Test Formalities
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Test Formalities
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Determine branch name
|
||||
run: |
|
||||
BRANCH="${GITHUB_BASE_REF#refs/heads/}"
|
||||
echo "Building for $BRANCH"
|
||||
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
|
||||
|
||||
- name: Test formalities
|
||||
run: |
|
||||
source .github/workflows/ci_helpers.sh
|
||||
|
||||
RET=0
|
||||
for commit in $(git rev-list HEAD ^origin/$BRANCH); do
|
||||
info "=== Checking commit '$commit'"
|
||||
if git show --format='%P' -s $commit | grep -qF ' '; then
|
||||
err "Pull request should not include merge commits"
|
||||
RET=1
|
||||
fi
|
||||
|
||||
author="$(git show -s --format=%aN $commit)"
|
||||
if echo $author | grep -q '\S\+\s\+\S\+'; then
|
||||
success "Author name ($author) seems ok"
|
||||
else
|
||||
err "Author name ($author) need to be your real name 'firstname lastname'"
|
||||
RET=1
|
||||
fi
|
||||
|
||||
subject="$(git show -s --format=%s $commit)"
|
||||
if echo "$subject" | grep -q -e '^[0-9A-Za-z,+/_-]\+: ' -e '^Revert '; then
|
||||
success "Commit subject line seems ok ($subject)"
|
||||
else
|
||||
err "Commit subject line MUST start with '<package name>: ' ($subject)"
|
||||
RET=1
|
||||
fi
|
||||
|
||||
body="$(git show -s --format=%b $commit)"
|
||||
sob="$(git show -s --format='Signed-off-by: %aN <%aE>' $commit)"
|
||||
if echo "$body" | grep -qF "$sob"; then
|
||||
success "Signed-off-by match author"
|
||||
else
|
||||
err "Signed-off-by is missing or doesn't match author (should be '$sob')"
|
||||
RET=1
|
||||
fi
|
||||
done
|
||||
|
||||
exit $RET
|
157
.github/workflows/multi-arch-test-build.yml
vendored
157
.github/workflows/multi-arch-test-build.yml
vendored
|
@ -1,157 +0,0 @@
|
|||
name: Test Build
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Test ${{ matrix.arch }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- arch: aarch64_generic
|
||||
target: armsr-armv8
|
||||
runtime_test: true
|
||||
|
||||
- arch: arm_cortex-a15_neon-vfpv4
|
||||
target: armsr-armv7
|
||||
runtime_test: true
|
||||
|
||||
- arch: arm_cortex-a9_vfpv3-d16
|
||||
target: mvebu-cortexa9
|
||||
runtime_test: false
|
||||
|
||||
- arch: i386_pentium-mmx
|
||||
target: x86-geode
|
||||
runtime_test: true
|
||||
|
||||
- arch: mips_24kc
|
||||
target: ath79-generic
|
||||
runtime_test: true
|
||||
|
||||
- arch: powerpc_464fp
|
||||
target: apm821xx-nand
|
||||
runtime_test: false
|
||||
|
||||
- arch: powerpc_8548
|
||||
target: mpc85xx-p1010
|
||||
runtime_test: false
|
||||
|
||||
- arch: riscv64_riscv64
|
||||
target: sifiveu-generic
|
||||
runtime_test: false
|
||||
|
||||
- arch: x86_64
|
||||
target: x86-64
|
||||
runtime_test: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Determine branch name
|
||||
run: |
|
||||
BRANCH="${GITHUB_BASE_REF#refs/heads/}"
|
||||
echo "Building for $BRANCH"
|
||||
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
|
||||
|
||||
- name: Determine changed packages
|
||||
run: |
|
||||
# only detect packages with changes
|
||||
PKG_ROOTS=$(find . -name Makefile | \
|
||||
grep -v ".*/src/Makefile" | \
|
||||
sed -e 's@./\(.*\)/Makefile@\1/@')
|
||||
CHANGES=$(git diff --diff-filter=d --name-only origin/$BRANCH)
|
||||
|
||||
for ROOT in $PKG_ROOTS; do
|
||||
for CHANGE in $CHANGES; do
|
||||
if [[ "$CHANGE" == "$ROOT"* ]]; then
|
||||
PACKAGES+=$(echo "$ROOT" | sed -e 's@\(.*\)/@\1 @')
|
||||
break
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# fallback to test packages if nothing explicitly changes this is
|
||||
# should run if other mechanics in packages.git changed
|
||||
PACKAGES="${PACKAGES:-bird2 cjdns olsrd}"
|
||||
|
||||
echo "Building $PACKAGES"
|
||||
echo "PACKAGES=$PACKAGES" >> $GITHUB_ENV
|
||||
|
||||
- name: Generate build keys
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y signify-openbsd
|
||||
signify-openbsd -G -n -c 'DO NOT USE - OpenWrt packages feed CI' -p packages_ci.pub -s packages_ci.sec
|
||||
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
|
||||
echo "KEY_BUILD<<$EOF" >> $GITHUB_ENV
|
||||
cat packages_ci.sec >> $GITHUB_ENV
|
||||
echo "$EOF" >> $GITHUB_ENV
|
||||
|
||||
- name: Build
|
||||
uses: openwrt/gh-action-sdk@v5
|
||||
env:
|
||||
ARCH: ${{ matrix.arch }}-${{ env.BRANCH }}
|
||||
FEEDNAME: packages_ci
|
||||
INDEX: 1
|
||||
KEY_BUILD: ${{ env.KEY_BUILD }}
|
||||
|
||||
- name: Move created packages to project dir
|
||||
run: cp bin/packages/${{ matrix.arch }}/packages_ci/* . || true
|
||||
|
||||
- name: Store packages
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{env.ARCHIVE_NAME}}-packages
|
||||
path: |
|
||||
Packages
|
||||
Packages.*
|
||||
*.ipk
|
||||
PKG-INFO
|
||||
|
||||
- name: Store logs
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ matrix.arch}}-logs
|
||||
path: logs/
|
||||
|
||||
- name: Remove logs
|
||||
run: sudo rm -rf logs/ || true
|
||||
|
||||
- name: Check if any packages were built
|
||||
run: |
|
||||
if [ -n "$(find . -maxdepth 1 -type f -name '*.ipk' -print -quit)" ]; then
|
||||
echo "Found *.ipk files"
|
||||
HAVE_IPKS=true
|
||||
else
|
||||
echo "No *.ipk files found"
|
||||
HAVE_IPKS=false
|
||||
fi
|
||||
echo "HAVE_IPKS=$HAVE_IPKS" >> $GITHUB_ENV
|
||||
|
||||
- name: Register QEMU
|
||||
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y qemu-user-static binfmt-support
|
||||
sudo update-binfmts --import
|
||||
|
||||
- name: Build Docker container
|
||||
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
|
||||
run: |
|
||||
docker build -t test-container --build-arg ARCH .github/workflows/
|
||||
env:
|
||||
ARCH: ${{ matrix.arch }}-${{ env.BRANCH }}
|
||||
|
||||
- name: Test via Docker container
|
||||
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
|
||||
run: |
|
||||
docker run --rm -v $GITHUB_WORKSPACE:/ci test-container
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
Axel "axn" Neumann <neumann@cgws.de>
|
||||
Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>
|
||||
Bastian Bittorf <bb@npl.de>
|
||||
Bastian Bittorf <bittorf@bluebottle.com>
|
||||
Corinna "Elektra" Aichele <onelektra@gmx.net>
|
||||
Gabriel Kerneis <gabriel@kerneis.info>
|
||||
Gui Iribarren <gui@altermundi.net>
|
||||
|
@ -21,5 +21,5 @@ Nicolás Echániz <nicoechaniz@altermundi.net>
|
|||
Pau Escrich <pau@dabax.net>
|
||||
Saverio Proto <zioproto@gmail.com>
|
||||
Simon Wunderlich <sw@simonwunderlich.de>
|
||||
Steven Barth <steven@midlink.org>
|
||||
Steven Barth <cyrus@openwrt.org>
|
||||
Vasilis "acinonyx" Tsiligiannis <acinonyx@openwrt.gr>
|
||||
|
|
18
README
Normal file
18
README
Normal file
|
@ -0,0 +1,18 @@
|
|||
This is an OpenWrt package feed containing community maintained routing packages.
|
||||
|
||||
To use these packages, add the following line to the feeds.conf
|
||||
in the OpenWrt buildroot:
|
||||
|
||||
src-git routing git://github.com/openwrt-routing/packages.git
|
||||
|
||||
Update the feed:
|
||||
|
||||
./scripts/feeds update routing
|
||||
|
||||
Activate the package:
|
||||
|
||||
./scripts/feeds install -a -p routing
|
||||
|
||||
The routing packages should now appear in menuconfig.
|
||||
|
||||
|
21
README.md
21
README.md
|
@ -1,21 +0,0 @@
|
|||
# OpenWrt Routing Feed
|
||||
|
||||
## Description
|
||||
|
||||
This OpenWrt package feed contains community maintained routing packages.
|
||||
|
||||
## Usage
|
||||
|
||||
|
||||
This repository is intended to be layered on-top of an OpenWrt buildroot.
|
||||
If you do not have an OpenWrt buildroot installed, see the documentation at:
|
||||
[OpenWrt Buildroot – Installation][1] on the OpenWrt support site.
|
||||
|
||||
This feed is enabled by default. To install all its package definitions, run:
|
||||
|
||||
```
|
||||
./scripts/feeds update routing
|
||||
./scripts/feeds install -a -p routing
|
||||
```
|
||||
|
||||
[1]: https://openwrt.org/docs/guide-developer/build-system/install-buildsystem
|
|
@ -9,15 +9,13 @@ include $(TOPDIR)/rules.mk
|
|||
|
||||
PKG_NAME:=ahcpd
|
||||
PKG_VERSION:=0.53
|
||||
PKG_RELEASE:=3
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://www.irif.fr/~jch/software/files/
|
||||
PKG_HASH:=a4622e817d2b2a9b878653f085585bd57f3838cc546cca6028d3b73ffcac0d52
|
||||
|
||||
PKG_MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
|
||||
PKG_SOURCE_URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/files/
|
||||
PKG_MD5SUM:=a1a610bf20965aa522cd766bf3d5829a
|
||||
PKG_LICENSE:=MIT
|
||||
PKG_LICENSE_FILES:=LICENCE
|
||||
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
@ -25,7 +23,8 @@ define Package/ahcpd
|
|||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
TITLE:=Ad-Hoc Configuration Protocol daemon
|
||||
URL:=https://www.irif.fr/~jch/software/ahcp/
|
||||
URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/ahcp/
|
||||
MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
|
||||
DEPENDS:=@IPV6 +ip +librt
|
||||
endef
|
||||
|
||||
|
|
|
@ -1,55 +1,53 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Copyright (C) 2013 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
#
|
||||
# The latest alfred git hash in PKG_REV can be obtained from https://git.open-mesh.org/alfred.git
|
||||
#
|
||||
PKG_NAME:=alfred
|
||||
PKG_VERSION:=2024.0
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=2016.5
|
||||
PKG_RELEASE:=0
|
||||
PKG_MD5SUM:=e03d422ed3b5a162b90e8af13389523f
|
||||
PKG_HASH:=37b3babf7f37643cf296be11fb82d5730cf441a5a56f72fba96edae9f149c9d2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_HASH:=d029a43638ab16771e5f71e134bc843d1713d74041c65bcda18a31d18f5531bd
|
||||
|
||||
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
PKG_LICENSE:=GPL-2.0-only MIT
|
||||
PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
PKG_BUILD_FLAGS:=gc-sections lto
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_ALFRED_NEEDS_lua \
|
||||
CONFIG_ALFRED_NEEDS_libgps \
|
||||
CONFIG_PACKAGE_ALFRED_VIS \
|
||||
CONFIG_PACKAGE_ALFRED_BATHOSTS \
|
||||
CONFIG_PACKAGE_ALFRED_GPSD
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
init-y := alfred
|
||||
|
||||
define Package/alfred
|
||||
URL:=https://www.open-mesh.org/
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
TITLE:=A.L.F.R.E.D. - Almighty Lightweight Fact Remote Exchange Daemon
|
||||
URL:=https://www.open-mesh.org/
|
||||
DEPENDS:= +libc @IPV6 +libnl-tiny +librt \
|
||||
+ALFRED_NEEDS_lua:lua \
|
||||
+ALFRED_NEEDS_libgps:libgps
|
||||
+ALFRED_NEEDS_lua:lua \
|
||||
+ALFRED_NEEDS_libgps:libgps
|
||||
endef
|
||||
|
||||
define Package/alfred/description
|
||||
alfred is a user space daemon for distributing arbitrary local information
|
||||
over the mesh/network in a decentralized fashion. This data can be anything
|
||||
which appears to be useful - originally designed to replace the batman-adv
|
||||
visualization (vis), you may distribute hostnames, phone books, administration
|
||||
information, DNS information, the local weather forecast ...
|
||||
alfred is a user space daemon for distributing arbitrary local information over
|
||||
the mesh/network in a decentralized fashion. This data can be anything which
|
||||
appears to be useful - originally designed to replace the batman-adv
|
||||
visualization (vis), you may distribute hostnames, phone books, administration
|
||||
information, DNS information, the local weather forecast ...
|
||||
|
||||
alfred runs as daemon in the background of the system. A user may insert
|
||||
information by using the alfred binary on the command line, or use special
|
||||
programs to communicate with alfred (done via unix sockets). alfred then takes
|
||||
care of distributing the local information to other alfred servers on other
|
||||
nodes. This is done via IPv6 link-local multicast, and does not require any
|
||||
configuration. A user can request data from alfred, and will receive the
|
||||
information available from all alfred servers in the network.
|
||||
alfred runs as daemon in the background of the system. A user may insert
|
||||
information by using the alfred binary on the command line, or use special
|
||||
programs to communicate with alfred (done via unix sockets). alfred then takes
|
||||
care of distributing the local information to other alfred servers on other
|
||||
nodes. This is done via IPv6 link-local multicast, and does not require any
|
||||
configuration. A user can request data from alfred, and will receive the
|
||||
information available from all alfred servers in the network.
|
||||
endef
|
||||
|
||||
define Package/alfred/conffiles
|
||||
|
@ -60,13 +58,21 @@ define Package/alfred/config
|
|||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
MAKE_FLAGS += \
|
||||
MAKE_ALFRED_FLAGS=\
|
||||
CONFIG_ALFRED_VIS=$(if $(CONFIG_PACKAGE_ALFRED_VIS),y,n) \
|
||||
CONFIG_ALFRED_GPSD=$(if $(CONFIG_PACKAGE_ALFRED_GPSD),y,n) \
|
||||
CONFIG_ALFRED_CAPABILITIES=n \
|
||||
LIBNL_NAME="libnl-tiny" \
|
||||
LIBNL_GENL_NAME="libnl-tiny" \
|
||||
REVISION="$(PKG_VERSION)-openwrt-$(PKG_RELEASE)"
|
||||
LIBNL_GENL_NAME="libnl-tiny"
|
||||
|
||||
TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto
|
||||
TARGET_LDFLAGS += -Wl,--gc-sections -fuse-linker-plugin
|
||||
|
||||
define Build/Compile
|
||||
CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) $(MAKE_ALFRED_FLAGS) all
|
||||
endef
|
||||
|
||||
define Package/alfred/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
config 'alfred' 'alfred'
|
||||
list interface 'br-lan'
|
||||
option interface 'br-lan'
|
||||
option mode 'master'
|
||||
option batmanif 'bat0'
|
||||
option start_vis '1'
|
||||
|
|
|
@ -1,41 +1,81 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
|
||||
#
|
||||
# Copyright (C) 2013 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
START=99
|
||||
USE_PROCD=1
|
||||
STOP=99
|
||||
alfred_args=""
|
||||
vis_args=""
|
||||
facters_dir="/etc/alfred"
|
||||
pid_file_alfred="/var/run/alfred.pid"
|
||||
pid_file_vis="/var/run/batadv-vis.pid"
|
||||
enable=0
|
||||
vis_enable=0
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_WRITE_PID=1
|
||||
|
||||
append_interface()
|
||||
wait_for_dir()
|
||||
{
|
||||
append "interfaces" "$1" ","
|
||||
local ifce="$1" dir="$2"
|
||||
|
||||
if ! [ -d "$dir" ] ; then
|
||||
timeout=30
|
||||
echo "${initscript}: waiting $timeout secs for $ifce interface..."
|
||||
for i in $(seq $timeout); do
|
||||
sleep 1
|
||||
[ -d "$dir" ] && break
|
||||
if [ $i == $timeout ] ; then
|
||||
echo "${initscript}: $ifce not detected, alfred not starting."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
alfred_start() {
|
||||
wait_for_ll_address()
|
||||
{
|
||||
local iface="$1"
|
||||
local timeout=30
|
||||
|
||||
echo "${initscript}: waiting $timeout secs for $iface address..."
|
||||
for i in $(seq $timeout); do
|
||||
# We look for
|
||||
# - the link-local address (starts with fe80)
|
||||
# - without tentative flag (bit 0x40 in the flags field; the first char of the flags field begins 38 columns after the fe80 prefix
|
||||
# - on interface $iface
|
||||
if awk '
|
||||
BEGIN { RET=1 }
|
||||
/^fe80.{37} [012389ab]/ { if ($6 == "'"$iface"'") RET=0 }
|
||||
END { exit RET }
|
||||
' /proc/net/if_inet6; then
|
||||
return
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "${initscript}: $iface address not detected, alfred not starting."
|
||||
exit 1
|
||||
}
|
||||
|
||||
alfred_start()
|
||||
{
|
||||
local args=""
|
||||
local section="$1"
|
||||
local disabled interface mode
|
||||
local interfaces
|
||||
|
||||
# check if section is disabled
|
||||
config_get_bool disabled "$section" disabled 0
|
||||
[ $disabled = 0 ] || return 1
|
||||
|
||||
args="-f"
|
||||
args=""
|
||||
|
||||
config_list_foreach "$section" "interface" append_interface
|
||||
if [ -z "$interfaces" ]; then
|
||||
config_get interface "$section" interface
|
||||
append_interface "$interface"
|
||||
fi
|
||||
append args "-i $interfaces"
|
||||
config_get interface "$section" interface
|
||||
append args "-i $interface"
|
||||
|
||||
config_get mode "$section" mode
|
||||
[ "$mode" = "master" ] && append args "-m"
|
||||
|
@ -43,6 +83,12 @@ alfred_start() {
|
|||
config_get batmanif "$section" batmanif
|
||||
append args "-b $batmanif"
|
||||
|
||||
if [ "$batmanif" != "none" ]; then
|
||||
wait_for_dir "$batmanif" "/sys/class/net/$batmanif/mesh"
|
||||
fi
|
||||
|
||||
wait_for_ll_address "$interface"
|
||||
|
||||
append alfred_args "$args"
|
||||
enable=1
|
||||
|
||||
|
@ -57,41 +103,41 @@ alfred_start() {
|
|||
return 0
|
||||
}
|
||||
|
||||
start_service() {
|
||||
start()
|
||||
{
|
||||
config_load "alfred"
|
||||
config_foreach alfred_start alfred
|
||||
|
||||
[ "$enable" = "0" ] && return 0
|
||||
if [ "$enable" = "0" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
procd_open_instance "alfred"
|
||||
procd_set_param command /usr/sbin/alfred
|
||||
procd_append_param command ${alfred_args}
|
||||
procd_close_instance
|
||||
echo "${initscript}: starting alfred"
|
||||
SERVICE_PID_FILE="$pid_file_alfred"
|
||||
service_start /usr/sbin/alfred ${alfred_args}
|
||||
|
||||
[ "$vis_enable" = "1" ] && {
|
||||
procd_open_instance "batadv-vis"
|
||||
procd_set_param command /usr/sbin/batadv-vis
|
||||
procd_append_param command ${vis_args}
|
||||
procd_close_instance
|
||||
}
|
||||
if [ "$vis_enable" = "1" ]; then
|
||||
echo "${initscript}: starting batadv-vis"
|
||||
SERVICE_PID_FILE="$pid_file_vis"
|
||||
service_start /usr/sbin/batadv-vis ${vis_args}
|
||||
fi
|
||||
|
||||
[ "$run_facters" = "1" ] && {
|
||||
if [ "$run_facters" = "1" ]; then
|
||||
( for file in $facters_dir/* ; do [ -x $file ] && $file ; done )
|
||||
if ! ( grep -q "for file in $facters_dir/\* ; do " /etc/crontabs/root 2>/dev/null ) ; then
|
||||
echo "*/5 * * * * ( for file in $facters_dir/* ; do [ -x \$file ] && \$file ; done )" >> /etc/crontabs/root
|
||||
/etc/init.d/cron enable
|
||||
/etc/init.d/cron restart
|
||||
fi
|
||||
}
|
||||
fi
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "alfred"
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
[ -e /etc/crontabs/root ] && {
|
||||
sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
|
||||
/etc/init.d/cron restart
|
||||
}
|
||||
stop()
|
||||
{
|
||||
SERVICE_PID_FILE="$pid_file_alfred"
|
||||
service_stop /usr/sbin/alfred
|
||||
SERVICE_PID_FILE="$pid_file_vis"
|
||||
[ -x /usr/sbin/batadv-vis ] && service_stop /usr/sbin/batadv-vis
|
||||
sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
|
||||
/etc/init.d/cron restart
|
||||
}
|
||||
|
|
|
@ -87,24 +87,19 @@ end
|
|||
|
||||
local function receive_bat_hosts()
|
||||
-- read raw chunks from alfred, convert them to a nested table and call write_bat_hosts
|
||||
-- "alfred -r" can fail in slave nodes (returns empty stdout), so:
|
||||
-- check output is not null before writing /tmp/bat-hosts, and retry 3 times before giving up.
|
||||
for n = 1, 3 do
|
||||
local fd = io.popen("alfred -r " .. type_id)
|
||||
--[[ this command returns something like
|
||||
{ "54:e6:fc:b9:cb:37", "00:11:22:33:44:55 ham_wlan0\x0a00:22:33:22:33:22 ham_eth0\x0a" },
|
||||
{ "90:f6:52:bb:ec:57", "00:22:33:22:33:23 spam\x0a" },
|
||||
]]--
|
||||
local fd = io.popen("alfred -r " .. type_id)
|
||||
--[[ this command returns something like
|
||||
{ "54:e6:fc:b9:cb:37", "00:11:22:33:44:55 ham_wlan0\x0a00:22:33:22:33:22 ham_eth0\x0a" },
|
||||
{ "90:f6:52:bb:ec:57", "00:22:33:22:33:23 spam\x0a" },
|
||||
]]--
|
||||
|
||||
if fd then
|
||||
local output = fd:read("*a")
|
||||
fd:close()
|
||||
if output and output ~= "" then
|
||||
assert(loadstring("rows = {" .. output .. "}"))()
|
||||
write_bat_hosts(rows)
|
||||
break
|
||||
end
|
||||
if fd then
|
||||
local output = fd:read("*a")
|
||||
if output then
|
||||
assert(loadstring("rows = {" .. output .. "}"))()
|
||||
write_bat_hosts(rows)
|
||||
end
|
||||
fd:close()
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ PKG_RELEASE:=1
|
|||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/files/
|
||||
PKG_HASH:=c411430bb102f08d3d68d2fb5010b5da0149908b671ac0fb12abd8c8ee6380c5
|
||||
PKG_MD5SUM:=40d4931986913f5f8d9b5b70abf6fda5
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
|
|
@ -1,23 +1,20 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#
|
||||
# Copyright (C) 2007-2021 OpenWrt.org
|
||||
# Copyright (C) 2007-2009 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=babeld
|
||||
PKG_VERSION:=1.13.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.8.0
|
||||
PKG_RELEASE:=3
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://www.irif.fr/~jch/software/files/
|
||||
PKG_HASH:=15f24d26da0ccfc073abcdef0309f281e4684f2aa71126f826572c4c845e8dd9
|
||||
|
||||
PKG_MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>, \
|
||||
Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>, \
|
||||
Nick Hainke <vincent@systemli.org>
|
||||
PKG_MD5SUM:=eb1c66c382e9181c418ebd84e52b5af2
|
||||
PKG_LICENSE:=MIT
|
||||
PKG_LICENSE_FILES:=LICENCE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
@ -25,17 +22,21 @@ define Package/babeld
|
|||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE:=A loop-avoiding distance-vector routing protocol
|
||||
TITLE:=A loop-free distance-vector routing protocol
|
||||
URL:=https://www.irif.fr/~jch/software/babel/
|
||||
DEPENDS:=@IPV6 +libubus +libubox
|
||||
MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>, \
|
||||
Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>
|
||||
DEPENDS:=@IPV6
|
||||
endef
|
||||
|
||||
define Package/babeld/description
|
||||
Babel is a loop-avoiding distance-vector routing protocol for IPv6 and IPv4
|
||||
with fast convergence properties. It is based on the ideas in DSDV, AODV and
|
||||
Cisco's EIGRP, but is designed to work well not only in wired networks but
|
||||
also in wireless mesh networks, and has been extended with support for
|
||||
overlay networks. Babel is an IETF standard protocol (RFC 8966).
|
||||
Babel is a loop-avoiding distance-vector routing protocol roughly based
|
||||
on DSDV and AODV, but with provisions for link cost estimation and
|
||||
redistribution of routes from other routing protocols.
|
||||
While it is optimised for wireless mesh networks, Babel will also work
|
||||
efficiently on wired networks. It will generate between 1.2 and 2.4 times
|
||||
the amount of routing traffic that RIPng would generate, while
|
||||
never counting to infinity.
|
||||
endef
|
||||
|
||||
define Package/babeld/conffiles
|
||||
|
@ -46,7 +47,6 @@ endef
|
|||
MAKE_FLAGS+= \
|
||||
CFLAGS="$(TARGET_CFLAGS)" \
|
||||
LDLIBS="" \
|
||||
LDLIBS+="-lubus -lubox"
|
||||
|
||||
define Package/babeld/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package babeld
|
||||
|
||||
# Detailed documentation: https://openwrt.org/docs/guide-user/services/babeld
|
||||
|
||||
# Babeld reads options from the following files (the last one takes precedence
|
||||
# if an option is defined in several places):
|
||||
# - the file defined by the option conf_file (default: /etc/babeld.conf),
|
||||
|
@ -24,7 +22,6 @@ config general
|
|||
## See comment at the top of this file for more details.
|
||||
# option 'conf_file' '/etc/babeld.conf'
|
||||
# option 'conf_dir' '/tmp/babel.d/'
|
||||
# option 'ubus_bindings' 'false'
|
||||
|
||||
config interface
|
||||
## Remove this line to enable babeld on this interface
|
||||
|
@ -42,10 +39,7 @@ config interface
|
|||
option 'ignore' 'true'
|
||||
## Physical interface name
|
||||
option 'ifname' 'tun-example'
|
||||
## Specify the type of interface: tunnels use the RTT-based metric.
|
||||
option 'type' 'tunnel'
|
||||
## Other options that can be overriden.
|
||||
# option 'max_rtt_penalty' '96'
|
||||
# option 'max_rtt_penalty' '90'
|
||||
|
||||
# A config interface without "option ifname" will set default options
|
||||
# for all interfaces. Interface-specific configuration always overrides
|
||||
|
@ -55,49 +49,27 @@ config interface
|
|||
# option 'update_interval' '30'
|
||||
|
||||
|
||||
# A filter consists of a type ('in', 'out', 'redistribute' or 'install'),
|
||||
# a set of selectors ('ip', 'eq', etc.) and a set of actions to perform
|
||||
# ('allow', 'deny', 'metric xxx', 'src-prefix xxx', 'table xxx', 'pref-src xxx').
|
||||
# See babeld man page ("Filtering rules") for more details.
|
||||
|
||||
# Below is a sample filter that redistributes the default route if its
|
||||
# protocol number is "boot", e.g. when it is installed by dhcp (see
|
||||
# /etc/iproute2/rt_protos). This filter is disabled thanks to the 'ignore'
|
||||
# setting.
|
||||
# A filter consists of a type ('in', 'out' or 'redistribute'), an action
|
||||
# ('allow', 'deny' or 'metric xxx') and a set of selectors ('ip', 'eq',
|
||||
# etc.). See babeld man page ("Filtering rules") for more details.
|
||||
# Here is a sample filter wich redistributes the default route if its
|
||||
# protocol number is "boot", e.g. when it installed by dhcp. It is
|
||||
# disabled by default.
|
||||
config filter
|
||||
option 'ignore' 'true'
|
||||
# Type of filter
|
||||
# Type
|
||||
option 'type' 'redistribute'
|
||||
# Selectors: ip, eq, le, ge, src_ip, src_eq, src_le, src_ge, neigh, id,
|
||||
# proto, local, if.
|
||||
option 'ip' '0.0.0.0/0'
|
||||
option 'eq' '0'
|
||||
option 'proto' '3'
|
||||
# Action, which can be any of: allow, deny, metric <NUMBER>, src-prefix <PREFIX>,
|
||||
# table <ID>, pref-src <IP>.
|
||||
# The action defaults to "allow" if not specified. Here, we specify a higher
|
||||
# redistribution metric than the default (0).
|
||||
# Action (one of: allow, deny, metric XXX, src-prefix XXX).
|
||||
option 'action' 'metric 128'
|
||||
|
||||
# Another example filter: don't redistribute local addresses in a certain IP prefix.
|
||||
# By default, babeld redistributes *all* local addresses.
|
||||
# Notice that the 'local' selector is a boolean.
|
||||
config filter
|
||||
option 'ignore' 'true'
|
||||
option 'type' 'redistribute'
|
||||
# Only apply to routes/addresses within this prefix.
|
||||
option 'ip' '198.51.100.0/24'
|
||||
# Notice that the 'local' selector is a boolean.
|
||||
option 'local' 'true'
|
||||
# Don't redistribute.
|
||||
option 'action' 'deny'
|
||||
|
||||
# Example install filter, to change or filter routes before they are inserted
|
||||
# into the kernel.
|
||||
config filter
|
||||
option 'ignore' 'true'
|
||||
option 'type' 'install'
|
||||
# Optional: only apply to routes within 2001:db8:cafe::/48
|
||||
option 'ip' '2001:db8:cafe::/48'
|
||||
# We specify the kernel routing table and the preferred source address to use for these routes.
|
||||
# "Allow" is implicit.
|
||||
option 'action' 'table 200 pref-src 2001:db8:ba:be1::42'
|
||||
# No action means "allow"
|
||||
|
|
|
@ -1,132 +0,0 @@
|
|||
--- a/babeld.c
|
||||
+++ b/babeld.c
|
||||
@@ -54,6 +54,8 @@ THE SOFTWARE.
|
||||
#include "local.h"
|
||||
#include "version.h"
|
||||
|
||||
+#include "ubus.h"
|
||||
+
|
||||
struct timeval now;
|
||||
|
||||
unsigned char myid[8];
|
||||
@@ -505,6 +507,9 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
+ if(ubus_bindings)
|
||||
+ babeld_add_ubus();
|
||||
+
|
||||
init_signals();
|
||||
rc = resize_receive_buffer(1500);
|
||||
if(rc < 0)
|
||||
@@ -597,6 +602,8 @@ main(int argc, char **argv)
|
||||
FD_SET(local_sockets[i].fd, &readfds);
|
||||
maxfd = MAX(maxfd, local_sockets[i].fd);
|
||||
}
|
||||
+ if(ubus_bindings)
|
||||
+ maxfd = babeld_ubus_add_read_sock(&readfds, maxfd);
|
||||
rc = select(maxfd + 1, &readfds, NULL, NULL, &tv);
|
||||
if(rc < 0) {
|
||||
if(errno != EINTR) {
|
||||
@@ -665,6 +672,9 @@ main(int argc, char **argv)
|
||||
i++;
|
||||
}
|
||||
|
||||
+ if(ubus_bindings)
|
||||
+ babeld_ubus_receive(&readfds);
|
||||
+
|
||||
if(reopening) {
|
||||
kernel_dump_time = now.tv_sec;
|
||||
check_neighbours_timeout = now;
|
||||
--- a/generate-version.sh
|
||||
+++ b/generate-version.sh
|
||||
@@ -10,4 +10,4 @@ else
|
||||
version="unknown"
|
||||
fi
|
||||
|
||||
-echo "#define BABELD_VERSION \"$version\""
|
||||
+echo "#define BABELD_VERSION \"$version-ubus-mod\""
|
||||
--- a/configuration.c
|
||||
+++ b/configuration.c
|
||||
@@ -42,6 +42,8 @@ THE SOFTWARE.
|
||||
#include "hmac.h"
|
||||
#include "configuration.h"
|
||||
|
||||
+#include "ubus.h"
|
||||
+
|
||||
static struct filter *input_filters = NULL;
|
||||
static struct filter *output_filters = NULL;
|
||||
static struct filter *redistribute_filters = NULL;
|
||||
@@ -1024,7 +1026,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
||||
strcmp(token, "daemonise") == 0 ||
|
||||
strcmp(token, "skip-kernel-setup") == 0 ||
|
||||
strcmp(token, "ipv6-subtrees") == 0 ||
|
||||
- strcmp(token, "reflect-kernel-metric") == 0) {
|
||||
+ strcmp(token, "reflect-kernel-metric") == 0 ||
|
||||
+ strcmp(token, "ubus-bindings") == 0) {
|
||||
int b;
|
||||
c = getbool(c, &b, gnc, closure);
|
||||
if(c < -1)
|
||||
@@ -1042,6 +1045,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
||||
has_ipv6_subtrees = b;
|
||||
else if(strcmp(token, "reflect-kernel-metric") == 0)
|
||||
reflect_kernel_metric = b;
|
||||
+ else if(strcmp(token, "ubus-bindings") == 0)
|
||||
+ ubus_bindings = b;
|
||||
else
|
||||
abort();
|
||||
} else if(strcmp(token, "protocol-group") == 0) {
|
||||
--- a/local.c
|
||||
+++ b/local.c
|
||||
@@ -42,6 +42,8 @@ THE SOFTWARE.
|
||||
#include "local.h"
|
||||
#include "version.h"
|
||||
|
||||
+#include "ubus.h"
|
||||
+
|
||||
int local_server_socket = -1;
|
||||
struct local_socket local_sockets[MAX_LOCAL_SOCKETS];
|
||||
int num_local_sockets = 0;
|
||||
@@ -191,6 +193,8 @@ local_notify_neighbour(struct neighbour
|
||||
if(local_sockets[i].monitor)
|
||||
local_notify_neighbour_1(&local_sockets[i], neigh, kind);
|
||||
}
|
||||
+ if(ubus_bindings)
|
||||
+ ubus_notify_neighbour(neigh, kind);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -228,6 +232,8 @@ local_notify_xroute(struct xroute *xrout
|
||||
if(local_sockets[i].monitor)
|
||||
local_notify_xroute_1(&local_sockets[i], xroute, kind);
|
||||
}
|
||||
+ if(ubus_bindings)
|
||||
+ ubus_notify_xroute(xroute, kind);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -273,6 +279,8 @@ local_notify_route(struct babel_route *r
|
||||
if(local_sockets[i].monitor)
|
||||
local_notify_route_1(&local_sockets[i], route, kind);
|
||||
}
|
||||
+ if(ubus_bindings)
|
||||
+ ubus_notify_route(route, kind);
|
||||
}
|
||||
|
||||
static void
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -11,11 +11,11 @@ LDLIBS = -lrt
|
||||
|
||||
SRCS = babeld.c net.c kernel.c util.c interface.c source.c neighbour.c \
|
||||
route.c xroute.c message.c resend.c configuration.c local.c \
|
||||
- hmac.c rfc6234/sha224-256.c BLAKE2/ref/blake2s-ref.c
|
||||
+ hmac.c ubus.c rfc6234/sha224-256.c BLAKE2/ref/blake2s-ref.c
|
||||
|
||||
OBJS = babeld.o net.o kernel.o util.o interface.o source.o neighbour.o \
|
||||
route.o xroute.o message.o resend.o configuration.o local.o \
|
||||
- hmac.o rfc6234/sha224-256.o BLAKE2/ref/blake2s-ref.o
|
||||
+ hmac.o ubus.o rfc6234/sha224-256.o BLAKE2/ref/blake2s-ref.o
|
||||
|
||||
babeld: $(OBJS)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o babeld $(OBJS) $(LDLIBS)
|
|
@ -1,535 +0,0 @@
|
|||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/select.h>
|
||||
|
||||
#include <libubox/blob.h>
|
||||
#include <libubox/blobmsg.h>
|
||||
#include <libubox/list.h>
|
||||
#include <libubus.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "babeld.h"
|
||||
#include "configuration.h"
|
||||
#include "interface.h"
|
||||
#include "kernel.h"
|
||||
#include "local.h"
|
||||
#include "message.h"
|
||||
#include "neighbour.h"
|
||||
#include "net.h"
|
||||
#include "resend.h"
|
||||
#include "route.h"
|
||||
#include "source.h"
|
||||
#include "util.h"
|
||||
#include "version.h"
|
||||
#include "xroute.h"
|
||||
|
||||
#include "ubus.h"
|
||||
|
||||
// Definition of header variable whether to enable ubus bindings.
|
||||
int ubus_bindings = 0;
|
||||
|
||||
// Shared state maintained throughout calls to handle ubus messages.
|
||||
static struct ubus_context *shared_ctx;
|
||||
|
||||
// List of exported routes (to be used with ubox's list helpers).
|
||||
struct xroute_list_entry {
|
||||
struct list_head list;
|
||||
struct xroute *xroute;
|
||||
};
|
||||
|
||||
// List of received routes (to be used with ubox's list helpers).
|
||||
struct route_list_entry {
|
||||
struct list_head list;
|
||||
struct babel_route *route;
|
||||
};
|
||||
|
||||
// List of neighbours (to be used with ubox's list helpers).
|
||||
struct neighbour_list_entry {
|
||||
struct list_head list;
|
||||
struct neighbour *neighbour;
|
||||
};
|
||||
|
||||
// Definition of interface function enums (to be used with ubox's blobmsg
|
||||
// helpers).
|
||||
enum { INTERFACE_IFNAME, __INTERFACE_MAX };
|
||||
|
||||
// Definition of interface parsing (to be used with ubox's blobmsg helpers).
|
||||
static const struct blobmsg_policy interface_policy[__INTERFACE_MAX] = {
|
||||
[INTERFACE_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
|
||||
};
|
||||
|
||||
// Definition of filter function enums (to be used with ubox's blobmsg
|
||||
// helpers).
|
||||
enum { FILTER_IFNAME, FILTER_TYPE, FILTER_METRIC, __FILTER_MAX };
|
||||
|
||||
// Definition of filter parsing (to be used with ubox's blobmsg helpers).
|
||||
static const struct blobmsg_policy filter_policy[__FILTER_MAX] = {
|
||||
[FILTER_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
|
||||
[FILTER_TYPE] = {"type", BLOBMSG_TYPE_INT32},
|
||||
[FILTER_METRIC] = {"metric", BLOBMSG_TYPE_INT32},
|
||||
};
|
||||
|
||||
// Adds a filter (ubus equivalent to "filter"-function).
|
||||
static int babeld_ubus_add_filter(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method, struct blob_attr *msg) {
|
||||
struct blob_attr *tb[__FILTER_MAX];
|
||||
struct blob_buf b = {0};
|
||||
struct filter *filter = NULL;
|
||||
char *ifname;
|
||||
int metric, type;
|
||||
|
||||
blobmsg_parse(filter_policy, __FILTER_MAX, tb, blob_data(msg), blob_len(msg));
|
||||
|
||||
if (!tb[FILTER_IFNAME])
|
||||
return UBUS_STATUS_INVALID_ARGUMENT;
|
||||
|
||||
if (!tb[FILTER_TYPE])
|
||||
return UBUS_STATUS_INVALID_ARGUMENT;
|
||||
|
||||
type = blobmsg_get_u32(tb[FILTER_TYPE]);
|
||||
|
||||
if (tb[FILTER_METRIC])
|
||||
metric = blobmsg_get_u32(tb[FILTER_METRIC]);
|
||||
|
||||
filter = calloc(1, sizeof(struct filter));
|
||||
if (filter == NULL)
|
||||
return UBUS_STATUS_UNKNOWN_ERROR;
|
||||
|
||||
filter->af = AF_INET6;
|
||||
filter->proto = 0;
|
||||
filter->plen_le = 128;
|
||||
filter->src_plen_le = 128;
|
||||
filter->action.add_metric = metric;
|
||||
|
||||
ifname = blobmsg_get_string(tb[FILTER_IFNAME]);
|
||||
filter->ifname = strdup(ifname);
|
||||
filter->ifindex = if_nametoindex(filter->ifname);
|
||||
|
||||
add_filter(filter, type);
|
||||
|
||||
return UBUS_STATUS_OK;
|
||||
}
|
||||
|
||||
// Adds an inteface (ubus equivalent to "interface"-function).
|
||||
static int babeld_ubus_add_interface(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method,
|
||||
struct blob_attr *msg) {
|
||||
struct blob_attr *tb[__INTERFACE_MAX];
|
||||
struct blob_buf b = {0};
|
||||
struct interface *ifp = NULL;
|
||||
char *ifname;
|
||||
|
||||
blobmsg_parse(interface_policy, __INTERFACE_MAX, tb, blob_data(msg),
|
||||
blob_len(msg));
|
||||
|
||||
if (!tb[INTERFACE_IFNAME])
|
||||
return UBUS_STATUS_INVALID_ARGUMENT;
|
||||
|
||||
ifname = blobmsg_get_string(tb[INTERFACE_IFNAME]);
|
||||
|
||||
ifp = add_interface(ifname, NULL);
|
||||
if (ifp == NULL)
|
||||
return UBUS_STATUS_UNKNOWN_ERROR;
|
||||
|
||||
return UBUS_STATUS_OK;
|
||||
}
|
||||
|
||||
// Sends a babel info message on ubus socket.
|
||||
static int babeld_ubus_babeld_info(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method, struct blob_attr *msg) {
|
||||
struct blob_buf b = {0};
|
||||
void *prefix;
|
||||
char host[64];
|
||||
int ret;
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
blobmsg_add_string(&b, "babeld-version", BABELD_VERSION);
|
||||
blobmsg_add_string(&b, "my-id", format_eui64(myid));
|
||||
if (!gethostname(host, sizeof(host)))
|
||||
blobmsg_add_string(&b, "host", host);
|
||||
|
||||
ret = ubus_send_reply(ctx_local, req, b.head);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
|
||||
|
||||
blob_buf_free(&b);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Appends an exported route message entry to the buffer.
|
||||
static void babeld_add_xroute_buf(struct xroute *xroute, struct blob_buf *b) {
|
||||
void *prefix;
|
||||
|
||||
prefix = blobmsg_open_table(b, format_prefix(xroute->prefix, xroute->plen));
|
||||
|
||||
blobmsg_add_string(b, "src-prefix",
|
||||
format_prefix(xroute->src_prefix, xroute->src_plen));
|
||||
blobmsg_add_u32(b, "metric", xroute->metric);
|
||||
blobmsg_close_table(b, prefix);
|
||||
}
|
||||
|
||||
// Sends an exported routes message on ubus socket, splitting apart IPv4 and
|
||||
// IPv6 routes.
|
||||
static int babeld_ubus_get_xroutes(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method, struct blob_attr *msg) {
|
||||
struct blob_buf b = {0};
|
||||
struct xroute_stream *xroutes;
|
||||
struct xroute_list_entry *cur, *tmp;
|
||||
void *ipv4, *ipv6;
|
||||
int ret;
|
||||
LIST_HEAD(xroute_ipv4_list);
|
||||
LIST_HEAD(xroute_ipv6_list);
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
|
||||
xroutes = xroute_stream();
|
||||
if (xroutes) {
|
||||
while (1) {
|
||||
struct xroute *xroute = xroute_stream_next(xroutes);
|
||||
if (xroute == NULL)
|
||||
break;
|
||||
|
||||
struct xroute_list_entry *xr =
|
||||
calloc(1, sizeof(struct xroute_list_entry));
|
||||
xr->xroute = xroute;
|
||||
|
||||
if (v4mapped(xroute->prefix)) {
|
||||
list_add(&xr->list, &xroute_ipv4_list);
|
||||
} else {
|
||||
list_add(&xr->list, &xroute_ipv6_list);
|
||||
}
|
||||
}
|
||||
xroute_stream_done(xroutes);
|
||||
}
|
||||
|
||||
ipv4 = blobmsg_open_table(&b, "IPv4");
|
||||
list_for_each_entry_safe(cur, tmp, &xroute_ipv4_list, list) {
|
||||
babeld_add_xroute_buf(cur->xroute, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv4);
|
||||
|
||||
ipv6 = blobmsg_open_table(&b, "IPv6");
|
||||
list_for_each_entry_safe(cur, tmp, &xroute_ipv6_list, list) {
|
||||
babeld_add_xroute_buf(cur->xroute, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv6);
|
||||
|
||||
ret = ubus_send_reply(ctx_local, req, b.head);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
|
||||
|
||||
blob_buf_free(&b);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Appends an route message entry to the buffer.
|
||||
static void babeld_add_route_buf(struct babel_route *route,
|
||||
struct blob_buf *b) {
|
||||
void *prefix;
|
||||
|
||||
prefix = blobmsg_open_table(
|
||||
b, format_prefix(route->src->prefix, route->src->plen));
|
||||
|
||||
blobmsg_add_string(
|
||||
b, "src-prefix",
|
||||
format_prefix(route->src->src_prefix, route->src->src_plen));
|
||||
blobmsg_add_u32(b, "route_metric", route_metric(route));
|
||||
blobmsg_add_u32(b, "route_smoothed_metric", route_smoothed_metric(route));
|
||||
blobmsg_add_u32(b, "refmetric", route->refmetric);
|
||||
blobmsg_add_string(b, "id", format_eui64(route->src->id));
|
||||
blobmsg_add_u32(b, "seqno", (uint32_t)route->seqno);
|
||||
blobmsg_add_u32(b, "age", (int)(now.tv_sec - route->time));
|
||||
blobmsg_add_string(b, "via", format_address(route->neigh->address));
|
||||
if (memcmp(route->nexthop, route->neigh->address, 16) != 0)
|
||||
blobmsg_add_string(b, "nexthop", format_address(route->nexthop));
|
||||
|
||||
blobmsg_add_u8(b, "installed", route->installed);
|
||||
blobmsg_add_u8(b, "feasible", route_feasible(route));
|
||||
|
||||
blobmsg_close_table(b, prefix);
|
||||
}
|
||||
|
||||
// Sends received routes message on ubus socket, splitting apart IPv4 and IPv6
|
||||
// routes.
|
||||
static int babeld_ubus_get_routes(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method, struct blob_attr *msg) {
|
||||
struct blob_buf b = {0};
|
||||
struct route_stream *routes;
|
||||
struct route_list_entry *cur, *tmp;
|
||||
void *prefix, *ipv4, *ipv6;
|
||||
int ret;
|
||||
LIST_HEAD(route_ipv4_list);
|
||||
LIST_HEAD(route_ipv6_list);
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
|
||||
routes = route_stream(0);
|
||||
if (routes) {
|
||||
while (1) {
|
||||
struct babel_route *route = route_stream_next(routes);
|
||||
if (route == NULL)
|
||||
break;
|
||||
struct route_list_entry *r = calloc(1, sizeof(struct route_list_entry));
|
||||
r->route = route;
|
||||
|
||||
if (v4mapped(route->src->prefix)) {
|
||||
list_add(&r->list, &route_ipv4_list);
|
||||
} else {
|
||||
list_add(&r->list, &route_ipv6_list);
|
||||
}
|
||||
}
|
||||
route_stream_done(routes);
|
||||
}
|
||||
|
||||
ipv4 = blobmsg_open_table(&b, "IPv4");
|
||||
list_for_each_entry_safe(cur, tmp, &route_ipv4_list, list) {
|
||||
babeld_add_route_buf(cur->route, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv4);
|
||||
|
||||
ipv6 = blobmsg_open_table(&b, "IPv6");
|
||||
list_for_each_entry_safe(cur, tmp, &route_ipv6_list, list) {
|
||||
babeld_add_route_buf(cur->route, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv6);
|
||||
|
||||
ret = ubus_send_reply(ctx_local, req, b.head);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
|
||||
|
||||
blob_buf_free(&b);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Appends an neighbour entry to the buffer.
|
||||
static void babeld_add_neighbour_buf(struct neighbour *neigh,
|
||||
struct blob_buf *b) {
|
||||
void *neighbour;
|
||||
|
||||
neighbour = blobmsg_open_table(b, format_address(neigh->address));
|
||||
blobmsg_add_string(b, "dev", neigh->ifp->name);
|
||||
blobmsg_add_u32(b, "hello-reach", neigh->hello.reach);
|
||||
blobmsg_add_u32(b, "uhello-reach", neigh->uhello.reach);
|
||||
blobmsg_add_u32(b, "rxcost", neighbour_rxcost(neigh));
|
||||
blobmsg_add_u32(b, "txcost", neigh->txcost);
|
||||
blobmsg_add_string(b, "rtt", format_thousands(neigh->rtt));
|
||||
blobmsg_add_u8(b, "if_up", if_up(neigh->ifp));
|
||||
blobmsg_close_table(b, neighbour);
|
||||
}
|
||||
|
||||
// Sends neighbours message on ubus socket, splitting apart IPv4 and IPv6
|
||||
// neighbours.
|
||||
static int babeld_ubus_get_neighbours(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method,
|
||||
struct blob_attr *msg) {
|
||||
struct blob_buf b = {0};
|
||||
struct neighbour *neigh;
|
||||
struct neighbour_list_entry *cur, *tmp;
|
||||
void *ipv4, *ipv6;
|
||||
int ret;
|
||||
LIST_HEAD(neighbour_ipv4_list);
|
||||
LIST_HEAD(neighbour_ipv6_list);
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
|
||||
FOR_ALL_NEIGHBOURS(neigh) {
|
||||
struct neighbour_list_entry *n =
|
||||
calloc(1, sizeof(struct neighbour_list_entry));
|
||||
n->neighbour = neigh;
|
||||
if (v4mapped(neigh->address)) {
|
||||
list_add(&n->list, &neighbour_ipv4_list);
|
||||
} else {
|
||||
list_add(&n->list, &neighbour_ipv6_list);
|
||||
}
|
||||
}
|
||||
|
||||
ipv4 = blobmsg_open_table(&b, "IPv4");
|
||||
list_for_each_entry_safe(cur, tmp, &neighbour_ipv4_list, list) {
|
||||
babeld_add_neighbour_buf(cur->neighbour, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv4);
|
||||
|
||||
ipv6 = blobmsg_open_table(&b, "IPv6");
|
||||
list_for_each_entry_safe(cur, tmp, &neighbour_ipv6_list, list) {
|
||||
babeld_add_neighbour_buf(cur->neighbour, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv6);
|
||||
|
||||
ret = ubus_send_reply(ctx_local, req, b.head);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
|
||||
|
||||
blob_buf_free(&b);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// List of functions we expose via the ubus bus.
|
||||
static const struct ubus_method babeld_methods[] = {
|
||||
UBUS_METHOD("add_interface", babeld_ubus_add_interface, interface_policy),
|
||||
UBUS_METHOD("add_filter", babeld_ubus_add_filter, filter_policy),
|
||||
UBUS_METHOD_NOARG("get_info", babeld_ubus_babeld_info),
|
||||
UBUS_METHOD_NOARG("get_xroutes", babeld_ubus_get_xroutes),
|
||||
UBUS_METHOD_NOARG("get_routes", babeld_ubus_get_routes),
|
||||
UBUS_METHOD_NOARG("get_neighbours", babeld_ubus_get_neighbours),
|
||||
};
|
||||
|
||||
// Definition of the ubus object type.
|
||||
static struct ubus_object_type babeld_object_type =
|
||||
UBUS_OBJECT_TYPE("babeld", babeld_methods);
|
||||
|
||||
// Object we announce via the ubus bus.
|
||||
static struct ubus_object babeld_object = {
|
||||
.name = "babeld",
|
||||
.type = &babeld_object_type,
|
||||
.methods = babeld_methods,
|
||||
.n_methods = ARRAY_SIZE(babeld_methods),
|
||||
};
|
||||
|
||||
// Registers handlers for babel methods in the global ubus context.
|
||||
static bool ubus_init_object() {
|
||||
int ret;
|
||||
|
||||
ret = ubus_add_object(shared_ctx, &babeld_object);
|
||||
if (ret) {
|
||||
fprintf(stderr, "Failed to add object: %s\n", ubus_strerror(ret));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Initializes the global ubus context, connecting to the bus to be able to
|
||||
// receive and send messages.
|
||||
static bool babeld_ubus_init(void) {
|
||||
if (shared_ctx)
|
||||
return true;
|
||||
|
||||
shared_ctx = ubus_connect(NULL);
|
||||
if (!shared_ctx)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ubus_notify_route(struct babel_route *route, int kind) {
|
||||
struct blob_buf b = {0};
|
||||
char method[50]; // possible methods are route.change, route.add, route.flush
|
||||
|
||||
if (!babeld_object.has_subscribers)
|
||||
return;
|
||||
|
||||
if (!route)
|
||||
return;
|
||||
|
||||
if (!shared_ctx)
|
||||
return;
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
babeld_add_route_buf(route, &b);
|
||||
snprintf(method, sizeof(method), "route.%s", local_kind(kind));
|
||||
ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
|
||||
blob_buf_free(&b);
|
||||
}
|
||||
|
||||
void ubus_notify_xroute(struct xroute *xroute, int kind) {
|
||||
struct blob_buf b = {0};
|
||||
char method[50]; // possible methods are xroute.change, xroute.add,
|
||||
// xroute.flush
|
||||
|
||||
if (!babeld_object.has_subscribers)
|
||||
return;
|
||||
|
||||
if (!xroute)
|
||||
return;
|
||||
|
||||
if (!shared_ctx)
|
||||
return;
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
babeld_add_xroute_buf(xroute, &b);
|
||||
snprintf(method, sizeof(method), "xroute.%s", local_kind(kind));
|
||||
ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
|
||||
blob_buf_free(&b);
|
||||
}
|
||||
|
||||
void ubus_notify_neighbour(struct neighbour *neigh, int kind) {
|
||||
struct blob_buf b = {0};
|
||||
char method[50]; // possible methods are neigh.change, neigh.add, neigh.flush
|
||||
|
||||
if (!babeld_object.has_subscribers)
|
||||
return;
|
||||
|
||||
if (!neigh)
|
||||
return;
|
||||
|
||||
if (!shared_ctx)
|
||||
return;
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
babeld_add_neighbour_buf(neigh, &b);
|
||||
snprintf(method, sizeof(method), "neigh.%s", local_kind(kind));
|
||||
ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
|
||||
blob_buf_free(&b);
|
||||
}
|
||||
|
||||
void babeld_ubus_receive(fd_set *readfds) {
|
||||
if (!shared_ctx)
|
||||
return;
|
||||
if (FD_ISSET(shared_ctx->sock.fd, readfds))
|
||||
ubus_handle_event(shared_ctx);
|
||||
}
|
||||
|
||||
int babeld_ubus_add_read_sock(fd_set *readfds, int maxfd) {
|
||||
if (!shared_ctx)
|
||||
return maxfd;
|
||||
|
||||
FD_SET(shared_ctx->sock.fd, readfds);
|
||||
return MAX(maxfd, shared_ctx->sock.fd);
|
||||
}
|
||||
|
||||
bool babeld_add_ubus() {
|
||||
if (!babeld_ubus_init()) {
|
||||
fprintf(stderr, "Failed to initialize ubus!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ubus_init_object()) {
|
||||
fprintf(stderr, "Failed to add objects to ubus!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
|
@ -1,99 +0,0 @@
|
|||
/*
|
||||
IPC integration of babeld with OpenWrt.
|
||||
|
||||
The ubus interface offers following functions:
|
||||
- add_filter '{"ifname":"eth0", "type":0, "metric":5000}'
|
||||
type:
|
||||
0: FILTER_TYPE_INPUT
|
||||
1: FILTER_TYPE_OUTPUT
|
||||
2: FILTER_TYPE_REDISTRIBUTE
|
||||
3: FILTER_TYPE_INSTALL
|
||||
- add_interface '{"ifname":"eth0"}'
|
||||
- get_info
|
||||
- get_neighbours
|
||||
- get_xroutes
|
||||
- get_routes
|
||||
|
||||
All output is divided into IPv4 and IPv6.
|
||||
|
||||
Ubus notifications are sent if we receive updates for
|
||||
- xroutes
|
||||
- routes
|
||||
- neighbours
|
||||
|
||||
The format is:
|
||||
- {route,xroute,neighbour}.add: Object was added
|
||||
- {route,xroute,neighbour}.change: Object was changed
|
||||
- {route,xroute,neighbour}.flush: Object was flushed
|
||||
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <sys/select.h>
|
||||
|
||||
struct babel_route;
|
||||
struct neighbour;
|
||||
struct xroute;
|
||||
|
||||
// Whether to enable ubus bindings (boolean option).
|
||||
extern int ubus_bindings;
|
||||
|
||||
/**
|
||||
* Initialize ubus interface.
|
||||
*
|
||||
* Connect to the ubus daemon and expose the ubus functions.
|
||||
*
|
||||
* @return if initializing ubus was successful
|
||||
*/
|
||||
bool babeld_add_ubus();
|
||||
|
||||
/**
|
||||
* Add ubus socket to given filedescriptor set.
|
||||
*
|
||||
* We need to check repeatedly if the ubus socket has something to read.
|
||||
* The functions allows to add the ubus socket to the normal while(1)-loop of
|
||||
* babeld.
|
||||
*
|
||||
* @param readfs: the filedescriptor set
|
||||
* @param maxfd: the current maximum file descriptor
|
||||
* @return the maximum file descriptor
|
||||
*/
|
||||
int babeld_ubus_add_read_sock(fd_set *readfds, int maxfd);
|
||||
|
||||
/**
|
||||
* Check and process ubus socket.
|
||||
*
|
||||
* If the ubus-socket signals that data is available, the ubus_handle_event is
|
||||
* called.
|
||||
*/
|
||||
void babeld_ubus_receive(fd_set *readfds);
|
||||
|
||||
/***
|
||||
* Notify the ubus bus that a new xroute is received.
|
||||
*
|
||||
* If a new xroute is received or changed, we will notify subscribers.
|
||||
*
|
||||
* @param xroute: xroute that experienced some change
|
||||
* @param kind: kind that describes if we have a flush, add or change
|
||||
*/
|
||||
void ubus_notify_xroute(struct xroute *xroute, int kind);
|
||||
|
||||
/***
|
||||
* Notify the ubus bus that a new route is received.
|
||||
*
|
||||
* If a new route is received or changed, we will notify subscribers.
|
||||
*
|
||||
* @param route: route that experienced some change
|
||||
* @param kind: kind that describes if we have a flush, add or change
|
||||
*/
|
||||
void ubus_notify_route(struct babel_route *route, int kind);
|
||||
|
||||
/***
|
||||
* Notify the ubus bus that a new neighbour is received.
|
||||
*
|
||||
* If a new neighbour is received or changed, we will notify subscribers.
|
||||
*
|
||||
* @param neigh: neighbour that experienced some change
|
||||
* @param kind: kind that describes if we have a flush, add or change
|
||||
*/
|
||||
void ubus_notify_neighbour(struct neighbour *neigh, int kind);
|
262
batctl/Makefile
262
batctl/Makefile
|
@ -1,248 +1,82 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Copyright (C) 2014 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=batctl
|
||||
PKG_VERSION:=2024.0
|
||||
|
||||
PKG_VERSION:=2016.5
|
||||
PKG_RELEASE:=1
|
||||
PKG_MD5SUM:=7b33fb47c7fa5b317e9a152a286999fc
|
||||
PKG_HASH:=07edeb1d87a548285be8c499542790a158fc8d94ef7ebb295f27ebf710024ae9
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_HASH:=76853e87201af63c411db152fd0c625a729a9733115897d1331604e2c5a67c7d
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
PKG_LICENSE:=GPL-2.0-only ISC MIT
|
||||
PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT LICENSES/deprecated/ISC
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
PKG_BUILD_FLAGS:=gc-sections lto
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/batctl/Default
|
||||
define Package/batctl
|
||||
URL:=https://www.open-mesh.org/
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
URL:=https://www.open-mesh.org/
|
||||
DEPENDS:=+libnl-tiny +libc +librt
|
||||
PROVIDES:=batctl
|
||||
DEPENDS:=+kmod-batman-adv +libnl-tiny +libc +librt
|
||||
TITLE:=B.A.T.M.A.N. Advanced user space configuration tool batctl
|
||||
MAINTAINER:=Marek Lindner <mareklindner@neomailbox.ch>
|
||||
endef
|
||||
|
||||
define Package/batctl/description
|
||||
batctl is a more intuitive managment utility for B.A.T.M.A.N.-Advanced.
|
||||
It is an easier method for configuring batman-adv and provides some
|
||||
additional tools for debugging as well. This package builds
|
||||
version $(PKG_VERSION) of the user space utility.
|
||||
batctl is a more intuitive managment utility for B.A.T.M.A.N.-Advanced.
|
||||
It is an easier method for configuring batman-adv and provides some
|
||||
additional tools for debugging as well. This package builds
|
||||
version $(PKG_VERSION) of the user space utility.
|
||||
endef
|
||||
|
||||
define Package/batctl-tiny
|
||||
$(call Package/batctl/Default)
|
||||
TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Minimal)
|
||||
VARIANT:=tiny
|
||||
ALTERNATIVES:=100:/usr/sbin/batctl:/usr/libexec/batctl-tiny
|
||||
endef
|
||||
# The linker can identify unused sections of a binary when each symbol is stored
|
||||
# in a separate section. This mostly removes unused linker sections and reduces
|
||||
# the size by ~3% on mipsel.
|
||||
|
||||
define Package/batctl-tiny/description
|
||||
$(Package/batctl/description)
|
||||
Only configuration relevant subcommands are enabled.
|
||||
endef
|
||||
TARGET_CFLAGS += -ffunction-sections -fdata-sections
|
||||
TARGET_LDFLAGS += -Wl,--gc-sections
|
||||
|
||||
define Package/batctl-default
|
||||
$(call Package/batctl/Default)
|
||||
TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Default)
|
||||
VARIANT:=default
|
||||
ALTERNATIVES:=200:/usr/sbin/batctl:/usr/libexec/batctl-default
|
||||
endef
|
||||
# Link-time optimization allows to move parts of the optimization from the single
|
||||
# source file to the global source view. This is done by emitting the GIMPLE
|
||||
# representation in each object file and analyzing it again during the link step.
|
||||
|
||||
define Package/batctl-default/description
|
||||
$(Package/batctl/description)
|
||||
Standard subcommands for configuration and online debugging are enabled.
|
||||
endef
|
||||
TARGET_CFLAGS += -flto
|
||||
TARGET_LDFLAGS += -fuse-linker-plugin
|
||||
|
||||
define Package/batctl-full
|
||||
$(call Package/batctl/Default)
|
||||
TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Full)
|
||||
VARIANT:=full
|
||||
ALTERNATIVES:=300:/usr/sbin/batctl:/usr/libexec/batctl-full
|
||||
endef
|
||||
|
||||
define Package/batctl-full/description
|
||||
$(Package/batctl/description)
|
||||
Subcommands for configuration, online and offline debugging are enabled.
|
||||
endef
|
||||
|
||||
MAKE_VARS += \
|
||||
MAKE_BATCTL_ENV += \
|
||||
CPPFLAGS="$(TARGET_CPPFLAGS)" \
|
||||
CFLAGS="$(TARGET_CFLAGS)" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
LIBNL_NAME="libnl-tiny" \
|
||||
LIBNL_GENL_NAME="libnl-tiny"
|
||||
|
||||
MAKE_FLAGS += \
|
||||
REVISION="$(PKG_VERSION)-openwrt-$(PKG_RELEASE)"
|
||||
MAKE_BATCTL_ARGS += \
|
||||
REVISION="$(PKG_BATCTL_SHORTREV)" \
|
||||
CC="$(TARGET_CC)" \
|
||||
DESTDIR="$(PKG_INSTALL_DIR)" \
|
||||
batctl install
|
||||
|
||||
config-n := \
|
||||
aggregation \
|
||||
ap_isolation \
|
||||
backbonetable \
|
||||
bisect_iv \
|
||||
bonding \
|
||||
bla_backbone_json \
|
||||
bla_claim_json \
|
||||
bridge_loop_avoidance \
|
||||
claimtable \
|
||||
dat_cache \
|
||||
dat_cache_json \
|
||||
distributed_arp_table \
|
||||
elp_interval \
|
||||
event \
|
||||
fragmentation \
|
||||
gateways \
|
||||
gateways_json \
|
||||
gw_mode \
|
||||
hardif_json \
|
||||
hardifs_json \
|
||||
hop_penalty \
|
||||
interface \
|
||||
isolation_mark \
|
||||
loglevel \
|
||||
mcast_flags \
|
||||
mcast_flags_json \
|
||||
mesh_json \
|
||||
multicast_fanout \
|
||||
multicast_forceflood \
|
||||
multicast_mode \
|
||||
neighbors \
|
||||
neighbors_json \
|
||||
network_coding \
|
||||
orig_interval \
|
||||
originators \
|
||||
originators_json \
|
||||
ping \
|
||||
routing_algo \
|
||||
statistics \
|
||||
tcpdump \
|
||||
throughput_override \
|
||||
throughputmeter \
|
||||
traceroute \
|
||||
transglobal \
|
||||
translate \
|
||||
translocal \
|
||||
transtable_global_json \
|
||||
transtable_local_json \
|
||||
vlan_json \
|
||||
|
||||
config-settings := \
|
||||
aggregation \
|
||||
ap_isolation \
|
||||
bonding \
|
||||
bridge_loop_avoidance \
|
||||
distributed_arp_table \
|
||||
elp_interval \
|
||||
fragmentation \
|
||||
gw_mode \
|
||||
hop_penalty \
|
||||
interface \
|
||||
isolation_mark \
|
||||
loglevel \
|
||||
multicast_fanout \
|
||||
multicast_forceflood \
|
||||
multicast_mode \
|
||||
network_coding \
|
||||
orig_interval \
|
||||
routing_algo \
|
||||
throughput_override \
|
||||
|
||||
config-tables := \
|
||||
backbonetable \
|
||||
claimtable \
|
||||
dat_cache \
|
||||
gateways \
|
||||
mcast_flags \
|
||||
neighbors \
|
||||
originators \
|
||||
statistics \
|
||||
transglobal \
|
||||
translocal \
|
||||
|
||||
config-json := \
|
||||
bla_backbone_json \
|
||||
bla_claim_json \
|
||||
dat_cache_json \
|
||||
gateways_json \
|
||||
hardif_json \
|
||||
hardifs_json \
|
||||
mcast_flags_json \
|
||||
mesh_json \
|
||||
neighbors_json \
|
||||
originators_json \
|
||||
transtable_global_json \
|
||||
transtable_local_json \
|
||||
vlan_json \
|
||||
|
||||
config-tools := \
|
||||
event \
|
||||
ping \
|
||||
tcpdump \
|
||||
throughputmeter \
|
||||
traceroute \
|
||||
translate \
|
||||
|
||||
config-extratools := \
|
||||
bisect_iv \
|
||||
|
||||
ifeq ($(BUILD_VARIANT),tiny)
|
||||
|
||||
config-y := \
|
||||
$(config-settings) \
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),default)
|
||||
|
||||
config-y := \
|
||||
$(config-settings) \
|
||||
$(config-tables) \
|
||||
$(config-json) \
|
||||
$(config-tools) \
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),full)
|
||||
|
||||
config-y := \
|
||||
$(config-settings) \
|
||||
$(config-tables) \
|
||||
$(config-json) \
|
||||
$(config-tools) \
|
||||
$(config-extratools) \
|
||||
|
||||
endif
|
||||
|
||||
define ConfigVars
|
||||
$(subst $(space),,$(foreach opt,$(config-$(1)),CONFIG_$(opt)=$(1)
|
||||
))
|
||||
define Build/Compile
|
||||
$(MAKE_BATCTL_ENV) $(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_BATCTL_ARGS)
|
||||
endef
|
||||
|
||||
define batctl_config
|
||||
$(call ConfigVars,n)$(call ConfigVars,y)
|
||||
endef
|
||||
$(eval $(call shexport,batctl_config))
|
||||
|
||||
MAKE_FLAGS += $$$$$(call shvar,batctl_config)
|
||||
|
||||
define Package/batctl-tiny/install
|
||||
$(INSTALL_DIR) $(1)/usr/libexec
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-tiny
|
||||
define Build/Clean
|
||||
rm -rf $(BUILD_DIR)/$(PKG_NAME)/
|
||||
endef
|
||||
|
||||
define Package/batctl-default/install
|
||||
$(INSTALL_DIR) $(1)/usr/libexec
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-default
|
||||
define Package/batctl/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
define Package/batctl-full/install
|
||||
$(INSTALL_DIR) $(1)/usr/libexec
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-full
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,batctl-default))
|
||||
$(eval $(call BuildPackage,batctl-tiny))
|
||||
$(eval $(call BuildPackage,batctl-full))
|
||||
$(eval $(call BuildPackage,batctl))
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
From: Philipp Psurek <philipp.psurek@gmail.com>
|
||||
Date: Tue, 13 Jun 2017 10:25:59 +0200
|
||||
Subject: batctl: change PATH_BUFF_LEN to maximal possible value
|
||||
|
||||
The output of
|
||||
|
||||
snprintf(path_buff, PATH_BUFF_LEN, SYS_ROUTING_ALGO_FMT, iface_dir->d_name)
|
||||
|
||||
in sys.c can be between 34 and 289 bytes and should not write into a
|
||||
destination of size 200.
|
||||
|
||||
Signed-off-by: Philipp Psurek <philipp.psurek@gmail.com>
|
||||
[sw: use higher limits to be future-proof]
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/620226bf8cff30e6dd966c8fe922b2d4cddf843b
|
||||
|
||||
diff --git a/functions.c b/functions.c
|
||||
index abd588209337dcfa04be9aadbf4ba39bb46771bb..676012bb56f9f8aa757b4805e27d904181ee2d27 100644
|
||||
--- a/functions.c
|
||||
+++ b/functions.c
|
||||
@@ -59,7 +59,7 @@
|
||||
#include "debugfs.h"
|
||||
#include "netlink.h"
|
||||
|
||||
-#define PATH_BUFF_LEN 200
|
||||
+#define PATH_BUFF_LEN 400
|
||||
|
||||
static struct timespec start_time;
|
||||
static char *host_name;
|
||||
diff --git a/functions.h b/functions.h
|
||||
index 95cd6cf32b0c97cc36f7a81a7d8b126a0bbc389b..99e9085b4f392452d0e0b711dac334559408c1fb 100644
|
||||
--- a/functions.h
|
||||
+++ b/functions.h
|
||||
@@ -31,7 +31,7 @@
|
||||
#define ETH_STR_LEN 17
|
||||
#define BATMAN_ADV_TAG "batman-adv:"
|
||||
|
||||
-#define PATH_BUFF_LEN 200
|
||||
+#define PATH_BUFF_LEN 400
|
||||
|
||||
/* return time delta from start to end in milliseconds */
|
||||
void start_timer(void);
|
|
@ -0,0 +1,40 @@
|
|||
From: Philipp Psurek <philipp.psurek@gmail.com>
|
||||
Date: Tue, 13 Jun 2017 13:08:24 +0200
|
||||
Subject: batctl: suppress implicit-fallthrough compiler warning
|
||||
|
||||
GCC 7.1.0 complains about an intended fallthrough.
|
||||
“__attribute__ ((fallthrough))” in this part of code would suppress this
|
||||
warning. Because older GCC compiler don’t understand this statement attribute
|
||||
and because there is already a comment in the source containing
|
||||
“falls?[ \t-]*thr(ough|u)” we can suppress the warning with the
|
||||
“-Wimplicit-fallthrough=2” warning option. Unintended fallthroughs without a
|
||||
comment would trigger this warning again.
|
||||
|
||||
To avoid compiler recognition in the Makefile a simply change of the comment
|
||||
is sufficient to suppress the warning. For some reason only stand alone
|
||||
comments mentioned in [1] are recognized so the comment has to be split up into
|
||||
two parts.
|
||||
|
||||
[1] https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/Warning-Options.html#index-Wimplicit-fallthrough_003d
|
||||
|
||||
Signed-off-by: Philipp Psurek <philipp.psurek@gmail.com>
|
||||
[sw: Put the second comment part into a new line to avoid clutter]
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/50ee3c45feeda6d8c04ee127097badf99f78a26e
|
||||
|
||||
diff --git a/tp_meter.c b/tp_meter.c
|
||||
index f95b8391ff3426200697034f1087274ca9e5a9dd..ec0dc4802c638471ff3c38bd344e31c208b634a5 100644
|
||||
--- a/tp_meter.c
|
||||
+++ b/tp_meter.c
|
||||
@@ -498,8 +498,9 @@ int tp_meter(char *mesh_iface, int argc, char **argv)
|
||||
break;
|
||||
case BATADV_TP_REASON_CANCEL:
|
||||
printf("CANCEL received: test aborted\n");
|
||||
- /* fall through and print the partial result */
|
||||
+ /* fall through */
|
||||
case BATADV_TP_REASON_COMPLETE:
|
||||
+ /* print the partial result */
|
||||
if (result.test_time > 0) {
|
||||
throughput = result.total_bytes * 1000;
|
||||
throughput /= result.test_time;
|
|
@ -0,0 +1,30 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:35 +0100
|
||||
Subject: batctl: Print dummy value when localtime failed
|
||||
|
||||
localtime can return NULL when the local time could not be calculated.
|
||||
Accessing this NULL pointer is not allowed.
|
||||
|
||||
Fixes: 05f27bfcd302 ("add arp packets , change output")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/09dd2dc0b4945c83bd07ad4bce64062239d901fb
|
||||
|
||||
diff --git a/tcpdump.c b/tcpdump.c
|
||||
index 2125b66d0871c4a127425bfad0135a9f565cfb78..db9c46afecf3de94dbd4d9292df1fe0812fb8bfc 100644
|
||||
--- a/tcpdump.c
|
||||
+++ b/tcpdump.c
|
||||
@@ -103,7 +103,11 @@ static int print_time(void)
|
||||
gettimeofday(&tv, NULL);
|
||||
tm = localtime(&tv.tv_sec);
|
||||
|
||||
- printf("%02d:%02d:%02d.%06ld ", tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec);
|
||||
+ if (tm)
|
||||
+ printf("%02d:%02d:%02d.%06ld ", tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec);
|
||||
+ else
|
||||
+ printf("00:00:00.000000 ");
|
||||
+
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:36 +0100
|
||||
Subject: batctl: Handle failure during hash_iterator allocation
|
||||
|
||||
The iterator functions should not try to start the iteration when the
|
||||
iterator could not be allocated.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/aa316bf6d1b2cf0ab7189ed8620c17f5018d4d37
|
||||
|
||||
diff --git a/hash.c b/hash.c
|
||||
index 08d47b5b8f812d718f9463c548d73fbffb49b1b3..c6f735c64b573928441b41936646d195bc0da4bb 100644
|
||||
--- a/hash.c
|
||||
+++ b/hash.c
|
||||
@@ -120,6 +120,9 @@ struct hash_it_t *hash_iterate(struct hashtable_t *hash,
|
||||
|
||||
if (iter_in == NULL) {
|
||||
iter = debugMalloc(sizeof(struct hash_it_t), 301);
|
||||
+ if (!iter)
|
||||
+ return NULL;
|
||||
+
|
||||
iter->index = -1;
|
||||
iter->bucket = NULL;
|
||||
iter->prev_bucket = NULL;
|
|
@ -0,0 +1,53 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:37 +0100
|
||||
Subject: batctl: Handle allocation error for path_buff
|
||||
|
||||
Fixes: 5a1af99276b0 ("batctl: adapt batctl to new sysfs interface handling")
|
||||
Fixes: 306fcb4480c9 ("batctl: support for multiple mesh clouds")
|
||||
Fixes: af115c9acf44 ("batctl: support new gateway sysfs API")
|
||||
Fixes: 2c2cb260ad2e ("batctl: list supported and configured routing algorithms")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/3b52283a5f60d1c6ec11628d031e72f0a28a720f
|
||||
|
||||
diff --git a/sys.c b/sys.c
|
||||
index b52434072b34b949c73de8346f8c2dce615423a4..3047b5f6eebf26290f2d8c4840d52bb1bddc3e3f 100644
|
||||
--- a/sys.c
|
||||
+++ b/sys.c
|
||||
@@ -153,6 +153,11 @@ int handle_loglevel(char *mesh_iface, int argc, char **argv)
|
||||
}
|
||||
|
||||
path_buff = malloc(PATH_BUFF_LEN);
|
||||
+ if (!path_buff) {
|
||||
+ fprintf(stderr, "Error - could not allocate path buffer: out of memory ?\n");
|
||||
+ return EXIT_FAILURE;
|
||||
+ }
|
||||
+
|
||||
snprintf(path_buff, PATH_BUFF_LEN, SYS_BATIF_PATH_FMT, mesh_iface);
|
||||
|
||||
if (argc != 1) {
|
||||
@@ -253,6 +258,11 @@ int handle_sys_setting(char *mesh_iface, int setting, int argc, char **argv)
|
||||
|
||||
/* prepare the classic path */
|
||||
path_buff = malloc(PATH_BUFF_LEN);
|
||||
+ if (!path_buff) {
|
||||
+ fprintf(stderr, "Error - could not allocate path buffer: out of memory ?\n");
|
||||
+ return EXIT_FAILURE;
|
||||
+ }
|
||||
+
|
||||
snprintf(path_buff, PATH_BUFF_LEN, SYS_BATIF_PATH_FMT, mesh_iface);
|
||||
|
||||
/* if the specified interface is a VLAN then change the path to point
|
||||
@@ -325,6 +335,11 @@ int handle_gw_setting(char *mesh_iface, int argc, char **argv)
|
||||
}
|
||||
|
||||
path_buff = malloc(PATH_BUFF_LEN);
|
||||
+ if (!path_buff) {
|
||||
+ fprintf(stderr, "Error - could not allocate path buffer: out of memory ?\n");
|
||||
+ return EXIT_FAILURE;
|
||||
+ }
|
||||
+
|
||||
snprintf(path_buff, PATH_BUFF_LEN, SYS_BATIF_PATH_FMT, mesh_iface);
|
||||
|
||||
if (argc == 1) {
|
60
batctl/patches/0006-batctl-Handle-nlmsg_alloc-errors.patch
Normal file
60
batctl/patches/0006-batctl-Handle-nlmsg_alloc-errors.patch
Normal file
|
@ -0,0 +1,60 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:38 +0100
|
||||
Subject: batctl: Handle nlmsg_alloc errors
|
||||
|
||||
nlmsg_alloc may return NULL on errors. The processing has to be aborted
|
||||
when this happens.
|
||||
|
||||
Fixes: d8dd1ff1a0fe ("batctl: Use netlink to replace some of debugfs")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/27e9937635ffbfe33f7f3297aff911718b8deb56
|
||||
|
||||
diff --git a/netlink.c b/netlink.c
|
||||
index 5f4325b0bb6b4a41860a75bd0851e446c5af9a88..64afeedac46bf3eab14a1d89d7db4491fbef8d81 100644
|
||||
--- a/netlink.c
|
||||
+++ b/netlink.c
|
||||
@@ -302,6 +302,11 @@ static char *netlink_get_info(int ifindex, uint8_t nl_cmd, const char *header)
|
||||
return NULL;
|
||||
|
||||
msg = nlmsg_alloc();
|
||||
+ if (!msg) {
|
||||
+ nl_socket_free(sock);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, 0,
|
||||
BATADV_CMD_GET_MESH_INFO, 1);
|
||||
|
||||
@@ -399,6 +404,11 @@ int netlink_print_routing_algos(void)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
msg = nlmsg_alloc();
|
||||
+ if (!msg) {
|
||||
+ last_err = -ENOMEM;
|
||||
+ goto err_free_sock;
|
||||
+ }
|
||||
+
|
||||
genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, NLM_F_DUMP,
|
||||
BATADV_CMD_GET_ROUTING_ALGOS, 1);
|
||||
|
||||
@@ -415,6 +425,8 @@ int netlink_print_routing_algos(void)
|
||||
nl_cb_err(cb, NL_CB_CUSTOM, print_error, NULL);
|
||||
|
||||
nl_recvmsgs(sock, cb);
|
||||
+
|
||||
+err_free_sock:
|
||||
nl_socket_free(sock);
|
||||
|
||||
if (!last_err)
|
||||
@@ -1131,6 +1143,9 @@ static int netlink_print_common(char *mesh_iface, char *orig_iface,
|
||||
header);
|
||||
|
||||
msg = nlmsg_alloc();
|
||||
+ if (!msg)
|
||||
+ continue;
|
||||
+
|
||||
genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0,
|
||||
NLM_F_DUMP, nl_cmd, 1);
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:39 +0100
|
||||
Subject: batctl: Handle nl_socket_alloc errors
|
||||
|
||||
nl_socket_alloc may return NULL on errors. The processing has to be aborted
|
||||
when this happens.
|
||||
|
||||
Fixes: d8dd1ff1a0fe ("batctl: Use netlink to replace some of debugfs")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/bc6cd37e0d3ce08e3b89e3123ffa87dc55f24c09
|
||||
|
||||
diff --git a/netlink.c b/netlink.c
|
||||
index 64afeedac46bf3eab14a1d89d7db4491fbef8d81..107ca52a4866e25b7b04428d770a885ca4e826d2 100644
|
||||
--- a/netlink.c
|
||||
+++ b/netlink.c
|
||||
@@ -295,6 +295,9 @@ static char *netlink_get_info(int ifindex, uint8_t nl_cmd, const char *header)
|
||||
};
|
||||
|
||||
sock = nl_socket_alloc();
|
||||
+ if (!sock)
|
||||
+ return NULL;
|
||||
+
|
||||
genl_connect(sock);
|
||||
|
||||
family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
|
||||
@@ -397,6 +400,9 @@ int netlink_print_routing_algos(void)
|
||||
};
|
||||
|
||||
sock = nl_socket_alloc();
|
||||
+ if (!sock)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
genl_connect(sock);
|
||||
|
||||
family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
|
||||
@@ -1104,6 +1110,9 @@ static int netlink_print_common(char *mesh_iface, char *orig_iface,
|
||||
int family;
|
||||
|
||||
sock = nl_socket_alloc();
|
||||
+ if (!sock)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
genl_connect(sock);
|
||||
|
||||
family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
|
69
batctl/patches/0008-batctl-Handle-nl_cb_alloc-errors.patch
Normal file
69
batctl/patches/0008-batctl-Handle-nl_cb_alloc-errors.patch
Normal file
|
@ -0,0 +1,69 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:40 +0100
|
||||
Subject: batctl: Handle nl_cb_alloc errors
|
||||
|
||||
nl_cb_alloc may return NULL on errors. The processing has to be aborted
|
||||
when this happens.
|
||||
|
||||
Fixes: d8dd1ff1a0fe ("batctl: Use netlink to replace some of debugfs")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/0a14f8800dac67d706827e9be7745e2319f5412c
|
||||
|
||||
diff --git a/netlink.c b/netlink.c
|
||||
index 107ca52a4866e25b7b04428d770a885ca4e826d2..3eb66c9de30c21722bb1e348b055838ea14d18cf 100644
|
||||
--- a/netlink.c
|
||||
+++ b/netlink.c
|
||||
@@ -320,11 +320,15 @@ static char *netlink_get_info(int ifindex, uint8_t nl_cmd, const char *header)
|
||||
nlmsg_free(msg);
|
||||
|
||||
cb = nl_cb_alloc(NL_CB_DEFAULT);
|
||||
+ if (!cb)
|
||||
+ goto err_free_sock;
|
||||
+
|
||||
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, info_callback, &opts);
|
||||
nl_cb_err(cb, NL_CB_CUSTOM, print_error, NULL);
|
||||
|
||||
nl_recvmsgs(sock, cb);
|
||||
|
||||
+err_free_sock:
|
||||
nl_socket_free(sock);
|
||||
|
||||
return opts.remaining_header;
|
||||
@@ -425,6 +429,11 @@ int netlink_print_routing_algos(void)
|
||||
opts.remaining_header = strdup("Available routing algorithms:\n");
|
||||
|
||||
cb = nl_cb_alloc(NL_CB_DEFAULT);
|
||||
+ if (!cb) {
|
||||
+ last_err = -ENOMEM;
|
||||
+ goto err_free_sock;
|
||||
+ }
|
||||
+
|
||||
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, netlink_print_common_cb,
|
||||
&opts);
|
||||
nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, stop_callback, NULL);
|
||||
@@ -1134,9 +1143,14 @@ static int netlink_print_common(char *mesh_iface, char *orig_iface,
|
||||
}
|
||||
}
|
||||
|
||||
+ cb = nl_cb_alloc(NL_CB_DEFAULT);
|
||||
+ if (!cb) {
|
||||
+ last_err = -ENOMEM;
|
||||
+ goto err_free_sock;
|
||||
+ }
|
||||
+
|
||||
bat_hosts_init(read_opt);
|
||||
|
||||
- cb = nl_cb_alloc(NL_CB_DEFAULT);
|
||||
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, netlink_print_common_cb, &opts);
|
||||
nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, stop_callback, NULL);
|
||||
nl_cb_err(cb, NL_CB_CUSTOM, print_error, NULL);
|
||||
@@ -1181,6 +1195,7 @@ static int netlink_print_common(char *mesh_iface, char *orig_iface,
|
||||
|
||||
bat_hosts_free();
|
||||
|
||||
+err_free_sock:
|
||||
nl_socket_free(sock);
|
||||
|
||||
return last_err;
|
|
@ -0,0 +1,56 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:41 +0100
|
||||
Subject: batctl: Free nl_sock on genl_ctrl_resolve error
|
||||
|
||||
genl_ctrl_resolve may return NULL on errors. The code must then free the
|
||||
socket which was used to start the genl_ctrl_resolve and stop the function
|
||||
with an error code.
|
||||
|
||||
Fixes: d8dd1ff1a0fe ("batctl: Use netlink to replace some of debugfs")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/cdac2f843c616caaa2a0d3847aeec84c200c62d6
|
||||
|
||||
diff --git a/netlink.c b/netlink.c
|
||||
index 3eb66c9de30c21722bb1e348b055838ea14d18cf..ee58ce8bf16e224374940dddaff61f7b3c5aa4bb 100644
|
||||
--- a/netlink.c
|
||||
+++ b/netlink.c
|
||||
@@ -301,8 +301,10 @@ static char *netlink_get_info(int ifindex, uint8_t nl_cmd, const char *header)
|
||||
genl_connect(sock);
|
||||
|
||||
family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
|
||||
- if (family < 0)
|
||||
+ if (family < 0) {
|
||||
+ nl_socket_free(sock);
|
||||
return NULL;
|
||||
+ }
|
||||
|
||||
msg = nlmsg_alloc();
|
||||
if (!msg) {
|
||||
@@ -410,8 +412,10 @@ int netlink_print_routing_algos(void)
|
||||
genl_connect(sock);
|
||||
|
||||
family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
|
||||
- if (family < 0)
|
||||
- return -EOPNOTSUPP;
|
||||
+ if (family < 0) {
|
||||
+ last_err = -EOPNOTSUPP;
|
||||
+ goto err_free_sock;
|
||||
+ }
|
||||
|
||||
msg = nlmsg_alloc();
|
||||
if (!msg) {
|
||||
@@ -1125,8 +1129,10 @@ static int netlink_print_common(char *mesh_iface, char *orig_iface,
|
||||
genl_connect(sock);
|
||||
|
||||
family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
|
||||
- if (family < 0)
|
||||
- return -EOPNOTSUPP;
|
||||
+ if (family < 0) {
|
||||
+ last_err = -EOPNOTSUPP;
|
||||
+ goto err_free_sock;
|
||||
+ }
|
||||
|
||||
ifindex = if_nametoindex(mesh_iface);
|
||||
if (!ifindex) {
|
|
@ -0,0 +1,37 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:42 +0100
|
||||
Subject: batctl: Free nl_sock when if_nametoindex failed
|
||||
|
||||
The if_nametoindex can return an error. The code must then free the
|
||||
previously allocated nl_sock and stop the function with an error code.
|
||||
|
||||
Fixes: d8dd1ff1a0fe ("batctl: Use netlink to replace some of debugfs")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/4361841bf76ecd27dcfca6edc30c63b05854d415
|
||||
|
||||
diff --git a/netlink.c b/netlink.c
|
||||
index ee58ce8bf16e224374940dddaff61f7b3c5aa4bb..88a5c95c67989a812231aec7352eecfc4e38c70d 100644
|
||||
--- a/netlink.c
|
||||
+++ b/netlink.c
|
||||
@@ -1137,7 +1137,8 @@ static int netlink_print_common(char *mesh_iface, char *orig_iface,
|
||||
ifindex = if_nametoindex(mesh_iface);
|
||||
if (!ifindex) {
|
||||
fprintf(stderr, "Interface %s is unknown\n", mesh_iface);
|
||||
- return -ENODEV;
|
||||
+ last_err = -ENODEV;
|
||||
+ goto err_free_sock;
|
||||
}
|
||||
|
||||
if (orig_iface) {
|
||||
@@ -1145,7 +1146,8 @@ static int netlink_print_common(char *mesh_iface, char *orig_iface,
|
||||
if (!hardifindex) {
|
||||
fprintf(stderr, "Interface %s is unknown\n",
|
||||
orig_iface);
|
||||
- return -ENODEV;
|
||||
+ last_err = -ENODEV;
|
||||
+ goto err_free_sock;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:43 +0100
|
||||
Subject: batctl: tcpdump: Fix types for for TT v1
|
||||
|
||||
The num_entry and num_vlan variables are accessed (printed) as u16
|
||||
variables and not like integers. They should therefore also be stored like
|
||||
that.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/15a1335cadacc7c3bb4723a30617d123a961a311
|
||||
|
||||
diff --git a/tcpdump.c b/tcpdump.c
|
||||
index db9c46afecf3de94dbd4d9292df1fe0812fb8bfc..da5541ea9f5f9f9b6fd0838d2242daa22d41a28d 100644
|
||||
--- a/tcpdump.c
|
||||
+++ b/tcpdump.c
|
||||
@@ -157,7 +157,8 @@ static void batctl_tvlv_parse_tt_v1(void *buff, ssize_t buff_len)
|
||||
{
|
||||
struct batadv_tvlv_tt_data *tvlv = buff;
|
||||
struct batadv_tvlv_tt_vlan_data *vlan;
|
||||
- int i, num_vlan, num_entry;
|
||||
+ int i;
|
||||
+ unsigned short num_vlan, num_entry;
|
||||
const char *type;
|
||||
size_t vlan_len;
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Thu, 23 Nov 2017 15:04:44 +0100
|
||||
Subject: batctl: Simplify concatenation of pathnames
|
||||
|
||||
The combination of strncpy and strncat is hard to read and it is rather
|
||||
easy to introduce some kind of problems when using that. The usage of
|
||||
snprintf simplifies it slightly.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/cfaec23c5f6f2cf649f3e0673b2e0c61bc01969f
|
||||
|
||||
diff --git a/bat-hosts.c b/bat-hosts.c
|
||||
index a4add34bbaf8c34f8357ba8d1583218fdaf4df93..66e8f05bd2277e5560be77a26b97245223fa72aa 100644
|
||||
--- a/bat-hosts.c
|
||||
+++ b/bat-hosts.c
|
||||
@@ -194,9 +194,7 @@ void bat_hosts_init(int read_opt)
|
||||
if (!homedir)
|
||||
continue;
|
||||
|
||||
- strncpy(confdir, homedir, CONF_DIR_LEN);
|
||||
- confdir[CONF_DIR_LEN - 1] = '\0';
|
||||
- strncat(confdir, &bat_hosts_path[i][1], CONF_DIR_LEN - strlen(confdir) - 1);
|
||||
+ snprintf(confdir, CONF_DIR_LEN, "%s%s", homedir, &bat_hosts_path[i][1]);
|
||||
} else {
|
||||
strncpy(confdir, bat_hosts_path[i], CONF_DIR_LEN);
|
||||
confdir[CONF_DIR_LEN - 1] = '\0';
|
||||
diff --git a/functions.c b/functions.c
|
||||
index 676012bb56f9f8aa757b4805e27d904181ee2d27..1c96e6241d01b83a136ff135bee8dd780629f7aa 100644
|
||||
--- a/functions.c
|
||||
+++ b/functions.c
|
||||
@@ -208,9 +208,7 @@ int read_file(const char *dir, const char *fname, int read_opt,
|
||||
if (read_opt & USE_BAT_HOSTS)
|
||||
bat_hosts_init(read_opt);
|
||||
|
||||
- strncpy(full_path, dir, sizeof(full_path));
|
||||
- full_path[sizeof(full_path) - 1] = '\0';
|
||||
- strncat(full_path, fname, sizeof(full_path) - strlen(full_path) - 1);
|
||||
+ snprintf(full_path, sizeof(full_path), "%s%s", dir, fname);
|
||||
|
||||
open:
|
||||
line = 0;
|
||||
@@ -349,9 +347,7 @@ int write_file(const char *dir, const char *fname, const char *arg1,
|
||||
char full_path[500];
|
||||
ssize_t write_len;
|
||||
|
||||
- strncpy(full_path, dir, sizeof(full_path));
|
||||
- full_path[sizeof(full_path) - 1] = '\0';
|
||||
- strncat(full_path, fname, sizeof(full_path) - strlen(full_path) - 1);
|
||||
+ snprintf(full_path, sizeof(full_path), "%s%s", dir, fname);
|
||||
|
||||
fd = open(full_path, O_WRONLY);
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 2 Dec 2017 08:45:59 +0100
|
||||
Subject: batctl: Handle allocation error in vlan_get_link_parse
|
||||
|
||||
The malloc could fail and return NULL. In this case, the processing of the
|
||||
current interface index has to be stopped to avoid writing to NULL (which
|
||||
would cause a segfault).
|
||||
|
||||
Fixes: d29288fe0583 ("batctl: implement vlan-to-link helper functions")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/2ea390ce9bdda39d3c15bd9470009f56f42d5ed9
|
||||
|
||||
diff --git a/functions.c b/functions.c
|
||||
index 1c96e6241d01b83a136ff135bee8dd780629f7aa..f91f26f4045766474d5dc109d76e20afd91a7791 100644
|
||||
--- a/functions.c
|
||||
+++ b/functions.c
|
||||
@@ -812,6 +812,9 @@ static int vlan_get_link_parse(struct nl_msg *msg, void *arg)
|
||||
idx = *(int *)nla_data(tb[IFLA_LINK]);
|
||||
free(nl_arg->iface);
|
||||
nl_arg->iface = malloc(IFNAMSIZ + 1);
|
||||
+ if (!nl_arg->iface)
|
||||
+ goto err;
|
||||
+
|
||||
if (!if_indextoname(idx, nl_arg->iface))
|
||||
goto err;
|
||||
|
|
@ -1,88 +1,35 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2007-2019 B.A.T.M.A.N. contributors:
|
||||
#
|
||||
# Marek Lindner, Simon Wunderlich
|
||||
|
||||
#
|
||||
# B.A.T.M.A.N meshing protocol
|
||||
#
|
||||
config KMOD_BATMAN_ADV_DEBUG_LOG
|
||||
bool "enable verbose debug logging"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default n
|
||||
|
||||
config BATMAN_ADV_BATMAN_V
|
||||
bool "B.A.T.M.A.N. V protocol"
|
||||
config KMOD_BATMAN_ADV_BLA
|
||||
bool "enable bridge loop avoidance"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables the B.A.T.M.A.N. V protocol, the successor
|
||||
of the currently used B.A.T.M.A.N. IV protocol. The main
|
||||
changes include splitting of the OGM protocol into a neighbor
|
||||
discovery protocol (Echo Location Protocol, ELP) and a new OGM
|
||||
Protocol OGMv2 for flooding protocol information through the
|
||||
network, as well as a throughput based metric.
|
||||
B.A.T.M.A.N. V is currently considered experimental and not
|
||||
compatible to B.A.T.M.A.N. IV networks.
|
||||
|
||||
config BATMAN_ADV_BLA
|
||||
bool "Bridge Loop Avoidance"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
select PACKAGE_kmod-lib-crc16
|
||||
default y
|
||||
help
|
||||
This option enables BLA (Bridge Loop Avoidance), a mechanism
|
||||
to avoid Ethernet frames looping when mesh nodes are connected
|
||||
to both the same LAN and the same mesh. If you will never use
|
||||
more than one mesh node in the same LAN, you can safely remove
|
||||
this feature and save some space.
|
||||
|
||||
config BATMAN_ADV_DAT
|
||||
bool "Distributed ARP Table"
|
||||
config KMOD_BATMAN_ADV_DAT
|
||||
bool "enable distributed arp table"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables DAT (Distributed ARP Table), a DHT based
|
||||
mechanism that increases ARP reliability on sparse wireless
|
||||
mesh networks. If you think that your network does not need
|
||||
this option you can safely remove it and save some space.
|
||||
|
||||
config BATMAN_ADV_NC
|
||||
bool "Network Coding"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
help
|
||||
This option enables network coding, a mechanism that aims to
|
||||
increase the overall network throughput by fusing multiple
|
||||
packets in one transmission.
|
||||
Note that interfaces controlled by batman-adv must be manually
|
||||
configured to have promiscuous mode enabled in order to make
|
||||
network coding work.
|
||||
If you think that your network does not need this feature you
|
||||
can safely disable it and save some space.
|
||||
|
||||
config BATMAN_ADV_MCAST
|
||||
bool "Multicast optimisation"
|
||||
config KMOD_BATMAN_ADV_DEBUGFS
|
||||
bool "enable debugfs support"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables the multicast optimisation which aims to
|
||||
reduce the air overhead while improving the reliability of
|
||||
multicast messages.
|
||||
|
||||
config BATMAN_ADV_DEBUG
|
||||
bool "B.A.T.M.A.N. debugging"
|
||||
config KMOD_BATMAN_ADV_MCAST
|
||||
bool "enable multicast transmission optimization"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
help
|
||||
This is an option for use by developers; most people should
|
||||
say N here. This enables compilation of support for
|
||||
outputting debugging information to the debugfs log or tracing
|
||||
buffer. The output is controlled via the batadv netdev specific
|
||||
log_level setting.
|
||||
default y
|
||||
|
||||
config BATMAN_ADV_TRACING
|
||||
bool "B.A.T.M.A.N. tracing support"
|
||||
config KMOD_BATMAN_ADV_NC
|
||||
bool "enable network coding [requires promisc mode support]"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
select KERNEL_FTRACE
|
||||
select KERNEL_ENABLE_DEFAULT_TRACERS
|
||||
help
|
||||
This is an option for use by developers; most people should
|
||||
say N here. Select this option to gather traces like the debug
|
||||
messages using the generic tracing infrastructure of the kernel.
|
||||
BATMAN_ADV_DEBUG must also be selected to get trace events for
|
||||
batadv_dbg.
|
||||
default n
|
||||
|
||||
config KMOD_BATMAN_ADV_BATMAN_V
|
||||
bool "enable batman v routing algorithm"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
|
|
|
@ -1,52 +1,41 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Copyright (C) 2010 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
# $Id: Makefile 5624 2006-11-23 00:29:07Z nbd $
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=batman-adv
|
||||
PKG_VERSION:=2024.0
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_VERSION:=2016.5
|
||||
PKG_RELEASE:=16
|
||||
PKG_MD5SUM:=6717a933a08dd2a01b00df30cb9f16a8
|
||||
PKG_HASH:=d0a0fc90c4f410b57d043215e253bb0b855efa5edbe165d87c17bfdcfafd0db7
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_HASH:=61110697b5799f646a2a82a4dcf97faed4bb12a7cc43bf4683d2c4de4f6b40e7
|
||||
PKG_EXTMOD_SUBDIRS:=net/batman-adv
|
||||
|
||||
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
PKG_LICENSE:=GPL-2.0-only MIT
|
||||
PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_BATMAN_ADV_BATMAN_V \
|
||||
CONFIG_BATMAN_ADV_BLA \
|
||||
CONFIG_BATMAN_ADV_DAT \
|
||||
CONFIG_BATMAN_ADV_NC \
|
||||
CONFIG_BATMAN_ADV_MCAST \
|
||||
CONFIG_BATMAN_ADV_DEBUG \
|
||||
CONFIG_BATMAN_ADV_TRACING
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define KernelPackage/batman-adv
|
||||
SUBMENU:=Network Support
|
||||
TITLE:=B.A.T.M.A.N. Adv
|
||||
URL:=https://www.open-mesh.org/
|
||||
DEPENDS:=+BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-lib-crc32c +kmod-cfg80211 +batctl
|
||||
MAINTAINER:=Marek Lindner <mareklindner@neomailbox.ch>
|
||||
SUBMENU:=Network Support
|
||||
DEPENDS:=+KMOD_BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-crypto-crc32c +kmod-lib-crc32c +kmod-cfg80211
|
||||
TITLE:=B.A.T.M.A.N. Adv
|
||||
FILES:=$(PKG_BUILD_DIR)/net/batman-adv/batman-adv.$(LINUX_KMOD_SUFFIX)
|
||||
AUTOLOAD:=$(call AutoProbe,batman-adv)
|
||||
AUTOLOAD:=$(call AutoLoad,50,cfg80211 batman-adv)
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/description
|
||||
B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is
|
||||
a routing protocol for multi-hop ad-hoc mesh networks. The
|
||||
networks may be wired or wireless. See
|
||||
https://www.open-mesh.org/ for more information and user space
|
||||
tools. This package builds version $(PKG_VERSION) of the kernel
|
||||
module.
|
||||
B.A.T.M.A.N. advanced is a kernel module which allows to
|
||||
build layer 2 mesh networks. This package builds
|
||||
version $(PKG_VERSION) of the kernel module.
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/config
|
||||
|
@ -59,43 +48,61 @@ endef
|
|||
|
||||
PKG_EXTRA_KCONFIG:= \
|
||||
CONFIG_BATMAN_ADV=m \
|
||||
CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_BATMAN_ADV_DEBUG),y,n) \
|
||||
CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_BATMAN_ADV_BLA),y,n) \
|
||||
CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_BATMAN_ADV_DAT),y,n) \
|
||||
CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_BATMAN_ADV_MCAST),y,n) \
|
||||
CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_BATMAN_ADV_NC),y,n) \
|
||||
CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_BATMAN_ADV_BATMAN_V),y,n) \
|
||||
CONFIG_BATMAN_ADV_TRACING=$(if $(CONFIG_BATMAN_ADV_TRACING),y,n) \
|
||||
CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUG_LOG),y,n) \
|
||||
CONFIG_BATMAN_ADV_DEBUGFS=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUGFS),y,n) \
|
||||
CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_KMOD_BATMAN_ADV_BLA),y,n) \
|
||||
CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_KMOD_BATMAN_ADV_DAT),y,n) \
|
||||
CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),y,n) \
|
||||
CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_KMOD_BATMAN_ADV_NC),y,n) \
|
||||
CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_KMOD_BATMAN_ADV_BATMAN_V),y,n) \
|
||||
|
||||
PKG_EXTRA_CFLAGS:= \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(PKG_EXTRA_KCONFIG)))) \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(PKG_EXTRA_KCONFIG)))) \
|
||||
|
||||
NOSTDINC_FLAGS = \
|
||||
$(KERNEL_NOSTDINC_FLAGS) \
|
||||
-I$(PKG_BUILD_DIR)/net/batman-adv \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211-backport \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211 \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211/uapi \
|
||||
-I$(PKG_BUILD_DIR)/include/ \
|
||||
-include backport/autoconf.h \
|
||||
-include backport/backport.h \
|
||||
-include $(PKG_BUILD_DIR)/compat-hacks.h \
|
||||
-DBATADV_SOURCE_VERSION=\\\"$(PKG_VERSION)-openwrt-$(PKG_RELEASE)\\\"
|
||||
-include $(PKG_BUILD_DIR)/compat-hacks.h
|
||||
|
||||
COMPAT_SOURCES = \
|
||||
$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/core/skbuff.o,) \
|
||||
$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/ipv4/igmp.o,) \
|
||||
$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/ipv6/mcast_snoop.o,) \
|
||||
|
||||
define Build/Compile
|
||||
+env "batman-adv-y=$(COMPAT_SOURCES)" \
|
||||
$(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \
|
||||
$(KERNEL_MAKE_FLAGS) \
|
||||
M="$(PKG_BUILD_DIR)/net/batman-adv" \
|
||||
ARCH="$(LINUX_KARCH)" \
|
||||
CROSS_COMPILE="$(TARGET_CROSS)" \
|
||||
SUBDIRS="$(PKG_BUILD_DIR)/net/batman-adv" \
|
||||
$(PKG_EXTRA_KCONFIG) \
|
||||
EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS)" \
|
||||
NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \
|
||||
modules
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
$(CP) ./files/compat-hacks.h $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
|
||||
define Build/Clean
|
||||
rm -rf $(BUILD_DIR)/$(PKG_NAME)/
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/install
|
||||
$(CP) ./files/. $(1)/
|
||||
$(INSTALL_DIR) $(1)/etc/config $(1)/etc/hotplug.d/net $(1)/etc/hotplug.d/iface $(1)/lib/batman-adv $(1)/usr/sbin $(1)/lib/netifd/proto
|
||||
$(INSTALL_DATA) ./files/etc/config/batman-adv $(1)/etc/config
|
||||
$(INSTALL_DATA) ./files/lib/batman-adv/config.sh $(1)/lib/batman-adv
|
||||
$(INSTALL_BIN) ./files/etc/hotplug.d/net/99-batman-adv $(1)/etc/hotplug.d/net
|
||||
$(INSTALL_BIN) ./files/lib/netifd/proto/batadv.sh $(1)/lib/netifd/proto
|
||||
$(INSTALL_BIN) ./files/lib/netifd/proto/batadv_vlan.sh $(1)/lib/netifd/proto
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,batman-adv))
|
||||
|
|
254
batman-adv/files/compat-hacks.h
Normal file
254
batman-adv/files/compat-hacks.h
Normal file
|
@ -0,0 +1,254 @@
|
|||
/* Please avoid adding hacks here - instead add it to mac80211/backports.git */
|
||||
|
||||
#undef CONFIG_MODULE_STRIPPED
|
||||
|
||||
#include <linux/version.h> /* LINUX_VERSION_CODE */
|
||||
#include <linux/types.h>
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
|
||||
|
||||
#define dev_get_iflink(_net_dev) ((_net_dev)->iflink)
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 1, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info) ({\
|
||||
BUILD_BUG_ON(upper_priv != NULL); \
|
||||
BUILD_BUG_ON(upper_info != NULL); \
|
||||
netdev_set_master(dev, upper_dev); \
|
||||
})
|
||||
|
||||
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info) ({\
|
||||
BUILD_BUG_ON(upper_priv != NULL); \
|
||||
BUILD_BUG_ON(upper_info != NULL); \
|
||||
netdev_master_upper_dev_link(dev, upper_dev); \
|
||||
})
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 5, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)
|
||||
|
||||
struct sk_buff *skb_checksum_trimmed(struct sk_buff *skb,
|
||||
unsigned int transport_len,
|
||||
__sum16(*skb_chkf)(struct sk_buff *skb));
|
||||
|
||||
int ip_mc_check_igmp(struct sk_buff *skb, struct sk_buff **skb_trimmed);
|
||||
|
||||
int ipv6_mc_check_mld(struct sk_buff *skb, struct sk_buff **skb_trimmed);
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 2, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
|
||||
|
||||
#define IFF_NO_QUEUE 0; dev->tx_queue_len = 0
|
||||
|
||||
static inline bool hlist_fake(struct hlist_node *h)
|
||||
{
|
||||
return h->pprev == &h->next;
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 3, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
|
||||
|
||||
#include <linux/ethtool.h>
|
||||
|
||||
#define ethtool_link_ksettings batadv_ethtool_link_ksettings
|
||||
|
||||
struct batadv_ethtool_link_ksettings {
|
||||
struct {
|
||||
__u32 speed;
|
||||
__u8 duplex;
|
||||
} base;
|
||||
};
|
||||
|
||||
#define __ethtool_get_link_ksettings(__dev, __link_settings) \
|
||||
batadv_ethtool_get_link_ksettings(__dev, __link_settings)
|
||||
|
||||
static inline int
|
||||
batadv_ethtool_get_link_ksettings(struct net_device *dev,
|
||||
struct ethtool_link_ksettings *link_ksettings)
|
||||
{
|
||||
struct ethtool_cmd cmd;
|
||||
int ret;
|
||||
|
||||
memset(&cmd, 0, sizeof(cmd));
|
||||
ret = __ethtool_get_settings(dev, &cmd);
|
||||
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
link_ksettings->base.duplex = cmd.duplex;
|
||||
link_ksettings->base.speed = ethtool_cmd_speed(&cmd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 6, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
|
||||
|
||||
#define netif_trans_update batadv_netif_trans_update
|
||||
static inline void batadv_netif_trans_update(struct net_device *dev)
|
||||
{
|
||||
dev->trans_start = jiffies;
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 7, 0) */
|
||||
|
||||
|
||||
#include_next <linux/netlink.h>
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
|
||||
|
||||
#include_next <net/netlink.h>
|
||||
|
||||
static inline bool batadv_nla_need_padding_for_64bit(struct sk_buff *skb);
|
||||
|
||||
static inline int batadv_nla_align_64bit(struct sk_buff *skb, int padattr)
|
||||
{
|
||||
if (batadv_nla_need_padding_for_64bit(skb) &&
|
||||
!nla_reserve(skb, padattr, 0))
|
||||
return -EMSGSIZE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct nlattr *batadv__nla_reserve_64bit(struct sk_buff *skb,
|
||||
int attrtype,
|
||||
int attrlen, int padattr)
|
||||
{
|
||||
if (batadv_nla_need_padding_for_64bit(skb))
|
||||
batadv_nla_align_64bit(skb, padattr);
|
||||
|
||||
return __nla_reserve(skb, attrtype, attrlen);
|
||||
}
|
||||
|
||||
static inline void batadv__nla_put_64bit(struct sk_buff *skb, int attrtype,
|
||||
int attrlen, const void *data,
|
||||
int padattr)
|
||||
{
|
||||
struct nlattr *nla;
|
||||
|
||||
nla = batadv__nla_reserve_64bit(skb, attrtype, attrlen, padattr);
|
||||
memcpy(nla_data(nla), data, attrlen);
|
||||
}
|
||||
|
||||
static inline bool batadv_nla_need_padding_for_64bit(struct sk_buff *skb)
|
||||
{
|
||||
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
/* The nlattr header is 4 bytes in size, that's why we test
|
||||
* if the skb->data _is_ aligned. A NOP attribute, plus
|
||||
* nlattr header for next attribute, will make nla_data()
|
||||
* 8-byte aligned.
|
||||
*/
|
||||
if (IS_ALIGNED((unsigned long)skb_tail_pointer(skb), 8))
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int batadv_nla_total_size_64bit(int payload)
|
||||
{
|
||||
return NLA_ALIGN(nla_attr_size(payload))
|
||||
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
+ NLA_ALIGN(nla_attr_size(0))
|
||||
#endif
|
||||
;
|
||||
}
|
||||
|
||||
static inline int batadv_nla_put_64bit(struct sk_buff *skb, int attrtype,
|
||||
int attrlen, const void *data,
|
||||
int padattr)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
if (batadv_nla_need_padding_for_64bit(skb))
|
||||
len = batadv_nla_total_size_64bit(attrlen);
|
||||
else
|
||||
len = nla_total_size(attrlen);
|
||||
if (unlikely(skb_tailroom(skb) < len))
|
||||
return -EMSGSIZE;
|
||||
|
||||
batadv__nla_put_64bit(skb, attrtype, attrlen, data, padattr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define nla_put_u64_64bit(_skb, _attrtype, _value, _padattr) \
|
||||
batadv_nla_put_u64_64bit(_skb, _attrtype, _value, _padattr)
|
||||
static inline int batadv_nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
|
||||
u64 value, int padattr)
|
||||
{
|
||||
return batadv_nla_put_64bit(skb, attrtype, sizeof(u64), &value,
|
||||
padattr);
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 7, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0)
|
||||
|
||||
static inline void *batadv_skb_put(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
return (void *)skb_put(skb, len);
|
||||
}
|
||||
#define skb_put batadv_skb_put
|
||||
|
||||
static inline void *skb_put_zero(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
void *tmp = skb_put(skb, len);
|
||||
|
||||
memset(tmp, 0, len);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
static inline void *skb_put_data(struct sk_buff *skb, const void *data,
|
||||
unsigned int len)
|
||||
{
|
||||
void *tmp = skb_put(skb, len);
|
||||
|
||||
memcpy(tmp, data, len);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 13, 0) */
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
|
||||
|
||||
#include_next <linux/cache.h>
|
||||
|
||||
/* hack for netlink.c which marked the family ops as ro */
|
||||
#ifdef __ro_after_init
|
||||
#undef __ro_after_init
|
||||
#endif
|
||||
#define __ro_after_init
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 10, 0) */
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 18, 0)
|
||||
|
||||
#include <net/cfg80211.h>
|
||||
|
||||
/* cfg80211 fix: https://patchwork.kernel.org/patch/10449857/ */
|
||||
static inline int batadv_cfg80211_get_station(struct net_device *dev,
|
||||
const u8 *mac_addr,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
memset(sinfo, 0, sizeof(*sinfo));
|
||||
return cfg80211_get_station(dev, mac_addr, sinfo);
|
||||
}
|
||||
|
||||
#define cfg80211_get_station(dev, mac_addr, sinfo) \
|
||||
batadv_cfg80211_get_station(dev, mac_addr, sinfo)
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 18, 0) */
|
21
batman-adv/files/etc/config/batman-adv
Normal file
21
batman-adv/files/etc/config/batman-adv
Normal file
|
@ -0,0 +1,21 @@
|
|||
|
||||
config 'mesh' 'bat0'
|
||||
option 'aggregated_ogms'
|
||||
option 'ap_isolation'
|
||||
option 'bonding'
|
||||
option 'fragmentation'
|
||||
option 'gw_bandwidth'
|
||||
option 'gw_mode'
|
||||
option 'gw_sel_class'
|
||||
option 'log_level'
|
||||
option 'orig_interval'
|
||||
option 'bridge_loop_avoidance'
|
||||
option 'distributed_arp_table'
|
||||
option 'multicast_mode'
|
||||
option 'network_coding'
|
||||
option 'hop_penalty'
|
||||
option 'isolation_mark'
|
||||
|
||||
# yet another batX instance
|
||||
# config 'mesh' 'bat5'
|
||||
# option 'interfaces' 'second_mesh'
|
12
batman-adv/files/etc/hotplug.d/net/99-batman-adv
Normal file
12
batman-adv/files/etc/hotplug.d/net/99-batman-adv
Normal file
|
@ -0,0 +1,12 @@
|
|||
#!/bin/sh
|
||||
|
||||
. /lib/batman-adv/config.sh
|
||||
|
||||
bat_load_module
|
||||
config_load batman-adv
|
||||
|
||||
case "$ACTION" in
|
||||
add)
|
||||
[ -d /sys/class/net/$INTERFACE/mesh/ ] && bat_config "$INTERFACE"
|
||||
;;
|
||||
esac
|
|
@ -1,97 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# This UCI-Defaults script will split the batadv proto network interfaces
|
||||
# in batadv_hardif and batadv proto. The configuration options from
|
||||
# /etc/config/batman-adv will be moved to the latter.
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
proto_batadv_to_batadv_hardif() {
|
||||
local section="$1"
|
||||
local proto
|
||||
local mesh
|
||||
local routing_algo
|
||||
|
||||
config_get proto "${section}" proto
|
||||
config_get mesh "${section}" mesh
|
||||
config_get routing_algo "${section}" routing_algo
|
||||
|
||||
if [ -z "$mesh" -o "${proto}" != "batadv" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
uci set network."${section}".proto="batadv_hardif"
|
||||
uci rename network."${section}".mesh="master"
|
||||
uci delete network."${section}".routing_algo
|
||||
|
||||
# create new section or adjust existing one
|
||||
uci set network."${mesh}"=interface
|
||||
uci set network."${mesh}".proto=batadv
|
||||
[ -n "${routing_algo}" ] && uci set network."${mesh}".routing_algo="${routing_algo}"
|
||||
}
|
||||
|
||||
mv_batadv_config_section() {
|
||||
local section="$1"
|
||||
local aggregated_ogms
|
||||
local ap_isolation
|
||||
local bonding
|
||||
local bridge_loop_avoidance
|
||||
local distributed_arp_table
|
||||
local fragmentation
|
||||
local gw_bandwidth
|
||||
local gw_mode
|
||||
local gw_sel_class
|
||||
local hop_penalty
|
||||
local isolation_mark
|
||||
local log_level
|
||||
local multicast_mode
|
||||
local network_coding
|
||||
local orig_interval
|
||||
|
||||
config_get aggregated_ogms "${section}" aggregated_ogms
|
||||
config_get ap_isolation "${section}" ap_isolation
|
||||
config_get bonding "${section}" bonding
|
||||
config_get bridge_loop_avoidance "${section}" bridge_loop_avoidance
|
||||
config_get distributed_arp_table "${section}" distributed_arp_table
|
||||
config_get fragmentation "${section}" fragmentation
|
||||
config_get gw_bandwidth "${section}" gw_bandwidth
|
||||
config_get gw_mode "${section}" gw_mode
|
||||
config_get gw_sel_class "${section}" gw_sel_class
|
||||
config_get hop_penalty "${section}" hop_penalty
|
||||
config_get isolation_mark "${section}" isolation_mark
|
||||
config_get log_level "${section}" log_level
|
||||
config_get multicast_mode "${section}" multicast_mode
|
||||
config_get network_coding "${section}" network_coding
|
||||
config_get orig_interval "${section}" orig_interval
|
||||
|
||||
# update section in case it exists
|
||||
[ -n "${aggregated_ogms}" ] && uci set network."${section}".aggregated_ogms="${aggregated_ogms}"
|
||||
[ -n "${ap_isolation}" ] && uci set network."${section}".ap_isolation="${ap_isolation}"
|
||||
[ -n "${bonding}" ] && uci set network."${section}".bonding="${bonding}"
|
||||
[ -n "${bridge_loop_avoidance}" ] && uci set network."${section}".bridge_loop_avoidance="${bridge_loop_avoidance}"
|
||||
[ -n "${distributed_arp_table}" ] && uci set network."${section}".distributed_arp_table="${distributed_arp_table}"
|
||||
[ -n "${fragmentation}" ] && uci set network."${section}".fragmentation="${fragmentation}"
|
||||
[ -n "${gw_bandwidth}" ] && uci set network."${section}".gw_bandwidth="${gw_bandwidth}"
|
||||
[ -n "${gw_mode}" ] && uci set network."${section}".gw_mode="${gw_mode}"
|
||||
[ -n "${gw_sel_class}" ] && uci set network."${section}".gw_sel_class="${gw_sel_class}"
|
||||
[ -n "${hop_penalty}" ] && uci set network."${section}".hop_penalty="${hop_penalty}"
|
||||
[ -n "${isolation_mark}" ] && uci set network."${section}".isolation_mark="${isolation_mark}"
|
||||
[ -n "${log_level}" ] && uci set network."${section}".log_level="${log_level}"
|
||||
[ -n "${multicast_mode}" ] && uci set network."${section}".multicast_mode="${multicast_mode}"
|
||||
[ -n "${network_coding}" ] && uci set network."${section}".network_coding="${network_coding}"
|
||||
[ -n "${orig_interval}" ] && uci set network."${section}".orig_interval="${orig_interval}"
|
||||
}
|
||||
|
||||
if [ -f /etc/config/batman-adv ]; then
|
||||
config_load network
|
||||
config_foreach proto_batadv_to_batadv_hardif 'interface'
|
||||
uci commit network
|
||||
|
||||
config_load batman-adv
|
||||
config_foreach mv_batadv_config_section 'mesh'
|
||||
uci commit network
|
||||
|
||||
rm -f /etc/config/batman-adv
|
||||
fi
|
||||
|
||||
exit 0
|
51
batman-adv/files/lib/batman-adv/config.sh
Normal file
51
batman-adv/files/lib/batman-adv/config.sh
Normal file
|
@ -0,0 +1,51 @@
|
|||
#!/bin/sh
|
||||
|
||||
bat_load_module()
|
||||
{
|
||||
[ -d "/sys/module/batman_adv/" ] && return
|
||||
|
||||
. /lib/functions.sh
|
||||
load_modules /etc/modules.d/*-crc16 /etc/modules.d/*-crypto* /etc/modules.d/*-lib-crc* /etc/modules.d/*-batman-adv*
|
||||
}
|
||||
|
||||
bat_config()
|
||||
{
|
||||
local mesh="$1"
|
||||
local aggregated_ogms ap_isolation bonding bridge_loop_avoidance distributed_arp_table fragmentation
|
||||
local gw_bandwidth gw_mode gw_sel_class isolation_mark hop_penalty multicast_mode network_coding log_level
|
||||
local orig_interval
|
||||
|
||||
config_get aggregated_ogms "$mesh" aggregated_ogms
|
||||
config_get ap_isolation "$mesh" ap_isolation
|
||||
config_get bonding "$mesh" bonding
|
||||
config_get bridge_loop_avoidance "$mesh" bridge_loop_avoidance
|
||||
config_get distributed_arp_table "$mesh" distributed_arp_table
|
||||
config_get fragmentation "$mesh" fragmentation
|
||||
config_get gw_bandwidth "$mesh" gw_bandwidth
|
||||
config_get gw_mode "$mesh" gw_mode
|
||||
config_get gw_sel_class "$mesh" gw_sel_class
|
||||
config_get hop_penalty "$mesh" hop_penalty
|
||||
config_get isolation_mark "$mesh" isolation_mark
|
||||
config_get multicast_mode "$mesh" multicast_mode
|
||||
config_get network_coding "$mesh" network_coding
|
||||
config_get log_level "$mesh" log_level
|
||||
config_get orig_interval "$mesh" orig_interval
|
||||
|
||||
[ ! -f "/sys/class/net/$mesh/mesh/orig_interval" ] && echo "batman-adv mesh $mesh does not exist - check your interface configuration" && return 1
|
||||
|
||||
[ -n "$aggregated_ogms" ] && echo $aggregated_ogms > /sys/class/net/$mesh/mesh/aggregated_ogms
|
||||
[ -n "$ap_isolation" ] && echo $ap_isolation > /sys/class/net/$mesh/mesh/ap_isolation
|
||||
[ -n "$bonding" ] && echo $bonding > /sys/class/net/$mesh/mesh/bonding
|
||||
[ -n "$bridge_loop_avoidance" ] && echo $bridge_loop_avoidance > /sys/class/net/$mesh/mesh/bridge_loop_avoidance 2>&-
|
||||
[ -n "$distributed_arp_table" ] && echo $distributed_arp_table > /sys/class/net/$mesh/mesh/distributed_arp_table 2>&-
|
||||
[ -n "$fragmentation" ] && echo $fragmentation > /sys/class/net/$mesh/mesh/fragmentation
|
||||
[ -n "$gw_bandwidth" ] && echo $gw_bandwidth > /sys/class/net/$mesh/mesh/gw_bandwidth
|
||||
[ -n "$gw_mode" ] && echo $gw_mode > /sys/class/net/$mesh/mesh/gw_mode
|
||||
[ -n "$gw_sel_class" ] && echo $gw_sel_class > /sys/class/net/$mesh/mesh/gw_sel_class
|
||||
[ -n "$hop_penalty" ] && echo $hop_penalty > /sys/class/net/$mesh/mesh/hop_penalty
|
||||
[ -n "$isolation_mark" ] && echo $isolation_mark > /sys/class/net/$mesh/mesh/isolation_mark
|
||||
[ -n "$multicast_mode" ] && echo $multicast_mode > /sys/class/net/$mesh/mesh/multicast_mode 2>&-
|
||||
[ -n "$network_coding" ] && echo $network_coding > /sys/class/net/$mesh/mesh/network_coding 2>&-
|
||||
[ -n "$log_level" ] && echo $log_level > /sys/class/net/$mesh/mesh/log_level 2>&-
|
||||
[ -n "$orig_interval" ] && echo $orig_interval > /sys/class/net/$mesh/mesh/orig_interval
|
||||
}
|
115
batman-adv/files/lib/netifd/proto/batadv.sh
Executable file → Normal file
115
batman-adv/files/lib/netifd/proto/batadv.sh
Executable file → Normal file
|
@ -1,123 +1,34 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
}
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
|
||||
proto_batadv_init_config() {
|
||||
no_device=1
|
||||
available=1
|
||||
|
||||
proto_config_add_boolean 'aggregated_ogms:bool'
|
||||
proto_config_add_boolean 'ap_isolation:bool'
|
||||
proto_config_add_boolean 'bonding:bool'
|
||||
proto_config_add_boolean 'bridge_loop_avoidance:bool'
|
||||
proto_config_add_boolean 'distributed_arp_table:bool'
|
||||
proto_config_add_boolean 'fragmentation:bool'
|
||||
proto_config_add_string 'gw_bandwidth'
|
||||
proto_config_add_string 'gw_mode'
|
||||
proto_config_add_int 'gw_sel_class'
|
||||
proto_config_add_int 'hop_penalty'
|
||||
proto_config_add_string 'isolation_mark'
|
||||
proto_config_add_string 'log_level'
|
||||
proto_config_add_int 'multicast_fanout'
|
||||
proto_config_add_boolean 'multicast_mode:bool'
|
||||
proto_config_add_boolean 'network_coding:bool'
|
||||
proto_config_add_int 'orig_interval'
|
||||
proto_config_add_string 'routing_algo'
|
||||
proto_config_add_string "mesh"
|
||||
proto_config_add_string "routing_algo"
|
||||
}
|
||||
|
||||
proto_batadv_setup() {
|
||||
local config="$1"
|
||||
local iface="$config"
|
||||
local iface="$2"
|
||||
|
||||
local aggregated_ogms
|
||||
local ap_isolation
|
||||
local bonding
|
||||
local bridge_loop_avoidance
|
||||
local distributed_arp_table
|
||||
local fragmentation
|
||||
local gw_bandwidth
|
||||
local gw_mode
|
||||
local gw_sel_class
|
||||
local hop_penalty
|
||||
local isolation_mark
|
||||
local log_level
|
||||
local multicast_fanout
|
||||
local multicast_mode
|
||||
local network_coding
|
||||
local orig_interval
|
||||
local routing_algo
|
||||
local mesh routing_algo
|
||||
json_get_vars mesh routing_algo
|
||||
|
||||
json_get_vars aggregated_ogms
|
||||
json_get_vars ap_isolation
|
||||
json_get_vars bonding
|
||||
json_get_vars bridge_loop_avoidance
|
||||
json_get_vars distributed_arp_table
|
||||
json_get_vars fragmentation
|
||||
json_get_vars gw_bandwidth
|
||||
json_get_vars gw_mode
|
||||
json_get_vars gw_sel_class
|
||||
json_get_vars hop_penalty
|
||||
json_get_vars isolation_mark
|
||||
json_get_vars log_level
|
||||
json_get_vars multicast_fanout
|
||||
json_get_vars multicast_mode
|
||||
json_get_vars network_coding
|
||||
json_get_vars orig_interval
|
||||
json_get_vars routing_algo
|
||||
|
||||
set_default routing_algo 'BATMAN_IV'
|
||||
|
||||
batctl routing_algo "$routing_algo"
|
||||
batctl meshif "$iface" interface create
|
||||
|
||||
[ -n "$aggregated_ogms" ] && batctl meshif "$iface" aggregation "$aggregated_ogms"
|
||||
[ -n "$ap_isolation" ] && batctl meshif "$iface" ap_isolation "$ap_isolation"
|
||||
[ -n "$bonding" ] && batctl meshif "$iface" bonding "$bonding"
|
||||
[ -n "$bridge_loop_avoidance" ] && batctl meshif "$iface" bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
|
||||
[ -n "$distributed_arp_table" ] && batctl meshif "$iface" distributed_arp_table "$distributed_arp_table" 2>&-
|
||||
[ -n "$fragmentation" ] && batctl meshif "$iface" fragmentation "$fragmentation"
|
||||
|
||||
case "$gw_mode" in
|
||||
server)
|
||||
if [ -n "$gw_bandwidth" ]; then
|
||||
batctl meshif "$iface" gw_mode "server" "$gw_bandwidth"
|
||||
else
|
||||
batctl meshif "$iface" gw_mode "server"
|
||||
fi
|
||||
;;
|
||||
client)
|
||||
if [ -n "$gw_sel_class" ]; then
|
||||
batctl meshif "$iface" gw_mode "client" "$gw_sel_class"
|
||||
else
|
||||
batctl meshif "$iface" gw_mode "client"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
batctl meshif "$iface" gw_mode "off"
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -n "$hop_penalty" ] && batctl meshif "$iface" hop_penalty "$hop_penalty"
|
||||
[ -n "$isolation_mark" ] && batctl meshif "$iface" isolation_mark "$isolation_mark"
|
||||
[ -n "$multicast_fanout" ] && batctl meshif "$iface" multicast_fanout "$multicast_fanout"
|
||||
[ -n "$multicast_mode" ] && batctl meshif "$iface" multicast_mode "$multicast_mode" 2>&-
|
||||
[ -n "$network_coding" ] && batctl meshif "$iface" network_coding "$network_coding" 2>&-
|
||||
[ -n "$log_level" ] && batctl meshif "$iface" loglevel "$log_level" 2>&-
|
||||
[ -n "$orig_interval" ] && batctl meshif "$iface" orig_interval "$orig_interval"
|
||||
[ -n "$routing_algo" ] || routing_algo="BATMAN_IV"
|
||||
echo "$routing_algo" > "/sys/module/batman_adv/parameters/routing_algo"
|
||||
|
||||
echo "$mesh" > "/sys/class/net/$iface/batman_adv/mesh_iface"
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
proto_batadv_teardown() {
|
||||
local config="$1"
|
||||
local iface="$config"
|
||||
local iface="$2"
|
||||
|
||||
batctl meshif "$iface" interface destroy
|
||||
echo "none" > "/sys/class/net/$iface/batman_adv/mesh_iface" || true
|
||||
}
|
||||
|
||||
add_protocol batadv
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
}
|
||||
|
||||
proto_batadv_hardif_init_config() {
|
||||
proto_config_add_int 'elp_interval'
|
||||
proto_config_add_int 'hop_penalty'
|
||||
proto_config_add_string "master"
|
||||
proto_config_add_string 'throughput_override'
|
||||
}
|
||||
|
||||
proto_batadv_hardif_setup() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
local elp_interval
|
||||
local hop_penalty
|
||||
local master
|
||||
local throughput_override
|
||||
|
||||
json_get_vars elp_interval
|
||||
json_get_vars hop_penalty
|
||||
json_get_vars master
|
||||
json_get_vars throughput_override
|
||||
|
||||
( proto_add_host_dependency "$config" '' "$master" )
|
||||
|
||||
batctl meshif "$master" interface -M add "$iface"
|
||||
|
||||
[ -n "$elp_interval" ] && batctl hardif "$iface" elp_interval "$elp_interval"
|
||||
[ -n "$hop_penalty" ] && batctl hardif "$iface" hop_penalty "$hop_penalty"
|
||||
[ -n "$throughput_override" ] && batctl hardif "$iface" throughput_override "$throughput_override"
|
||||
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
proto_batadv_hardif_teardown() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
local master
|
||||
|
||||
json_get_vars master
|
||||
|
||||
batctl meshif "$master" interface -M del "$iface" || true
|
||||
}
|
||||
|
||||
add_protocol batadv_hardif
|
12
batman-adv/files/lib/netifd/proto/batadv_vlan.sh
Executable file → Normal file
12
batman-adv/files/lib/netifd/proto/batadv_vlan.sh
Executable file → Normal file
|
@ -5,25 +5,25 @@
|
|||
init_proto "$@"
|
||||
|
||||
proto_batadv_vlan_init_config() {
|
||||
proto_config_add_boolean 'ap_isolation:bool'
|
||||
proto_config_add_string "ap_isolation"
|
||||
}
|
||||
|
||||
proto_batadv_vlan_setup() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
# VLAN specific variables
|
||||
local device="${iface%.*}"
|
||||
local vid="${iface#*.}"
|
||||
|
||||
# batadv_vlan options
|
||||
local ap_isolation
|
||||
|
||||
json_get_vars ap_isolation
|
||||
|
||||
[ -n "$ap_isolation" ] && batctl vlan "$iface" ap_isolation "$ap_isolation"
|
||||
echo "$ap_isolation" > "/sys/class/net/${device}/mesh/vlan${vid}/ap_isolation"
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
proto_batadv_vlan_teardown() {
|
||||
local cfg="$1"
|
||||
}
|
||||
|
||||
add_protocol batadv_vlan
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 23 Sep 2016 14:55:38 +0200
|
||||
Subject: Add compat fallback for batadv_getlink_net
|
||||
|
||||
Forwarded: not-needed
|
||||
|
||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
||||
index 61a431a9772ba96418644b399c9e787cbfd0e743..6969f580d0bfd0428f1c6985eaec8bbbf5a0d38b 100644
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -95,6 +95,9 @@ out:
|
||||
static struct net *batadv_getlink_net(const struct net_device *netdev,
|
||||
struct net *fallback_net)
|
||||
{
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
|
||||
+ return fallback_net;
|
||||
+#else
|
||||
if (!netdev->rtnl_link_ops)
|
||||
return fallback_net;
|
||||
|
||||
@@ -102,6 +105,7 @@ static struct net *batadv_getlink_net(const struct net_device *netdev,
|
||||
return fallback_net;
|
||||
|
||||
return netdev->rtnl_link_ops->get_link_net(netdev);
|
||||
+#endif
|
||||
}
|
||||
|
||||
/**
|
|
@ -1,274 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 6 May 2022 22:03:29 +0200
|
||||
Subject: Revert "batman-adv: Migrate to linux/container_of.h"
|
||||
|
||||
The original patch requires Linux 5.16.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit 043ae5634bdfd4c4dd8b95a22890752495080bb5.
|
||||
|
||||
--- a/compat-include/linux/container_of.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 16, 0)
|
||||
-#include_next <linux/container_of.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_ */
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -13,13 +13,13 @@
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
--- a/net/batman-adv/bat_v_ogm.c
|
||||
+++ b/net/batman-adv/bat_v_ogm.c
|
||||
@@ -9,12 +9,12 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc16.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
@@ -21,6 +20,7 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netlink.h>
|
||||
--- a/net/batman-adv/gateway_client.c
|
||||
+++ b/net/batman-adv/gateway_client.c
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -10,12 +10,12 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/if_ether.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc32c.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
--- a/net/batman-adv/network-coding.c
|
||||
+++ b/net/batman-adv/network-coding.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/originator.c
|
||||
+++ b/net/batman-adv/originator.c
|
||||
@@ -8,11 +8,11 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/send.c
|
||||
+++ b/net/batman-adv/send.c
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netdevice.h>
|
||||
--- a/net/batman-adv/soft-interface.c
|
||||
+++ b/net/batman-adv/soft-interface.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/tp_meter.c
|
||||
+++ b/net/batman-adv/tp_meter.c
|
||||
@@ -12,13 +12,13 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/limits.h>
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc32c.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
@@ -22,6 +21,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/tvlv.c
|
||||
+++ b/net/batman-adv/tvlv.c
|
||||
@@ -7,10 +7,10 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
|
@ -0,0 +1,62 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Tue, 27 Dec 2016 08:51:17 +0100
|
||||
Subject: batman-adv: Decrease hardif refcnt on fragmentation send error
|
||||
|
||||
An error before the hardif is found has to free the skb. But every error
|
||||
after that has to free the skb + put the hard interface.
|
||||
|
||||
Fixes: 8b4132b1447a ("batman-adv: Consume skb in batadv_frag_send_packet")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/205dc8385dc863467f4f6ccec2e63254e6baf831
|
||||
|
||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
||||
index 9c561e683f4b8b68642b626b51a0dcda30260e97..0854ebd8613e9bf9044b04099b11341325d6e194 100644
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -474,7 +474,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
if (!primary_if) {
|
||||
ret = -EINVAL;
|
||||
- goto put_primary_if;
|
||||
+ goto free_skb;
|
||||
}
|
||||
|
||||
/* Create one header to be copied to all fragments */
|
||||
@@ -502,7 +502,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
skb_fragment = batadv_frag_create(skb, &frag_header, mtu);
|
||||
if (!skb_fragment) {
|
||||
ret = -ENOMEM;
|
||||
- goto free_skb;
|
||||
+ goto put_primary_if;
|
||||
}
|
||||
|
||||
batadv_inc_counter(bat_priv, BATADV_CNT_FRAG_TX);
|
||||
@@ -511,7 +511,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
ret = batadv_send_unicast_skb(skb_fragment, neigh_node);
|
||||
if (ret != NET_XMIT_SUCCESS) {
|
||||
ret = NET_XMIT_DROP;
|
||||
- goto free_skb;
|
||||
+ goto put_primary_if;
|
||||
}
|
||||
|
||||
frag_header.no++;
|
||||
@@ -519,7 +519,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
/* The initial check in this function should cover this case */
|
||||
if (frag_header.no == BATADV_FRAG_MAX_FRAGMENTS - 1) {
|
||||
ret = -EINVAL;
|
||||
- goto free_skb;
|
||||
+ goto put_primary_if;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -527,7 +527,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
if (batadv_skb_head_push(skb, header_size) < 0 ||
|
||||
pskb_expand_head(skb, header_size + ETH_HLEN, 0, GFP_ATOMIC) < 0) {
|
||||
ret = -ENOMEM;
|
||||
- goto free_skb;
|
||||
+ goto put_primary_if;
|
||||
}
|
||||
|
||||
memcpy(skb->data, &frag_header, header_size);
|
|
@ -1,19 +0,0 @@
|
|||
From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Date: Thu, 6 Apr 2023 18:05:50 -0500
|
||||
Subject: fix batadv_is_cfg80211_netdev
|
||||
|
||||
Replace CONFIG_CFG80211 with CPTCFG_CFG80211, which is the correct
|
||||
macro to use when building under backports.
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -308,8 +308,7 @@ static bool batadv_is_cfg80211_netdev(st
|
||||
{
|
||||
if (!net_device)
|
||||
return false;
|
||||
-
|
||||
-#if IS_ENABLED(CONFIG_CFG80211)
|
||||
+#if IS_ENABLED(CPTCFG_CFG80211)
|
||||
/* cfg80211 drivers have to set ieee80211_ptr */
|
||||
if (net_device->ieee80211_ptr)
|
||||
return true;
|
|
@ -1,97 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 2 Feb 2024 22:49:00 +0100
|
||||
Subject: Revert "batman-adv: Switch to linux/sprintf.h"
|
||||
|
||||
The original patch requires Linux 6.6.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit f0fb49c5ab70dfa064f0aa8d1c5d84f65e8cbc86.
|
||||
|
||||
--- a/compat-include/linux/sprintf.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(6, 6, 0)
|
||||
-#include_next <linux/sprintf.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_ */
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
@@ -29,7 +30,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/workqueue.h>
|
||||
--- a/net/batman-adv/gateway_client.c
|
||||
+++ b/net/batman-adv/gateway_client.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
@@ -27,7 +28,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/udp.h>
|
||||
#include <net/sock.h>
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/workqueue.h>
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/netdevice.h>
|
||||
@@ -34,7 +35,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
|
@ -0,0 +1,58 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sun, 12 Feb 2017 11:26:33 +0100
|
||||
Subject: batman-adv: Fix double free during fragment merge error
|
||||
|
||||
The function batadv_frag_skb_buffer was supposed not to consume the skbuff
|
||||
on errors. This was followed in the helper function
|
||||
batadv_frag_insert_packet when the skb would potentially be inserted in the
|
||||
fragment queue. But it could happen that the next helper function
|
||||
batadv_frag_merge_packets would try to merge the fragments and fail. This
|
||||
results in a kfree_skb of all the enqueued fragments (including the just
|
||||
inserted one). batadv_recv_frag_packet would detect the error in
|
||||
batadv_frag_skb_buffer and try to free the skb again.
|
||||
|
||||
The behavior of batadv_frag_skb_buffer (and its helper
|
||||
batadv_frag_insert_packet) must therefore be changed to always consume the
|
||||
skbuff to have a common behavior and avoid the double kfree_skb.
|
||||
|
||||
Fixes: 9b3eab61754d ("batman-adv: Receive fragmented packets and merge")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/e3bab02816097f860545d9ce9ae0808c69d7c92f
|
||||
|
||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
||||
index 0854ebd8613e9bf9044b04099b11341325d6e194..31e97e9aee0d543b68be091936888e1f6c9dd7eb 100644
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -239,8 +239,10 @@ err_unlock:
|
||||
spin_unlock_bh(&chain->lock);
|
||||
|
||||
err:
|
||||
- if (!ret)
|
||||
+ if (!ret) {
|
||||
kfree(frag_entry_new);
|
||||
+ kfree_skb(skb);
|
||||
+ }
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -313,7 +315,7 @@ free:
|
||||
*
|
||||
* There are three possible outcomes: 1) Packet is merged: Return true and
|
||||
* set *skb to merged packet; 2) Packet is buffered: Return true and set *skb
|
||||
- * to NULL; 3) Error: Return false and leave skb as is.
|
||||
+ * to NULL; 3) Error: Return false and free skb.
|
||||
*
|
||||
* Return: true when packet is merged or buffered, false when skb is not not
|
||||
* used.
|
||||
@@ -338,9 +340,9 @@ bool batadv_frag_skb_buffer(struct sk_buff **skb,
|
||||
goto out_err;
|
||||
|
||||
out:
|
||||
- *skb = skb_out;
|
||||
ret = true;
|
||||
out_err:
|
||||
+ *skb = skb_out;
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1,69 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 2 Feb 2024 22:49:48 +0100
|
||||
Subject: Revert "batman-adv: Switch to linux/array_size.h"
|
||||
|
||||
The original patch requires Linux 6.7.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit f33d7f724675544a36b24c77f8d4b95d41252ae2.
|
||||
|
||||
--- a/compat-include/linux/array_size.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(6, 7, 0)
|
||||
-#include_next <linux/array_size.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_ */
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
-#include <linux/array_size.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
--- a/net/batman-adv/netlink.c
|
||||
+++ b/net/batman-adv/netlink.c
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "netlink.h"
|
||||
#include "main.h"
|
||||
|
||||
-#include <linux/array_size.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
@@ -21,6 +20,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/init.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/minmax.h>
|
|
@ -0,0 +1,51 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Mon, 13 Feb 2017 20:44:31 +0100
|
||||
Subject: batman-adv: Fix transmission of final, 16th fragment
|
||||
|
||||
Trying to split and transmit a unicast packet in 16 parts will fail for
|
||||
the final fragment: After having sent the 15th one with a frag_packet.no
|
||||
index of 14, we will increase the the index to 15 - and return with an
|
||||
error code immediately, even though one more fragment is due for
|
||||
transmission and allowed.
|
||||
|
||||
Fixing this issue by moving the check before incrementing the index.
|
||||
|
||||
While at it, adding an unlikely(), because the check is actually more of
|
||||
an assertion.
|
||||
|
||||
Fixes: db56e4ecf5c2 ("batman-adv: Fragment and send skbs larger than mtu")
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/464eff3b1768ff190466a453a57ac140ea5cb756
|
||||
|
||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
||||
index 31e97e9aee0d543b68be091936888e1f6c9dd7eb..11149e5be4e0ef9dfe2872e1d8d1f6dbb4ccdb14 100644
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -501,6 +501,12 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
|
||||
/* Eat and send fragments from the tail of skb */
|
||||
while (skb->len > max_fragment_size) {
|
||||
+ /* The initial check in this function should cover this case */
|
||||
+ if (unlikely(frag_header.no == BATADV_FRAG_MAX_FRAGMENTS - 1)) {
|
||||
+ ret = -EINVAL;
|
||||
+ goto put_primary_if;
|
||||
+ }
|
||||
+
|
||||
skb_fragment = batadv_frag_create(skb, &frag_header, mtu);
|
||||
if (!skb_fragment) {
|
||||
ret = -ENOMEM;
|
||||
@@ -517,12 +523,6 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
frag_header.no++;
|
||||
-
|
||||
- /* The initial check in this function should cover this case */
|
||||
- if (frag_header.no == BATADV_FRAG_MAX_FRAGMENTS - 1) {
|
||||
- ret = -EINVAL;
|
||||
- goto put_primary_if;
|
||||
- }
|
||||
}
|
||||
|
||||
/* Make room for the fragment header. */
|
|
@ -0,0 +1,116 @@
|
|||
From: Gao Feng <gfree.wind@gmail.com>
|
||||
Date: Mon, 21 Nov 2016 23:00:32 +0800
|
||||
Subject: batman-adv: Treat NET_XMIT_CN as transmit successfully
|
||||
|
||||
The tc could return NET_XMIT_CN as one congestion notification, but
|
||||
it does not mean the packet is lost. Other modules like ipvlan,
|
||||
macvlan, and others treat NET_XMIT_CN as success too.
|
||||
|
||||
So batman-adv should add the NET_XMIT_CN check.
|
||||
|
||||
Signed-off-by: Gao Feng <gfree.wind@gmail.com>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/1120b81c74187f489c08fc9438305071def089cc
|
||||
|
||||
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
|
||||
index 49576c5a3fe306a42c28c3901d2b2c6cce7d0b8e..3641765d55df049a5dbac35d322ebc537a0f0322 100644
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -659,7 +659,8 @@ static bool batadv_dat_send_data(struct batadv_priv *bat_priv,
|
||||
}
|
||||
|
||||
send_status = batadv_send_unicast_skb(tmp_skb, neigh_node);
|
||||
- if (send_status == NET_XMIT_SUCCESS) {
|
||||
+ if (send_status == NET_XMIT_SUCCESS ||
|
||||
+ send_status == NET_XMIT_CN) {
|
||||
/* count the sent packet */
|
||||
switch (packet_subtype) {
|
||||
case BATADV_P_DAT_DHT_GET:
|
||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
||||
index 11149e5be4e0ef9dfe2872e1d8d1f6dbb4ccdb14..d33f16b9b8ac13ba630bf9ac8c5f4f0ca79fc878 100644
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -517,7 +517,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
batadv_add_counter(bat_priv, BATADV_CNT_FRAG_TX_BYTES,
|
||||
skb_fragment->len + ETH_HLEN);
|
||||
ret = batadv_send_unicast_skb(skb_fragment, neigh_node);
|
||||
- if (ret != NET_XMIT_SUCCESS) {
|
||||
+ if (ret != NET_XMIT_SUCCESS && ret != NET_XMIT_CN) {
|
||||
ret = NET_XMIT_DROP;
|
||||
goto put_primary_if;
|
||||
}
|
||||
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
|
||||
index 6713bdf414cdacdaf36ecd6ac516f99e079fb51e..6b08b26da4d94be9c8c5e9dc708ddc18d8282428 100644
|
||||
--- a/net/batman-adv/routing.c
|
||||
+++ b/net/batman-adv/routing.c
|
||||
@@ -262,7 +262,7 @@ static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
|
||||
icmph->ttl = BATADV_TTL;
|
||||
|
||||
res = batadv_send_skb_to_orig(skb, orig_node, NULL);
|
||||
- if (res == NET_XMIT_SUCCESS)
|
||||
+ if (res == NET_XMIT_SUCCESS || res == NET_XMIT_CN)
|
||||
ret = NET_RX_SUCCESS;
|
||||
|
||||
/* skb was consumed */
|
||||
@@ -330,7 +330,7 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
|
||||
icmp_packet->ttl = BATADV_TTL;
|
||||
|
||||
res = batadv_send_skb_to_orig(skb, orig_node, NULL);
|
||||
- if (res == NET_RX_SUCCESS)
|
||||
+ if (res == NET_RX_SUCCESS || res == NET_XMIT_CN)
|
||||
ret = NET_XMIT_SUCCESS;
|
||||
|
||||
/* skb was consumed */
|
||||
@@ -424,7 +424,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb,
|
||||
|
||||
/* route it */
|
||||
res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
|
||||
- if (res == NET_XMIT_SUCCESS)
|
||||
+ if (res == NET_XMIT_SUCCESS || res == NET_XMIT_CN)
|
||||
ret = NET_RX_SUCCESS;
|
||||
|
||||
/* skb was consumed */
|
||||
@@ -719,14 +719,14 @@ static int batadv_route_unicast_packet(struct sk_buff *skb,
|
||||
|
||||
len = skb->len;
|
||||
res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
|
||||
- if (res == NET_XMIT_SUCCESS)
|
||||
+ if (res == NET_XMIT_SUCCESS || res == NET_XMIT_CN)
|
||||
ret = NET_RX_SUCCESS;
|
||||
|
||||
/* skb was consumed */
|
||||
skb = NULL;
|
||||
|
||||
/* translate transmit result into receive result */
|
||||
- if (res == NET_XMIT_SUCCESS) {
|
||||
+ if (res == NET_XMIT_SUCCESS || res == NET_XMIT_CN) {
|
||||
/* skb was transmitted and consumed */
|
||||
batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
|
||||
batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
|
||||
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
|
||||
index 7b3494ae6ad93fd0d32391e5c88f5d636f43acd5..60516bbb7e8391f3063ba1e48c81288ffc7bef49 100644
|
||||
--- a/net/batman-adv/soft-interface.c
|
||||
+++ b/net/batman-adv/soft-interface.c
|
||||
@@ -386,7 +386,7 @@ send:
|
||||
ret = batadv_send_skb_via_tt(bat_priv, skb, dst_hint,
|
||||
vid);
|
||||
}
|
||||
- if (ret != NET_XMIT_SUCCESS)
|
||||
+ if (ret != NET_XMIT_SUCCESS && ret != NET_XMIT_CN)
|
||||
goto dropped_freed;
|
||||
}
|
||||
|
||||
diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
|
||||
index 981e8c5b07e9398c68df711d1d7b54e6e9333ead..c367c8316a822c70ee397bbe1266cd38f24a279b 100644
|
||||
--- a/net/batman-adv/tp_meter.c
|
||||
+++ b/net/batman-adv/tp_meter.c
|
||||
@@ -615,7 +615,7 @@ static int batadv_tp_send_msg(struct batadv_tp_vars *tp_vars, const u8 *src,
|
||||
batadv_tp_fill_prerandom(tp_vars, data, data_len);
|
||||
|
||||
r = batadv_send_skb_to_orig(skb, orig_node, NULL);
|
||||
- if (r == NET_XMIT_SUCCESS)
|
||||
+ if (r == NET_XMIT_SUCCESS || r == NET_XMIT_CN)
|
||||
return 0;
|
||||
|
||||
return BATADV_TP_REASON_CANT_SEND;
|
|
@ -0,0 +1,63 @@
|
|||
From: Simon Wunderlich <simon.wunderlich@open-mesh.com>
|
||||
Date: Thu, 24 Nov 2016 16:11:01 +0100
|
||||
Subject: batman-adv: don't add loop detect macs to TT
|
||||
|
||||
The bridge loop avoidance (BLA) feature of batman-adv sends packets to
|
||||
probe for Mesh/LAN packet loops. Those packets are not sent by real
|
||||
clients and should therefore not be added to the translation table (TT).
|
||||
|
||||
Signed-off-by: Simon Wunderlich <simon.wunderlich@open-mesh.com>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/447df986b83630a92ca9d33903023b7e1b2917f3
|
||||
|
||||
diff --git a/net/batman-adv/bridge_loop_avoidance.h b/net/batman-adv/bridge_loop_avoidance.h
|
||||
index 1ae93e46fb98498c00082728ca91216d78e13298..2827cd3c13d2a35a3b296340a0aa123dbd032926 100644
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.h
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.h
|
||||
@@ -20,6 +20,8 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
+#include <linux/compiler.h>
|
||||
+#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct net_device;
|
||||
@@ -27,6 +29,22 @@ struct netlink_callback;
|
||||
struct seq_file;
|
||||
struct sk_buff;
|
||||
|
||||
+/**
|
||||
+ * batadv_bla_is_loopdetect_mac - check if the mac address is from a loop detect
|
||||
+ * frame sent by bridge loop avoidance
|
||||
+ * @mac: mac address to check
|
||||
+ *
|
||||
+ * Return: true if the it looks like a loop detect frame
|
||||
+ * (mac starts with BA:BE), false otherwise
|
||||
+ */
|
||||
+static inline bool batadv_bla_is_loopdetect_mac(const uint8_t *mac)
|
||||
+{
|
||||
+ if (mac[0] == 0xba && mac[1] == 0xbe)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||
bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
unsigned short vid, bool is_bcast);
|
||||
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
|
||||
index 60516bbb7e8391f3063ba1e48c81288ffc7bef49..4e447bf17332c191dda694b9b3e49e06073814fc 100644
|
||||
--- a/net/batman-adv/soft-interface.c
|
||||
+++ b/net/batman-adv/soft-interface.c
|
||||
@@ -258,7 +258,8 @@ static int batadv_interface_tx(struct sk_buff *skb,
|
||||
ethhdr = eth_hdr(skb);
|
||||
|
||||
/* Register the client MAC in the transtable */
|
||||
- if (!is_multicast_ether_addr(ethhdr->h_source)) {
|
||||
+ if (!is_multicast_ether_addr(ethhdr->h_source) &&
|
||||
+ !batadv_bla_is_loopdetect_mac(ethhdr->h_source)) {
|
||||
client_added = batadv_tt_local_add(soft_iface, ethhdr->h_source,
|
||||
vid, skb->skb_iif,
|
||||
skb->mark);
|
|
@ -0,0 +1,49 @@
|
|||
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Date: Wed, 22 Feb 2017 17:25:41 +0100
|
||||
Subject: batman-adv: decrease maximum fragment size
|
||||
|
||||
With this patch the maximum fragment size is reduced from 1400 to 1280
|
||||
bytes.
|
||||
|
||||
Fragmentation v2 correctly uses the smaller of 1400 and the interface
|
||||
MTU, thus generally supporting interfaces with an MTU < 1400 bytes, too.
|
||||
|
||||
However, currently "Fragmentation v2" does not support re-fragmentation.
|
||||
Which means that once a packet is split into two packets of 1400 + x
|
||||
bytes for instance and the next hop provides an interface with an even
|
||||
smaller MTU of 1280 bytes, then the larger fragment is lost.
|
||||
|
||||
A maximum fragment size of 1280 bytes is a safer option as this is the
|
||||
minimum MTU required by IPv6, making interfaces with an MTU < 1280
|
||||
rather exotic.
|
||||
|
||||
Regarding performance, this should have no negative impact on unicast
|
||||
traffic: Having some more bytes in the smaller and some less in the
|
||||
larger does not change the sum of both fragments.
|
||||
|
||||
Concerning TT, choosing 1280 bytes fragments might result in more TT
|
||||
messages than necessary when a large network is bridged into batman-adv.
|
||||
However, the TT overhead in general is marginal due to its reactive
|
||||
nature, therefore such a performance impact on TT should not be
|
||||
noticeable for a user.
|
||||
|
||||
Cc: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
[linus.luessing@c0d3.blue: Added commit message]
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/eb60b63140af5ec01ea0916837c2816cad10d6c1
|
||||
|
||||
diff --git a/net/batman-adv/main.h b/net/batman-adv/main.h
|
||||
index a6cc8040a21dd24fb507683230fd66a9edb62458..5b7855560e8ad121c7b48da97807b6895be158fc 100644
|
||||
--- a/net/batman-adv/main.h
|
||||
+++ b/net/batman-adv/main.h
|
||||
@@ -168,7 +168,7 @@ enum batadv_uev_type {
|
||||
/* Maximum number of fragments for one packet */
|
||||
#define BATADV_FRAG_MAX_FRAGMENTS 16
|
||||
/* Maxumim size of each fragment */
|
||||
-#define BATADV_FRAG_MAX_FRAG_SIZE 1400
|
||||
+#define BATADV_FRAG_MAX_FRAG_SIZE 1280
|
||||
/* Time to keep fragments while waiting for rest of the fragments */
|
||||
#define BATADV_FRAG_TIMEOUT 10000
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 22 Feb 2017 17:25:42 +0100
|
||||
Subject: batman-adv: Keep fragments equally sized
|
||||
|
||||
The batman-adv fragmentation packets have the design problem that they
|
||||
cannot be refragmented. This often leads to problems when networks are
|
||||
incorrectly configured and don't use a common MTU.
|
||||
|
||||
The sender could for example fragment a 1500 byte packet to fit in a 1280
|
||||
bytes large MTU. This would create a 1280 large packet and a 284 bytes
|
||||
large packet. But the next hop is then not able to transport 1280 bytes to
|
||||
its next hop. The 1280 byte large packet will be dropped but the 284 bytes
|
||||
large packet will still be forwarded to its destination.
|
||||
|
||||
This can partly being avoided by splitting packets more equally. In this
|
||||
example, the two 782 bytes large packets could both potentially reach its
|
||||
destination.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/3caa5d14206ce8d4bd48bc931f213dec47ea1566
|
||||
|
||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
||||
index d33f16b9b8ac13ba630bf9ac8c5f4f0ca79fc878..70e512111528b0345889cea4ffd0ad5d984a4e6a 100644
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -404,7 +404,7 @@ out:
|
||||
* batadv_frag_create - create a fragment from skb
|
||||
* @skb: skb to create fragment from
|
||||
* @frag_head: header to use in new fragment
|
||||
- * @mtu: size of new fragment
|
||||
+ * @fragment_size: size of new fragment
|
||||
*
|
||||
* Split the passed skb into two fragments: A new one with size matching the
|
||||
* passed mtu and the old one with the rest. The new skb contains data from the
|
||||
@@ -414,11 +414,11 @@ out:
|
||||
*/
|
||||
static struct sk_buff *batadv_frag_create(struct sk_buff *skb,
|
||||
struct batadv_frag_packet *frag_head,
|
||||
- unsigned int mtu)
|
||||
+ unsigned int fragment_size)
|
||||
{
|
||||
struct sk_buff *skb_fragment;
|
||||
unsigned int header_size = sizeof(*frag_head);
|
||||
- unsigned int fragment_size = mtu - header_size;
|
||||
+ unsigned int mtu = fragment_size + header_size;
|
||||
|
||||
skb_fragment = netdev_alloc_skb(NULL, mtu + ETH_HLEN);
|
||||
if (!skb_fragment)
|
||||
@@ -456,7 +456,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
struct sk_buff *skb_fragment;
|
||||
unsigned int mtu = neigh_node->if_incoming->net_dev->mtu;
|
||||
unsigned int header_size = sizeof(frag_header);
|
||||
- unsigned int max_fragment_size, max_packet_size;
|
||||
+ unsigned int max_fragment_size, num_fragments;
|
||||
int ret;
|
||||
|
||||
/* To avoid merge and refragmentation at next-hops we never send
|
||||
@@ -464,10 +464,15 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
*/
|
||||
mtu = min_t(unsigned int, mtu, BATADV_FRAG_MAX_FRAG_SIZE);
|
||||
max_fragment_size = mtu - header_size;
|
||||
- max_packet_size = max_fragment_size * BATADV_FRAG_MAX_FRAGMENTS;
|
||||
+
|
||||
+ if (skb->len == 0 || max_fragment_size == 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ num_fragments = (skb->len - 1) / max_fragment_size + 1;
|
||||
+ max_fragment_size = (skb->len - 1) / num_fragments + 1;
|
||||
|
||||
/* Don't even try to fragment, if we need more than 16 fragments */
|
||||
- if (skb->len > max_packet_size) {
|
||||
+ if (num_fragments > BATADV_FRAG_MAX_FRAGMENTS) {
|
||||
ret = -EAGAIN;
|
||||
goto free_skb;
|
||||
}
|
||||
@@ -507,7 +512,8 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
goto put_primary_if;
|
||||
}
|
||||
|
||||
- skb_fragment = batadv_frag_create(skb, &frag_header, mtu);
|
||||
+ skb_fragment = batadv_frag_create(skb, &frag_header,
|
||||
+ max_fragment_size);
|
||||
if (!skb_fragment) {
|
||||
ret = -ENOMEM;
|
||||
goto put_primary_if;
|
|
@ -0,0 +1,137 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 4 Mar 2017 16:33:31 +0100
|
||||
Subject: batman-adv: Initialize gw sel_class via batadv_algo
|
||||
|
||||
The gateway selection class variable is shared between different algorithm
|
||||
versions. But the interpretation of the content is algorithm specific. The
|
||||
initialization is therefore also algorithm specific.
|
||||
|
||||
But this was implemented incorrectly and the initialization for BATMAN_V
|
||||
always overwrote the value previously written for BATMAN_IV. This could
|
||||
only be avoided when BATMAN_V was disabled during compile time.
|
||||
|
||||
Using a special batadv_algo hook for this initialization avoids this
|
||||
problem.
|
||||
|
||||
Fixes: 80b2d47be2c7 ("batman-adv: B.A.T.M.A.N. V - implement GW selection logic")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/ef565a1434966750644affda86fd11b0b69edbfe
|
||||
|
||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
||||
index f00f666e2ccd4714bb7a5210c48e39edb40e0c17..7bfd0d7ef49df8e699f91e2b827b824aa3657c0d 100644
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -2477,6 +2477,16 @@ static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface)
|
||||
batadv_iv_ogm_schedule(hard_iface);
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_iv_init_sel_class - initialize GW selection class
|
||||
+ * @bat_priv: the bat priv with all the soft interface information
|
||||
+ */
|
||||
+static void batadv_iv_init_sel_class(struct batadv_priv *bat_priv)
|
||||
+{
|
||||
+ /* set default TQ difference threshold to 20 */
|
||||
+ atomic_set(&bat_priv->gw.sel_class, 20);
|
||||
+}
|
||||
+
|
||||
static struct batadv_gw_node *
|
||||
batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv)
|
||||
{
|
||||
@@ -2823,6 +2833,7 @@ static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
|
||||
.del_if = batadv_iv_ogm_orig_del_if,
|
||||
},
|
||||
.gw = {
|
||||
+ .init_sel_class = batadv_iv_init_sel_class,
|
||||
.get_best_gw_node = batadv_iv_gw_get_best_gw_node,
|
||||
.is_eligible = batadv_iv_gw_is_eligible,
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
|
||||
index 2ac612d7bab4d0b4035c9e476dab17536349dca3..2e2471ca84e392faac7fd6537bf137161e27542a 100644
|
||||
--- a/net/batman-adv/bat_v.c
|
||||
+++ b/net/batman-adv/bat_v.c
|
||||
@@ -668,6 +668,16 @@ err_ifinfo1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_v_init_sel_class - initialize GW selection class
|
||||
+ * @bat_priv: the bat priv with all the soft interface information
|
||||
+ */
|
||||
+static void batadv_v_init_sel_class(struct batadv_priv *bat_priv)
|
||||
+{
|
||||
+ /* set default throughput difference threshold to 5Mbps */
|
||||
+ atomic_set(&bat_priv->gw.sel_class, 50);
|
||||
+}
|
||||
+
|
||||
static ssize_t batadv_v_store_sel_class(struct batadv_priv *bat_priv,
|
||||
char *buff, size_t count)
|
||||
{
|
||||
@@ -1052,6 +1062,7 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = {
|
||||
.dump = batadv_v_orig_dump,
|
||||
},
|
||||
.gw = {
|
||||
+ .init_sel_class = batadv_v_init_sel_class,
|
||||
.store_sel_class = batadv_v_store_sel_class,
|
||||
.show_sel_class = batadv_v_show_sel_class,
|
||||
.get_best_gw_node = batadv_v_gw_get_best_gw_node,
|
||||
@@ -1092,9 +1103,6 @@ int batadv_v_mesh_init(struct batadv_priv *bat_priv)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
- /* set default throughput difference threshold to 5Mbps */
|
||||
- atomic_set(&bat_priv->gw.sel_class, 50);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/net/batman-adv/gateway_common.c b/net/batman-adv/gateway_common.c
|
||||
index 21184810d89f69e372673aff221a74382945491d..3e3f91ab694fb8e61ecb4df356e72334b56e0fbe 100644
|
||||
--- a/net/batman-adv/gateway_common.c
|
||||
+++ b/net/batman-adv/gateway_common.c
|
||||
@@ -253,6 +253,11 @@ static void batadv_gw_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
|
||||
*/
|
||||
void batadv_gw_init(struct batadv_priv *bat_priv)
|
||||
{
|
||||
+ if (bat_priv->algo_ops->gw.init_sel_class)
|
||||
+ bat_priv->algo_ops->gw.init_sel_class(bat_priv);
|
||||
+ else
|
||||
+ atomic_set(&bat_priv->gw.sel_class, 1);
|
||||
+
|
||||
batadv_tvlv_handler_register(bat_priv, batadv_gw_tvlv_ogm_handler_v1,
|
||||
NULL, BATADV_TVLV_GW, 1,
|
||||
BATADV_TVLV_HANDLER_OGM_CIFNOTFND);
|
||||
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
|
||||
index 4e447bf17332c191dda694b9b3e49e06073814fc..08432b14386a53c771c54b9eb38893d94c6f9b53 100644
|
||||
--- a/net/batman-adv/soft-interface.c
|
||||
+++ b/net/batman-adv/soft-interface.c
|
||||
@@ -821,7 +821,6 @@ static int batadv_softif_init_late(struct net_device *dev)
|
||||
atomic_set(&bat_priv->mcast.num_want_all_ipv6, 0);
|
||||
#endif
|
||||
atomic_set(&bat_priv->gw.mode, BATADV_GW_MODE_OFF);
|
||||
- atomic_set(&bat_priv->gw.sel_class, 20);
|
||||
atomic_set(&bat_priv->gw.bandwidth_down, 100);
|
||||
atomic_set(&bat_priv->gw.bandwidth_up, 20);
|
||||
atomic_set(&bat_priv->orig_interval, 1000);
|
||||
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
||||
index e913aee28c98bf77cdd7fe92496fa4b188ff9604..5137d859694c28f60cad33325127617c047412ff 100644
|
||||
--- a/net/batman-adv/types.h
|
||||
+++ b/net/batman-adv/types.h
|
||||
@@ -1489,6 +1489,7 @@ struct batadv_algo_orig_ops {
|
||||
|
||||
/**
|
||||
* struct batadv_algo_gw_ops - mesh algorithm callbacks (GW specific)
|
||||
+ * @init_sel_class: initialize GW selection class (optional)
|
||||
* @store_sel_class: parse and stores a new GW selection class (optional)
|
||||
* @show_sel_class: prints the current GW selection class (optional)
|
||||
* @get_best_gw_node: select the best GW from the list of available nodes
|
||||
@@ -1499,6 +1500,7 @@ struct batadv_algo_orig_ops {
|
||||
* @dump: dump gateways to a netlink socket (optional)
|
||||
*/
|
||||
struct batadv_algo_gw_ops {
|
||||
+ void (*init_sel_class)(struct batadv_priv *bat_priv);
|
||||
ssize_t (*store_sel_class)(struct batadv_priv *bat_priv, char *buff,
|
||||
size_t count);
|
||||
ssize_t (*show_sel_class)(struct batadv_priv *bat_priv, char *buff);
|
|
@ -0,0 +1,137 @@
|
|||
From: Andreas Pape <APape@phoenixcontact.com>
|
||||
Date: Mon, 5 Sep 2016 13:20:25 +0200
|
||||
Subject: batman-adv: prevent multiple ARP replies sent by gateways if dat enabled
|
||||
|
||||
If dat is enabled it must be made sure that only the backbone gw which has
|
||||
claimed the remote destination for the ARP request answers the ARP request
|
||||
directly if the MAC address is known due to the local dat table. This
|
||||
prevents multiple ARP replies in a common backbone if more than one
|
||||
gateway already knows the remote mac searched for in the ARP request.
|
||||
|
||||
Signed-off-by: Andreas Pape <apape@phoenixcontact.com>
|
||||
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
[sven@narfation.org: fix conflicts with current version]
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0c794961bc0d32386cffdc6d41c5ee21d9638e5b
|
||||
|
||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
||||
index e7f690b571ea9be8ace25843d6e187a907486b99..41ab4a67a07b264bccdc5bccf73920909ff35c40 100644
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -2450,3 +2450,52 @@ out:
|
||||
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+#ifdef CONFIG_BATMAN_ADV_DAT
|
||||
+/**
|
||||
+ * batadv_bla_check_claim - check if address is claimed
|
||||
+ *
|
||||
+ * @bat_priv: the bat priv with all the soft interface information
|
||||
+ * @addr: mac address of which the claim status is checked
|
||||
+ * @vid: the VLAN ID
|
||||
+ *
|
||||
+ * addr is checked if this address is claimed by the local device itself.
|
||||
+ *
|
||||
+ * Return: true if bla is disabled or the mac is claimed by the device,
|
||||
+ * false if the device addr is already claimed by another gateway
|
||||
+ */
|
||||
+bool batadv_bla_check_claim(struct batadv_priv *bat_priv,
|
||||
+ u8 *addr, unsigned short vid)
|
||||
+{
|
||||
+ struct batadv_bla_claim search_claim;
|
||||
+ struct batadv_bla_claim *claim = NULL;
|
||||
+ struct batadv_hard_iface *primary_if = NULL;
|
||||
+ bool ret = true;
|
||||
+
|
||||
+ if (!atomic_read(&bat_priv->bridge_loop_avoidance))
|
||||
+ return ret;
|
||||
+
|
||||
+ primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
+ if (!primary_if)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* First look if the mac address is claimed */
|
||||
+ ether_addr_copy(search_claim.addr, addr);
|
||||
+ search_claim.vid = vid;
|
||||
+
|
||||
+ claim = batadv_claim_hash_find(bat_priv, &search_claim);
|
||||
+
|
||||
+ /* If there is a claim and we are not owner of the claim,
|
||||
+ * return false.
|
||||
+ */
|
||||
+ if (claim) {
|
||||
+ if (!batadv_compare_eth(claim->backbone_gw->orig,
|
||||
+ primary_if->net_dev->dev_addr))
|
||||
+ ret = false;
|
||||
+ batadv_claim_put(claim);
|
||||
+ }
|
||||
+
|
||||
+ batadv_hardif_put(primary_if);
|
||||
+ return ret;
|
||||
+}
|
||||
+#endif
|
||||
diff --git a/net/batman-adv/bridge_loop_avoidance.h b/net/batman-adv/bridge_loop_avoidance.h
|
||||
index 2827cd3c13d2a35a3b296340a0aa123dbd032926..133227c578e73fb998b540fdf361472a21e0c602 100644
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.h
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.h
|
||||
@@ -69,6 +69,10 @@ void batadv_bla_status_update(struct net_device *net_dev);
|
||||
int batadv_bla_init(struct batadv_priv *bat_priv);
|
||||
void batadv_bla_free(struct batadv_priv *bat_priv);
|
||||
int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
+#ifdef CONFIG_BATMAN_ADV_DAT
|
||||
+bool batadv_bla_check_claim(struct batadv_priv *bat_priv, u8 *addr,
|
||||
+ unsigned short vid);
|
||||
+#endif
|
||||
#define BATADV_BLA_CRC_INIT 0
|
||||
#else /* ifdef CONFIG_BATMAN_ADV_BLA */
|
||||
|
||||
@@ -145,6 +149,13 @@ static inline int batadv_bla_backbone_dump(struct sk_buff *msg,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
+static inline
|
||||
+bool batadv_bla_check_claim(struct batadv_priv *bat_priv, u8 *addr,
|
||||
+ unsigned short vid)
|
||||
+{
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
#endif /* ifdef CONFIG_BATMAN_ADV_BLA */
|
||||
|
||||
#endif /* ifndef _NET_BATMAN_ADV_BLA_H_ */
|
||||
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
|
||||
index 3641765d55df049a5dbac35d322ebc537a0f0322..4cfc9672507ba718d975a2f869bb89fc38e0d934 100644
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -43,6 +43,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <net/arp.h>
|
||||
|
||||
+#include "bridge_loop_avoidance.h"
|
||||
#include "hard-interface.h"
|
||||
#include "hash.h"
|
||||
#include "log.h"
|
||||
@@ -1041,6 +1042,20 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ /* If BLA is enabled, only send ARP replies if we have claimed
|
||||
+ * the destination for the ARP request or if no one else of
|
||||
+ * the backbone gws belonging to our backbone has claimed the
|
||||
+ * destination.
|
||||
+ */
|
||||
+ if (!batadv_bla_check_claim(bat_priv,
|
||||
+ dat_entry->mac_addr, vid)) {
|
||||
+ batadv_dbg(BATADV_DBG_DAT, bat_priv,
|
||||
+ "Device %pM claimed by another backbone gw. Don't send ARP reply!",
|
||||
+ dat_entry->mac_addr);
|
||||
+ ret = true;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
skb_new = batadv_dat_arp_create_reply(bat_priv, ip_dst, ip_src,
|
||||
dat_entry->mac_addr,
|
||||
hw_src, vid);
|
|
@ -0,0 +1,88 @@
|
|||
From: Andreas Pape <APape@phoenixcontact.com>
|
||||
Date: Mon, 5 Sep 2016 13:20:26 +0200
|
||||
Subject: batman-adv: prevent duplication of ARP replies when DAT is used
|
||||
|
||||
If none of the backbone gateways in a bla setup has already knowledge of
|
||||
the mac address searched for in an incoming ARP request from the backbone
|
||||
an address resolution via the DHT of DAT is started. The gateway can send
|
||||
several ARP requests to different DHT nodes and therefore can get several
|
||||
replies. This patch assures that not all of the possible ARP replies are
|
||||
returned to the backbone by checking the local DAT cache of the gateway.
|
||||
If there is an entry in the local cache the gateway has already learned
|
||||
the requested address and there is no need to forward the additional reply
|
||||
to the backbone.
|
||||
Furthermore it is checked if this gateway has claimed the source of the ARP
|
||||
reply and only forwards it to the backbone if it has claimed the source or
|
||||
if there is no claim at all.
|
||||
|
||||
Signed-off-by: Andreas Pape <apape@phoenixcontact.com>
|
||||
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
[sven@narfation.org: fix conflicts with current version]
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/81e422051cf0403e40615eb306d0ddaaddfee611
|
||||
|
||||
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
|
||||
index 4cfc9672507ba718d975a2f869bb89fc38e0d934..16216532c1d82c09337a9c5e7a4cd5b4ad3ded5d 100644
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -1205,6 +1205,7 @@ void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
|
||||
bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
|
||||
struct sk_buff *skb, int hdr_size)
|
||||
{
|
||||
+ struct batadv_dat_entry *dat_entry = NULL;
|
||||
u16 type;
|
||||
__be32 ip_src, ip_dst;
|
||||
u8 *hw_src, *hw_dst;
|
||||
@@ -1227,12 +1228,41 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
|
||||
hw_dst = batadv_arp_hw_dst(skb, hdr_size);
|
||||
ip_dst = batadv_arp_ip_dst(skb, hdr_size);
|
||||
|
||||
+ /* If ip_dst is already in cache and has the right mac address,
|
||||
+ * drop this frame if this ARP reply is destined for us because it's
|
||||
+ * most probably an ARP reply generated by another node of the DHT.
|
||||
+ * We have most probably received already a reply earlier. Delivering
|
||||
+ * this frame would lead to doubled receive of an ARP reply.
|
||||
+ */
|
||||
+ dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_src, vid);
|
||||
+ if (dat_entry && batadv_compare_eth(hw_src, dat_entry->mac_addr)) {
|
||||
+ batadv_dbg(BATADV_DBG_DAT, bat_priv, "Doubled ARP reply removed: ARP MSG = [src: %pM-%pI4 dst: %pM-%pI4]; dat_entry: %pM-%pI4\n",
|
||||
+ hw_src, &ip_src, hw_dst, &ip_dst,
|
||||
+ dat_entry->mac_addr, &dat_entry->ip);
|
||||
+ dropped = true;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
/* Update our internal cache with both the IP addresses the node got
|
||||
* within the ARP reply
|
||||
*/
|
||||
batadv_dat_entry_add(bat_priv, ip_src, hw_src, vid);
|
||||
batadv_dat_entry_add(bat_priv, ip_dst, hw_dst, vid);
|
||||
|
||||
+ /* If BLA is enabled, only forward ARP replies if we have claimed the
|
||||
+ * source of the ARP reply or if no one else of the same backbone has
|
||||
+ * already claimed that client. This prevents that different gateways
|
||||
+ * to the same backbone all forward the ARP reply leading to multiple
|
||||
+ * replies in the backbone.
|
||||
+ */
|
||||
+ if (!batadv_bla_check_claim(bat_priv, hw_src, vid)) {
|
||||
+ batadv_dbg(BATADV_DBG_DAT, bat_priv,
|
||||
+ "Device %pM claimed by another backbone gw. Drop ARP reply.\n",
|
||||
+ hw_src);
|
||||
+ dropped = true;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
/* if this REPLY is directed to a client of mine, let's deliver the
|
||||
* packet to the interface
|
||||
*/
|
||||
@@ -1245,6 +1275,8 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
|
||||
out:
|
||||
if (dropped)
|
||||
kfree_skb(skb);
|
||||
+ if (dat_entry)
|
||||
+ batadv_dat_entry_put(dat_entry);
|
||||
/* if dropped == false -> deliver to the interface */
|
||||
return dropped;
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
From: Andreas Pape <APape@phoenixcontact.com>
|
||||
Date: Mon, 5 Sep 2016 13:20:27 +0200
|
||||
Subject: batman-adv: drop unicast packets from other backbone gw
|
||||
|
||||
Additional dropping of unicast packets received from another backbone gw if
|
||||
the same backbone network before being forwarded to the same backbone again
|
||||
is necessary. It was observed in a test setup that in rare cases these
|
||||
frames lead to looping unicast traffic backbone->mesh->backbone.
|
||||
|
||||
Signed-off-by: Andreas Pape <apape@phoenixcontact.com>
|
||||
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
[sven@narfation.org: fix conflicts with current version]
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/bfe2a1971f43ef540ef0440d319542fa7d41d81f
|
||||
|
||||
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
|
||||
index 6b08b26da4d94be9c8c5e9dc708ddc18d8282428..5190683424b89d1fa7c86895000bc6656e6a65dd 100644
|
||||
--- a/net/batman-adv/routing.c
|
||||
+++ b/net/batman-adv/routing.c
|
||||
@@ -942,15 +942,17 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||
struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
|
||||
struct batadv_unicast_packet *unicast_packet;
|
||||
struct batadv_unicast_4addr_packet *unicast_4addr_packet;
|
||||
- u8 *orig_addr;
|
||||
- struct batadv_orig_node *orig_node = NULL;
|
||||
+ u8 *orig_addr, *orig_addr_gw;
|
||||
+ struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL;
|
||||
int check, hdr_size = sizeof(*unicast_packet);
|
||||
enum batadv_subtype subtype;
|
||||
- bool is4addr;
|
||||
+ struct ethhdr *ethhdr;
|
||||
int ret = NET_RX_DROP;
|
||||
+ bool is4addr, is_gw;
|
||||
|
||||
unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
||||
unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
|
||||
+ ethhdr = eth_hdr(skb);
|
||||
|
||||
is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
|
||||
/* the caller function should have already pulled 2 bytes */
|
||||
@@ -973,6 +975,23 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||
|
||||
/* packet for me */
|
||||
if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
|
||||
+ /* If this is a unicast packet from another backgone gw,
|
||||
+ * drop it.
|
||||
+ */
|
||||
+ orig_addr_gw = ethhdr->h_source;
|
||||
+ orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw);
|
||||
+ if (orig_node_gw) {
|
||||
+ is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw,
|
||||
+ hdr_size);
|
||||
+ batadv_orig_node_put(orig_node_gw);
|
||||
+ if (is_gw) {
|
||||
+ batadv_dbg(BATADV_DBG_BLA, bat_priv,
|
||||
+ "Dropped unicast pkt received from another backbone gw %pM.\n",
|
||||
+ orig_addr_gw);
|
||||
+ return NET_RX_DROP;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (is4addr) {
|
||||
subtype = unicast_4addr_packet->subtype;
|
||||
batadv_dat_inc_counter(bat_priv, subtype);
|
|
@ -0,0 +1,30 @@
|
|||
From: Andreas Pape <apape@phoenixcontact.com>
|
||||
Date: Fri, 19 May 2017 10:01:42 +0200
|
||||
Subject: batman-adv: fix memory leak when dropping packet from other gateway
|
||||
|
||||
The skb must be released in the receive handler since b91a2543b4c1
|
||||
("batman-adv: Consume skb in receive handlers"). Just returning NET_RX_DROP
|
||||
will no longer automatically free the memory. This results in memory leaks
|
||||
when unicast packets from other backbones must be dropped because they
|
||||
share a common backbone.
|
||||
|
||||
Fixes: bfe2a1971f43 ("batman-adv: drop unicast packets from other backbone gw")
|
||||
Signed-off-by: Andreas Pape <apape@phoenixcontact.com>
|
||||
[sven@narfation.org: adjust commit message]
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/a58feb79ed1447e3e83f3b0b1a23779886869f39
|
||||
|
||||
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
|
||||
index 5190683424b89d1fa7c86895000bc6656e6a65dd..213cc01ad00392f7cbd4efd9d4796f76691d2d9e 100644
|
||||
--- a/net/batman-adv/routing.c
|
||||
+++ b/net/batman-adv/routing.c
|
||||
@@ -988,7 +988,7 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||
batadv_dbg(BATADV_DBG_BLA, bat_priv,
|
||||
"Dropped unicast pkt received from another backbone gw %pM.\n",
|
||||
orig_addr_gw);
|
||||
- return NET_RX_DROP;
|
||||
+ goto free_skb;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
From: Andreas Pape <APape@phoenixcontact.com>
|
||||
Date: Mon, 5 Sep 2016 13:20:29 +0200
|
||||
Subject: batman-adv: handle race condition for claims between gateways
|
||||
|
||||
Consider the following situation which has been found in a test setup:
|
||||
Gateway B has claimed client C and gateway A has the same backbone
|
||||
network as B. C sends a broad- or multicast to B and directly after
|
||||
this packet decides to send another packet to A due to a better TQ
|
||||
value. B will forward the broad-/multicast into the backbone as it is
|
||||
the responsible gw and after that A will claim C as it has been
|
||||
chosen by C as the best gateway. If it now happens that A claims C
|
||||
before it has received the broad-/multicast forwarded by B (due to
|
||||
backbone topology or due to some delay in B when forwarding the
|
||||
packet) we get a critical situation: in the current code A will
|
||||
immediately unclaim C when receiving the multicast due to the
|
||||
roaming client scenario although the position of C has not changed
|
||||
in the mesh. If this happens the multi-/broadcast forwarded by B
|
||||
will be sent back into the mesh by A and we have looping packets
|
||||
until one of the gateways claims C again.
|
||||
In order to prevent this, unclaiming of a client due to the roaming
|
||||
client scenario is only done after a certain time is expired after
|
||||
the last claim of the client. 100 ms are used here, which should be
|
||||
slow enough for big backbones and slow gateways but fast enough not
|
||||
to break the roaming client use case.
|
||||
|
||||
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
Signed-off-by: Andreas Pape <apape@phoenixcontact.com>
|
||||
[sven@narfation.org: fix conflicts with current version]
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/cbb2ccc101e220b339989d5a51c0ca226ceda792
|
||||
|
||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
||||
index 41ab4a67a07b264bccdc5bccf73920909ff35c40..1e6e5d4468ad50c221ea5a0d436678d16c5e154f 100644
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -1964,10 +1964,22 @@ bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
/* if yes, the client has roamed and we have
|
||||
* to unclaim it.
|
||||
*/
|
||||
- batadv_handle_unclaim(bat_priv, primary_if,
|
||||
- primary_if->net_dev->dev_addr,
|
||||
- ethhdr->h_source, vid);
|
||||
- goto allow;
|
||||
+ if (batadv_has_timed_out(claim->lasttime, 100)) {
|
||||
+ /* only unclaim if the last claim entry is
|
||||
+ * older than 100 ms to make sure we really
|
||||
+ * have a roaming client here.
|
||||
+ */
|
||||
+ batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla_tx(): Roaming client %pM detected. Unclaim it.\n",
|
||||
+ ethhdr->h_source);
|
||||
+ batadv_handle_unclaim(bat_priv, primary_if,
|
||||
+ primary_if->net_dev->dev_addr,
|
||||
+ ethhdr->h_source, vid);
|
||||
+ goto allow;
|
||||
+ } else {
|
||||
+ batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla_tx(): Race for claim %pM detected. Drop packet.\n",
|
||||
+ ethhdr->h_source);
|
||||
+ goto handled;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* check if it is a multicast/broadcast frame */
|
|
@ -0,0 +1,33 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 5 Apr 2017 16:26:17 +0200
|
||||
Subject: batman-adv: Fix rx packet/bytes stats on local ARP reply
|
||||
|
||||
The stats are generated by batadv_interface_stats and must not be stored
|
||||
directly in the net_device stats member variable. The batadv_priv
|
||||
bat_counters information is assembled when ndo_get_stats is called. The
|
||||
stats previously stored in net_device::stats is then overwritten.
|
||||
|
||||
The batman-adv counters must therefore be increased when an ARP packet is
|
||||
answered locally via the distributed arp table.
|
||||
|
||||
Fixes: 75ca71d858f5 ("batman-adv: Distributed ARP Table - add snooping functions for ARP messages")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/426ddde4ffe0c7345d1a7409bf899f89ddea26d3
|
||||
|
||||
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
|
||||
index 16216532c1d82c09337a9c5e7a4cd5b4ad3ded5d..4d982e63a3ab269e3d3b1e7a9d5f205638051603 100644
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -1064,8 +1064,9 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
|
||||
|
||||
skb_new->protocol = eth_type_trans(skb_new,
|
||||
bat_priv->soft_iface);
|
||||
- bat_priv->stats.rx_packets++;
|
||||
- bat_priv->stats.rx_bytes += skb->len + ETH_HLEN + hdr_size;
|
||||
+ batadv_inc_counter(bat_priv, BATADV_CNT_RX);
|
||||
+ batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
|
||||
+ skb->len + ETH_HLEN + hdr_size);
|
||||
bat_priv->soft_iface->last_rx = jiffies;
|
||||
|
||||
netif_rx(skb_new);
|
|
@ -0,0 +1,32 @@
|
|||
From: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
Date: Thu, 1 Jun 2017 17:11:24 +0200
|
||||
Subject: batman-adv: do not add loop detection mac addresses to global tt
|
||||
|
||||
This change has been made for local TT already, add another one for
|
||||
global TT - but only for temporary entries (aka speedy join), to prevent
|
||||
inconsistencies between local and global tables in case an older
|
||||
batman-adv version is still announcing those entries from its local
|
||||
table.
|
||||
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/1f1b6c0d96129e6445652061d93a7fb1f0476fa3
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 30ecbfb40adfa6f9f1c777fc93e42df8c39e4581..199da2abe6ab92161ab66faa01fa3d06aeb68c89 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -4012,6 +4012,12 @@ bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv,
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
+ /* ignore loop detect macs, they are not supposed to be in the tt local
|
||||
+ * data as well.
|
||||
+ */
|
||||
+ if (batadv_bla_is_loopdetect_mac(addr))
|
||||
+ return false;
|
||||
+
|
||||
if (!batadv_tt_global_add(bat_priv, orig_node, addr, vid,
|
||||
BATADV_TT_CLIENT_TEMP,
|
||||
atomic_read(&orig_node->last_ttvn)))
|
|
@ -0,0 +1,32 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 9 Jun 2017 17:06:50 +0200
|
||||
Subject: batman-adv: Use default throughput value on cfg80211 error
|
||||
|
||||
A wifi interface should never be handled like an ethernet devices. The
|
||||
parser of the cfg80211 output must therefore skip the ethtool code when
|
||||
cfg80211_get_station returned an error.
|
||||
|
||||
Fixes: 01b1fe819ee0 ("batman-adv: refactor wifi interface detection")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Reviewed-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/76ef29071b0050f972a626747d034a494a7195d7
|
||||
|
||||
diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
|
||||
index f2fb2f05b6bf280d2b5fae26ed10288f73345f16..7c54a9291c9eaed75dfdfdfbd200f84c51576cb3 100644
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -109,8 +109,10 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
- if (!ret)
|
||||
- return sinfo.expected_throughput / 100;
|
||||
+ if (ret)
|
||||
+ goto default_throughput;
|
||||
+
|
||||
+ return sinfo.expected_throughput / 100;
|
||||
}
|
||||
|
||||
/* if not a wifi interface, check if this device provides data via
|
|
@ -0,0 +1,91 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 9 Jun 2017 17:06:51 +0200
|
||||
Subject: batman-adv: Accept only filled wifi station info
|
||||
|
||||
The wifi driver can decide to not provide parts of the station info. For
|
||||
example, the expected throughput of the station can be omitted when the
|
||||
used rate control doesn't provide this kind of information.
|
||||
|
||||
The B.A.T.M.A.N. V implementation must therefore check the filled bitfield
|
||||
before it tries to access the expected_throughput of the returned
|
||||
station_info.
|
||||
|
||||
Reported-by: Alvaro Antelo <alvaro.antelo@gmail.com>
|
||||
Fixes: 5c3245172c01 ("batman-adv: ELP - compute the metric based on the estimated throughput")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Reviewed-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/1e26904b364ceffe9ca7d6da7412e70fb2a04178
|
||||
|
||||
diff --git a/compat-include/linux/nl80211.h b/compat-include/linux/nl80211.h
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..e6654df8cd67caa52a16a1f709141d7415b9f523
|
||||
--- /dev/null
|
||||
+++ b/compat-include/linux/nl80211.h
|
||||
@@ -0,0 +1,14 @@
|
||||
+#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_NL80211_H_
|
||||
+#define _NET_BATMAN_ADV_COMPAT_LINUX_NL80211_H_
|
||||
+
|
||||
+#include <linux/version.h>
|
||||
+#include_next <linux/nl80211.h>
|
||||
+
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)
|
||||
+
|
||||
+/* Linux 3.15 misses the uapi include.... */
|
||||
+#include <uapi/linux/nl80211.h>
|
||||
+
|
||||
+#endif /* < KERNEL_VERSION(3, 16, 0) */
|
||||
+
|
||||
+#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_NL80211_H_ */
|
||||
diff --git a/compat-include/uapi/linux/nl80211.h b/compat-include/uapi/linux/nl80211.h
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..06f5625af21360be5718a1a6f7e8949f6739c927
|
||||
--- /dev/null
|
||||
+++ b/compat-include/uapi/linux/nl80211.h
|
||||
@@ -0,0 +1,16 @@
|
||||
+#ifndef _NET_BATMAN_ADV_COMPAT_UAPI_LINUX_NL80211_H_
|
||||
+#define _NET_BATMAN_ADV_COMPAT_UAPI_LINUX_NL80211_H_
|
||||
+
|
||||
+#include <linux/version.h>
|
||||
+#include_next <uapi/linux/nl80211.h>
|
||||
+
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
|
||||
+
|
||||
+/* for batadv_v_elp_get_throughput which would have used
|
||||
+ * STATION_INFO_EXPECTED_THROUGHPUT in Linux 4.0.0
|
||||
+ */
|
||||
+#define NL80211_STA_INFO_EXPECTED_THROUGHPUT 28
|
||||
+
|
||||
+#endif /* < KERNEL_VERSION(4, 0, 0) */
|
||||
+
|
||||
+#endif /* _NET_BATMAN_ADV_COMPAT_UAPI_LINUX_NL80211_H_ */
|
||||
diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
|
||||
index 7c54a9291c9eaed75dfdfdfbd200f84c51576cb3..06b2924f4cb7dde54bab97ad2d28aecd9b1a4ceb 100644
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
+#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
@@ -29,6 +30,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/netdevice.h>
|
||||
+#include <linux/nl80211.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
@@ -111,6 +113,8 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)
|
||||
}
|
||||
if (ret)
|
||||
goto default_throughput;
|
||||
+ if (!(sinfo.filled & BIT(NL80211_STA_INFO_EXPECTED_THROUGHPUT)))
|
||||
+ goto default_throughput;
|
||||
|
||||
return sinfo.expected_throughput / 100;
|
||||
}
|
|
@ -0,0 +1,205 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Thu, 6 Jul 2017 07:02:25 +0200
|
||||
Subject: batman-adv: fix TT sync flag inconsistencies
|
||||
|
||||
This patch fixes an issue in the translation table code potentially
|
||||
leading to a TT Request + Response storm. The issue may occur for nodes
|
||||
involving BLA and an inconsistent configuration of the batman-adv AP
|
||||
isolation feature. However, since the new multicast optimizations, a
|
||||
single, malformed packet may lead to a mesh-wide, persistent
|
||||
Denial-of-Service, too.
|
||||
|
||||
The issue occurs because nodes are currently OR-ing the TT sync flags of
|
||||
all originators announcing a specific MAC address via the
|
||||
translation table. When an intermediate node now receives a TT Request
|
||||
and wants to answer this on behalf of the destination node, then this
|
||||
intermediate node now responds with an altered flag field and broken
|
||||
CRC. The next OGM of the real destination will lead to a CRC mismatch
|
||||
and triggering a TT Request and Response again.
|
||||
|
||||
Furthermore, the OR-ing is currently never undone as long as at least
|
||||
one originator announcing the according MAC address remains, leading to
|
||||
the potential persistency of this issue.
|
||||
|
||||
This patch fixes this issue by storing the flags used in the CRC
|
||||
calculation on a a per TT orig entry basis to be able to respond with
|
||||
the correct, original flags in an intermediate TT Response for one
|
||||
thing. And to be able to correctly unset sync flags once all nodes
|
||||
announcing a sync flag vanish for another.
|
||||
|
||||
Fixes: fa614fd04692 ("batman-adv: fix tt_global_entries flags update")
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Acked-by: Antonio Quartulli <a@unstable.cc>
|
||||
[sw: typo in commit message]
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/382d020fe3fa528b1f65f8107df8fc023eb8cacb
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 199da2abe6ab92161ab66faa01fa3d06aeb68c89..a64003b824e0d0b05f0a9e44ccc32ba0cb3018fc 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -1549,9 +1549,41 @@ batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
|
||||
return found;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_tt_global_sync_flags - update TT sync flags
|
||||
+ * @tt_global: the TT global entry to update sync flags in
|
||||
+ *
|
||||
+ * Updates the sync flag bits in the tt_global flag attribute with a logical
|
||||
+ * OR of all sync flags from any of its TT orig entries.
|
||||
+ */
|
||||
+static void
|
||||
+batadv_tt_global_sync_flags(struct batadv_tt_global_entry *tt_global)
|
||||
+{
|
||||
+ struct batadv_tt_orig_list_entry *orig_entry;
|
||||
+ const struct hlist_head *head;
|
||||
+ u16 flags = BATADV_NO_FLAGS;
|
||||
+
|
||||
+ rcu_read_lock();
|
||||
+ head = &tt_global->orig_list;
|
||||
+ hlist_for_each_entry_rcu(orig_entry, head, list)
|
||||
+ flags |= orig_entry->flags;
|
||||
+ rcu_read_unlock();
|
||||
+
|
||||
+ flags |= tt_global->common.flags & (~BATADV_TT_SYNC_MASK);
|
||||
+ tt_global->common.flags = flags;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * batadv_tt_global_orig_entry_add - add or update a TT orig entry
|
||||
+ * @tt_global: the TT global entry to add an orig entry in
|
||||
+ * @orig_node: the originator to add an orig entry for
|
||||
+ * @ttvn: translation table version number of this changeset
|
||||
+ * @flags: TT sync flags
|
||||
+ */
|
||||
static void
|
||||
batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
|
||||
- struct batadv_orig_node *orig_node, int ttvn)
|
||||
+ struct batadv_orig_node *orig_node, int ttvn,
|
||||
+ u8 flags)
|
||||
{
|
||||
struct batadv_tt_orig_list_entry *orig_entry;
|
||||
|
||||
@@ -1561,7 +1593,8 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
|
||||
* was added during a "temporary client detection"
|
||||
*/
|
||||
orig_entry->ttvn = ttvn;
|
||||
- goto out;
|
||||
+ orig_entry->flags = flags;
|
||||
+ goto sync_flags;
|
||||
}
|
||||
|
||||
orig_entry = kmem_cache_zalloc(batadv_tt_orig_cache, GFP_ATOMIC);
|
||||
@@ -1573,6 +1606,7 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
|
||||
batadv_tt_global_size_inc(orig_node, tt_global->common.vid);
|
||||
orig_entry->orig_node = orig_node;
|
||||
orig_entry->ttvn = ttvn;
|
||||
+ orig_entry->flags = flags;
|
||||
kref_init(&orig_entry->refcount);
|
||||
|
||||
spin_lock_bh(&tt_global->list_lock);
|
||||
@@ -1582,6 +1616,8 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
|
||||
spin_unlock_bh(&tt_global->list_lock);
|
||||
atomic_inc(&tt_global->orig_list_count);
|
||||
|
||||
+sync_flags:
|
||||
+ batadv_tt_global_sync_flags(tt_global);
|
||||
out:
|
||||
if (orig_entry)
|
||||
batadv_tt_orig_list_entry_put(orig_entry);
|
||||
@@ -1703,10 +1739,10 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
}
|
||||
|
||||
/* the change can carry possible "attribute" flags like the
|
||||
- * TT_CLIENT_WIFI, therefore they have to be copied in the
|
||||
+ * TT_CLIENT_TEMP, therefore they have to be copied in the
|
||||
* client entry
|
||||
*/
|
||||
- common->flags |= flags;
|
||||
+ common->flags |= flags & (~BATADV_TT_SYNC_MASK);
|
||||
|
||||
/* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
|
||||
* one originator left in the list and we previously received a
|
||||
@@ -1723,7 +1759,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
}
|
||||
add_orig_entry:
|
||||
/* add the new orig_entry (if needed) or update it */
|
||||
- batadv_tt_global_orig_entry_add(tt_global_entry, orig_node, ttvn);
|
||||
+ batadv_tt_global_orig_entry_add(tt_global_entry, orig_node, ttvn,
|
||||
+ flags & BATADV_TT_SYNC_MASK);
|
||||
|
||||
batadv_dbg(BATADV_DBG_TT, bat_priv,
|
||||
"Creating new global tt entry: %pM (vid: %d, via %pM)\n",
|
||||
@@ -1946,6 +1983,7 @@ batadv_tt_global_dump_subentry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
struct batadv_tt_orig_list_entry *orig,
|
||||
bool best)
|
||||
{
|
||||
+ u16 flags = (common->flags & (~BATADV_TT_SYNC_MASK)) | orig->flags;
|
||||
void *hdr;
|
||||
struct batadv_orig_node_vlan *vlan;
|
||||
u8 last_ttvn;
|
||||
@@ -1975,7 +2013,7 @@ batadv_tt_global_dump_subentry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
nla_put_u8(msg, BATADV_ATTR_TT_LAST_TTVN, last_ttvn) ||
|
||||
nla_put_u32(msg, BATADV_ATTR_TT_CRC32, crc) ||
|
||||
nla_put_u16(msg, BATADV_ATTR_TT_VID, common->vid) ||
|
||||
- nla_put_u32(msg, BATADV_ATTR_TT_FLAGS, common->flags))
|
||||
+ nla_put_u32(msg, BATADV_ATTR_TT_FLAGS, flags))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (best && nla_put_flag(msg, BATADV_ATTR_FLAG_BEST))
|
||||
@@ -2589,6 +2627,7 @@ static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
|
||||
unsigned short vid)
|
||||
{
|
||||
struct batadv_hashtable *hash = bat_priv->tt.global_hash;
|
||||
+ struct batadv_tt_orig_list_entry *tt_orig;
|
||||
struct batadv_tt_common_entry *tt_common;
|
||||
struct batadv_tt_global_entry *tt_global;
|
||||
struct hlist_head *head;
|
||||
@@ -2627,8 +2666,9 @@ static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
|
||||
/* find out if this global entry is announced by this
|
||||
* originator
|
||||
*/
|
||||
- if (!batadv_tt_global_entry_has_orig(tt_global,
|
||||
- orig_node))
|
||||
+ tt_orig = batadv_tt_global_orig_entry_find(tt_global,
|
||||
+ orig_node);
|
||||
+ if (!tt_orig)
|
||||
continue;
|
||||
|
||||
/* use network order to read the VID: this ensures that
|
||||
@@ -2640,10 +2680,12 @@ static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
|
||||
/* compute the CRC on flags that have to be kept in sync
|
||||
* among nodes
|
||||
*/
|
||||
- flags = tt_common->flags & BATADV_TT_SYNC_MASK;
|
||||
+ flags = tt_orig->flags;
|
||||
crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags));
|
||||
|
||||
crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
|
||||
+
|
||||
+ batadv_tt_orig_list_entry_put(tt_orig);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
||||
index 5137d859694c28f60cad33325127617c047412ff..7c928938b22dcae681294700252c0ae74378f999 100644
|
||||
--- a/net/batman-adv/types.h
|
||||
+++ b/net/batman-adv/types.h
|
||||
@@ -1262,6 +1262,7 @@ struct batadv_tt_global_entry {
|
||||
* struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client
|
||||
* @orig_node: pointer to orig node announcing this non-mesh client
|
||||
* @ttvn: translation table version number which added the non-mesh client
|
||||
+ * @flags: per orig entry TT sync flags
|
||||
* @list: list node for batadv_tt_global_entry::orig_list
|
||||
* @refcount: number of contexts the object is used
|
||||
* @rcu: struct used for freeing in an RCU-safe manner
|
||||
@@ -1269,6 +1270,7 @@ struct batadv_tt_global_entry {
|
||||
struct batadv_tt_orig_list_entry {
|
||||
struct batadv_orig_node *orig_node;
|
||||
u8 ttvn;
|
||||
+ u8 flags;
|
||||
struct hlist_node list;
|
||||
struct kref refcount;
|
||||
struct rcu_head rcu;
|
|
@ -0,0 +1,53 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Mon, 16 Oct 2017 09:48:03 +0200
|
||||
Subject: batman-adv: Avoid spurious warnings from bat_v neigh_cmp implementation
|
||||
|
||||
The neighbor compare API implementation for B.A.T.M.A.N. V checks whether
|
||||
the neigh_ifinfo for this neighbor on a specific interface exists. A
|
||||
warning is printed when it isn't found.
|
||||
|
||||
But it is not called inside a lock which would prevent that this
|
||||
information is lost right before batadv_neigh_ifinfo_get. It must therefore
|
||||
be expected that batadv_v_neigh_(cmp|is_sob) might not be able to get the
|
||||
requested neigh_ifinfo.
|
||||
|
||||
A WARN_ON for such a situation seems not to be appropriate because this
|
||||
will only flood the kernel logs. The warnings must therefore be removed.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Acked-by: Antonio Quartulli <a@unstable.cc>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0dee8aba4702f82197ed3428ede6b3884fdff5ca
|
||||
|
||||
diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
|
||||
index 2e2471ca84e392faac7fd6537bf137161e27542a..80679f17d40170237ce6ad2d800da96bbef79e37 100644
|
||||
--- a/net/batman-adv/bat_v.c
|
||||
+++ b/net/batman-adv/bat_v.c
|
||||
@@ -623,11 +623,11 @@ static int batadv_v_neigh_cmp(struct batadv_neigh_node *neigh1,
|
||||
int ret = 0;
|
||||
|
||||
ifinfo1 = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
|
||||
- if (WARN_ON(!ifinfo1))
|
||||
+ if (!ifinfo1)
|
||||
goto err_ifinfo1;
|
||||
|
||||
ifinfo2 = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
|
||||
- if (WARN_ON(!ifinfo2))
|
||||
+ if (!ifinfo2)
|
||||
goto err_ifinfo2;
|
||||
|
||||
ret = ifinfo1->bat_v.throughput - ifinfo2->bat_v.throughput;
|
||||
@@ -649,11 +649,11 @@ static bool batadv_v_neigh_is_sob(struct batadv_neigh_node *neigh1,
|
||||
bool ret = false;
|
||||
|
||||
ifinfo1 = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
|
||||
- if (WARN_ON(!ifinfo1))
|
||||
+ if (!ifinfo1)
|
||||
goto err_ifinfo1;
|
||||
|
||||
ifinfo2 = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
|
||||
- if (WARN_ON(!ifinfo2))
|
||||
+ if (!ifinfo2)
|
||||
goto err_ifinfo2;
|
||||
|
||||
threshold = ifinfo1->bat_v.throughput / 4;
|
|
@ -0,0 +1,27 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@open-mesh.com>
|
||||
Date: Wed, 29 Nov 2017 10:25:02 +0100
|
||||
Subject: batman-adv: Always initialize fragment header priority
|
||||
|
||||
The batman-adv unuicast fragment header contains 3 bits for the priority of
|
||||
the packet. These bits will be initialized when the skb->priority contains
|
||||
a value between 256 and 263. But otherwise, the uninitialized bits from the
|
||||
stack will be used.
|
||||
|
||||
Fixes: 4f241fcea704 ("batman-adv: Include frame priority in fragment header")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@open-mesh.com>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/e45a75c82feae23a20d2744ccfde03780ccdafc7
|
||||
|
||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
||||
index 70e512111528b0345889cea4ffd0ad5d984a4e6a..28f54887c975905d03372ab8ba5274fd82117651 100644
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -500,6 +500,8 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
*/
|
||||
if (skb->priority >= 256 && skb->priority <= 263)
|
||||
frag_header.priority = skb->priority - 256;
|
||||
+ else
|
||||
+ frag_header.priority = 0;
|
||||
|
||||
ether_addr_copy(frag_header.orig, primary_if->net_dev->dev_addr);
|
||||
ether_addr_copy(frag_header.dest, orig_node->orig);
|
|
@ -0,0 +1,28 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Wed, 29 Nov 2017 10:50:42 +0100
|
||||
Subject: batman-adv: Fix check of retrieved orig_gw in batadv_v_gw_is_eligible
|
||||
|
||||
The batadv_v_gw_is_eligible function already assumes that orig_node is not
|
||||
NULL. But batadv_gw_node_get may have failed to find the originator. It
|
||||
must therefore be checked whether the batadv_gw_node_get failed and not
|
||||
whether orig_node is NULL to detect this error.
|
||||
|
||||
Fixes: 80b2d47be2c7 ("batman-adv: B.A.T.M.A.N. V - implement GW selection logic")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Acked-by: Antonio Quartulli <a@unstable.cc>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/c7380677d6167f3798d3ea7a4f1a93663f3c7915
|
||||
|
||||
diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
|
||||
index 80679f17d40170237ce6ad2d800da96bbef79e37..2f77e112d4cb4db7b1086715a597ef995054fdc1 100644
|
||||
--- a/net/batman-adv/bat_v.c
|
||||
+++ b/net/batman-adv/bat_v.c
|
||||
@@ -815,7 +815,7 @@ static bool batadv_v_gw_is_eligible(struct batadv_priv *bat_priv,
|
||||
}
|
||||
|
||||
orig_gw = batadv_gw_node_get(bat_priv, orig_node);
|
||||
- if (!orig_node)
|
||||
+ if (!orig_gw)
|
||||
goto out;
|
||||
|
||||
if (batadv_v_gw_throughput_get(orig_gw, &orig_throughput) < 0)
|
|
@ -0,0 +1,39 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sun, 3 Dec 2017 11:26:45 +0100
|
||||
Subject: batman-adv: Fix lock for ogm cnt access in batadv_iv_ogm_calc_tq
|
||||
|
||||
The originator node object orig_neigh_node is used to when accessing the
|
||||
bcast_own(_sum) and real_packet_count information. The access to them has
|
||||
to be protected with the spinlock in orig_neigh_node.
|
||||
|
||||
But the function uses the lock in orig_node instead. This is incorrect
|
||||
because they could be two different originator node objects.
|
||||
|
||||
Fixes: f14416760b62 ("batman-adv: protect bit operations to count OGMs with spinlock")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/9a3b195410e5d2f285cdf0073fef721ff8d9474d
|
||||
|
||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
||||
index 7bfd0d7ef49df8e699f91e2b827b824aa3657c0d..56b4984d738e87098c24213d4aa277a2ef948fec 100644
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -1214,7 +1214,7 @@ static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
|
||||
orig_node->last_seen = jiffies;
|
||||
|
||||
/* find packet count of corresponding one hop neighbor */
|
||||
- spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
|
||||
+ spin_lock_bh(&orig_neigh_node->bat_iv.ogm_cnt_lock);
|
||||
if_num = if_incoming->if_num;
|
||||
orig_eq_count = orig_neigh_node->bat_iv.bcast_own_sum[if_num];
|
||||
neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node, if_outgoing);
|
||||
@@ -1224,7 +1224,7 @@ static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
|
||||
} else {
|
||||
neigh_rq_count = 0;
|
||||
}
|
||||
- spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
|
||||
+ spin_unlock_bh(&orig_neigh_node->bat_iv.ogm_cnt_lock);
|
||||
|
||||
/* pay attention to not get a value bigger than 100 % */
|
||||
if (orig_eq_count > neigh_rq_count)
|
|
@ -0,0 +1,40 @@
|
|||
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Date: Tue, 23 Jan 2018 10:59:49 +0100
|
||||
Subject: batman-adv: fix packet checksum in receive path
|
||||
|
||||
eth_type_trans() internally calls skb_pull(), which does not adjust the
|
||||
skb checksum; skb_postpull_rcsum() is necessary to avoid log spam of the
|
||||
form "bat0: hw csum failure" when packets with CHECKSUM_COMPLETE are
|
||||
received.
|
||||
|
||||
Note that in usual setups, packets don't reach batman-adv with
|
||||
CHECKSUM_COMPLETE (I assume NICs bail out of checksumming when they see
|
||||
batadv's ethtype?), which is why the log messages do not occur on every
|
||||
system using batman-adv. I could reproduce this issue by stacking
|
||||
batman-adv on top of a VXLAN interface.
|
||||
|
||||
Fixes: fe28a94c01e1 ("batman-adv: receive packets directly using skbs")
|
||||
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/798174b15153afd88268f2f87811602f68b3f2c6
|
||||
|
||||
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
|
||||
index 08432b14386a53c771c54b9eb38893d94c6f9b53..5da1a1c0f1efb5d95f31bc852b899f61e462feb1 100644
|
||||
--- a/net/batman-adv/soft-interface.c
|
||||
+++ b/net/batman-adv/soft-interface.c
|
||||
@@ -470,13 +470,7 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
||||
|
||||
/* skb->dev & skb->pkt_type are set here */
|
||||
skb->protocol = eth_type_trans(skb, soft_iface);
|
||||
-
|
||||
- /* should not be necessary anymore as we use skb_pull_rcsum()
|
||||
- * TODO: please verify this and remove this TODO
|
||||
- * -- Dec 21st 2009, Simon Wunderlich
|
||||
- */
|
||||
-
|
||||
- /* skb->ip_summed = CHECKSUM_UNNECESSARY; */
|
||||
+ skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
|
||||
|
||||
batadv_inc_counter(bat_priv, BATADV_CNT_RX);
|
||||
batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
|
|
@ -0,0 +1,36 @@
|
|||
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Date: Tue, 23 Jan 2018 10:59:50 +0100
|
||||
Subject: batman-adv: invalidate checksum on fragment reassembly
|
||||
|
||||
A more sophisticated implementation could try to combine fragment checksums
|
||||
when all fragments have CHECKSUM_COMPLETE and are split at even offsets.
|
||||
For now, we just set ip_summed to CHECKSUM_NONE to avoid "hw csum failure"
|
||||
warnings in the kernel log when fragmented frames are received. In
|
||||
consequence, skb_pull_rcsum() can be replaced with skb_pull().
|
||||
|
||||
Note that in usual setups, packets don't reach batman-adv with
|
||||
CHECKSUM_COMPLETE (I assume NICs bail out of checksumming when they see
|
||||
batadv's ethtype?), which is why the log messages do not occur on every
|
||||
system using batman-adv. I could reproduce this issue by stacking
|
||||
batman-adv on top of a VXLAN interface.
|
||||
|
||||
Fixes: 9b3eab61754d ("batman-adv: Receive fragmented packets and merge")
|
||||
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/2c1bce065baa688bc1eca4116f83ca3b790432a5
|
||||
|
||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
||||
index 28f54887c975905d03372ab8ba5274fd82117651..5969d3705ec08a96438ecce06577d35291600753 100644
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -287,7 +287,8 @@ batadv_frag_merge_packets(struct hlist_head *chain)
|
||||
/* Move the existing MAC header to just before the payload. (Override
|
||||
* the fragment header.)
|
||||
*/
|
||||
- skb_pull_rcsum(skb_out, hdr_size);
|
||||
+ skb_pull(skb_out, hdr_size);
|
||||
+ skb_out->ip_summed = CHECKSUM_NONE;
|
||||
memmove(skb_out->data - ETH_HLEN, skb_mac_header(skb_out), ETH_HLEN);
|
||||
skb_set_mac_header(skb_out, -ETH_HLEN);
|
||||
skb_reset_network_header(skb_out);
|
|
@ -0,0 +1,30 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Mon, 19 Feb 2018 14:08:52 +0100
|
||||
Subject: batman-adv: Ignore invalid batadv_iv_gw during netlink send
|
||||
|
||||
The function batadv_iv_gw_dump stops the processing loop when
|
||||
batadv_iv_gw_dump_entry returns a non-0 return code. This should only
|
||||
happen when the buffer is full. Otherwise, an empty message may be
|
||||
returned by batadv_gw_dump. This empty message will then stop the netlink
|
||||
dumping of gateway entries. At worst, not a single entry is returned to
|
||||
userspace even when plenty of possible gateways exist.
|
||||
|
||||
Fixes: fa3228924152 ("batman-adv: add B.A.T.M.A.N. IV bat_gw_dump implementations")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/c58f37c248bb4926cda82fd0463b6fecb3d3654f
|
||||
|
||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
||||
index 56b4984d738e87098c24213d4aa277a2ef948fec..1847898906d495980a71eb6a0e5a7b510e55d003 100644
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -2719,7 +2719,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
struct batadv_neigh_node *router;
|
||||
struct batadv_gw_node *curr_gw;
|
||||
- int ret = -EINVAL;
|
||||
+ int ret = 0;
|
||||
void *hdr;
|
||||
|
||||
router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT);
|
|
@ -0,0 +1,30 @@
|
|||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Mon, 19 Feb 2018 14:08:53 +0100
|
||||
Subject: batman-adv: Ignore invalid batadv_v_gw during netlink send
|
||||
|
||||
The function batadv_v_gw_dump stops the processing loop when
|
||||
batadv_v_gw_dump_entry returns a non-0 return code. This should only
|
||||
happen when the buffer is full. Otherwise, an empty message may be
|
||||
returned by batadv_gw_dump. This empty message will then stop the netlink
|
||||
dumping of gateway entries. At worst, not a single entry is returned to
|
||||
userspace even when plenty of possible gateways exist.
|
||||
|
||||
Fixes: 15315a94ad98 ("batman-adv: add B.A.T.M.A.N. V bat_gw_dump implementations")
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/12f1d3a6bf4d157928fec509aab981e5243ee438
|
||||
|
||||
diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
|
||||
index 2f77e112d4cb4db7b1086715a597ef995054fdc1..0488063ff6ac5985e27c3a0df41ab3566b48abb8 100644
|
||||
--- a/net/batman-adv/bat_v.c
|
||||
+++ b/net/batman-adv/bat_v.c
|
||||
@@ -930,7 +930,7 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
struct batadv_neigh_node *router;
|
||||
struct batadv_gw_node *curr_gw;
|
||||
- int ret = -EINVAL;
|
||||
+ int ret = 0;
|
||||
void *hdr;
|
||||
|
||||
router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT);
|
|
@ -0,0 +1,59 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 24 Feb 2018 12:03:36 +0100
|
||||
Subject: batman-adv: Fix netlink dumping of BLA claims
|
||||
|
||||
The function batadv_bla_claim_dump_bucket must be able to handle
|
||||
non-complete dumps of a single bucket. It tries to do that by saving the
|
||||
latest dumped index in *idx_skip to inform the caller about the current
|
||||
state.
|
||||
|
||||
But the caller only assumes that buckets were not completely dumped when
|
||||
the return code is non-zero. This function must therefore also return a
|
||||
non-zero index when the dumping of an entry failed. Otherwise the caller
|
||||
will just skip all remaining buckets.
|
||||
|
||||
And the function must also reset *idx_skip back to zero when it finished a
|
||||
bucket. Otherwise it will skip the same number of entries in the next
|
||||
bucket as the previous one had.
|
||||
|
||||
Fixes: 3b7a63606020 ("batman-adv: add B.A.T.M.A.N. Dump BLA claims via netlink")
|
||||
Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/49197c00f82cfcfeef963ef9367841d38a6ff207
|
||||
|
||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
||||
index 1e6e5d4468ad50c221ea5a0d436678d16c5e154f..4784469cadd4364b6239ce9ff0d1c7cc254de439 100644
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -2149,22 +2149,25 @@ batadv_bla_claim_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
{
|
||||
struct batadv_bla_claim *claim;
|
||||
int idx = 0;
|
||||
+ int ret = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(claim, head, hash_entry) {
|
||||
if (idx++ < *idx_skip)
|
||||
continue;
|
||||
- if (batadv_bla_claim_dump_entry(msg, portid, seq,
|
||||
- primary_if, claim)) {
|
||||
+
|
||||
+ ret = batadv_bla_claim_dump_entry(msg, portid, seq,
|
||||
+ primary_if, claim);
|
||||
+ if (ret) {
|
||||
*idx_skip = idx - 1;
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
|
||||
- *idx_skip = idx;
|
||||
+ *idx_skip = 0;
|
||||
unlock:
|
||||
rcu_read_unlock();
|
||||
- return 0;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/**
|
|
@ -0,0 +1,59 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 24 Feb 2018 12:03:37 +0100
|
||||
Subject: batman-adv: Fix netlink dumping of BLA backbones
|
||||
|
||||
The function batadv_bla_backbone_dump_bucket must be able to handle
|
||||
non-complete dumps of a single bucket. It tries to do that by saving the
|
||||
latest dumped index in *idx_skip to inform the caller about the current
|
||||
state.
|
||||
|
||||
But the caller only assumes that buckets were not completely dumped when
|
||||
the return code is non-zero. This function must therefore also return a
|
||||
non-zero index when the dumping of an entry failed. Otherwise the caller
|
||||
will just skip all remaining buckets.
|
||||
|
||||
And the function must also reset *idx_skip back to zero when it finished a
|
||||
bucket. Otherwise it will skip the same number of entries in the next
|
||||
bucket as the previous one had.
|
||||
|
||||
Fixes: 7f609cab5123 ("batman-adv: add backbone table netlink support")
|
||||
Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/29e4759e49f06014b84791397ebe1b22546edd2d
|
||||
|
||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
||||
index 4784469cadd4364b6239ce9ff0d1c7cc254de439..aecf34503e95d9aa723449ddbf0bb3035336b878 100644
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -2382,22 +2382,25 @@ batadv_bla_backbone_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
{
|
||||
struct batadv_bla_backbone_gw *backbone_gw;
|
||||
int idx = 0;
|
||||
+ int ret = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
|
||||
if (idx++ < *idx_skip)
|
||||
continue;
|
||||
- if (batadv_bla_backbone_dump_entry(msg, portid, seq,
|
||||
- primary_if, backbone_gw)) {
|
||||
+
|
||||
+ ret = batadv_bla_backbone_dump_entry(msg, portid, seq,
|
||||
+ primary_if, backbone_gw);
|
||||
+ if (ret) {
|
||||
*idx_skip = idx - 1;
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
|
||||
- *idx_skip = idx;
|
||||
+ *idx_skip = 0;
|
||||
unlock:
|
||||
rcu_read_unlock();
|
||||
- return 0;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/**
|
|
@ -0,0 +1,234 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Tue, 26 Dec 2017 15:14:01 +0100
|
||||
Subject: batman-adv: Fix internal interface indices types
|
||||
|
||||
batman-adv uses internal indices for each enabled and active interface.
|
||||
It is currently used by the B.A.T.M.A.N. IV algorithm to identifify the
|
||||
correct position in the ogm_cnt bitmaps.
|
||||
|
||||
The type for the number of enabled interfaces (which defines the next
|
||||
interface index) was set to char. This type can be (depending on the
|
||||
architecture) either signed (limiting batman-adv to 127 active slave
|
||||
interfaces) or unsigned (limiting batman-adv to 255 active slave
|
||||
interfaces).
|
||||
|
||||
This limit was not correctly checked when an interface was enabled and thus
|
||||
an overflow happened. This was only catched on systems with the signed char
|
||||
type when the B.A.T.M.A.N. IV code tried to resize its counter arrays with
|
||||
a negative size.
|
||||
|
||||
The if_num interface index was only a s16 and therefore significantly
|
||||
smaller than the ifindex (int) used by the code net code.
|
||||
|
||||
Both &batadv_hard_iface->if_num and &batadv_priv->num_ifaces must be
|
||||
(unsigned) int to support the same number of slave interfaces as the net
|
||||
core code. And the interface activation code must check the number of
|
||||
active slave interfaces to avoid integer overflows.
|
||||
|
||||
Fixes: d1fbb61d0534 ("raw socket operations added: create / destroy / bind / send broadcast of own OGMs implemented orig interval configurable via /proc/net/batman-adv/orig_interval")
|
||||
Fixes: ea6f8d42a595 ("batman-adv: move /proc interface handling to /sys")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
||||
Origin: backport, https://git.open-mesh.org/batman-adv.git/commit/d5db560de1352d3ec6933bca25b3aaad7ddd15e1
|
||||
|
||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
||||
index 1847898906d495980a71eb6a0e5a7b510e55d003..bf389adbb2694746d6397a0a38353cdcd8008899 100644
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -149,7 +149,7 @@ static void batadv_iv_ogm_orig_free(struct batadv_orig_node *orig_node)
|
||||
* Return: 0 on success, a negative error code otherwise.
|
||||
*/
|
||||
static int batadv_iv_ogm_orig_add_if(struct batadv_orig_node *orig_node,
|
||||
- int max_if_num)
|
||||
+ unsigned int max_if_num)
|
||||
{
|
||||
void *data_ptr;
|
||||
size_t old_size;
|
||||
@@ -193,7 +193,8 @@ unlock:
|
||||
*/
|
||||
static void
|
||||
batadv_iv_ogm_drop_bcast_own_entry(struct batadv_orig_node *orig_node,
|
||||
- int max_if_num, int del_if_num)
|
||||
+ unsigned int max_if_num,
|
||||
+ unsigned int del_if_num)
|
||||
{
|
||||
size_t chunk_size;
|
||||
size_t if_offset;
|
||||
@@ -231,7 +232,8 @@ batadv_iv_ogm_drop_bcast_own_entry(struct batadv_orig_node *orig_node,
|
||||
*/
|
||||
static void
|
||||
batadv_iv_ogm_drop_bcast_own_sum_entry(struct batadv_orig_node *orig_node,
|
||||
- int max_if_num, int del_if_num)
|
||||
+ unsigned int max_if_num,
|
||||
+ unsigned int del_if_num)
|
||||
{
|
||||
size_t if_offset;
|
||||
void *data_ptr;
|
||||
@@ -268,7 +270,8 @@ batadv_iv_ogm_drop_bcast_own_sum_entry(struct batadv_orig_node *orig_node,
|
||||
* Return: 0 on success, a negative error code otherwise.
|
||||
*/
|
||||
static int batadv_iv_ogm_orig_del_if(struct batadv_orig_node *orig_node,
|
||||
- int max_if_num, int del_if_num)
|
||||
+ unsigned int max_if_num,
|
||||
+ unsigned int del_if_num)
|
||||
{
|
||||
spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
|
||||
|
||||
@@ -302,7 +305,8 @@ static struct batadv_orig_node *
|
||||
batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr)
|
||||
{
|
||||
struct batadv_orig_node *orig_node;
|
||||
- int size, hash_added;
|
||||
+ int hash_added;
|
||||
+ size_t size;
|
||||
|
||||
orig_node = batadv_orig_hash_find(bat_priv, addr);
|
||||
if (orig_node)
|
||||
@@ -885,7 +889,7 @@ batadv_iv_ogm_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
|
||||
u32 i;
|
||||
size_t word_index;
|
||||
u8 *w;
|
||||
- int if_num;
|
||||
+ unsigned int if_num;
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
@@ -1015,7 +1019,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
|
||||
struct batadv_neigh_node *tmp_neigh_node = NULL;
|
||||
struct batadv_neigh_node *router = NULL;
|
||||
struct batadv_orig_node *orig_node_tmp;
|
||||
- int if_num;
|
||||
+ unsigned int if_num;
|
||||
u8 sum_orig, sum_neigh;
|
||||
u8 *neigh_addr;
|
||||
u8 tq_avg;
|
||||
@@ -1173,7 +1177,7 @@ static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
|
||||
u8 total_count;
|
||||
u8 orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own;
|
||||
unsigned int neigh_rq_inv_cube, neigh_rq_max_cube;
|
||||
- int if_num;
|
||||
+ unsigned int if_num;
|
||||
unsigned int tq_asym_penalty, inv_asym_penalty;
|
||||
unsigned int combined_tq;
|
||||
unsigned int tq_iface_penalty;
|
||||
@@ -1692,9 +1696,9 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
|
||||
|
||||
if (is_my_orig) {
|
||||
unsigned long *word;
|
||||
- int offset;
|
||||
+ size_t offset;
|
||||
s32 bit_pos;
|
||||
- s16 if_num;
|
||||
+ unsigned int if_num;
|
||||
u8 *weight;
|
||||
|
||||
orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv,
|
||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
||||
index 6969f580d0bfd0428f1c6985eaec8bbbf5a0d38b..ebeea5816a06b33c4944b01e40cee157c88bdff7 100644
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -741,6 +741,11 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
|
||||
hard_iface->soft_iface = soft_iface;
|
||||
bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||
|
||||
+ if (bat_priv->num_ifaces >= UINT_MAX) {
|
||||
+ ret = -ENOSPC;
|
||||
+ goto err_dev;
|
||||
+ }
|
||||
+
|
||||
ret = netdev_master_upper_dev_link(hard_iface->net_dev,
|
||||
soft_iface, NULL, NULL);
|
||||
if (ret)
|
||||
@@ -848,7 +853,7 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
|
||||
batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
|
||||
|
||||
/* nobody uses this interface anymore */
|
||||
- if (!bat_priv->num_ifaces) {
|
||||
+ if (bat_priv->num_ifaces == 0) {
|
||||
batadv_gw_check_client_stop(bat_priv);
|
||||
|
||||
if (autodel == BATADV_IF_CLEANUP_AUTO)
|
||||
@@ -884,7 +889,7 @@ batadv_hardif_add_interface(struct net_device *net_dev)
|
||||
if (ret)
|
||||
goto free_if;
|
||||
|
||||
- hard_iface->if_num = -1;
|
||||
+ hard_iface->if_num = 0;
|
||||
hard_iface->net_dev = net_dev;
|
||||
hard_iface->soft_iface = NULL;
|
||||
hard_iface->if_status = BATADV_IF_NOT_IN_USE;
|
||||
diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c
|
||||
index 8f3b2969cc4e3044e714086329166b9a3b7517a4..d9ee84340d93bd03f1de504f7223c7f894818906 100644
|
||||
--- a/net/batman-adv/originator.c
|
||||
+++ b/net/batman-adv/originator.c
|
||||
@@ -1500,7 +1500,7 @@ int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
}
|
||||
|
||||
int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface,
|
||||
- int max_if_num)
|
||||
+ unsigned int max_if_num)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||
struct batadv_algo_ops *bao = bat_priv->algo_ops;
|
||||
@@ -1535,7 +1535,7 @@ err:
|
||||
}
|
||||
|
||||
int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface,
|
||||
- int max_if_num)
|
||||
+ unsigned int max_if_num)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||
struct batadv_hashtable *hash = bat_priv->orig_hash;
|
||||
diff --git a/net/batman-adv/originator.h b/net/batman-adv/originator.h
|
||||
index ebc56183f3581835c899272425a212ff092033b6..fab0b2cc141d9affdbcf68f1d0ce7aad753c3857 100644
|
||||
--- a/net/batman-adv/originator.h
|
||||
+++ b/net/batman-adv/originator.h
|
||||
@@ -78,9 +78,9 @@ int batadv_orig_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface,
|
||||
- int max_if_num);
|
||||
+ unsigned int max_if_num);
|
||||
int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface,
|
||||
- int max_if_num);
|
||||
+ unsigned int max_if_num);
|
||||
struct batadv_orig_node_vlan *
|
||||
batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
|
||||
unsigned short vid);
|
||||
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
||||
index 7c928938b22dcae681294700252c0ae74378f999..bf1d3f0258ffb2fb8ee483337012798b20462cd6 100644
|
||||
--- a/net/batman-adv/types.h
|
||||
+++ b/net/batman-adv/types.h
|
||||
@@ -155,7 +155,7 @@ enum batadv_hard_iface_wifi_flags {
|
||||
*/
|
||||
struct batadv_hard_iface {
|
||||
struct list_head list;
|
||||
- s16 if_num;
|
||||
+ unsigned int if_num;
|
||||
char if_status;
|
||||
u8 num_bcasts;
|
||||
u32 wifi_flags;
|
||||
@@ -1081,7 +1081,7 @@ struct batadv_priv {
|
||||
atomic_t bcast_seqno;
|
||||
atomic_t bcast_queue_left;
|
||||
atomic_t batman_queue_left;
|
||||
- char num_ifaces;
|
||||
+ unsigned int num_ifaces;
|
||||
struct kobject *mesh_obj;
|
||||
struct dentry *debug_dir;
|
||||
struct hlist_head forw_bat_list;
|
||||
@@ -1477,9 +1477,10 @@ struct batadv_algo_neigh_ops {
|
||||
*/
|
||||
struct batadv_algo_orig_ops {
|
||||
void (*free)(struct batadv_orig_node *orig_node);
|
||||
- int (*add_if)(struct batadv_orig_node *orig_node, int max_if_num);
|
||||
- int (*del_if)(struct batadv_orig_node *orig_node, int max_if_num,
|
||||
- int del_if_num);
|
||||
+ int (*add_if)(struct batadv_orig_node *orig_node,
|
||||
+ unsigned int max_if_num);
|
||||
+ int (*del_if)(struct batadv_orig_node *orig_node,
|
||||
+ unsigned int max_if_num, unsigned int del_if_num);
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
void (*print)(struct batadv_priv *priv, struct seq_file *seq,
|
||||
struct batadv_hard_iface *hard_iface);
|
|
@ -0,0 +1,35 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Sun, 4 Mar 2018 13:08:17 +0100
|
||||
Subject: batman-adv: Fix multicast packet loss with a single WANT_ALL_IPV4/6 flag
|
||||
|
||||
As the kernel doc describes too the code is supposed to skip adding
|
||||
multicast TT entries if both the WANT_ALL_IPV4 and WANT_ALL_IPV6 flags
|
||||
are present.
|
||||
|
||||
Unfortunately, the current code even skips adding multicast TT entries
|
||||
if only either the WANT_ALL_IPV4 or WANT_ALL_IPV6 is present.
|
||||
|
||||
This could lead to IPv6 multicast packet loss if only an IGMP but not an
|
||||
MLD querier is present for instance or vice versa.
|
||||
|
||||
Fixes: 391b59cdb111 ("batman-adv: Add multicast optimization support for bridged setups")
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/edba00d56efb1d55cdd40957e010fba80580b5e2
|
||||
|
||||
diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c
|
||||
index 090a69fc342eac8a0b6bf89556d2b32523817d09..1fb4f87be11e984f3a839c0b2dea939cd692b04d 100644
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -541,8 +541,8 @@ update:
|
||||
bat_priv->mcast.enabled = true;
|
||||
}
|
||||
|
||||
- return !(mcast_data.flags &
|
||||
- (BATADV_MCAST_WANT_ALL_IPV4 | BATADV_MCAST_WANT_ALL_IPV6));
|
||||
+ return !(mcast_data.flags & BATADV_MCAST_WANT_ALL_IPV4 &&
|
||||
+ mcast_data.flags & BATADV_MCAST_WANT_ALL_IPV6);
|
||||
}
|
||||
|
||||
/**
|
|
@ -0,0 +1,58 @@
|
|||
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Date: Fri, 16 Mar 2018 11:29:09 +0100
|
||||
Subject: batman-adv: update data pointers after skb_cow()
|
||||
|
||||
batadv_check_unicast_ttvn() calls skb_cow(), so pointers into the SKB data
|
||||
must be (re)set after calling it. The ethhdr variable is dropped
|
||||
altogether.
|
||||
|
||||
Fixes: 78fc6bbe0aca ("batman-adv: add UNICAST_4ADDR packet type")
|
||||
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/64d22c76a207ed313b2496f0709b2567719452c4
|
||||
|
||||
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
|
||||
index 213cc01ad00392f7cbd4efd9d4796f76691d2d9e..8d927931017e53d285d9c64b4b850bb1d0388e11 100644
|
||||
--- a/net/batman-adv/routing.c
|
||||
+++ b/net/batman-adv/routing.c
|
||||
@@ -946,14 +946,10 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL;
|
||||
int check, hdr_size = sizeof(*unicast_packet);
|
||||
enum batadv_subtype subtype;
|
||||
- struct ethhdr *ethhdr;
|
||||
int ret = NET_RX_DROP;
|
||||
bool is4addr, is_gw;
|
||||
|
||||
unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
||||
- unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
|
||||
- ethhdr = eth_hdr(skb);
|
||||
-
|
||||
is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
|
||||
/* the caller function should have already pulled 2 bytes */
|
||||
if (is4addr)
|
||||
@@ -973,12 +969,14 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||
if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
|
||||
goto free_skb;
|
||||
|
||||
+ unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
||||
+
|
||||
/* packet for me */
|
||||
if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
|
||||
/* If this is a unicast packet from another backgone gw,
|
||||
* drop it.
|
||||
*/
|
||||
- orig_addr_gw = ethhdr->h_source;
|
||||
+ orig_addr_gw = eth_hdr(skb)->h_source;
|
||||
orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw);
|
||||
if (orig_node_gw) {
|
||||
is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw,
|
||||
@@ -993,6 +991,8 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
if (is4addr) {
|
||||
+ unicast_4addr_packet =
|
||||
+ (struct batadv_unicast_4addr_packet *)skb->data;
|
||||
subtype = unicast_4addr_packet->subtype;
|
||||
batadv_dat_inc_counter(bat_priv, subtype);
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Date: Fri, 16 Mar 2018 11:29:10 +0100
|
||||
Subject: batman-adv: fix header size check in batadv_dbg_arp()
|
||||
|
||||
Checking for 0 is insufficient: when an SKB without a batadv header, but
|
||||
with a VLAN header is received, hdr_size will be 4, making the following
|
||||
code interpret the Ethernet header as a batadv header.
|
||||
|
||||
Fixes: 3e26722bc9f2 ("batman-adv: make the Distributed ARP Table vlan aware")
|
||||
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/7dfe729b169b1217f47744edbd1616f473340fda
|
||||
|
||||
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
|
||||
index 4d982e63a3ab269e3d3b1e7a9d5f205638051603..fcd38e48a6ea74bd91b0bdd874cb5e88e661e729 100644
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -391,7 +391,7 @@ static void batadv_dbg_arp(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
batadv_arp_hw_src(skb, hdr_size), &ip_src,
|
||||
batadv_arp_hw_dst(skb, hdr_size), &ip_dst);
|
||||
|
||||
- if (hdr_size == 0)
|
||||
+ if (hdr_size < sizeof(struct batadv_unicast_packet))
|
||||
return;
|
||||
|
||||
unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
|
|
@ -0,0 +1,83 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sun, 18 Mar 2018 13:12:01 +0100
|
||||
Subject: batman-adv: Fix skbuff rcsum on packet reroute
|
||||
|
||||
batadv_check_unicast_ttvn may redirect a packet to itself or another
|
||||
originator. This involves rewriting the ttvn and the destination address in
|
||||
the batadv unicast header. These field were not yet pulled (with skb rcsum
|
||||
update) and thus any change to them also requires a change in the receive
|
||||
checksum.
|
||||
|
||||
Reported-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Fixes: cea194d90b11 ("batman-adv: improved client announcement mechanism")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: backport, https://git.open-mesh.org/batman-adv.git/commit/fb91b0ef84738102807e5dd7ec0b3565415aff56
|
||||
|
||||
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
|
||||
index 8d927931017e53d285d9c64b4b850bb1d0388e11..6a12612463127f501ad6a0df20632f14586075bd 100644
|
||||
--- a/net/batman-adv/routing.c
|
||||
+++ b/net/batman-adv/routing.c
|
||||
@@ -744,6 +744,7 @@ free_skb:
|
||||
/**
|
||||
* batadv_reroute_unicast_packet - update the unicast header for re-routing
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
+ * @skb: unicast packet to process
|
||||
* @unicast_packet: the unicast header to be updated
|
||||
* @dst_addr: the payload destination
|
||||
* @vid: VLAN identifier
|
||||
@@ -755,7 +756,7 @@ free_skb:
|
||||
* Return: true if the packet header has been updated, false otherwise
|
||||
*/
|
||||
static bool
|
||||
-batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
|
||||
+batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
struct batadv_unicast_packet *unicast_packet,
|
||||
u8 *dst_addr, unsigned short vid)
|
||||
{
|
||||
@@ -784,8 +785,10 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
|
||||
}
|
||||
|
||||
/* update the packet header */
|
||||
+ skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
||||
ether_addr_copy(unicast_packet->dest, orig_addr);
|
||||
unicast_packet->ttvn = orig_ttvn;
|
||||
+ skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
||||
|
||||
ret = true;
|
||||
out:
|
||||
@@ -826,7 +829,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
||||
* the packet to
|
||||
*/
|
||||
if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
|
||||
- if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
|
||||
+ if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet,
|
||||
ethhdr->h_dest, vid))
|
||||
batadv_dbg_ratelimited(BATADV_DBG_TT,
|
||||
bat_priv,
|
||||
@@ -872,7 +875,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
||||
* destination can possibly be updated and forwarded towards the new
|
||||
* target host
|
||||
*/
|
||||
- if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
|
||||
+ if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet,
|
||||
ethhdr->h_dest, vid)) {
|
||||
batadv_dbg_ratelimited(BATADV_DBG_TT, bat_priv,
|
||||
"Rerouting unicast packet to %pM (dst=%pM): TTVN mismatch old_ttvn=%u new_ttvn=%u\n",
|
||||
@@ -895,12 +898,14 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
||||
if (!primary_if)
|
||||
return false;
|
||||
|
||||
+ /* update the packet header */
|
||||
+ skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
||||
ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr);
|
||||
+ unicast_packet->ttvn = curr_ttvn;
|
||||
+ skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
||||
|
||||
batadv_hardif_put(primary_if);
|
||||
|
||||
- unicast_packet->ttvn = curr_ttvn;
|
||||
-
|
||||
return true;
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Tue, 20 Mar 2018 03:13:27 +0100
|
||||
Subject: batman-adv: fix multicast-via-unicast transmission with AP isolation
|
||||
|
||||
For multicast frames AP isolation is only supposed to be checked on
|
||||
the receiving nodes and never on the originating one.
|
||||
|
||||
Furthermore, the isolation or wifi flag bits should only be intepreted
|
||||
as such for unicast and never multicast TT entries.
|
||||
|
||||
By injecting flags to the multicast TT entry claimed by a single
|
||||
target node it was verified in tests that this multicast address
|
||||
becomes unreachable, leading to packet loss.
|
||||
|
||||
Omitting the "src" parameter to the batadv_transtable_search() call
|
||||
successfully skipped the AP isolation check and made the target
|
||||
reachable again.
|
||||
|
||||
Fixes: 405cc1e5a81e ("batman-adv: Modified forwarding behaviour for multicast packets")
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/67a50c93bceb534937d6a188eded79272ff6d55d
|
||||
|
||||
diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c
|
||||
index 1fb4f87be11e984f3a839c0b2dea939cd692b04d..20680e1dafc46cd60766a6dcd4f401f097ad4786 100644
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -811,8 +811,8 @@ static struct batadv_orig_node *
|
||||
batadv_mcast_forw_tt_node_get(struct batadv_priv *bat_priv,
|
||||
struct ethhdr *ethhdr)
|
||||
{
|
||||
- return batadv_transtable_search(bat_priv, ethhdr->h_source,
|
||||
- ethhdr->h_dest, BATADV_NO_FLAGS);
|
||||
+ return batadv_transtable_search(bat_priv, NULL, ethhdr->h_dest,
|
||||
+ BATADV_NO_FLAGS);
|
||||
}
|
||||
|
||||
/**
|
|
@ -0,0 +1,79 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Thu, 22 Mar 2018 00:21:32 +0100
|
||||
Subject: batman-adv: fix packet loss for broadcasted DHCP packets to a server
|
||||
|
||||
DHCP connectivity issues can currently occur if the following conditions
|
||||
are met:
|
||||
|
||||
1) A DHCP packet from a client to a server
|
||||
2) This packet has a multicast destination
|
||||
3) This destination has a matching entry in the translation table
|
||||
(FF:FF:FF:FF:FF:FF for IPv4, 33:33:00:01:00:02/33:33:00:01:00:03
|
||||
for IPv6)
|
||||
4) The orig-node determined by TT for the multicast destination
|
||||
does not match the orig-node determined by best-gateway-selection
|
||||
|
||||
In this case the DHCP packet will be dropped.
|
||||
|
||||
The "gateway-out-of-range" check is supposed to only be applied to
|
||||
unicasted DHCP packets to a specific DHCP server.
|
||||
|
||||
In that case dropping the the unicasted frame forces the client to
|
||||
retry via a broadcasted one, but now directed to the new best
|
||||
gateway.
|
||||
|
||||
A DHCP packet with broadcast/multicast destination is already ensured to
|
||||
always be delivered to the best gateway. Dropping a multicasted
|
||||
DHCP packet here will only prevent completing DHCP as there is no
|
||||
other fallback.
|
||||
|
||||
So far, it seems the unicast check was implicitly performed by
|
||||
expecting the batadv_transtable_search() to return NULL for multicast
|
||||
destinations. However, a multicast address could have always ended up in
|
||||
the translation table and in fact is now common.
|
||||
|
||||
To fix this potential loss of a DHCP client-to-server packet to a
|
||||
multicast address this patch adds an explicit multicast destination
|
||||
check to reliably bail out of the gateway-out-of-range check for such
|
||||
destinations.
|
||||
|
||||
The issue and fix were tested in the following three node setup:
|
||||
|
||||
- Line topology, A-B-C
|
||||
- A: gateway client, DHCP client
|
||||
- B: gateway server, hop-penalty increased: 30->60, DHCP server
|
||||
- C: gateway server, code modifications to announce FF:FF:FF:FF:FF:FF
|
||||
|
||||
Without this patch, A would never transmit its DHCP Discover packet
|
||||
due to an always "out-of-range" condition. With this patch,
|
||||
a full DHCP handshake between A and B was possible again.
|
||||
|
||||
Fixes: afae4e42aae6 ("batman-adv: refactoring gateway handling code")
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/49b2132f0fe2753a3b46103db9719898c5cd44aa
|
||||
|
||||
diff --git a/net/batman-adv/gateway_client.c b/net/batman-adv/gateway_client.c
|
||||
index 52b8bd6ec43183519a63483950c2e886e47a6f9e..f1fdf4e7f5c3ce7f20339dcee3b6e43290ea3b4e 100644
|
||||
--- a/net/batman-adv/gateway_client.c
|
||||
+++ b/net/batman-adv/gateway_client.c
|
||||
@@ -705,7 +705,7 @@ bool batadv_gw_out_of_range(struct batadv_priv *bat_priv,
|
||||
{
|
||||
struct batadv_neigh_node *neigh_curr = NULL;
|
||||
struct batadv_neigh_node *neigh_old = NULL;
|
||||
- struct batadv_orig_node *orig_dst_node;
|
||||
+ struct batadv_orig_node *orig_dst_node = NULL;
|
||||
struct batadv_gw_node *gw_node = NULL;
|
||||
struct batadv_gw_node *curr_gw = NULL;
|
||||
struct batadv_neigh_ifinfo *curr_ifinfo, *old_ifinfo;
|
||||
@@ -716,6 +716,9 @@ bool batadv_gw_out_of_range(struct batadv_priv *bat_priv,
|
||||
|
||||
vid = batadv_get_vid(skb, 0);
|
||||
|
||||
+ if (is_multicast_ether_addr(ethhdr->h_dest))
|
||||
+ goto out;
|
||||
+
|
||||
orig_dst_node = batadv_transtable_search(bat_priv, ethhdr->h_source,
|
||||
ethhdr->h_dest, vid);
|
||||
if (!orig_dst_node)
|
|
@ -0,0 +1,72 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 9 May 2018 21:07:40 +0200
|
||||
Subject: batman-adv: Avoid race in TT TVLV allocator helper
|
||||
|
||||
The functions batadv_tt_prepare_tvlv_local_data and
|
||||
batadv_tt_prepare_tvlv_global_data are responsible for preparing a buffer
|
||||
which can be used to store the TVLV container for TT and add the VLAN
|
||||
information to it.
|
||||
|
||||
This will be done in three phases:
|
||||
|
||||
1. count the number of VLANs and their entries
|
||||
2. allocate the buffer using the counters from the previous step and limits
|
||||
from the caller (parameter tt_len)
|
||||
3. insert the VLAN information to the buffer
|
||||
|
||||
The step 1 and 3 operate on a list which contains the VLANs. The access to
|
||||
these lists must be protected with an appropriate lock or otherwise they
|
||||
might operate on on different entries. This could for example happen when
|
||||
another context is adding VLAN entries to this list.
|
||||
|
||||
This could lead to a buffer overflow in these functions when enough entries
|
||||
were added between step 1 and 3 to the VLAN lists that the buffer room for
|
||||
the entries (*tt_change) is smaller then the now required extra buffer for
|
||||
new VLAN entries.
|
||||
|
||||
Fixes: 21a57f6e7a3b ("batman-adv: make the TT CRC logic VLAN specific")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Antonio Quartulli <a@unstable.cc>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/286be89a33497ba9000aa5c2960f1f4114953522
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index a64003b824e0d0b05f0a9e44ccc32ba0cb3018fc..933ac64b5707846ddee9f828b538ade86b968986 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -860,7 +860,7 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
|
||||
struct batadv_orig_node_vlan *vlan;
|
||||
u8 *tt_change_ptr;
|
||||
|
||||
- rcu_read_lock();
|
||||
+ spin_lock_bh(&orig_node->vlan_list_lock);
|
||||
hlist_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
|
||||
num_vlan++;
|
||||
num_entries += atomic_read(&vlan->tt.num_entries);
|
||||
@@ -898,7 +898,7 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
|
||||
*tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr;
|
||||
|
||||
out:
|
||||
- rcu_read_unlock();
|
||||
+ spin_unlock_bh(&orig_node->vlan_list_lock);
|
||||
return tvlv_len;
|
||||
}
|
||||
|
||||
@@ -934,7 +934,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
u8 *tt_change_ptr;
|
||||
int change_offset;
|
||||
|
||||
- rcu_read_lock();
|
||||
+ spin_lock_bh(&bat_priv->softif_vlan_list_lock);
|
||||
hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
||||
num_vlan++;
|
||||
num_entries += atomic_read(&vlan->tt.num_entries);
|
||||
@@ -972,7 +972,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
*tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr;
|
||||
|
||||
out:
|
||||
- rcu_read_unlock();
|
||||
+ spin_unlock_bh(&bat_priv->softif_vlan_list_lock);
|
||||
return tvlv_len;
|
||||
}
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Thu, 10 May 2018 19:44:28 +0200
|
||||
Subject: batman-adv: Fix TT sync flags for intermediate TT responses
|
||||
|
||||
The previous TT sync fix so far only fixed TT responses issued by the
|
||||
target node directly. So far, TT responses issued by intermediate nodes
|
||||
still lead to the wrong flags being added, leading to CRC mismatches.
|
||||
|
||||
This behaviour was observed at Freifunk Hannover in a 800 nodes setup
|
||||
where a considerable amount of nodes were still infected with 'WI'
|
||||
TT flags even with (most) nodes having the previous TT sync fix applied.
|
||||
|
||||
I was able to reproduce the issue with intermediate TT responses in a
|
||||
four node test setup and this patch fixes this issue by ensuring to
|
||||
use the per originator instead of the summarized, OR'd ones.
|
||||
|
||||
Fixes: fa614fd04692 ("batman-adv: fix tt_global_entries flags update")
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: backport, https://git.open-mesh.org/batman-adv.git/commit/d65daee8617b29c1ddcc949ce3a5ec24f7a1e1af
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 933ac64b5707846ddee9f828b538ade86b968986..94527e5e859dcdb443b2fc9c3fbbe06aae3b4a08 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -1528,6 +1528,8 @@ batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
|
||||
* by a given originator
|
||||
* @entry: the TT global entry to check
|
||||
* @orig_node: the originator to search in the list
|
||||
+ * @flags: a pointer to store TT flags for the given @entry received
|
||||
+ * from @orig_node
|
||||
*
|
||||
* find out if an orig_node is already in the list of a tt_global_entry.
|
||||
*
|
||||
@@ -1535,7 +1537,8 @@ batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
|
||||
*/
|
||||
static bool
|
||||
batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
|
||||
- const struct batadv_orig_node *orig_node)
|
||||
+ const struct batadv_orig_node *orig_node,
|
||||
+ u8 *flags)
|
||||
{
|
||||
struct batadv_tt_orig_list_entry *orig_entry;
|
||||
bool found = false;
|
||||
@@ -1543,6 +1546,10 @@ batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
|
||||
orig_entry = batadv_tt_global_orig_entry_find(entry, orig_node);
|
||||
if (orig_entry) {
|
||||
found = true;
|
||||
+
|
||||
+ if (flags)
|
||||
+ *flags = orig_entry->flags;
|
||||
+
|
||||
batadv_tt_orig_list_entry_put(orig_entry);
|
||||
}
|
||||
|
||||
@@ -1721,7 +1728,7 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
if (!(common->flags & BATADV_TT_CLIENT_TEMP))
|
||||
goto out;
|
||||
if (batadv_tt_global_entry_has_orig(tt_global_entry,
|
||||
- orig_node))
|
||||
+ orig_node, NULL))
|
||||
goto out_remove;
|
||||
batadv_tt_global_del_orig_list(tt_global_entry);
|
||||
goto add_orig_entry;
|
||||
@@ -2863,23 +2870,46 @@ unlock:
|
||||
}
|
||||
|
||||
/**
|
||||
- * batadv_tt_local_valid - verify that given tt entry is a valid one
|
||||
+ * batadv_tt_local_valid() - verify local tt entry and get flags
|
||||
* @entry_ptr: to be checked local tt entry
|
||||
* @data_ptr: not used but definition required to satisfy the callback prototype
|
||||
+ * @flags: a pointer to store TT flags for this client to
|
||||
+ *
|
||||
+ * Checks the validity of the given local TT entry. If it is, then the provided
|
||||
+ * flags pointer is updated.
|
||||
*
|
||||
* Return: true if the entry is a valid, false otherwise.
|
||||
*/
|
||||
-static bool batadv_tt_local_valid(const void *entry_ptr, const void *data_ptr)
|
||||
+static bool batadv_tt_local_valid(const void *entry_ptr,
|
||||
+ const void *data_ptr,
|
||||
+ u8 *flags)
|
||||
{
|
||||
const struct batadv_tt_common_entry *tt_common_entry = entry_ptr;
|
||||
|
||||
if (tt_common_entry->flags & BATADV_TT_CLIENT_NEW)
|
||||
return false;
|
||||
+
|
||||
+ if (flags)
|
||||
+ *flags = tt_common_entry->flags;
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_tt_global_valid() - verify global tt entry and get flags
|
||||
+ * @entry_ptr: to be checked global tt entry
|
||||
+ * @data_ptr: an orig_node object (may be NULL)
|
||||
+ * @flags: a pointer to store TT flags for this client to
|
||||
+ *
|
||||
+ * Checks the validity of the given global TT entry. If it is, then the provided
|
||||
+ * flags pointer is updated either with the common (summed) TT flags if data_ptr
|
||||
+ * is NULL or the specific, per originator TT flags otherwise.
|
||||
+ *
|
||||
+ * Return: true if the entry is a valid, false otherwise.
|
||||
+ */
|
||||
static bool batadv_tt_global_valid(const void *entry_ptr,
|
||||
- const void *data_ptr)
|
||||
+ const void *data_ptr,
|
||||
+ u8 *flags)
|
||||
{
|
||||
const struct batadv_tt_common_entry *tt_common_entry = entry_ptr;
|
||||
const struct batadv_tt_global_entry *tt_global_entry;
|
||||
@@ -2893,7 +2923,8 @@ static bool batadv_tt_global_valid(const void *entry_ptr,
|
||||
struct batadv_tt_global_entry,
|
||||
common);
|
||||
|
||||
- return batadv_tt_global_entry_has_orig(tt_global_entry, orig_node);
|
||||
+ return batadv_tt_global_entry_has_orig(tt_global_entry, orig_node,
|
||||
+ flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2903,25 +2934,34 @@ static bool batadv_tt_global_valid(const void *entry_ptr,
|
||||
* @hash: hash table containing the tt entries
|
||||
* @tt_len: expected tvlv tt data buffer length in number of bytes
|
||||
* @tvlv_buff: pointer to the buffer to fill with the TT data
|
||||
- * @valid_cb: function to filter tt change entries
|
||||
+ * @valid_cb: function to filter tt change entries and to return TT flags
|
||||
* @cb_data: data passed to the filter function as argument
|
||||
+ *
|
||||
+ * Fills the tvlv buff with the tt entries from the specified hash. If valid_cb
|
||||
+ * is not provided then this becomes a no-op.
|
||||
*/
|
||||
static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
|
||||
struct batadv_hashtable *hash,
|
||||
void *tvlv_buff, u16 tt_len,
|
||||
bool (*valid_cb)(const void *,
|
||||
- const void *),
|
||||
+ const void *,
|
||||
+ u8 *flags),
|
||||
void *cb_data)
|
||||
{
|
||||
struct batadv_tt_common_entry *tt_common_entry;
|
||||
struct batadv_tvlv_tt_change *tt_change;
|
||||
struct hlist_head *head;
|
||||
u16 tt_tot, tt_num_entries = 0;
|
||||
+ u8 flags;
|
||||
+ bool ret;
|
||||
u32 i;
|
||||
|
||||
tt_tot = batadv_tt_entries(tt_len);
|
||||
tt_change = (struct batadv_tvlv_tt_change *)tvlv_buff;
|
||||
|
||||
+ if (!valid_cb)
|
||||
+ return;
|
||||
+
|
||||
rcu_read_lock();
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
@@ -2931,11 +2971,12 @@ static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
|
||||
if (tt_tot == tt_num_entries)
|
||||
break;
|
||||
|
||||
- if ((valid_cb) && (!valid_cb(tt_common_entry, cb_data)))
|
||||
+ ret = valid_cb(tt_common_entry, cb_data, &flags);
|
||||
+ if (!ret)
|
||||
continue;
|
||||
|
||||
ether_addr_copy(tt_change->addr, tt_common_entry->addr);
|
||||
- tt_change->flags = tt_common_entry->flags;
|
||||
+ tt_change->flags = flags;
|
||||
tt_change->vid = htons(tt_common_entry->vid);
|
||||
memset(tt_change->reserved, 0,
|
||||
sizeof(tt_change->reserved));
|
|
@ -0,0 +1,73 @@
|
|||
From: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Date: Sat, 12 May 2018 00:23:07 +0800
|
||||
Subject: batman-adv: prevent TT request storms by not sending inconsistent TT TLVLs
|
||||
|
||||
A translation table TVLV changset sent with an OGM consists
|
||||
of a number of headers (one per VLAN) plus the changeset
|
||||
itself (addition and/or deletion of entries).
|
||||
|
||||
The per-VLAN headers are used by OGM recipients for consistency
|
||||
checks. Said consistency check might determine that a full
|
||||
translation table request is needed to restore consistency. If
|
||||
the TT sender adds per-VLAN headers of empty VLANs into the OGM,
|
||||
recipients are led to believe to have reached an inconsistent
|
||||
state and thus request a full table update. The full table does
|
||||
not contain empty VLANs (due to missing entries) the cycle
|
||||
restarts when the next OGM is issued.
|
||||
|
||||
Consequently, when the translation table TVLV headers are
|
||||
composed, empty VLANs are to be excluded.
|
||||
|
||||
Fixes: 21a57f6e7a3b ("batman-adv: make the TT CRC logic VLAN specific")
|
||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/e4687b4be274da6180fc15b327419851fb681ec9
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 94527e5e859dcdb443b2fc9c3fbbe06aae3b4a08..743963bf39dca73f7554f9f85fffd57fd6a3c963 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -929,15 +929,20 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
struct batadv_tvlv_tt_vlan_data *tt_vlan;
|
||||
struct batadv_softif_vlan *vlan;
|
||||
u16 num_vlan = 0;
|
||||
- u16 num_entries = 0;
|
||||
+ u16 vlan_entries = 0;
|
||||
+ u16 total_entries = 0;
|
||||
u16 tvlv_len;
|
||||
u8 *tt_change_ptr;
|
||||
int change_offset;
|
||||
|
||||
spin_lock_bh(&bat_priv->softif_vlan_list_lock);
|
||||
hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
||||
+ vlan_entries = atomic_read(&vlan->tt.num_entries);
|
||||
+ if (vlan_entries < 1)
|
||||
+ continue;
|
||||
+
|
||||
num_vlan++;
|
||||
- num_entries += atomic_read(&vlan->tt.num_entries);
|
||||
+ total_entries += vlan_entries;
|
||||
}
|
||||
|
||||
change_offset = sizeof(**tt_data);
|
||||
@@ -945,7 +950,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
|
||||
/* if tt_len is negative, allocate the space needed by the full table */
|
||||
if (*tt_len < 0)
|
||||
- *tt_len = batadv_tt_len(num_entries);
|
||||
+ *tt_len = batadv_tt_len(total_entries);
|
||||
|
||||
tvlv_len = *tt_len;
|
||||
tvlv_len += change_offset;
|
||||
@@ -962,6 +967,10 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
|
||||
tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1);
|
||||
hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
||||
+ vlan_entries = atomic_read(&vlan->tt.num_entries);
|
||||
+ if (vlan_entries < 1)
|
||||
+ continue;
|
||||
+
|
||||
tt_vlan->vid = htons(vlan->vid);
|
||||
tt_vlan->crc = htonl(vlan->tt.crc);
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 2 Jun 2018 17:26:34 +0200
|
||||
Subject: batman-adv: Fix bat_ogm_iv best gw refcnt after netlink dump
|
||||
|
||||
A reference for the best gateway is taken when the list of gateways in the
|
||||
mesh is sent via netlink. This is necessary to check whether the currently
|
||||
dumped entry is the currently selected gateway or not. This information is
|
||||
then transferred as flag BATADV_ATTR_FLAG_BEST.
|
||||
|
||||
After the comparison of the current entry is done,
|
||||
batadv_iv_gw_dump_entry() has to decrease the reference counter again.
|
||||
Otherwise the reference will be held and thus prevents a proper shutdown of
|
||||
the batman-adv interfaces (and some of the interfaces enslaved in it).
|
||||
|
||||
Fixes: fa3228924152 ("batman-adv: add B.A.T.M.A.N. IV bat_gw_dump implementations")
|
||||
Reported-by: Andreas Ziegler <dev@andreas-ziegler.de>
|
||||
Tested-by: Andreas Ziegler <dev@andreas-ziegler.de>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/46360d203c627e71a27d1f8f551c819c7f2353fd
|
||||
|
||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
||||
index bf389adbb2694746d6397a0a38353cdcd8008899..f0174a17b30d14e5c127106b364b8fbc8ec384ee 100644
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -2722,7 +2722,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
{
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
struct batadv_neigh_node *router;
|
||||
- struct batadv_gw_node *curr_gw;
|
||||
+ struct batadv_gw_node *curr_gw = NULL;
|
||||
int ret = 0;
|
||||
void *hdr;
|
||||
|
||||
@@ -2770,6 +2770,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
+ if (curr_gw)
|
||||
+ batadv_gw_node_put(curr_gw);
|
||||
if (router_ifinfo)
|
||||
batadv_neigh_ifinfo_put(router_ifinfo);
|
||||
if (router)
|
|
@ -0,0 +1,42 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 2 Jun 2018 17:26:35 +0200
|
||||
Subject: batman-adv: Fix bat_v best gw refcnt after netlink dump
|
||||
|
||||
A reference for the best gateway is taken when the list of gateways in the
|
||||
mesh is sent via netlink. This is necessary to check whether the currently
|
||||
dumped entry is the currently selected gateway or not. This information is
|
||||
then transferred as flag BATADV_ATTR_FLAG_BEST.
|
||||
|
||||
After the comparison of the current entry is done,
|
||||
batadv_v_gw_dump_entry() has to decrease the reference counter again.
|
||||
Otherwise the reference will be held and thus prevents a proper shutdown of
|
||||
the batman-adv interfaces (and some of the interfaces enslaved in it).
|
||||
|
||||
Fixes: 15315a94ad98 ("batman-adv: add B.A.T.M.A.N. V bat_gw_dump implementations")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/2b422b5808183d1084b450b89d9a085a13dd6d2c
|
||||
|
||||
diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
|
||||
index 0488063ff6ac5985e27c3a0df41ab3566b48abb8..87f06e92270b4c51376bc4e9717b0aed8c9f3441 100644
|
||||
--- a/net/batman-adv/bat_v.c
|
||||
+++ b/net/batman-adv/bat_v.c
|
||||
@@ -929,7 +929,7 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
{
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
struct batadv_neigh_node *router;
|
||||
- struct batadv_gw_node *curr_gw;
|
||||
+ struct batadv_gw_node *curr_gw = NULL;
|
||||
int ret = 0;
|
||||
void *hdr;
|
||||
|
||||
@@ -997,6 +997,8 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
+ if (curr_gw)
|
||||
+ batadv_gw_node_put(curr_gw);
|
||||
if (router_ifinfo)
|
||||
batadv_neigh_ifinfo_put(router_ifinfo);
|
||||
if (router)
|
|
@ -0,0 +1,106 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 1 Jun 2018 19:24:23 +0200
|
||||
Subject: batman-adv: Fix debugfs path for renamed hardif
|
||||
|
||||
batman-adv is creating special debugfs directories in the init
|
||||
net_namespace for each valid hard-interface (net_device). But it is
|
||||
possible to rename a net_device to a completely different name then the
|
||||
original one.
|
||||
|
||||
It can therefore happen that a user registers a new net_device which gets
|
||||
the name "wlan0" assigned by default. batman-adv is also adding a new
|
||||
directory under $debugfs/batman-adv/ with the name "wlan0".
|
||||
|
||||
The user then decides to rename this device to "wl_pri" and registers a
|
||||
different device. The kernel may now decide to use the name "wlan0" again
|
||||
for this new device. batman-adv will detect it as a valid net_device and
|
||||
tries to create a directory with the name "wlan0" under
|
||||
$debugfs/batman-adv/. But there already exists one with this name under
|
||||
this path and thus this fails. batman-adv will detect a problem and
|
||||
rollback the registering of this device.
|
||||
|
||||
batman-adv must therefore take care of renaming the debugfs directories
|
||||
for hard-interfaces whenever it detects such a net_device rename.
|
||||
|
||||
Fixes: 3c926a01c8e8 ("batman-adv: add debugfs structure for information per interface")
|
||||
Reported-by: John Soros <sorosj@gmail.com>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: backport, https://git.open-mesh.org/batman-adv.git/commit/127086f503f6495518b95455efebee33d328f335
|
||||
|
||||
diff --git a/net/batman-adv/debugfs.c b/net/batman-adv/debugfs.c
|
||||
index 77925504379dac7d64777393ddae326b5d6d9505..a229d2d9acfd1f3d6fea071aa0df3bf06a0e2ecf 100644
|
||||
--- a/net/batman-adv/debugfs.c
|
||||
+++ b/net/batman-adv/debugfs.c
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "debugfs.h"
|
||||
#include "main.h"
|
||||
|
||||
+#include <linux/dcache.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
@@ -337,6 +338,25 @@ out:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_debugfs_rename_hardif() - Fix debugfs path for renamed hardif
|
||||
+ * @hard_iface: hard interface which was renamed
|
||||
+ */
|
||||
+void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
|
||||
+{
|
||||
+ const char *name = hard_iface->net_dev->name;
|
||||
+ struct dentry *dir;
|
||||
+ struct dentry *d;
|
||||
+
|
||||
+ dir = hard_iface->debug_dir;
|
||||
+ if (!dir)
|
||||
+ return;
|
||||
+
|
||||
+ d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
|
||||
+ if (!d)
|
||||
+ pr_err("Can't rename debugfs dir to %s\n", name);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* batadv_debugfs_del_hardif - delete the base directory for a hard interface
|
||||
* in debugfs.
|
||||
diff --git a/net/batman-adv/debugfs.h b/net/batman-adv/debugfs.h
|
||||
index e49121ee55f696547ddc9774ba6c425af2d49b57..3d9b684b862d0aa9d2380fbcb15fd4ef68a4511c 100644
|
||||
--- a/net/batman-adv/debugfs.h
|
||||
+++ b/net/batman-adv/debugfs.h
|
||||
@@ -31,6 +31,7 @@ void batadv_debugfs_destroy(void);
|
||||
int batadv_debugfs_add_meshif(struct net_device *dev);
|
||||
void batadv_debugfs_del_meshif(struct net_device *dev);
|
||||
int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface);
|
||||
+void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface);
|
||||
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface);
|
||||
|
||||
#else
|
||||
@@ -58,6 +59,11 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static inline
|
||||
+void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
static inline
|
||||
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
||||
index ebeea5816a06b33c4944b01e40cee157c88bdff7..507eaff8582a8c58adc6d23abc42bb6c31d2816f 100644
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -1020,6 +1020,9 @@ static int batadv_hard_if_event(struct notifier_block *this,
|
||||
if (batadv_is_wifi_hardif(hard_iface))
|
||||
hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
|
||||
break;
|
||||
+ case NETDEV_CHANGENAME:
|
||||
+ batadv_debugfs_rename_hardif(hard_iface);
|
||||
+ break;
|
||||
default:
|
||||
break;
|
||||
}
|
|
@ -0,0 +1,134 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 1 Jun 2018 19:24:24 +0200
|
||||
Subject: batman-adv: Fix debugfs path for renamed softif
|
||||
|
||||
batman-adv is creating special debugfs directories in the init
|
||||
net_namespace for each created soft-interface (batadv net_device). But it
|
||||
is possible to rename a net_device to a completely different name then the
|
||||
original one.
|
||||
|
||||
It can therefore happen that a user registers a new batadv net_device with
|
||||
the name "bat0". batman-adv is then also adding a new directory under
|
||||
$debugfs/batman-adv/ with the name "wlan0".
|
||||
|
||||
The user then decides to rename this device to "bat1" and registers a
|
||||
different batadv device with the name "bat0". batman-adv will then try to
|
||||
create a directory with the name "bat0" under $debugfs/batman-adv/ again.
|
||||
But there already exists one with this name under this path and thus this
|
||||
fails. batman-adv will detect a problem and rollback the registering of
|
||||
this device.
|
||||
|
||||
batman-adv must therefore take care of renaming the debugfs directories for
|
||||
soft-interfaces whenever it detects such a net_device rename.
|
||||
|
||||
Fixes: 230202d4b530 ("batman-adv: Move device for icmp injection to debugfs")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: backport, https://git.open-mesh.org/batman-adv.git/commit/3f2237bb191cd17654a4d5a5badfd6e7379c4b37
|
||||
|
||||
diff --git a/net/batman-adv/debugfs.c b/net/batman-adv/debugfs.c
|
||||
index a229d2d9acfd1f3d6fea071aa0df3bf06a0e2ecf..fa396394edd02e74f49323216027f4ef9739dfa0 100644
|
||||
--- a/net/batman-adv/debugfs.c
|
||||
+++ b/net/batman-adv/debugfs.c
|
||||
@@ -421,6 +421,26 @@ out:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_debugfs_rename_meshif() - Fix debugfs path for renamed softif
|
||||
+ * @dev: net_device which was renamed
|
||||
+ */
|
||||
+void batadv_debugfs_rename_meshif(struct net_device *dev)
|
||||
+{
|
||||
+ struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
+ const char *name = dev->name;
|
||||
+ struct dentry *dir;
|
||||
+ struct dentry *d;
|
||||
+
|
||||
+ dir = bat_priv->debug_dir;
|
||||
+ if (!dir)
|
||||
+ return;
|
||||
+
|
||||
+ d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
|
||||
+ if (!d)
|
||||
+ pr_err("Can't rename debugfs dir to %s\n", name);
|
||||
+}
|
||||
+
|
||||
void batadv_debugfs_del_meshif(struct net_device *dev)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
diff --git a/net/batman-adv/debugfs.h b/net/batman-adv/debugfs.h
|
||||
index 3d9b684b862d0aa9d2380fbcb15fd4ef68a4511c..59a0d6d70ecd4d0b49e15138306acc371da2d8b7 100644
|
||||
--- a/net/batman-adv/debugfs.h
|
||||
+++ b/net/batman-adv/debugfs.h
|
||||
@@ -29,6 +29,7 @@ struct net_device;
|
||||
void batadv_debugfs_init(void);
|
||||
void batadv_debugfs_destroy(void);
|
||||
int batadv_debugfs_add_meshif(struct net_device *dev);
|
||||
+void batadv_debugfs_rename_meshif(struct net_device *dev);
|
||||
void batadv_debugfs_del_meshif(struct net_device *dev);
|
||||
int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface);
|
||||
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface);
|
||||
@@ -49,6 +50,10 @@ static inline int batadv_debugfs_add_meshif(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static inline void batadv_debugfs_rename_meshif(struct net_device *dev)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
static inline void batadv_debugfs_del_meshif(struct net_device *dev)
|
||||
{
|
||||
}
|
||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
||||
index 507eaff8582a8c58adc6d23abc42bb6c31d2816f..23d3893264f989c9740e68d83f6db300dee20dc3 100644
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -958,6 +958,32 @@ void batadv_hardif_remove_interfaces(void)
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_hard_if_event_softif() - Handle events for soft interfaces
|
||||
+ * @event: NETDEV_* event to handle
|
||||
+ * @net_dev: net_device which generated an event
|
||||
+ *
|
||||
+ * Return: NOTIFY_* result
|
||||
+ */
|
||||
+static int batadv_hard_if_event_softif(unsigned long event,
|
||||
+ struct net_device *net_dev)
|
||||
+{
|
||||
+ struct batadv_priv *bat_priv;
|
||||
+
|
||||
+ switch (event) {
|
||||
+ case NETDEV_REGISTER:
|
||||
+ batadv_sysfs_add_meshif(net_dev);
|
||||
+ bat_priv = netdev_priv(net_dev);
|
||||
+ batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
|
||||
+ break;
|
||||
+ case NETDEV_CHANGENAME:
|
||||
+ batadv_debugfs_rename_meshif(net_dev);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return NOTIFY_DONE;
|
||||
+}
|
||||
+
|
||||
static int batadv_hard_if_event(struct notifier_block *this,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
@@ -966,12 +992,8 @@ static int batadv_hard_if_event(struct notifier_block *this,
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
struct batadv_priv *bat_priv;
|
||||
|
||||
- if (batadv_softif_is_valid(net_dev) && event == NETDEV_REGISTER) {
|
||||
- batadv_sysfs_add_meshif(net_dev);
|
||||
- bat_priv = netdev_priv(net_dev);
|
||||
- batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
|
||||
- return NOTIFY_DONE;
|
||||
- }
|
||||
+ if (batadv_softif_is_valid(net_dev))
|
||||
+ return batadv_hard_if_event_softif(event, net_dev);
|
||||
|
||||
hard_iface = batadv_hardif_get_by_netdev(net_dev);
|
||||
if (!hard_iface && (event == NETDEV_REGISTER ||
|
|
@ -0,0 +1,34 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Thu, 7 Jun 2018 00:46:23 +0200
|
||||
Subject: batman-adv: Avoid storing non-TT-sync flags on singular entries too
|
||||
|
||||
Since commit 382d020fe3fa ("batman-adv: fix TT sync flag inconsistencies")
|
||||
TT sync flags and TT non-sync'd flags are supposed to be stored
|
||||
separately.
|
||||
|
||||
The previous patch missed to apply this separation on a TT entry with
|
||||
only a single TT orig entry.
|
||||
|
||||
This is a minor fix because with only a single TT orig entry the DDoS
|
||||
issue the former patch solves does not apply.
|
||||
|
||||
Fixes: 382d020fe3fa ("batman-adv: fix TT sync flag inconsistencies")
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/beb6246b2339852b6a429ae9259a8eb30a685041
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 743963bf39dca73f7554f9f85fffd57fd6a3c963..a8b4d9bcb318656022a30f742ede4f38a646d0d1 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -1695,7 +1695,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
ether_addr_copy(common->addr, tt_addr);
|
||||
common->vid = vid;
|
||||
|
||||
- common->flags = flags;
|
||||
+ common->flags = flags & (~BATADV_TT_SYNC_MASK);
|
||||
+
|
||||
tt_global_entry->roam_at = 0;
|
||||
/* node must store current time in case of roaming. This is
|
||||
* needed to purge this entry out on timeout (if nobody claims
|
|
@ -0,0 +1,43 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Thu, 7 Jun 2018 00:46:24 +0200
|
||||
Subject: batman-adv: Fix multicast TT issues with bogus ROAM flags
|
||||
|
||||
When a (broken) node wrongly sends multicast TT entries with a ROAM
|
||||
flag then this causes any receiving node to drop all entries for the
|
||||
same multicast MAC address announced by other nodes, leading to
|
||||
packet loss.
|
||||
|
||||
Fix this DoS vector by only storing TT sync flags. For multicast TT
|
||||
non-sync'ing flag bits like ROAM are unused so far anyway.
|
||||
|
||||
Fixes: 405cc1e5a81e ("batman-adv: Modified forwarding behaviour for multicast packets")
|
||||
Reported-by: Leonardo Mörlein <me@irrelefant.net>
|
||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/c7054ffae0c3b08bb4bef3cffee1e0a543e14096
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index a8b4d9bcb318656022a30f742ede4f38a646d0d1..143a00f90d1d925aad7113f897d06f435f28dcd8 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -1695,7 +1695,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
ether_addr_copy(common->addr, tt_addr);
|
||||
common->vid = vid;
|
||||
|
||||
- common->flags = flags & (~BATADV_TT_SYNC_MASK);
|
||||
+ if (!is_multicast_ether_addr(common->addr))
|
||||
+ common->flags = flags & (~BATADV_TT_SYNC_MASK);
|
||||
|
||||
tt_global_entry->roam_at = 0;
|
||||
/* node must store current time in case of roaming. This is
|
||||
@@ -1759,7 +1760,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
* TT_CLIENT_TEMP, therefore they have to be copied in the
|
||||
* client entry
|
||||
*/
|
||||
- common->flags |= flags & (~BATADV_TT_SYNC_MASK);
|
||||
+ if (!is_multicast_ether_addr(common->addr))
|
||||
+ common->flags |= flags & (~BATADV_TT_SYNC_MASK);
|
||||
|
||||
/* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
|
||||
* one originator left in the list and we previously received a
|
|
@ -0,0 +1,32 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 31 Aug 2018 15:08:44 +0200
|
||||
Subject: batman-adv: Avoid probe ELP information leak
|
||||
|
||||
The probe ELPs for WiFi interfaces are expanded to contain at least
|
||||
BATADV_ELP_MIN_PROBE_SIZE bytes. This is usually a lot more than the
|
||||
number of bytes which the template ELP packet requires.
|
||||
|
||||
These extra padding bytes were not initialized and thus could contain data
|
||||
which were previously stored at the same location. It is therefore required
|
||||
to set it to some predefined or random values to avoid leaking private
|
||||
information from the system transmitting these kind of packets.
|
||||
|
||||
Fixes: bedcadfaa92b ("batman-adv: ELP - send unicast ELP packets for throughput sampling")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Antonio Quartulli <a@unstable.cc>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/6c876e572f592c31132a55b5fb8427e168e5fb3c
|
||||
|
||||
diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
|
||||
index 06b2924f4cb7dde54bab97ad2d28aecd9b1a4ceb..e988a14f3eb01de1f52fe6dcaa91af898060140e 100644
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -227,7 +227,7 @@ batadv_v_elp_wifi_neigh_probe(struct batadv_hardif_neigh_node *neigh)
|
||||
* the packet to be exactly of that size to make the link
|
||||
* throughput estimation effective.
|
||||
*/
|
||||
- skb_put(skb, probe_len - hard_iface->bat_v.elp_skb->len);
|
||||
+ skb_put_zero(skb, probe_len - hard_iface->bat_v.elp_skb->len);
|
||||
|
||||
batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
|
||||
"Sending unicast (probe) ELP packet on interface %s to %pM\n",
|
|
@ -0,0 +1,42 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 31 Aug 2018 16:46:47 +0200
|
||||
Subject: batman-adv: Fix segfault when writing to throughput_override
|
||||
|
||||
The per hardif sysfs file "batman_adv/throughput_override" prints the
|
||||
resulting change as info text when the users writes to this file. It uses
|
||||
the helper function batadv_info to add it at the same time to the kernel
|
||||
ring buffer and to the batman-adv debug log (when CONFIG_BATMAN_ADV_DEBUG
|
||||
is enabled).
|
||||
|
||||
The function batadv_info requires as first parameter the batman-adv softif
|
||||
net_device. This parameter is then used to find the private buffer which
|
||||
contains the debug log for this batman-adv interface. But
|
||||
batadv_store_throughput_override used as first argument the slave
|
||||
net_device. This slave device doesn't have the batadv_priv private data
|
||||
which is access by batadv_info.
|
||||
|
||||
Writing to this file with CONFIG_BATMAN_ADV_DEBUG enabled can either lead
|
||||
to a segfault or to memory corruption.
|
||||
|
||||
Fixes: c513176e4b7a ("batman-adv: add throughput override attribute to hard_ifaces")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/ddf99b78e255530cbadc0f67656a549e19520280
|
||||
|
||||
diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c
|
||||
index 17c844196eb26c9faf9fd543b88cd86cc1c2c029..ae22db3d6637dde2fcc238826a624ef2d6dbd8f5 100644
|
||||
--- a/net/batman-adv/sysfs.c
|
||||
+++ b/net/batman-adv/sysfs.c
|
||||
@@ -1078,8 +1078,9 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
|
||||
if (old_tp_override == tp_override)
|
||||
goto out;
|
||||
|
||||
- batadv_info(net_dev, "%s: Changing from: %u.%u MBit to: %u.%u MBit\n",
|
||||
- "throughput_override",
|
||||
+ batadv_info(hard_iface->soft_iface,
|
||||
+ "%s: %s: Changing from: %u.%u MBit to: %u.%u MBit\n",
|
||||
+ "throughput_override", net_dev->name,
|
||||
old_tp_override / 10, old_tp_override % 10,
|
||||
tp_override / 10, tp_override % 10);
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 31 Aug 2018 16:56:29 +0200
|
||||
Subject: batman-adv: Fix segfault when writing to sysfs elp_interval
|
||||
|
||||
The per hardif sysfs file "batman_adv/elp_interval" is using the generic
|
||||
functions to store/show uint values. The helper __batadv_store_uint_attr
|
||||
requires the softif net_device as parameter to print the resulting change
|
||||
as info text when the users writes to this file. It uses the helper
|
||||
function batadv_info to add it at the same time to the kernel ring buffer
|
||||
and to the batman-adv debug log (when CONFIG_BATMAN_ADV_DEBUG is enabled).
|
||||
|
||||
The function batadv_info requires as first parameter the batman-adv softif
|
||||
net_device. This parameter is then used to find the private buffer which
|
||||
contains the debug log for this batman-adv interface. But
|
||||
batadv_store_throughput_override used as first argument the slave
|
||||
net_device. This slave device doesn't have the batadv_priv private data
|
||||
which is access by batadv_info.
|
||||
|
||||
Writing to this file with CONFIG_BATMAN_ADV_DEBUG enabled can either lead
|
||||
to a segfault or to memory corruption.
|
||||
|
||||
Fixes: ec46535b8275 ("batman-adv: Add hard_iface specific sysfs wrapper macros for UINT")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/848be9859b0109a6e428f92f21f2e660153b1c75
|
||||
|
||||
diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c
|
||||
index ae22db3d6637dde2fcc238826a624ef2d6dbd8f5..a4e6f158de26dea0e8e3fefd5b9aeec3dcd64457 100644
|
||||
--- a/net/batman-adv/sysfs.c
|
||||
+++ b/net/batman-adv/sysfs.c
|
||||
@@ -186,7 +186,8 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
|
||||
\
|
||||
return __batadv_store_uint_attr(buff, count, _min, _max, \
|
||||
_post_func, attr, \
|
||||
- &bat_priv->_var, net_dev); \
|
||||
+ &bat_priv->_var, net_dev, \
|
||||
+ NULL); \
|
||||
}
|
||||
|
||||
#define BATADV_ATTR_SIF_SHOW_UINT(_name, _var) \
|
||||
@@ -260,7 +261,9 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
|
||||
\
|
||||
length = __batadv_store_uint_attr(buff, count, _min, _max, \
|
||||
_post_func, attr, \
|
||||
- &hard_iface->_var, net_dev); \
|
||||
+ &hard_iface->_var, \
|
||||
+ hard_iface->soft_iface, \
|
||||
+ net_dev); \
|
||||
\
|
||||
batadv_hardif_put(hard_iface); \
|
||||
return length; \
|
||||
@@ -354,10 +357,12 @@ __batadv_store_bool_attr(char *buff, size_t count,
|
||||
|
||||
static int batadv_store_uint_attr(const char *buff, size_t count,
|
||||
struct net_device *net_dev,
|
||||
+ struct net_device *slave_dev,
|
||||
const char *attr_name,
|
||||
unsigned int min, unsigned int max,
|
||||
atomic_t *attr)
|
||||
{
|
||||
+ char ifname[IFNAMSIZ + 3] = "";
|
||||
unsigned long uint_val;
|
||||
int ret;
|
||||
|
||||
@@ -383,8 +388,11 @@ static int batadv_store_uint_attr(const char *buff, size_t count,
|
||||
if (atomic_read(attr) == uint_val)
|
||||
return count;
|
||||
|
||||
- batadv_info(net_dev, "%s: Changing from: %i to: %lu\n",
|
||||
- attr_name, atomic_read(attr), uint_val);
|
||||
+ if (slave_dev)
|
||||
+ snprintf(ifname, sizeof(ifname), "%s: ", slave_dev->name);
|
||||
+
|
||||
+ batadv_info(net_dev, "%s: %sChanging from: %i to: %lu\n",
|
||||
+ attr_name, ifname, atomic_read(attr), uint_val);
|
||||
|
||||
atomic_set(attr, uint_val);
|
||||
return count;
|
||||
@@ -395,12 +403,13 @@ static ssize_t __batadv_store_uint_attr(const char *buff, size_t count,
|
||||
void (*post_func)(struct net_device *),
|
||||
const struct attribute *attr,
|
||||
atomic_t *attr_store,
|
||||
- struct net_device *net_dev)
|
||||
+ struct net_device *net_dev,
|
||||
+ struct net_device *slave_dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
- ret = batadv_store_uint_attr(buff, count, net_dev, attr->name, min, max,
|
||||
- attr_store);
|
||||
+ ret = batadv_store_uint_attr(buff, count, net_dev, slave_dev,
|
||||
+ attr->name, min, max, attr_store);
|
||||
if (post_func && ret)
|
||||
post_func(net_dev);
|
||||
|
||||
@@ -569,7 +578,7 @@ static ssize_t batadv_store_gw_sel_class(struct kobject *kobj,
|
||||
return __batadv_store_uint_attr(buff, count, 1, BATADV_TQ_MAX_VALUE,
|
||||
batadv_post_gw_reselect, attr,
|
||||
&bat_priv->gw.sel_class,
|
||||
- bat_priv->soft_iface);
|
||||
+ bat_priv->soft_iface, NULL);
|
||||
}
|
||||
|
||||
static ssize_t batadv_show_gw_bwidth(struct kobject *kobj,
|
|
@ -0,0 +1,42 @@
|
|||
From: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Date: Fri, 7 Sep 2018 05:45:54 +0800
|
||||
Subject: batman-adv: fix backbone_gw refcount on queue_work() failure
|
||||
|
||||
The backbone_gw refcounter is to be decreased by the queued work and
|
||||
currently is never decreased if the queue_work() call fails.
|
||||
Fix by checking the queue_work() return value and decrease refcount
|
||||
if necessary.
|
||||
|
||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/24d83a50421c1c5d39cd9c015516a1a293ae8d0c
|
||||
|
||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
||||
index aecf34503e95d9aa723449ddbf0bb3035336b878..258a74fd1c237fbf1b81dfc1c48720d8359b0ecc 100644
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -1767,6 +1767,7 @@ batadv_bla_loopdetect_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
{
|
||||
struct batadv_bla_backbone_gw *backbone_gw;
|
||||
struct ethhdr *ethhdr;
|
||||
+ bool ret;
|
||||
|
||||
ethhdr = eth_hdr(skb);
|
||||
|
||||
@@ -1790,8 +1791,13 @@ batadv_bla_loopdetect_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
if (unlikely(!backbone_gw))
|
||||
return true;
|
||||
|
||||
- queue_work(batadv_event_workqueue, &backbone_gw->report_work);
|
||||
- /* backbone_gw is unreferenced in the report work function function */
|
||||
+ ret = queue_work(batadv_event_workqueue, &backbone_gw->report_work);
|
||||
+
|
||||
+ /* backbone_gw is unreferenced in the report work function function
|
||||
+ * if queue_work() call was successful
|
||||
+ */
|
||||
+ if (!ret)
|
||||
+ batadv_backbone_gw_put(backbone_gw);
|
||||
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
From: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Date: Fri, 7 Sep 2018 05:45:55 +0800
|
||||
Subject: batman-adv: fix hardif_neigh refcount on queue_work() failure
|
||||
|
||||
The hardif_neigh refcounter is to be decreased by the queued work and
|
||||
currently is never decreased if the queue_work() call fails.
|
||||
Fix by checking the queue_work() return value and decrease refcount
|
||||
if necessary.
|
||||
|
||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/85100b602c127cecf1bcfd620d20eb867d685df2
|
||||
|
||||
diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
|
||||
index e988a14f3eb01de1f52fe6dcaa91af898060140e..2ec0ecab0493ff88fdc01e55c8557de5b772e8bf 100644
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -254,6 +254,7 @@ static void batadv_v_elp_periodic_work(struct work_struct *work)
|
||||
struct batadv_priv *bat_priv;
|
||||
struct sk_buff *skb;
|
||||
u32 elp_interval;
|
||||
+ bool ret;
|
||||
|
||||
bat_v = container_of(work, struct batadv_hard_iface_bat_v, elp_wq.work);
|
||||
hard_iface = container_of(bat_v, struct batadv_hard_iface, bat_v);
|
||||
@@ -315,8 +316,11 @@ static void batadv_v_elp_periodic_work(struct work_struct *work)
|
||||
* may sleep and that is not allowed in an rcu protected
|
||||
* context. Therefore schedule a task for that.
|
||||
*/
|
||||
- queue_work(batadv_event_workqueue,
|
||||
- &hardif_neigh->bat_v.metric_work);
|
||||
+ ret = queue_work(batadv_event_workqueue,
|
||||
+ &hardif_neigh->bat_v.metric_work);
|
||||
+
|
||||
+ if (!ret)
|
||||
+ batadv_hardif_neigh_put(hardif_neigh);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue