パケットの流れを追う

previously on Mona OS

最近Season4見ているもので・・・(調子に乗りました)
前回の調査で Monaの内部でパケットが消失していることが確定した。
そこで今回はMonaデバイスドライバがreadしたパケットと、uIP(プロトコルスタック)が受け取ったパケットを比べる。

比較

NICSERVERがデバイスドライバ、UIPがプロトコルスタックです。
パケットの順序はMona内の時系列順です。

** OK
NICSERVER:80 to 1025 ACK SYN seqno=90fc24fe ackno=0000019b
UIP      :80 to 1025 ACK SYN seqno=90fc24fe ackno=0000019b
NICSERVER:80 to 1025 ACK     seqno=90fc24ff ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc24ff ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc24ff ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc24ff ackno=000001c5

** NG
NICSERVER:80 to 1025 ACK     seqno=90fc2a85 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc24ff ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc24ff ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc2a85 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc2a85 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc2aa5 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc2aa5 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc302b ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc304b ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc302b ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc2aa5 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc304b ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc302b ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc2aa5 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc302b ackno=000001c5

* OK
NICSERVER:80 to 1025 ACK     seqno=90fc304b ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc304b ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc35d1 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc35d1 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc35f1 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc35f1 ackno=000001c5

* NG
NICSERVER:80 to 1025 ACK     seqno=90fc3b77 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc35d1 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc35d1 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc35f1 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc35f1 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc3b77 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc3b77 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc3b97 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc3b97 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc411d ackno=000001c5

* OK
NICSERVER:80 to 1025 ACK     seqno=90fc3b77 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc3b77 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc3b97 ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc3b97 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc411d ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc411d ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc413d ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc413d ackno=000001c5

NICSERVER:80 to 1025 ACK     seqno=90fc46c3 ackno=000001c5
NICSERVER:80 to 1025 ACK     seqno=90fc411d ackno=000001c5
UIP      :80 to 1025 ACK     seqno=90fc411d ackno=000001c5

問題

OKと書いているところはパケットのフローが正常だと思われるところです。
逆にNGと書いている部分は、seqnoを手がかりに追ってみていくとかなり怪しいです。
例えば1番目のNGの部分でseqnoが90fc2a85, 90fc24ffのものがありますが、NICSERVERとUIPでパケットをうけとっている順番が逆です。

なぜ逆に?

NICドライバは

    this->frameList.add(frame);

のように到着フレームを登録していて。

uIPは

            Ether::Frame* frame = this->frameList.removeAt(0);

と取り出している。

一見問題なさそうだが・・・。
以下のことを試して見た方がよさそう。

  • 排他をきちんとしてみる
  • 自前のコレクションクラスをSTLに置き換え