This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

Issue: TCP初接続時のARPリクエスト内容が不正

TCPSocketにてサーバに初めて接続する際、MACアドレスを知るためにARPリクエストを発行します。 しかしリクエスト内容が不正なため、ARP応答が返らずにARPリクエストを発行し続けます。 (たまたまサーバからARPリクエストが来るなど、何らかの要因で解決できることはあります)

ARPリクエストを作成、送信しているのは次のコードです。

NyLPC_cMiMicIpNetIf_sendArpRequest()より抜粋

    struct TEthPacket* ethbuf;
    //システムTxBufを得る
    ethbuf=(struct TEthPacket*)NyLPC_cMiMicIpNetIf_allocSysTxBuf();
    //ARPパケットを作る。
    NyLPC_TArpHeader_setArpRequest(&(ethbuf->data.arp),inst->_netinfo.current_config->ip_addr,&(inst->_netinfo.current_config->eth_mac),i_addr);
    tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_netinfo.current_config->eth_mac));
    //送信
    p=((struct NyLPC_TEthernetIIHeader*)ethbuf)-1;

    NyLPC_cMutex_lock(&(inst->_mutex));
    NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,p,tx_len);

しかし、NyLPC_cMiMicIpNetIf_allocSysTxBuf()で取得するバッファはTEthPacketのアドレスではなく、TEthPacket->dataのアドレスです。 その結果、ずれたバッファにアドレスにデータをセットしてしまい、ARPリクエストの内容が不正になります。

次のように正しいアドレスへデータを設定するよう修正することで、正しくARPリクエストが発行されることを確認しました。

修正後

    struct TEthPacket* ethbuf;
    //システムTxBufを得る
    ethbuf=(struct TEthPacket*)((struct NyLPC_TEthernetIIHeader*)NyLPC_cMiMicIpNetIf_allocSysTxBuf()-1);
    //ARPパケットを作る。
    NyLPC_TArpHeader_setArpRequest(&(ethbuf->data.arp),inst->_netinfo.current_config->ip_addr,&(inst->_netinfo.current_config->eth_mac),i_addr);
    tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_netinfo.current_config->eth_mac));
    //送信
    NyLPC_cMutex_lock(&(inst->_mutex));
    NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,ethbuf,tx_len);

2 comments:

14 Sep 2015

不具合の報告とパッチの提供ありがとうございます。 該当箇所のチェックを終わり次第、メインツリーに反映してご報告します。

15 Sep 2015

不具合の修正を確認しました。 r113でコミットしました。関連するプロジェクトのlibMiMicも更新済です。

有難うございました。