Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sys/shell: fix missing generic lora settings in ifconfig #19466

Merged
merged 4 commits into from
Apr 13, 2023

Conversation

aabadie
Copy link
Contributor

@aabadie aabadie commented Apr 13, 2023

Contribution description

This PR is fixing the missing bandwitdh, SF and CR LoRa parameter in the ifconfig command. In the gnrc_netif.c, they are only available when using gnrc_lorawan while they are more generally specific to LoRa (and there's a module for that).
So this PR basically just fixes the module used to enable them.

Testing procedure

Run the examples/default on a LoRa board, for example b-l072z-lrwan1 (there are a few available on iot-lab).

On master, the BW, SF and CR are missing:

$ IOTLAB_NODE=auto make BOARD=b-l072z-lrwan1 -C examples/default/ flash term
make: Entering directory '/work/riot/RIOT/examples/default'
Building application "default" for "b-l072z-lrwan1" with MCU "stm32".

"make" -C /work/riot/RIOT/boards/b-l072z-lrwan1
"make" -C /work/riot/RIOT/boards/common/init
"make" -C /work/riot/RIOT/core
"make" -C /work/riot/RIOT/core/lib
"make" -C /work/riot/RIOT/cpu/stm32
"make" -C /work/riot/RIOT/cpu/cortexm_common
"make" -C /work/riot/RIOT/cpu/cortexm_common/periph
"make" -C /work/riot/RIOT/cpu/stm32/periph
"make" -C /work/riot/RIOT/cpu/stm32/stmclk
"make" -C /work/riot/RIOT/cpu/stm32/vectors
"make" -C /work/riot/RIOT/drivers
"make" -C /work/riot/RIOT/drivers/netdev
"make" -C /work/riot/RIOT/drivers/periph_common
"make" -C /work/riot/RIOT/drivers/saul
"make" -C /work/riot/RIOT/drivers/saul/init_devs
"make" -C /work/riot/RIOT/drivers/sx127x
"make" -C /work/riot/RIOT/sys
"make" -C /work/riot/RIOT/sys/auto_init
"make" -C /work/riot/RIOT/sys/div
"make" -C /work/riot/RIOT/sys/event
"make" -C /work/riot/RIOT/sys/fmt
"make" -C /work/riot/RIOT/sys/frac
"make" -C /work/riot/RIOT/sys/iolist
"make" -C /work/riot/RIOT/sys/isrpipe
"make" -C /work/riot/RIOT/sys/libc
"make" -C /work/riot/RIOT/sys/luid
"make" -C /work/riot/RIOT/sys/malloc_thread_safe
"make" -C /work/riot/RIOT/sys/net/gnrc
"make" -C /work/riot/RIOT/sys/net/gnrc/netapi
"make" -C /work/riot/RIOT/sys/net/gnrc/netif
"make" -C /work/riot/RIOT/sys/net/gnrc/netif/hdr
"make" -C /work/riot/RIOT/sys/net/gnrc/netif/init_devs
"make" -C /work/riot/RIOT/sys/net/gnrc/netreg
"make" -C /work/riot/RIOT/sys/net/gnrc/pkt
"make" -C /work/riot/RIOT/sys/net/gnrc/pktbuf
"make" -C /work/riot/RIOT/sys/net/gnrc/pktbuf_static
"make" -C /work/riot/RIOT/sys/net/gnrc/pktdump
"make" -C /work/riot/RIOT/sys/net/link_layer/eui_provider
"make" -C /work/riot/RIOT/sys/net/link_layer/l2util
"make" -C /work/riot/RIOT/sys/net/netif
"make" -C /work/riot/RIOT/sys/newlib_syscalls_default
"make" -C /work/riot/RIOT/sys/od
"make" -C /work/riot/RIOT/sys/phydat
"make" -C /work/riot/RIOT/sys/pm_layered
"make" -C /work/riot/RIOT/sys/preprocessor
"make" -C /work/riot/RIOT/sys/ps
"make" -C /work/riot/RIOT/sys/rtc_utils
"make" -C /work/riot/RIOT/sys/saul_reg
"make" -C /work/riot/RIOT/sys/shell
"make" -C /work/riot/RIOT/sys/shell/cmds
"make" -C /work/riot/RIOT/sys/stdio_uart
"make" -C /work/riot/RIOT/sys/tsrb
"make" -C /work/riot/RIOT/sys/ztimer
   text	   data	    bss	    dec	    hex	filename
  49308	    132	   6004	  55444	   d894	/work/riot/RIOT/examples/default/bin/b-l072z-lrwan1/default.elf
iotlab-node --jmespath='keys(@)[0]' --format='lambda ret: exit(int(ret))'  --list saclay,st-lrwan1,13 --flash /work/riot/RIOT/examples/default/bin/b-l072z-lrwan1/default.bin
ssh -t abadie@saclay.iot-lab.info 'socat - tcp:st-lrwan1-13.saclay.iot-lab.info:20000' 
help
help
Command              Description
---------------------------------------
ifconfig             Configure network interfaces
pm                   interact with layered PM subsystem
ps                   Prints information about running threads.
reboot               Reboot the node
rtc                  control RTC peripheral interface
saul                 interact with sensors and actuators using SAUL
txtsnd               Sends a custom string as is over the link layer
version              Prints current RIOT_VERSION
> ifconfig
ifconfig
Iface  3  Frequency: 868299987Hz  RSSI: -157 
           TX-Power: 14dBm  State: SLEEP 
          L2-PDU:255  
          
> 

With this PR:

$ IOTLAB_NODE=auto make BOARD=b-l072z-lrwan1 -C examples/default/ flash term
make: Entering directory '/work/riot/RIOT/examples/default'
Building application "default" for "b-l072z-lrwan1" with MCU "stm32".

"make" -C /work/riot/RIOT/boards/b-l072z-lrwan1
"make" -C /work/riot/RIOT/boards/common/init
"make" -C /work/riot/RIOT/core
"make" -C /work/riot/RIOT/core/lib
"make" -C /work/riot/RIOT/cpu/stm32
"make" -C /work/riot/RIOT/cpu/cortexm_common
"make" -C /work/riot/RIOT/cpu/cortexm_common/periph
"make" -C /work/riot/RIOT/cpu/stm32/periph
"make" -C /work/riot/RIOT/cpu/stm32/stmclk
"make" -C /work/riot/RIOT/cpu/stm32/vectors
"make" -C /work/riot/RIOT/drivers
"make" -C /work/riot/RIOT/drivers/netdev
"make" -C /work/riot/RIOT/drivers/periph_common
"make" -C /work/riot/RIOT/drivers/saul
"make" -C /work/riot/RIOT/drivers/saul/init_devs
"make" -C /work/riot/RIOT/drivers/sx127x
"make" -C /work/riot/RIOT/sys
"make" -C /work/riot/RIOT/sys/auto_init
"make" -C /work/riot/RIOT/sys/div
"make" -C /work/riot/RIOT/sys/event
"make" -C /work/riot/RIOT/sys/fmt
"make" -C /work/riot/RIOT/sys/frac
"make" -C /work/riot/RIOT/sys/iolist
"make" -C /work/riot/RIOT/sys/isrpipe
"make" -C /work/riot/RIOT/sys/libc
"make" -C /work/riot/RIOT/sys/luid
"make" -C /work/riot/RIOT/sys/malloc_thread_safe
"make" -C /work/riot/RIOT/sys/net/gnrc
"make" -C /work/riot/RIOT/sys/net/gnrc/netapi
"make" -C /work/riot/RIOT/sys/net/gnrc/netif
"make" -C /work/riot/RIOT/sys/net/gnrc/netif/hdr
"make" -C /work/riot/RIOT/sys/net/gnrc/netif/init_devs
"make" -C /work/riot/RIOT/sys/net/gnrc/netreg
"make" -C /work/riot/RIOT/sys/net/gnrc/pkt
"make" -C /work/riot/RIOT/sys/net/gnrc/pktbuf
"make" -C /work/riot/RIOT/sys/net/gnrc/pktbuf_static
"make" -C /work/riot/RIOT/sys/net/gnrc/pktdump
"make" -C /work/riot/RIOT/sys/net/link_layer/eui_provider
"make" -C /work/riot/RIOT/sys/net/link_layer/l2util
"make" -C /work/riot/RIOT/sys/net/netif
"make" -C /work/riot/RIOT/sys/newlib_syscalls_default
"make" -C /work/riot/RIOT/sys/od
"make" -C /work/riot/RIOT/sys/phydat
"make" -C /work/riot/RIOT/sys/pm_layered
"make" -C /work/riot/RIOT/sys/preprocessor
"make" -C /work/riot/RIOT/sys/ps
"make" -C /work/riot/RIOT/sys/rtc_utils
"make" -C /work/riot/RIOT/sys/saul_reg
"make" -C /work/riot/RIOT/sys/shell
"make" -C /work/riot/RIOT/sys/shell/cmds
"make" -C /work/riot/RIOT/sys/stdio_uart
"make" -C /work/riot/RIOT/sys/tsrb
"make" -C /work/riot/RIOT/sys/ztimer
   text	   data	    bss	    dec	    hex	filename
  50368	    132	   6004	  56504	   dcb8	/work/riot/RIOT/examples/default/bin/b-l072z-lrwan1/default.elf
iotlab-node --jmespath='keys(@)[0]' --format='lambda ret: exit(int(ret))'  --list saclay,st-lrwan1,13 --flash /work/riot/RIOT/examples/default/bin/b-l072z-lrwan1/default.bin
ssh -t abadie@saclay.iot-lab.info 'socat - tcp:st-lrwan1-13.saclay.iot-lab.info:20000' 
help
help
Command              Description
---------------------------------------
ifconfig             Configure network interfaces
pm                   interact with layered PM subsystem
ps                   Prints information about running threads.
reboot               Reboot the node
rtc                  control RTC peripheral interface
saul                 interact with sensors and actuators using SAUL
txtsnd               Sends a custom string as is over the link layer
version              Prints current RIOT_VERSION
> ifconfig
ifconfig
Iface  3  Frequency: 868299987Hz  RSSI: -157  BW: 125kHz  SF: 7  CR: 4/5 
           TX-Power: 14dBm  State: SLEEP 
          L2-PDU:255  
          

Issues/PRs references

I'm too lazy to track which PR introduced this regression (because it was working before) I found it: #18649

@aabadie aabadie added the Type: bug The issue reports a bug / The PR fixes a bug (including spelling errors) label Apr 13, 2023
@github-actions github-actions bot added the Area: sys Area: System label Apr 13, 2023
@aabadie aabadie added the CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR label Apr 13, 2023
@riot-ci
Copy link

riot-ci commented Apr 13, 2023

Murdock results

✔️ PASSED

f50be77 tests/Makefile.boards.netif: add lora-e5-dev

Success Failures Total Runtime
6881 0 6882 08m:55s

Artifacts

@aabadie aabadie force-pushed the pr/sys/shell_lora_ifconfig_fix branch from e4c4c04 to 380b06f Compare April 13, 2023 08:51
@github-actions github-actions bot added Area: drivers Area: Device drivers Area: Kconfig Area: Kconfig integration Area: LoRa Area: LoRa radio support Area: tests Area: tests and testing framework labels Apr 13, 2023
@aabadie
Copy link
Contributor Author

aabadie commented Apr 13, 2023

I added a few more commits to that PR because I noticed other missing things:

  • sx126x driver was not pulling in the lora module => ifconfig wouldn't work with boards that are using this lora driver
  • nucleo-wl55jc and lora-e5-dev boards were not in the BOARD_PROVIDES_NETIF variable => no ifconfig command for these boards in examples/default

I tested this PR on one of the nucleo-wl55jc board provided on the IoT-LAB Grenoble site and the initial problem is also fixed.

image

@aabadie
Copy link
Contributor Author

aabadie commented Apr 13, 2023

bors merge

@bors
Copy link
Contributor

bors bot commented Apr 13, 2023

Build succeeded:

@bors bors bot merged commit acd02f1 into RIOT-OS:master Apr 13, 2023
@maribu
Copy link
Member

maribu commented Apr 13, 2023

This is backporting material, isn't it?

@aabadie aabadie deleted the pr/sys/shell_lora_ifconfig_fix branch April 13, 2023 15:44
@aabadie
Copy link
Contributor Author

aabadie commented Apr 13, 2023

Thanks for reviewing and acking!

This is backporting material, isn't it?

I'm not sure, as this is quite a minor bug.

@jia200x
Copy link
Member

jia200x commented Apr 14, 2023

I think we should introduce a MODULE_SHELL_CMD_LORA for this, as this would pull all LoRa shell commands just by selecting any LoRa driver.

@aabadie
Copy link
Contributor Author

aabadie commented Apr 14, 2023

I think we should introduce a MODULE_SHELL_CMD_LORA for this, as this would pull all LoRa shell commands just by selecting any LoRa driver.

and shell_commands_default and gnrc_netif

@aabadie
Copy link
Contributor Author

aabadie commented Apr 14, 2023

There are no lora phy specific commands. Everything is done via shell_cmd_gnrc_netif. So when using both shell_commands_default and gnrc_netif (this one pulls in shell_cmd_gnrc_netif in this case), you want to have lora specific options as well with ifconfig if you pull in a LoRa driver (all lora drivers in RIOT provide a netif interface). Which is what this PR is about.

@jia200x
Copy link
Member

jia200x commented Apr 14, 2023

and shell_commands_default and gnrc_netif

Actually shell_cmd_gnrc_netif would already get the modules if a LoRa driver is selected.

There are no lora phy specific commands. Everything is done via shell_cmd_gnrc_netif. So when using both shell_commands_default and gnrc_netif (this one pulls in shell_cmd_gnrc_netif in this case), you want to have lora specific options as well with ifconfig if you pull in a LoRa driver (all lora drivers in RIOT provide a netif interface). Which is what this PR is about.

But isn't it the whole point of shell_cmd_xxx to provide granularity to the shell commands? As it was before, it was possible to run e.g GNRC LoRaWAN with ifconfig without the LoRaWAN shell commands (which is not uncommon when OTAA runs during startup but you still need ifconfig for a second interface). With this PR it is not possible anymore.

@aabadie
Copy link
Contributor Author

aabadie commented Apr 14, 2023

Actually shell_cmd_gnrc_netif would already get the modules if a LoRa driver is selected

Not in the case of a lora driver because it provides other radio options, e.g BW/SF/CR.

This PR only changes the LoRa settings that are displayed/can be changed using ifconfig. It should have no impact with gnrc lorawan specific behavior. The BW/SF/CR options are provided in the netdev adaptation layer at driver level (e.g phy).

With this PR it is not possible anymore

I haven't tried to set/get GNRC lorawan options using ifconfig but I tried to keep the behavior when the shell_cmd_gnrc_netif_lorawan module is used. Is it broken now ?

@jia200x
Copy link
Member

jia200x commented Apr 14, 2023

Not in the case of a lora driver because it provides other radio options, e.g BW/SF/CR.

This is what I mean:
On master I can select shell_cmd_gnrc_netif without selecting shell_cmd_gnrc_netif_lorawan and I can still configure the LoRaWAN interface using gnrc_netapi.

See that there's no shell_cmd_gnrc_netif_lorawan module:

make info-modules | grep shell
shell
shell_cmd_gnrc_netif
shell_cmds

On master:

RIOT_CI_BUILD=1 make all -j4 
Building application "gnrc_lorawan" for "b-l072z-lrwan1" with MCU "stm32".

   text	  data	   bss	   dec	   hex	filename
  50564	   512	  6424	 57500	  e09c	RIOT/examples/gnrc_lorawan/bin/b-l072z-lrwan1/gnrc_lorawan.elf

> ifconfig help
2023-04-14 16:48:58,833 # ifconfig help
2023-04-14 16:48:58,834 # usage: ifconfig
2023-04-14 16:48:58,836 # usage: ifconfig help
2023-04-14 16:48:58,839 # usage: ifconfig <if_id> [up|down]
2023-04-14 16:48:58,843 # usage: ifconfig <if_id> set <key> <value>
2023-04-14 16:48:58,847 #       Sets an hardware specific specific value
2023-04-14 16:48:58,851 #       <key> may be one of the following
2023-04-14 16:48:58,854 #        * "addr" - sets (short) address
2023-04-14 16:48:58,858 #        * "addr_long" - sets long address
2023-04-14 16:48:58,861 #        * "addr_short" - alias for "addr"
2023-04-14 16:48:58,867 #        * "cca_threshold" - set ED threshold during CCA in dBm
2023-04-14 16:48:58,871 #        * "freq" - sets the "channel" center frequency
2023-04-14 16:48:58,875 #        * "channel" - sets the frequency channel
2023-04-14 16:48:58,879 #        * "chan" - alias for "channel"
2023-04-14 16:48:58,883 #        * "checksum" - set checksumming on-off
2023-04-14 16:48:58,889 #        * "csma_retries" - set max. number of channel access attempts
2023-04-14 16:48:58,893 #        * "encrypt" - set the encryption on-off
2023-04-14 16:48:58,896 #        * "hop_limit" - set hop limit
2023-04-14 16:48:58,900 #        * "hl" - alias for "hop_limit"
2023-04-14 16:48:58,905 #        * "key" - set the encryption key in hexadecimal format
2023-04-14 16:48:58,909 #        * "mtu" - IPv6 maximum transition unit
2023-04-14 16:48:58,914 #        * "nid" - sets the network identifier (or the PAN ID)
2023-04-14 16:48:58,919 #        * "page" - set the channel page (IEEE 802.15.4)
2023-04-14 16:48:58,922 #        * "pan" - alias for "nid"
2023-04-14 16:48:58,925 #        * "pan_id" - alias for "nid"
2023-04-14 16:48:58,929 #        * "phy_busy" - set busy mode on-off
2023-04-14 16:48:58,932 #        * "power" - TX power in dBm
2023-04-14 16:48:58,937 #        * "retrans" - max. number of retransmissions
2023-04-14 16:48:58,942 #        * "src_len" - sets the source address length in byte
2023-04-14 16:48:58,945 #        * "state" - set the device state

With this PR, it always brings the shell commands for LoRa.

RIOT_CI_BUILD=1 make all -j4                      
Building application "gnrc_lorawan" for "b-l072z-lrwan1" with MCU "stm32".

   text	  data	   bss	   dec	   hex	filename
  51612	   512	  6424	 58548	  e4b4	RIOT/examples/gnrc_lorawan/bin/b-l072z-lrwan1/gnrc_lorawan.elf

> ifconfig help
2023-04-14 16:48:07,083 # ifconfig help
2023-04-14 16:48:07,085 # usage: ifconfig
2023-04-14 16:48:07,086 # usage: ifconfig help
2023-04-14 16:48:07,089 # usage: ifconfig <if_id> [up|down]
2023-04-14 16:48:07,093 # usage: ifconfig <if_id> set <key> <value>
2023-04-14 16:48:07,097 #       Sets an hardware specific specific value
2023-04-14 16:48:07,101 #       <key> may be one of the following
2023-04-14 16:48:07,105 #        * "addr" - sets (short) address
2023-04-14 16:48:07,107 #        * "addr_long" - sets long address
2023-04-14 16:48:07,111 #        * "addr_short" - alias for "addr"
2023-04-14 16:48:07,116 #        * "cca_threshold" - set ED threshold during CCA in dBm
2023-04-14 16:48:07,121 #        * "freq" - sets the "channel" center frequency
2023-04-14 16:48:07,125 #        * "channel" - sets the frequency channel
2023-04-14 16:48:07,129 #        * "chan" - alias for "channel"
2023-04-14 16:48:07,133 #        * "checksum" - set checksumming on-off
2023-04-14 16:48:07,139 #        * "csma_retries" - set max. number of channel access attempts
2023-04-14 16:48:07,143 #        * "encrypt" - set the encryption on-off
2023-04-14 16:48:07,146 #        * "hop_limit" - set hop limit
2023-04-14 16:48:07,149 #        * "hl" - alias for "hop_limit"
2023-04-14 16:48:07,155 #        * "key" - set the encryption key in hexadecimal format
2023-04-14 16:48:07,159 #        * "mtu" - IPv6 maximum transition unit
2023-04-14 16:48:07,164 #        * "nid" - sets the network identifier (or the PAN ID)
2023-04-14 16:48:07,169 #        * "page" - set the channel page (IEEE 802.15.4)
2023-04-14 16:48:07,172 #        * "pan" - alias for "nid"
2023-04-14 16:48:07,175 #        * "pan_id" - alias for "nid"
2023-04-14 16:48:07,179 #        * "phy_busy" - set busy mode on-off
2023-04-14 16:48:07,183 #        * "bw" - alias for channel bandwidth
2023-04-14 16:48:07,186 #        * "sf" - alias for spreading factor
2023-04-14 16:48:07,190 #        * "cr" - alias for coding rate
2023-04-14 16:48:07,193 #        * "power" - TX power in dBm
2023-04-14 16:48:07,197 #        * "retrans" - max. number of retransmissions
2023-04-14 16:48:07,203 #        * "src_len" - sets the source address length in byte
2023-04-14 16:48:07,206 #        * "state" - set the device state

I haven't tried to set/get GNRC lorawan options using ifconfig but I tried to keep the behavior when the shell_cmd_gnrc_netif_lorawan module is used. Is it broken now ?

It is not broken in the sense that it doesn't work, but it is not possible to disable the LoRa shell commands anymore when using LoRa.

@jia200x
Copy link
Member

jia200x commented Apr 14, 2023

A fix could be as simple as renaming the old shell_cmd_gnrc_netif_lorawan to shell_gnrc_netif_lora, as it's not possible to have gnrc_netif_lorawan and gnrc_netif_raw running simultaneously anyway and that should be enough to give granularity.

@aabadie
Copy link
Contributor Author

aabadie commented Apr 14, 2023

A fix could be as simple as renaming the old shell_cmd_gnrc_netif_lorawan to shell_gnrc_netif_lora

That would not solve anything and introduce confusion: the options that are added when shell_cmd_gnrc_netif_lorawan is used are lorawan specific options (joineui, deveui and so).

We are also not talking about "lora shell commands" but rather ifconfig shell command options to configure a lora radio.

it's not possible to have gnrc_netif_lorawan and gnrc_netif_raw running simultaneously anyway and that should be enough to give granularity

ok I think I get the point here. so maybe adding an intermediate module for "gnrc_netif_raw" and "lora" would make sense. But I don't understand why gnrc_netif_lorawan has a responsibility in setting/getting the lora radio options.

@jia200x
Copy link
Member

jia200x commented Apr 14, 2023

Please don't get me wrong, I'm not arguing for shell_cmd_gnrc_netif_lorawan to compile SF/BW/etc. I definitely agree with the problem this PR attempts to solve.

I'm just saying that before it was indeed possible to compile shell_cmd_gnrc_netif without pulling in LoRa specific subcommands. Now it is not.

I don't have a strong opinion about naming, but IMO there should be at least one pseudomodule for turning on the "LoRa cmds of GNRC Netif" (which is why I proposed shell_cmd_gnrc_netif_lora) as well as one for "LoRaWAN cmds of GNRC Netif" (doesn't btw the existing module already reflect that?). Just to be clear, note that these modules are not directly related to "GNRC LoRaWAN", as there could be still other LoRaWAN imementations exposing a GNRC Netif.

