何かがおかしい。。。。

概要

R1にて自作のルーティングアプリケーションをGo言語で作成してみました。
しかし、自作アプリケーションのミスでそれぞれのHostにpingを飛ばしても、パケットロスを起こしてしまう。

ictsc2020-ace-tmp (3).png.webp

この問題を解決してほしい。
注意点:R1のルーティングアプリケーションは初期実行されていないので注意が必要です。
ーー起動方法ーー

cd ~/go/src/github.com/yoneyan/ictsc-ace/cmd/routing
go get .
go build .
sudo ./routing start eth1 eth2 eth3 eth4

にてルーティングアプリケーションを起動することができます。

また、ソースコードは https://drive.google.com/file/d/1njTGorOGDsI1yUYpZlMj0bFLBlbukjX4/view?usp=sharing にて公開しています。

前提条件

  • kernelパラメーターの変更をしてはならない

初期状態

それぞれのHostにpingを飛ばしても、パケットロスを起こしてしまう。
(pingができる時と出来ないときがある。)

終了状態

それぞれのHostにpingを飛ばして、パケットロスが起こらない状態にしてほしい。

解説

原因はGolangにてルーティングの実装に問題があることが原因です。
Golangにて、Channelを使った処理にミスが生じており、適切なNICにパケットを送り出せていないため起きている問題です。

ictsc2020-ace-tmp (3).png.webp

HostA => HostD宛にPingを飛ばした場合でも、Channelの実装ミスによりHostA,B,C,Dのどれかにパケット転送してしまうというバグによって引き起こされる問題です。

問題の修正箇所は、以下になります。

 pkg/routing/router/router.go


 func routerReceive(device string) error {
                                if err != nil {
                                        log.Println(err)
                                }
+                       } else {
+                               packets <- msg
                        }
                }
        }()

採点基準

パケットロスをせずにpingが飛ぶこと(100%)