bug of arp on FreeBSD

[ Nob's Home | FreeBSD | ppp ]

ppp-2.3b2のinstallで書いた、
ppp接続が落ちたときに不完全なarp情報が残ってしまい、
次の接続ができなくなる問題の解決方法がわかりました。

ppp-2.3b2で接続していてftpかけているときに 回線を強制切断すると。

Sep 26 13:07:56 cs1 pppd[2017]: Connect: ppp1 <--> /dev/ttyd0
Sep 26 13:07:59 cs1 pppd[2017]: local  IP address 202.227.75.**
Sep 26 13:07:59 cs1 pppd[2017]: remote IP address 202.227.75.**
Sep 26 13:09:14 cs1 pppd[2017]: Modem hangup
Sep 26 13:09:14 cs1 pppd[2017]: Connection terminated.
Sep 26 13:09:15 cs1 pppd[2053]: pppd 2.3.0 started by root, uid 0
とpppdは終了し、正常に再起動していますが、
netstatでみると、202.227.75.** link#1 として
不正な経路情報が残っています。
cs1# netstat -nr
Routing tables

Internet:
Destination      Gateway            Flags     Refs     Use     Netif Expire
default          202.227.75.34      UGSc        8    12144       ed0
127.0.0.1        127.0.0.1          UH          0      268       lo0
202.227.75.*     202.227.75.35      UGHD        1     2246       ed0
202.227.75.**    link#1             UC          0        0
202.227.75.**    0:0:e8:ce:34:33    UHLW        2      924       lo0
202.227.75.**    0:40:c7:57:e3:c1   UHLW        6     1685       ed0    976
202.227.75.**    0:40:c7:57:de:19   UHLW        5      605       ed0   1112
202.227.75.**    link#1             UHLW        1        5
202.227.75.**   202.227.75.35      UGHD        0        0       ed0
224              link#1             UCS         0        0

これはarp tableに不完全な情報が残っているためで、
arp -aで確認すると
cs1# arp -a
cs1.y-min.or.jp (202.227.75.**) at 0:0:e8:ce:34:33 permanent
center.y-min.or.jp (202.227.75.**) at 0:40:c7:57:e3:c1
gw.y-min.or.jp (202.227.75.**) at 0:40:c7:57:de:19
du0.y-min.or.jp (202.227.75.**) at (incomplete)
となっています。
arp -d 202.227.75.**としてもしばらくすると経路情報ともども復活してしまいます。

この状態で同じaddressにppp接続すると、

Sep 26 22:28:04 cs1 pppd[26282]: pppd 2.3.0 started by root, uid 0
Sep 26 22:29:03 cs1 pppd[26282]: Connect: ppp1 <--> /dev/ttyd0
Sep 26 22:29:04 cs1 pppd[26282]: Couldn't set interface address: Address already exists
Sep 26 22:29:04 cs1 pppd[26282]: local  IP address 202.227.75.**
Sep 26 22:29:04 cs1 pppd[26282]: remote IP address 202.227.75.**
というようになり、接続できません。

この問題を FreeBSD-users-jp mailing list で相談したところ、
(匿名希望)さんから情報をいただきました。

この現象は、2.1R 以前のkernelのBUG らしい。
freebsd-questions に投稿されていた"Jay L. West"氏(jlwest@tseinc.com)のmailによると、
/sys/netinet/in_rmx.cをstableのものと入れ替えてkernel remakeすればよい。
とのこと。

そこで、
FreeBSD-stableの/usr/src/sys/netinet/in_rmx.c をget。
私のgetしたものはversion 1.13.4.3でした。

/sys/netinet/in_rmx.cを退避しておいて、getしたものをcopy。

kernelをrecompileしてrebootしてみました。

この処置によっても、ppp接続の異常終了により不完全なarpが残る現象は改善されません。
しかし、次のpppd接続のとき、これまでのように"Address already exists"とはならず、
正常に使用できます。

この問題は FreeBSD 2.1.5Rでは改善されているそうです。
in_rmx.cのversionが

$Id: in_rmx.c,v 1.13.4.3 1996/03/04 04:56:21 davidg Exp $
以上であれば大丈夫でしょう。
[ Nob's Home | FreeBSD | ppp ]
nob@makioka.y-min.or.jp