Skip to content

gnrc: runs full on very heavy load #10672

@miri64

Description

@miri64

Description

When using a 6Lo capable node, I am able to cause one node to have a full packet buffer. The packet space is never released, so the node basically becomes unreachable.

This was originally reported in #10581 (comment)

Steps to reproduce the issue

Compile gnrc_networking on native with

diff --git a/examples/gnrc_networking/Makefile b/examples/gnrc_networking/Makefile
index 4d361f825..693378f50 100644
--- a/examples/gnrc_networking/Makefile
+++ b/examples/gnrc_networking/Makefile
@@ -18,7 +18,7 @@ BOARD_INSUFFICIENT_MEMORY := arduino-duemilanove arduino-mega2560 arduino-uno \
 
 # Include packages that pull up and auto-init the link layer.
 # NOTE: 6LoWPAN will be included if IEEE802.15.4 devices are present
-USEMODULE += gnrc_netdev_default
+USEMODULE += socket_zep
+USEMODULE += gnrc_pktbuf_cmd
 USEMODULE += auto_init_gnrc_netif
 # Specify the mandatory networking modules for IPv6 and UDP
 USEMODULE += gnrc_ipv6_router_default

Run two instances of it

native1:

TERMFLAGS="-z [::]:17754,[::1]:17755" make -C examples/gnrc_networking term

native2:

TERMFLAGS="-z [::]:17755,[::1]:17754" make -C examples/gnrc_networking term

Note: you might need to start both instances rather quickly between each start, otherwise the already running instance might abort with

/home/mlenders/Repositories/RIOT-OS/RIOT/examples/gnrc_networking/bin/native/gnrc_networking.elf: zep: read: Connection refused

Start pinging with full MTU-sized packages from both nodes (nearly) at the same time:

native1> ping6 200 fe80::25a:4550:a00:455a 1232 0
native2> ping6 200 fe80::25a:4550:a00:455b 1232 0

Expected results

There will be timeouts and maybe full packet buffer messages, but afterwards the packet buffer will be free (check with pktbuf command).

Actual results

The packet buffer runs full and won't be released (one node will only get ping timeouts rather quickly, the other nodes only reports error: packet buffer full multiple times and then return to shell. The pktbuf commands reveals that the packet buffer contains packets that are never released

Versions

Tested in 2018.10 and current master as of writing this issue (07ceddd). I also had a look 2018.04 (where the gnrc_pktbuf_cmd pseudo-module does not exist) here both nodes ran full (but that might only be incidental).

$ ./dist/tools/ci/print_toolchain_versions.sh 

Operating System Environment
-----------------------------
       Operating System: "Arch Linux" 
                 Kernel: Linux 4.19.12-arch1-1-ARCH x86_64 unknown

Installed compiler toolchains
-----------------------------
             native gcc: gcc (GCC) 8.2.1 20181127
      arm-none-eabi-gcc: arm-none-eabi-gcc (Arch Repository) 8.2.0
                avr-gcc: avr-gcc (GCC) 8.2.0
       mips-mti-elf-gcc: missing
             msp430-gcc: missing
   riscv-none-embed-gcc: missing
                  clang: clang version 7.0.1 (tags/RELEASE_701/final)

Installed compiler libs
-----------------------
   arm-none-eabi-newlib: "3.0.0"
    mips-mti-elf-newlib: missing
riscv-none-embed-newlib: missing
               avr-libc: "2.0.0" ("20150208")

Installed development tools
---------------------------
                  cmake: cmake version 3.13.1
               cppcheck: missing
                doxygen: 1.8.14
                 flake8: missing
                    git: git version 2.20.1
                   make: GNU Make 4.2.1
                openocd: missing
                 python: Python 3.7.1
                python2: Python 2.7.15
                python3: Python 3.7.1
             coccinelle: missing

(maybe @gschorcht also can report his build environment)

Metadata

Metadata

Assignees

Labels

Area: networkArea: NetworkingType: bugThe issue reports a bug / The PR fixes a bug (including spelling errors)

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions