問題
RTEMS 4.9.2 を実行しているシステムで、ソケット通信に関して非常に奇妙な問題が発生しています。ソケットをセットアップし、次のコマンドを使用してバインドします。
// Bind the socket to set the local port
sockaddr_in localSocketAddress = {0};
localSocketAddress.sin_family = AF_INET;
localSocketAddress.sin_port = (u_short)localPort;
localSocketAddress.sin_addr.s_addr = localAddress;
if (bind( mSocket, (sockaddr *)&localSocketAddress, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
int errorOut = errno;
...
これは、以下で説明する奇妙な特定のシナリオを除いて、UDP 通信で機能します。bind
発生する問題は、セットアップが正しいにもかかわらず、この呼び出しが失敗することです。RTEMSのエラー125
は次のEADDRNOTAVAIL
とおりです。
存在しないインターフェイスが要求されたか、要求されたアドレスがローカルではありませんでした。
明らかな原因
デバイスの起動時に、次の 2 つの方法のいずれかでネットワークをセットアップできます。
ネットワーク IP と SUBNET は、デフォルトのブートローダー (UBOOT) にあるものに基づいて自動構成され、RTEMS OS を通じて設定されます。
RTEMS 関数
rtems_bsdnet_ifconfig
は、起動後に唯一のイーサネット インターフェイスの IP アドレスを変更するために呼び出されます。
明確にするために、オプション 2 は次のように呼び出されます。
rtems_bsdnet_ifconfig(eth_interface, SIOCSIFADDR, &ipaddr);
ネットワークがオプション 1 で示されるように設定されている場合、すべてが期待どおりに機能しますが、オプション 2 が使用されている場合 (設定がオプション 1 で定義されたネットワーク オプションと一致する場合でも)、ソケット バインドは失敗します。
IP を再構成すると、このバインドが失敗することを示す RTEMS の既知の理由またはバグはありますか?
追加情報
基本的に を使用する方法を使用して、新しい IP アドレス (オプション 2) を設定しています
ioctl("eht1", SIOCSIFADDR, ...)
。ローカル ADDRESS を指定せずにソケットをバインドすると (つまり use
INADDR_ANY
)、どのような場合でも機能します。は
rtems_bsdnet_ifconfig
、関数の単純なインターフェイスですioctl
。それはからのものrtems_glue.c
であり、関数シグネチャを持っていますint rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
このバインドを除いて、通常のネットワーク機能はすべて機能しているようです。
これを見た後、IPアドレスをリセットするためにもっと多くのことをする必要があるのではないかと思いました. しかし、これは機能しません。最初の回答を使用したり、何かを行ったりすると
SIOCSIFFLAGS
、すべてのネットワーク機能が停止します。