[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 メーリングリストの案内