Chirpstack UDP Forwarder Gets Empty Gateway ID Resulting in Error

Viewed 57

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.

2 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.

Thank you for the quick response. You are correct, as soon as I updated the concentratord version, the udp forwarder was able to pull the gateway ID without issues. Thank you!