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

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

Issue: 別セグメントへのARPリクエストを投げ続ける

クライアントのmbed(192.168.1.XX) から別セグメントにあるサーバ(192.168.100.XX)へ接続しようとすると、 192.168.100.XXのMACアドレスを尋ねるARPリクエストを投げ続けてしまい接続できません。

この場合、デフォルトゲートウェイへのARPリクエストでMACアドレスを取得し、 IPパケットの宛先IPを192.168.100.XX、Etherフレームの宛先MACアドレスをゲートウェイとして 送信するのが適当と考えています。

ソースを確認したところ、NyLPC_cMiMicIpNetIf_sendIPv4Tx()でIP送信に失敗した場合に、 宛先IPのMACアドレスを尋ねるARPリクエストを送信しています。

void NyLPC_cMiMicIpNetIf_sendIPv4Tx(void* i_eth_payload)
{
	NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
    void* p=((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1;
    NyLPC_cMutex_lock(&(inst->_mutex));
    //IPパケットの送信を試行
    if(sendIPv4Tx((struct TEthPacket*)p)){
        NyLPC_cMutex_unlock(&(inst->_mutex));
        return;
    }
    NyLPC_cMutex_unlock(&(inst->_mutex));
    //ARPリクエストを代わりに送信
    NyLPC_cMiMicIpNetIf_sendArpRequest(&((struct NyLPC_TIPv4Header*)i_eth_payload)->destipaddr);
    return;
}

宛先がローカルアドレスかそれ以外かでARPリクエストの送信先を変更することで 問題が解決することを確認済みです。

void NyLPC_cMiMicIpNetIf_sendIPv4Tx(void* i_eth_payload)
{
	NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
    void* p=((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1;
    NyLPC_cMutex_lock(&(inst->_mutex));
    //IPパケットの送信を試行
    if(sendIPv4Tx((struct TEthPacket*)p)){
        NyLPC_cMutex_unlock(&(inst->_mutex));
        return;
    }
    NyLPC_cMutex_unlock(&(inst->_mutex));
    //ARPリクエストを代わりに送信
 	{
		//LocalIP以外ならdefaultRootへ変換
        NyLPC_TBool isLocal = NyLPC_cIPv4Config_isLocalIP(inst->_netinfo.current_config, &((struct NyLPC_TIPv4Header*)i_eth_payload)->destipaddr);
		NyLPC_cMiMicIpNetIf_sendArpRequest(isLocal ? &((struct NyLPC_TIPv4Header*)i_eth_payload)->destipaddr : &(inst->_netinfo.current_config->dr_addr));
	}
    return;
}