[Armadillo:07653] telnetd(busybox)でIAC-NOPとTCP keepalive

email@hidden
2011年 10月 26日 (水) 23:07:55 JST


小松平です。

atmark-dist-20110704, Armadillo-440のtelnetd(busybox1.00)は、
telnetのIAC-NOPをサポートしておらず、0xf1をユーザデータとし
て受信したかのように動くようです。

telnetクライアントとしてTera Term(手元ではVersion4.66)を使っ
た場合、アイドルが300秒つづくと、teratermがIAC-NOPを送信しま
す(アプリケーション層でのキープアライブ動作と思います)。

telnetdにおいてこれは無視されないとならないはずですが、
0xf1を受信したかのような動きをしてしまいます。5分おきにごみ
が受信されることになります。


BUSYBOXのサイトを見ると..
http://busybox.net/
>10 November 2008 -- BusyBox 1.13.0 (unstable), BusyBox 1.12.2 (stable)
>telnetd: handle emacs M-DEL and IAC-NOP. By Jim Cathey (jcathey AT ciena.com)
とあるので、IAC-NOPは対応済みのようですね。

atmark-distのbusyboxを新しい版に変えるのがよいのでしょうが
それにはちょっと躊躇して、
busybox(atmark-dist-20110704/user/busybox/networking以下)に
次の変更を加えました。


$ diff telnetd.c.old telnetd.c
142a143,152
>
>                       /*
>                        * NOP support.
>                        */
>                       if (((ptr+1) < end) && (ptr[1] == NOP)) {
>                               /* skip no operation */
>                               ptr += 2;
>                       }
>                       else
>


話は変わって、
telnetdのソケットでTCP keepaliveを使いたくて、次の変更を加え
ました。意図通り動作するようです(telnetd.cのソケットを操作し
たのですが意図通り動作せず、CONFIG_FEATURE_TELNETD_INETDであ
ることに気づくまでややしばらく..)。

$ diff inetd.c.old inetd.c
111a112
> #include <netinet/tcp.h>
840a842
>               int option;
874a877,888
>                                       /*
>                                        * turn on keep-alive.
>                                        */
>                                       option = 1;
>                                       setsockopt(ctrl, SOL_SOCKET, SO_KEEPALIVE, (void*)&option, sizeof(option));
>
>                                       option = 30;
>                                       setsockopt(ctrl, SOL_TCP, TCP_KEEPIDLE, (void*)&option, sizeof(option));
>                                       option = 10;
>                                       setsockopt(ctrl, SOL_TCP, TCP_KEEPINTVL, (void*)&option, sizeof(option));
>                                       option = 4;
>                                       setsockopt(ctrl, SOL_TCP, TCP_KEEPCNT, (void*)&option, sizeof(option));



busyboxではないtelnetdを使うのも手かもしれませんが、そちらは
使ったことがなく未確認です。

以上、参考になれば幸いです。



armadillo メーリングリストの案内