Ryo Iizuka / libMiMic

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

Revision:
48:00d211aac2ec
Parent:
43:a182f2b5ff41
Child:
57:bc4330dfa62f
diff -r d27b9b2dcac6 -r 00d211aac2ec core/uip/NyLPC_cIPv4.c
--- a/core/uip/NyLPC_cIPv4.c	Sun Jul 28 01:07:37 2013 +0000
+++ b/core/uip/NyLPC_cIPv4.c	Wed Aug 07 13:53:02 2013 +0000
@@ -118,11 +118,10 @@
         }
         tp=(NyLPC_TcUdpSocket_t*)p[i];
         //パラメータの一致チェック
-        if(i_lport!=tp->uip_udp_conn.lport)
-        {
-            continue;
+        if(i_lport==tp->uip_udp_conn.lport){
+        //unicast
+            return tp;
         }
-        return tp;
     }
     return NULL;
 }
@@ -141,7 +140,7 @@
         }
         tp=(NyLPC_TcUdpSocket_t*)p[i];
         //パラメータの一致チェック
-        if(i_lport!=tp->uip_udp_conn.lport || NyLPC_TIPv4Addr_isEqual(i_mcast_ip,&(tp->uip_udp_conn.lipaddr)))
+        if(i_lport!=tp->uip_udp_conn.lport || (!NyLPC_TIPv4Addr_isEqual(i_mcast_ip,&(tp->uip_udp_conn.mcastaddr))))
         {
             continue;
         }
@@ -463,44 +462,29 @@
     NyLPC_TcIPv4_t* i_inst,
     NyLPC_TcIPv4Payload_t* i_ipp)
 {
-    NyLPC_TcUdpSocket_t* sock;
-    //Multicastか調べる
-    if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_ipp->header->destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
-        //Multicastパケット
-
-        //チェックサムの計算
-        if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff))
-        {
-            //受信エラーのあるパケットはドロップ
-            goto DROP;
-        }
-        //マルチキャストに参加している&&portの一致するソケットを検索
-        sock=cSocketTbl_getMatchMulticastUdpSocket(&(i_inst->_socket_tbl),&(i_ipp->header->destipaddr),i_ipp->payload.udp->destport);
-        if(sock==NULL)
-        {
-            goto DROP;
-        }
+    NyLPC_TcUdpSocket_t* sock=NULL;
+    if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&(i_inst->_ref_config->ip_addr)))
+    {
+        sock=cSocketTbl_getMatchUdpSocket(&(i_inst->_socket_tbl),i_ipp->payload.udp->destport);
     }else{
-        //ユニキャストパケット
-
-        //自分自身のIPに対する呼び出し?
-        if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&(i_inst->_ref_config->ip_addr)))
-        {
-            //自分以外のパケットはドロップ
-            goto DROP;
+        if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_ipp->header->destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
+        //MultiCast?
+            //マルチキャストに参加している&&portの一致するソケットを検索
+            sock=cSocketTbl_getMatchMulticastUdpSocket(&(i_inst->_socket_tbl),&(i_ipp->header->destipaddr),i_ipp->payload.udp->destport);
+        }else if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&NyLPC_TIPv4Addr_BROADCAST)){
+        //Broadcast?
+            sock=cSocketTbl_getMatchUdpSocket(&(i_inst->_socket_tbl),i_ipp->payload.udp->destport);
         }
-        //チェックサムの計算
-        if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff))
-        {
-            //受信エラーのあるパケットはドロップ
-            goto DROP;
-        }
-        //ポートの一致するUDPソケットを探す。
-        sock=cSocketTbl_getMatchUdpSocket(&(i_inst->_socket_tbl),i_ipp->payload.udp->destport);
-        if(sock==NULL)
-        {
-            goto DROP;
-        }
+    }
+    if(sock==NULL)
+    {
+        goto DROP;
+    }
+    //パケットのエラーチェック
+    if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff))
+    {
+        //受信エラーのあるパケットはドロップ
+        goto DROP;
     }
     //既存の接続を処理
     return NyLPC_cUdpSocket_parseRx(sock,i_ipp);