FreeRTOSを動かしてみる(9)


今回は受信側を実装していく

# NICドライバからダミープロセスまで
以下の赤部分
![image](https://kroki.io/graphviz/svg/eNp9U8tuwjAQvPMVls_lC6LkhCpVqlRU6AmhyokXYpHE7tqmIJR_b2yHkBf1IYp3ZmfW3jUXR2QqJytyW5BmIatOXCCJyXYV-UgFvy4YG7QQLUJIctjpnCmIaSov9IVocy2aDUpbceB072napkE8K6w2gN_vorKX1sitgqVQxNSH6aILT_K2DI9geom9ZBMwplRPweNC7VrO27qt6JHbYWBywArMmCHUMnG05jLcIU3eI9TdX5Yjh_Pzyrkty-t84QFSKDPQmg4YWpZwr-9rtZ51nlj9QGnnnRwyNDgM1YfmY-FXBPjcfmxG4j2DO4NOCPhPE8K4zTSCzMksE8fdP4dCo1h2GtnUo8sL36a1ZJmEm85kIZtc7AY3dNX3v30UnnwYbCaGTutB63ZPeb3Z8dPma2kfkqjOQt87c_OvMtashMhRI3foqD3IEGQOZPOg04_IwWH1H_CmEVQ=)

[こんな感じ](https://github.com/tyano461/virtether/commit/e6f4a23b12eea09963f965e0a2269db1bf45e0d2#diff-1c8344b3a8698bb0333b48297be127fb32f83ad24031cc8c1a347f9c85c02306)で

なぜかiovだと通信できなくて、kvecだと通信できた。
[sendto](https://elixir.bootlin.com/linux/v6.5.6/source/net/socket.c#L2102)のコード見ても
なぜiovじゃだめなのかわからん。
ちなみにubufもだめだった。
多分この先でcopy_from_userとかしてるんだろうと想像(見てないけど)

ver5のときは普通にsock_sendmsgで通信できたんだけどなぁ。。。

ビルド&実行して
```shell
./run.sh 1
```

pingを打つと
ダミープロセスにarpリクエストが飛んでいることが見て取れる
```
virtether$ ping -w1 192.168.100.2
PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.
echoback.c(160) recv_main cond signal
echoback.c(82) main queue:0x7fce74000b70
echoback.c(86) main ff ff ff ff ff ff fe 93 21 0d 69 88 08 06 00 01
08 00 06 04 00 01 fe 93 21 0d 69 88 c0 a8 64 01
00 00 00 00 00 00 c0 a8 64 02 

echoback.c(218) send_callback write:42
echoback.c(82) main queue:(nil)

--- 192.168.100.2 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
```

# ダミープロセスからQEMUへの送信
以下の赤部分

![images](https://kroki.io/graphviz/svg/eNp9U8tuwjAQvOcrLJ-bL4jCCVWqVKmo0BNClYkXYpHE7tqmIJR_b2yHkBf1IYp3ZnfWnjUXR2QqJ0tyi0izkFUnLpCkZLNMfKSCXxdMDVpIohCSHLY6ZwpSupcX-kK0uRbNBqWtOHC68zRt96F4VlhtAL_fRWUvrZBbBdtDkVIfplEXnuRtGB7B9BJ7ySZgTKleBY8LtW05b6u2o0duh4HJASswY4ZQ8cLRmstwhzR5j1B3f1mOHM7PO-e2LK_zjQdIocxAazpgaFnCvb-v5WpWeSL1A6WdV3LIUOAwrD4UHxd-RYDPzcd6VLwncGfQCQH_MSGM24wRZK5MvHDc3XMoGMWy00imHl1e-DbWknjhbzp6GOktb9-Bxw-DzUTDpQckk4VsMHwMfwc9S-rNjp8273r7kER1FvruzM2_ylSzEhJHTdyhk_YgQ5A5kM2Drn5CDg6r_wCgdBFU)

これはユーザ空間で普通にUDP通信するだけなので大したことはしていない。

- [送信側](https://github.com/tyano461/virtether/commit/9c742d6e9f7bd66bc3f0dded8be1db6e27c269b7#diff-535f01a6b4dfbaefa12dfd242e5e96b0b71276569ae209fc37f6fc5c90f784ef)
- [受信側](https://github.com/tyano461/qemu_an385_ex/commit/90458a238fa758fdbe16a13bca27a2a78b0e4e88)

qemu立ち上げて
```shell
CORTEX_M3_MPS2_QEMU_GCC$ sudo /home/voyager/workspace/oss/build_qemu/qemu-system-arm -machine mps2-an385 -m 16 -monitor null -semihosting --semihosting-config enable=on,target=native -kernel ./build/RTOSDemo.axf -serial stdio -nographic | tee qemu.log 
```

ビルド&実行して
```
virtether$ ./run.sh 1
gcc -g -O0 echoback.c -o echoback
make -C /lib/modules/6.5.6-300.fc39.x86_64/build M=/home/voyager/workspace/freertos/virtether modules
make[1]: Entering directory '/usr/src/kernels/6.5.6-300.fc39.x86_64'
  CC [M]  /home/voyager/workspace/freertos/virtether/virtether.o
  MODPOST /home/voyager/workspace/freertos/virtether/Module.symvers
  CC [M]  /home/voyager/workspace/freertos/virtether/virtether.mod.o
  LD [M]  /home/voyager/workspace/freertos/virtether/virtether.ko
  BTF [M] /home/voyager/workspace/freertos/virtether/virtether.ko
Skipping BTF generation for /home/voyager/workspace/freertos/virtether/virtether.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/kernels/6.5.6-300.fc39.x86_64'
EXTRA_CLAGS="-g -DDEBUG"
    try:
        ping -w1 192.168.100.2
        sudo echo "aiueo" > /dev/veth_cdev 

```

pingを打つと
```
virtether$ ping -w1 192.168.100.2
PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.
echoback.c(262) send_udp sendto(42): 42

--- 192.168.100.2 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
```

qemu側でARPパケットを受け取れていることが確認出来る。
```
mps2.c(801) udp_recvfromdummy TODO: irq fire n:42
mps2.c(801) udp_recvfromdummy TODO: irq fire n:42
mps2.c(801) udp_recvfromdummy TODO: irq fire n:42

```

----
# 参考
https://www.geekpage.jp/programming/linux-network/book/08/8-5.php