Regarding the pseudomodules, you would probably use the first one for the "raw" interface and the second for GNRC LoRaWAN, as you probably don't wanna change the PHY settings when the MAC is in control of the transceiver. You could though, if you pull in both modules.

If we want to make it more generic, we could consider dropping the "gnrc" prefix from such pseudomodules, as we should aim to use stack independent components anyway (e.g netif/sock).

@aabadie
Copy link
Contributor Author

aabadie commented Apr 17, 2023

I'm just saying that before it was indeed possible to compile shell_cmd_gnrc_netif without pulling in LoRa specific subcommands. Now it is not.

Ok, I think I get the point. So by default, if a lora driver is used along with the shell_commands_default module, the LoRa options will be compiled in, otherwise, a "lora_shell_cmd" module must be used to pull them explicitly.
I can PR something in that direction, when time permits :)

@aabadie
Copy link
Contributor Author

aabadie commented Apr 20, 2023

@jia200x see #19490

@benpicco benpicco added this to the Release 2023.07 milestone Aug 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area: drivers Area: Device drivers Area: Kconfig Area: Kconfig integration Area: LoRa Area: LoRa radio support Area: sys Area: System Area: tests Area: tests and testing framework CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR Type: bug The issue reports a bug / The PR fixes a bug (including spelling errors)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants