Chirpstack UDP Forwarder Gets Empty Gateway ID Resulting in Error

Viewed 4

Hello,

I have a Concentratord + Chirpstack UDP Forwarder setup I am trying to get working, but am running into an issue. I have no issue sending messages from Concentratord to the Chirpstack Gateway Bridge, but when I try sending to the Chirpstack UDP Forwarder, I get the following issue:

2026-09-14T20:40:14.120Z INFO  [chirpstack_udp_forwarder] Starting ChirpStack UDP Forwarder (version: 4.3.1, docs: https://github.com/chirpstack/chirpstack-udp-forwarder)
2026-09-14T20:40:14.120Z DEBUG [chirpstack_udp_forwarder::helpers] Reading gateway id, server: ipc:///tmp/concentratord_command
2026-09-14T20:40:14.120Z INFO  [chirpstack_udp_forwarder::commands] Creating new socket for sending commands, endpoint: ipc:///tmp/concentratord_command
2026-09-14T20:40:14.123Z INFO  [chirpstack_udp_forwarder] Received gateway ID from Concentratord, gateway_id:
2026-09-14T20:40:14.124Z INFO  [chirpstack_udp_forwarder::forwarder] Starting forwarder, server: www.mydomain.com:1780
2026-09-14T20:40:14.124Z INFO  [chirpstack_udp_forwarder::metrics] Starting Prometheus metrics server, bind: 0.0.0.0:9800
2026-09-14T20:40:14.165Z INFO  [chirpstack_udp_forwarder::events] Creating new socket for receiving events, endpoint: ipc:///tmp/concentratord_event
2026-09-14T20:40:14.166Z INFO  [chirpstack_udp_forwarder::commands] Creating new socket for sending commands, endpoint: ipc:///tmp/concentratord_command

thread '<unnamed>' (38) panicked at src/forwarder.rs:222:12:
copy_from_slice: source slice length (0) does not match destination slice length (8)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Aborted (core dumped)

Best I can tell, the gateway ID it is recieving from concentratord is blank, resulting in the error. I'm not sure what I am missing in my setup.

Versions:
chirpstack-concentratord-sx1302 4.4.1
chirpstack-udp-forwarder 4.3.1

Here is my concentratord config, which has no problem when pushing to the gateway bridge:

# Concentratord configuration.
[concentratord]
  # Log level.
  #
  # Valid options are:
  #   * TRACE
  #   * DEBUG
  #   * INFO
  #   * WARN
  #   * ERROR
  #   * OFF
  log_level="INFO"

  # Log to syslog.
  #
  # When set to true, log messages are being written to syslog instead of stdout.
  log_to_syslog=false

  # Statistics interval.
  stats_interval="30s"

  # Disable CRC status filter.
  #
  # By default, the Concentratord will ignore received frames which do not have
  # a valid CRC. This option makes it possible to disable this filter such that
  # received frames without (valid) CRC can be analyzed.
  disable_crc_filter=false

  # Configuration for the (ZeroMQ based) API.
  [concentratord.api]
    # Event PUB socket bind.
    event_bind="ipc:///tmp/concentratord_event"

    # Command REP socket bind.
    command_bind="ipc:///tmp/concentratord_command"


# LoRa gateway configuration.
[gateway]


# GPIO Info
  sx1302_power_en_chip="/dev/gpiochip4"
  sx1302_reset_pin=17

  # Antenna gain (dB).
  antenna_gain=0

  # Public LoRaWAN network.
  lorawan_public=true

  com_dev_path="/dev/ttyConcentrator"

  # Region.
  #
  # The region of the gateway. Options:
  #  EU868, US915, CN779, EU433, AU915, CN470, AS923, AS923_2, AS923_3, AS923_4,
  #  KR923, IN865, RU864
  #
  # Not not all the gateway models implement all regions.
  region="US915"

  # Gateway vendor / model.
  #
  # This configures various vendor and model specific settings.
  model="rak_5146"

  # Gateway vendor / model flags.
  #
  # Flag can be used to configure additional vendor / model features. The
  # following flags can be used:
  #
  #   Global flags:
  #     GNSS - Enable GNSS / GPS support
  #     USB  - Use USB for concentrator communication (default is SPI)
  model_flags=[ "USB" ]

  # Time fallback.
  #
  # In case the gateway does not have a GNSS module or is unable to aquire a
  # GNSS fix, use the system-time for setting the 'time' field on RX.
  time_fallback_enabled=true


  # Static gateway location.
  [gateway.location]

    # When set to non-zero values, the static gateway location will be reported
    # when the gateway does not have a GNSS module or when no GNSS location fix
    # is available.
    latitude=0.0
    longitude=0.0
    altitude=0

Here is the Chirpstack UDP Forwarder config:

# UDP Forwarder configuration.
[udp_forwarder]

  # Log level.
  #
  # Valid options are:
  #   * TRACE
  #   * DEBUG
  #   * INFO
  #   * WARN
  #   * ERROR
  #   * OFF
  log_level="DEBUG"

  # Log to syslog.
  #
  # When set to true, log messages are being written to syslog instead of stdout.
  log_to_syslog=false

  # Prometheus metrics bind.
  #
  # E.g. '0.0.0.0:9800', leave blank to disable the metrics endpoint.
  metrics_bind="0.0.0.0:9800"


  # Servers to forward the data to using UDP.
  # This section can be repeated.
  [[udp_forwarder.servers]]
    # Server (hostname:port).
    server="www.mydomain.com:1780"

    # Keepalive interval (seconds).
    #
    # In this interval, the ChirpStack UDP Forwarder will send keepalive
    # frames to the server, which must be answered by an acknowledgement.
    keepalive_interval_secs=10

    # Max. allowed keepalive failures.
    #
    # After the max. number has been reached, the ChirpStack UDP Forwarder will
    # 're-connect' to the server, meaning it will also re-resolve the DNS in case
    # the server address is a hostname.
    keepalive_max_failures=12

    # Filters.
    [backend.filters]

      # Forward CRC ok.
      forward_crc_ok=true

      # Forward CRC invalid.
      forward_crc_invalid=false

      # Forward CRC missing.
      forward_crc_missing=false

      # LoRaWAN only.
      lorawan_only=false

      # DevAddr prefix filters.
      #
      # Example configuration:
      # dev_addr_prefixes=["0000ff00/24"]
      #
      # The above filter means that the 24MSB of 0000ff00 will be used to
      # filter DevAddrs. Uplinks with DevAddrs that do not match any of the
      # configured filters will not be forwarded. Leaving this option empty
      # disables filtering on DevAddr.
      dev_addr_prefixes=[]

      # JoinEUI prefix filters.
      #
      # Example configuration:
      # join_eui_prefixes=["0000ff0000000000/24"]
      #
      # The above filter means that the 24MSB of 0000ff0000000000 will be used
      # to filter JoinEUIs. Uplinks with JoinEUIs that do not match any of the
      # configured filters will not be forwarded. Leaving this option empty
      # disables filtering on JoinEUI.
      join_eui_prefixes=[]


# Concentratord configuration.
[concentratord]

  # Event API URL.
  event_url="ipc:///tmp/concentratord_event"

  # Command API URL.
  command_url="ipc:///tmp/concentratord_command"

I would be grateful for any insight on what could be causing this issue.

1 Answers

Your Concentratord is quite outdated. The latest version is v4.7.1. There have been changes in the ZMQ protocol (see changelogs) that might cause the issue you are seeing.