Ryo Iizuka / libMiMic

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

Files at this revision

API Documentation at this revision

Comitter:
nyatla
Date:
Sun Mar 15 09:33:38 2015 +0000
Parent:
109:18f12ac01097
Child:
111:f525c6e5e27b
Commit message:
51d1c88c8a56d6295311cfd20aa197a9cd650b2d; ????; NetworkInterface???????

Changed in this revision

core/NyLPC_cFifoBuffer.c Show annotated file Show diff for this revision Revisions of this file
core/NyLPC_cFifoBuffer.h Show annotated file Show diff for this revision Revisions of this file
core/NyLPC_cMiMicEnv.c Show annotated file Show diff for this revision Revisions of this file
core/http/NyLPC_cHttpBasicBodyParser.c Show annotated file Show diff for this revision Revisions of this file
core/include/NyLPC_netif.h Show annotated file Show diff for this revision Revisions of this file
core/net/httpcl/NyLPC_cHttpClient.c Show annotated file Show diff for this revision Revisions of this file
core/net/httpd/NyLPC_cHttpd.c Show annotated file Show diff for this revision Revisions of this file
core/net/httpd/NyLPC_cHttpdConnection.c Show annotated file Show diff for this revision Revisions of this file
core/net/httpd/mod/NyLPC_cMocMiMicSetting.c Show annotated file Show diff for this revision Revisions of this file
core/net/mdns/NyLPC_cMDnsServer.c Show annotated file Show diff for this revision Revisions of this file
core/net/upnp/NyLPC_cSsdpSocket.c Show annotated file Show diff for this revision Revisions of this file
core/netif/NyLPC_cNet.c Show annotated file Show diff for this revision Revisions of this file
core/netif/NyLPC_cNet.h Show annotated file Show diff for this revision Revisions of this file
core/netif/NyLPC_cNetIf.c Show diff for this revision Revisions of this file
core/netif/NyLPC_cNetIf.h Show diff for this revision Revisions of this file
core/netif/NyLPC_iUdpSocket.h Show annotated file Show diff for this revision Revisions of this file
core/netif/apipa/NyLPC_cApipa.c Show annotated file Show diff for this revision Revisions of this file
core/netif/dhcp/NyLPC_cDhcpClient.c Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cIPv4.c Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cIPv4.h Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpBaseSocket.c Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpBaseSocket.h Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpNetIf.c Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpNetIf.h Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpNetIf_protected.h Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpTcpListener.c Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpTcpListener.h Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpTcpListener_protected.h Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpTcpSocket.c Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpTcpSocket.h Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpTcpSocket_protected.h Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpUdpSocket.c Show annotated file Show diff for this revision Revisions of this file
core/netif/mimicip/NyLPC_cMiMicIpUdpSocket.h Show annotated file Show diff for this revision Revisions of this file
mbed/Net.cpp Show annotated file Show diff for this revision Revisions of this file
mbed/Net.h Show annotated file Show diff for this revision Revisions of this file
mbed/TcpSocket.cpp Show annotated file Show diff for this revision Revisions of this file
mbed/UdpSocket.cpp Show annotated file Show diff for this revision Revisions of this file
mbed/mimic.h Show annotated file Show diff for this revision Revisions of this file
mbed/netif/INetIf.h Show annotated file Show diff for this revision Revisions of this file
mbed/netif/MiMicNetIf.cpp Show annotated file Show diff for this revision Revisions of this file
mbed/netif/MiMicNetIf.h Show annotated file Show diff for this revision Revisions of this file
--- a/core/NyLPC_cFifoBuffer.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/NyLPC_cFifoBuffer.c	Sun Mar 15 09:33:38 2015 +0000
@@ -49,6 +49,14 @@
     memcpy(wp,i_data,i_data_len);
     i_inst->len+=i_data_len;
 }
+void* NyLPC_cFifoBuffer_prePush(NyLPC_TcFifoBuffer_t* i_inst,NyLPC_TUInt16 i_data_len)
+{
+    NyLPC_TUInt8* wp;
+    NyLPC_ArgAssert(NyLPC_cFifoBuffer_getSpace(i_inst)>=i_data_len);
+    wp=((NyLPC_TUInt8*)(i_inst->buf))+i_inst->len;
+    i_inst->len+=i_data_len;
+    return wp;
+}
 
 /**
  * See Header file.
--- a/core/NyLPC_cFifoBuffer.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/NyLPC_cFifoBuffer.h	Sun Mar 15 09:33:38 2015 +0000
@@ -97,6 +97,11 @@
  *
  */
 void NyLPC_cFifoBuffer_push(NyLPC_TcFifoBuffer_t* i_inst,const void* i_data,NyLPC_TUInt16 i_data_len);
+/**
+ * 先にメモリ領域を確保して、そのアドレスを返します。
+ */
+void* NyLPC_cFifoBuffer_prePush(NyLPC_TcFifoBuffer_t* i_inst,NyLPC_TUInt16 i_data_len);
+
 
 /**
  * この関数は、バッファの先頭からデータを削除します。
--- a/core/NyLPC_cMiMicEnv.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/NyLPC_cMiMicEnv.c	Sun Mar 15 09:33:38 2015 +0000
@@ -1,7 +1,7 @@
 #include "NyLPC_cMiMicEnv.h"
 #include "NyLPC_netif.h"
 
-const static char* VERSION="MiMic/1.7.0";
+const static char* VERSION="MiMic/1.7.1";
 
 #if NyLPC_MCU==NyLPC_MCU_LPC4088
 const static char* MCU="LPC4088";
@@ -31,7 +31,7 @@
 #if NyLPC_MCU==NyLPC_MCU_K64F
         return PNAME_FRDM;
 #else
-        switch(*(NyLPC_cNetIf_getInterfaceInfo()->device_name)){
+        switch(*(NyLPC_cNet_getInterfaceInfo()->device_name)){
         case 'L':
             return PNAME_LPCXPRESSO;
         case 'D':
@@ -41,7 +41,7 @@
         }
 #endif
     case NyLPC_cMiMicEnv_ETHERNET_PHY:
-        return NyLPC_cNetIf_getInterfaceInfo()->device_name;
+        return NyLPC_cNet_getInterfaceInfo()->device_name;
     case NyLPC_cMiMicEnv_MCU_NAME:
         return MCU;
     default:
--- a/core/http/NyLPC_cHttpBasicBodyParser.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/http/NyLPC_cHttpBasicBodyParser.c	Sun Mar 15 09:33:38 2015 +0000
@@ -155,7 +155,6 @@
             }
         }
         return i_size;
-        break;
     case NyLPC_THttpMessgeHeader_TransferEncoding_NONE:
         if(i_inst->_status!=NyLPC_TcHttpBasicBodyParser_ST_BODY){
             NyLPC_OnErrorGoto(ERROR);
--- a/core/include/NyLPC_netif.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/include/NyLPC_netif.h	Sun Mar 15 09:33:38 2015 +0000
@@ -36,7 +36,9 @@
 #include "../netif/NyLPC_iTcpSocket.h"
 #include "../netif/NyLPC_iUdpSocket.h"
 #include "../netif/NyLPC_NetIf_ip_types.h"
-#include "../netif/NyLPC_cNetIf.h"
+#include "../netif/NyLPC_cNet.h"
+#include "../netif/NyLPC_iNetInterface.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
@@ -48,4 +50,3 @@
 
 
 #endif
-
--- a/core/net/httpcl/NyLPC_cHttpClient.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/net/httpcl/NyLPC_cHttpClient.c	Sun Mar 15 09:33:38 2015 +0000
@@ -17,7 +17,7 @@
 
 NyLPC_TBool NyLPC_cHttpClient_initialize(NyLPC_TcHttpClient_t* i_inst,void* i_rx_buf,NyLPC_TUInt16 i_rx_size)
 {
-	i_inst->_sock=NyLPC_cNetIf_createTcpSocketEx(NyLPC_TSocketType_TCP_NORMAL);
+	i_inst->_sock=NyLPC_cNet_createTcpSocketEx(NyLPC_TSocketType_TCP_NORMAL);
 	if(i_inst->_sock==NULL){
 		return NyLPC_TBool_FALSE;
 	}
--- a/core/net/httpd/NyLPC_cHttpd.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/net/httpd/NyLPC_cHttpd.c	Sun Mar 15 09:33:38 2015 +0000
@@ -6,7 +6,7 @@
     int i;
     i_inst->_num_of_active_connection=0;
     NyLPC_cMutex_initialize(&i_inst->_mutex);
-    i_inst->_listener=NyLPC_cNetIf_createTcpListenerEx(i_port_number);
+    i_inst->_listener=NyLPC_cNet_createTcpListenerEx(i_port_number);
     if(i_inst->_listener==NULL){
         return NyLPC_TBool_FALSE;
     }
--- a/core/net/httpd/NyLPC_cHttpdConnection.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/net/httpd/NyLPC_cHttpdConnection.c	Sun Mar 15 09:33:38 2015 +0000
@@ -8,7 +8,7 @@
 
 NyLPC_TBool NyLPC_cHttpdConnection_initialize(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TcHttpd_t* i_parent_httpd)
 {
-    i_inst->_socket=NyLPC_cNetIf_createTcpSocketEx(NyLPC_TSocketType_TCP_HTTP);
+    i_inst->_socket=NyLPC_cNet_createTcpSocketEx(NyLPC_TSocketType_TCP_HTTP);
     if(i_inst->_socket==NULL){
         return NyLPC_TBool_FALSE;
     }
--- a/core/net/httpd/mod/NyLPC_cMocMiMicSetting.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/net/httpd/mod/NyLPC_cMocMiMicSetting.c	Sun Mar 15 09:33:38 2015 +0000
@@ -7,7 +7,7 @@
  *
  * MiMic is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
+ * by the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
@@ -428,7 +428,7 @@
                 NyLPC_OnErrorGoto(Error);
             }
             //write current status
-            netif_info=NyLPC_cNetIf_getInterfaceInfo();
+            netif_info=NyLPC_cNet_getInterfaceInfo();
             currebt_cfg=(const NyLPC_TcNetConfig_t*)(netif_info->current_config);
             if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
                 "\"cur\":{"
--- a/core/net/mdns/NyLPC_cMDnsServer.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/net/mdns/NyLPC_cMDnsServer.c	Sun Mar 15 09:33:38 2015 +0000
@@ -1098,7 +1098,7 @@
 {
     NyLPC_cStopwatch_initialize(&(i_inst->_periodic_sw));
     NyLPC_cStopwatch_startExpire(&(i_inst->_periodic_sw),1000);
-    i_inst->_socket=NyLPC_cNetIf_createUdpSocketEx(MDNS_MCAST_PORT,NyLPC_TSocketType_UDP_NOBUF);
+    i_inst->_socket=NyLPC_cNet_createUdpSocketEx(MDNS_MCAST_PORT,NyLPC_TSocketType_UDP_NOBUF);
     i_inst->_socket->_tag=i_inst;
     NyLPC_iUdpSocket_setOnRxHandler(i_inst->_socket,onPacket);
     NyLPC_iUdpSocket_setOnPeriodicHandler(i_inst->_socket,onPeriodic);
--- a/core/net/upnp/NyLPC_cSsdpSocket.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/net/upnp/NyLPC_cSsdpSocket.c	Sun Mar 15 09:33:38 2015 +0000
@@ -540,7 +540,7 @@
 		const struct NyLPC_TUPnPDevDescDevice* i_ref_dev_record,
 		NyLPC_TUInt16 i_server_port,const NyLPC_TChar* i_ref_location_path)
 {
-	i_inst->_socket=NyLPC_cNetIf_createUdpSocketEx(1900,NyLPC_TSocketType_UDP_NOBUF);
+	i_inst->_socket=NyLPC_cNet_createUdpSocketEx(1900,NyLPC_TSocketType_UDP_NOBUF);
     i_inst->_socket->_tag=i_inst;
 
 	NyLPC_iUdpSocket_setOnRxHandler(i_inst->_socket,onPacket);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/netif/NyLPC_cNet.c	Sun Mar 15 09:33:38 2015 +0000
@@ -0,0 +1,101 @@
+
+#include "NyLPC_cNet.h"
+#include "./mimicip/NyLPC_cMiMicIpNetIf_protected.h"
+#include "dhcp/NyLPC_cDhcpClient.h"
+#include "apipa/NyLPC_cApipa.h"
+
+
+/**
+ * 唯一のネットワークインタフェイス
+ */
+const static struct NyLPC_TiNetInterface_Interface* netif;
+
+
+
+
+
+void NyLPC_cNet_initialize(const struct NyLPC_TiNetInterface_Interface* i_netif)
+{
+	NyLPC_Assert(netif==NULL);
+	netif=i_netif;
+}
+
+void NyLPC_cNet_start(const NyLPC_TcIPv4Config_t* i_ref_config)
+{
+	netif->start(i_ref_config);
+    return;
+}
+
+void NyLPC_cNet_stop(void)
+{
+	netif->stop();
+    return;
+}
+
+
+
+/**
+ * 指定したIPアドレスを要求するARPリクエストを発行します。
+ */
+void NyLPC_cNet_sendArpRequest(const struct NyLPC_TIPv4Addr* i_addr)
+{
+	netif->sendarprequest(i_addr);
+}
+/**
+ * ARPテーブルに指定したIPがあるかを返します。
+ */
+NyLPC_TBool NyLPC_cNet_hasArpInfo(const struct NyLPC_TIPv4Addr* i_addr)
+{
+	return netif->hasarpinfo(i_addr);
+}
+
+NyLPC_TBool NyLPC_cNet_isInitService(void)
+{
+	return netif->isinitservice();
+}
+
+NyLPC_TiTcpSocket_t* NyLPC_cNet_createTcpSocketEx(NyLPC_TSocketType i_socktype)
+{
+	return netif->createTcpSocketEx(i_socktype);
+}
+NyLPC_TiUdpSocket_t* NyLPC_cNet_createUdpSocketEx(NyLPC_TUInt16 i_port,NyLPC_TSocketType i_socktype)
+{
+	return netif->createUdpSocetEx(i_port,i_socktype);
+}
+NyLPC_TiTcpListener_t* NyLPC_cNet_createTcpListenerEx(NyLPC_TUInt16 i_port)
+{
+	return netif->createTcpListener(i_port);
+}
+
+const struct NyLPC_TNetInterfaceInfo* NyLPC_cNet_getInterfaceInfo(void)
+{
+	return netif->getinterfaceinfo();
+}
+
+
+
+NyLPC_TBool NyLPC_cNet_requestAddrDhcp(NyLPC_TcIPv4Config_t* i_cfg,NyLPC_TInt16 i_repeat)
+{
+    NyLPC_TBool ret;
+    NyLPC_TcDhcpClient_t sock;
+    //netを開始
+    NyLPC_cDhcpClient_initialize(&sock);
+    ret=NyLPC_cDhcpClient_requestAddr(&sock,i_cfg,i_repeat);
+    NyLPC_cDhcpClient_finalize(&sock);
+    return ret;
+}
+
+NyLPC_TBool NyLPC_cNet_requestAddrApipa(NyLPC_TcIPv4Config_t* i_cfg,NyLPC_TInt16 i_repeat)
+{
+    NyLPC_TBool ret;
+    NyLPC_TcApipa_t sock;
+    //netを開始
+    NyLPC_cApipa_initialize(&sock);
+    ret=NyLPC_cApipa_requestAddr(&sock,i_cfg,i_repeat);
+    NyLPC_cApipa_finalize(&sock);
+    return ret;
+}
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/netif/NyLPC_cNet.h	Sun Mar 15 09:33:38 2015 +0000
@@ -0,0 +1,69 @@
+#ifndef NYLPC_CNET_H_
+#define NYLPC_CNET_H_
+#include "NyLPC_stdlib.h"
+#include "NyLPC_cIPv4Config.h"
+#include "NyLPC_iTcpListener.h"
+#include "NyLPC_iTcpSocket.h"
+#include "NyLPC_iUdpSocket.h"
+#include "NyLPC_iNetInterface.h"
+#include "NyLPC_NetIf_ip_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+typedef struct NyLPC_TcNet NyLPC_TcNet_t;
+
+void NyLPC_cNet_initialize(const struct NyLPC_TiNetInterface_Interface* i_netif);
+#define NyLPC_cNet_finalize()
+
+NyLPC_TiTcpSocket_t* NyLPC_cNet_createTcpSocketEx(NyLPC_TSocketType i_socktype);
+NyLPC_TiUdpSocket_t* NyLPC_cNet_createUdpSocketEx(NyLPC_TUInt16 i_port,NyLPC_TSocketType i_socktype);
+NyLPC_TiTcpListener_t* NyLPC_cNet_createTcpListenerEx(NyLPC_TUInt16 i_port);
+
+/**
+ * 指定したIPアドレスを要求するARPリクエストを発行します。
+ */
+void NyLPC_cNet_sendArpRequest(const struct NyLPC_TIPv4Addr* i_addr);
+
+/**
+ * ARPテーブルに指定したIPがあるかを返します。
+ */
+NyLPC_TBool NyLPC_cNet_hasArpInfo(const struct NyLPC_TIPv4Addr* i_addr);
+
+void NyLPC_cNet_start(const NyLPC_TcIPv4Config_t* i_ref_config);
+void NyLPC_cNet_stop(void);
+NyLPC_TBool NyLPC_cNet_isInitService(void);
+
+/**
+ * NyLPC_TcIPv4Config_tをDHCPで更新します。
+ * この関数をコールする時は、サービスは停止中でなければなりません。
+ * @param i_cfg
+ * 更新するi_cfg構造体。
+ * emac,default_mssは設定済である必要があります。他のフィールド値は不定で構いません。
+ * 更新されるフィールドは、ip,netmast,default_rootの3つです。
+ * @return
+ * 更新に成功した場合TRUE
+ */
+NyLPC_TBool NyLPC_cNet_requestAddrDhcp(NyLPC_TcIPv4Config_t* i_cfg,NyLPC_TInt16 i_repeat);
+/**
+ * NyLPC_TcIPv4Config_tをAPIPAで更新します。
+ * この関数をコールする時は、サービスは停止中でなければなりません。
+ * @param i_cfg
+ * 更新するi_cfg構造体。
+ * emac,default_mssは設定済である必要があります。他のフィールド値は不定で構いません。
+ * 更新されるフィールドは、ip,netmast,default_rootの3つです。
+ * @return
+ * 更新に成功した場合TRUE
+ */
+NyLPC_TBool NyLPC_cNet_requestAddrApipa(NyLPC_TcIPv4Config_t* i_cfg,NyLPC_TInt16 i_repeat);
+
+const struct NyLPC_TNetInterfaceInfo* NyLPC_cNet_getInterfaceInfo(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+
+
--- a/core/netif/NyLPC_cNetIf.c	Wed Nov 19 14:45:17 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-
-#include "NyLPC_cNetIf.h"
-#include "./mimicip/NyLPC_cMiMicIpNetIf_protected.h"
-#include "dhcp/NyLPC_cDhcpClient.h"
-#include "apipa/NyLPC_cApipa.h"
-
-
-/**
- * 唯一のネットワークインタフェイス
- */
-const static struct NyLPC_TiNetInterface_Interface* netif;
-
-
-
-
-
-void NyLPC_cNetIf_initialize(void)
-{
-	if(netif==NULL){
-		//ここでネットワークインタフェイスを切り替えてくれ。
-		netif=NyLPC_cMiMicIpNetIf_getNetInterface();
-	}
-}
-
-void NyLPC_cNetIf_start(const NyLPC_TcIPv4Config_t* i_ref_config)
-{
-	netif->start(i_ref_config);
-    return;
-}
-
-void NyLPC_cNetIf_stop(void)
-{
-	netif->stop();
-    return;
-}
-
-
-
-/**
- * 指定したIPアドレスを要求するARPリクエストを発行します。
- */
-void NyLPC_cNetIf_sendArpRequest(const struct NyLPC_TIPv4Addr* i_addr)
-{
-	netif->sendarprequest(i_addr);
-}
-/**
- * ARPテーブルに指定したIPがあるかを返します。
- */
-NyLPC_TBool NyLPC_cNetIf_hasArpInfo(const struct NyLPC_TIPv4Addr* i_addr)
-{
-	return netif->hasarpinfo(i_addr);
-}
-
-NyLPC_TBool NyLPC_cNetIf_isInitService(void)
-{
-	return netif->isinitservice();
-}
-
-NyLPC_TiTcpSocket_t* NyLPC_cNetIf_createTcpSocketEx(NyLPC_TSocketType i_socktype)
-{
-	return netif->createTcpSocketEx(i_socktype);
-}
-NyLPC_TiUdpSocket_t* NyLPC_cNetIf_createUdpSocketEx(NyLPC_TUInt16 i_port,NyLPC_TSocketType i_socktype)
-{
-	return netif->createUdpSocetEx(i_port,i_socktype);
-}
-NyLPC_TiTcpListener_t* NyLPC_cNetIf_createTcpListenerEx(NyLPC_TUInt16 i_port)
-{
-	return netif->createTcpListener(i_port);
-}
-
-const struct NyLPC_TNetInterfaceInfo* NyLPC_cNetIf_getInterfaceInfo(void)
-{
-	return netif->getinterfaceinfo();
-}
-
-
-
-NyLPC_TBool NyLPC_cNetIf_requestAddrDhcp(NyLPC_TcIPv4Config_t* i_cfg,NyLPC_TInt16 i_repeat)
-{
-    NyLPC_TBool ret;
-    NyLPC_TcDhcpClient_t sock;
-    //netを開始
-    NyLPC_cDhcpClient_initialize(&sock);
-    ret=NyLPC_cDhcpClient_requestAddr(&sock,i_cfg,i_repeat);
-    NyLPC_cDhcpClient_finalize(&sock);
-    return ret;
-}
-
-NyLPC_TBool NyLPC_cNetIf_requestAddrApipa(NyLPC_TcIPv4Config_t* i_cfg,NyLPC_TInt16 i_repeat)
-{
-    NyLPC_TBool ret;
-    NyLPC_TcApipa_t sock;
-    //netを開始
-    NyLPC_cApipa_initialize(&sock);
-    ret=NyLPC_cApipa_requestAddr(&sock,i_cfg,i_repeat);
-    NyLPC_cApipa_finalize(&sock);
-    return ret;
-}
-
-
-
--- a/core/netif/NyLPC_cNetIf.h	Wed Nov 19 14:45:17 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-#ifndef NYLPC_CNETIF_H_
-#define NYLPC_CNETIF_H_
-#include "NyLPC_stdlib.h"
-#include "NyLPC_cIPv4Config.h"
-#include "NyLPC_iTcpListener.h"
-#include "NyLPC_iTcpSocket.h"
-#include "NyLPC_iUdpSocket.h"
-#include "NyLPC_iNetInterface.h"
-#include "NyLPC_NetIf_ip_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-typedef struct NyLPC_TcNetIf NyLPC_TcNetIf_t;
-
-void NyLPC_cNetIf_initialize(void);
-#define NyLPC_cNetIf_finalize()
-
-NyLPC_TiTcpSocket_t* NyLPC_cNetIf_createTcpSocketEx(NyLPC_TSocketType i_socktype);
-NyLPC_TiUdpSocket_t* NyLPC_cNetIf_createUdpSocketEx(NyLPC_TUInt16 i_port,NyLPC_TSocketType i_socktype);
-NyLPC_TiTcpListener_t* NyLPC_cNetIf_createTcpListenerEx(NyLPC_TUInt16 i_port);
-
-/**
- * 指定したIPアドレスを要求するARPリクエストを発行します。
- */
-void NyLPC_cNetIf_sendArpRequest(const struct NyLPC_TIPv4Addr* i_addr);
-
-/**
- * ARPテーブルに指定したIPがあるかを返します。
- */
-NyLPC_TBool NyLPC_cNetIf_hasArpInfo(const struct NyLPC_TIPv4Addr* i_addr);
-
-void NyLPC_cNetIf_start(const NyLPC_TcIPv4Config_t* i_ref_config);
-void NyLPC_cNetIf_stop(void);
-NyLPC_TBool NyLPC_cNetIf_isInitService(void);
-
-/**
- * NyLPC_TcIPv4Config_tをDHCPで更新します。
- * この関数をコールする時は、サービスは停止中でなければなりません。
- * @param i_cfg
- * 更新するi_cfg構造体。
- * emac,default_mssは設定済である必要があります。他のフィールド値は不定で構いません。
- * 更新されるフィールドは、ip,netmast,default_rootの3つです。
- * @return
- * 更新に成功した場合TRUE
- */
-NyLPC_TBool NyLPC_cNetIf_requestAddrDhcp(NyLPC_TcIPv4Config_t* i_cfg,NyLPC_TInt16 i_repeat);
-/**
- * NyLPC_TcIPv4Config_tをAPIPAで更新します。
- * この関数をコールする時は、サービスは停止中でなければなりません。
- * @param i_cfg
- * 更新するi_cfg構造体。
- * emac,default_mssは設定済である必要があります。他のフィールド値は不定で構いません。
- * 更新されるフィールドは、ip,netmast,default_rootの3つです。
- * @return
- * 更新に成功した場合TRUE
- */
-NyLPC_TBool NyLPC_cNetIf_requestAddrApipa(NyLPC_TcIPv4Config_t* i_cfg,NyLPC_TInt16 i_repeat);
-
-const struct NyLPC_TNetInterfaceInfo* NyLPC_cNetIf_getInterfaceInfo(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif
-
--- a/core/netif/NyLPC_iUdpSocket.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/NyLPC_iUdpSocket.h	Sun Mar 15 09:33:38 2015 +0000
@@ -144,7 +144,7 @@
  * ソケットのローカルIPのアドレスを返す。
  * 値はuipが動作中のみ有効。
  */
-typedef struct NyLPC_TIPv4Addr* (*NyLPC_TiUdpSocket_getSockIP)(const NyLPC_TiUdpSocket_t* i_inst);
+typedef const struct NyLPC_TIPv4Addr* (*NyLPC_TiUdpSocket_getSockIP)(const NyLPC_TiUdpSocket_t* i_inst);
 
 typedef void (*NyLPC_TiUdpSocket_finalize)(NyLPC_TiUdpSocket_t* i_inst);
 
@@ -197,4 +197,3 @@
 #endif /* __cplusplus */
 
 #endif /* NYLPC_IIUDPSOCKET_H_ */
-
--- a/core/netif/apipa/NyLPC_cApipa.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/apipa/NyLPC_cApipa.c	Sun Mar 15 09:33:38 2015 +0000
@@ -1,5 +1,5 @@
 #include "NyLPC_cApipa.h"
-#include "../NyLPC_cNetIf.h"
+#include "../NyLPC_cNet.h"
 #include <stdio.h>
 #include <string.h>
 
@@ -14,7 +14,7 @@
     NyLPC_cStopwatch_startExpire(&sw,i_wait_in_ms);
     while(!NyLPC_cStopwatch_isExpired(&sw)){
         NyLPC_cThread_yield();
-        if(NyLPC_cNetIf_hasArpInfo(i_ip)){
+        if(NyLPC_cNet_hasArpInfo(i_ip)){
             return NyLPC_TBool_TRUE;
         }
     }
@@ -64,26 +64,26 @@
         updateSeed(i_inst);
         makeIP(i_inst,&caip);
         //startInterface
-        NyLPC_cNetIf_start(&cfg);
-        NyLPC_cNetIf_sendArpRequest(&caip);
+        NyLPC_cNet_start(&cfg);
+        NyLPC_cNet_sendArpRequest(&caip);
         //テーブル更新待ち
         if(waitForArpResponse(&caip,512+(i_inst->_seed % 256))){
-            NyLPC_cNetIf_stop();
+            NyLPC_cNet_stop();
             continue;
         }
-        NyLPC_cNetIf_stop();
+        NyLPC_cNet_stop();
         //IPのコンフリクトテスト
         NyLPC_cIPv4Config_setIp(&cfg,&caip,&NyLPC_TIPv4Addr_APIPA_MASK);
-        NyLPC_cNetIf_start(&cfg);
+        NyLPC_cNet_start(&cfg);
         //!ARP送信
-        NyLPC_cNetIf_sendArpRequest(&caip);
+        NyLPC_cNet_sendArpRequest(&caip);
         if(waitForArpResponse(&caip,512+(256-(i_inst->_seed % 256)))){
             //応答があったらエラー
-             NyLPC_cNetIf_stop();
+             NyLPC_cNet_stop();
             continue;
         }
         //OK
-        NyLPC_cNetIf_stop();
+        NyLPC_cNet_stop();
         NyLPC_cIPv4Config_setIp(i_cfg,&cfg.ip_addr,&cfg.netmask);
         return NyLPC_TBool_TRUE;
     }
--- a/core/netif/dhcp/NyLPC_cDhcpClient.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/dhcp/NyLPC_cDhcpClient.c	Sun Mar 15 09:33:38 2015 +0000
@@ -24,7 +24,7 @@
  *
  *********************************************************************************/
 #include "NyLPC_cDhcpClient.h"
-#include "../NyLPC_cNetIf.h"
+#include "../NyLPC_cNet.h"
 #include <stdio.h>
 #include <string.h>
 
@@ -200,7 +200,7 @@
  */
 NyLPC_TBool NyLPC_cDhcpClient_initialize(NyLPC_TcDhcpClient_t* i_inst)
 {
-    i_inst->_socket=NyLPC_cNetIf_createUdpSocketEx(68,NyLPC_TSocketType_UDP_NOBUF);
+    i_inst->_socket=NyLPC_cNet_createUdpSocketEx(68,NyLPC_TSocketType_UDP_NOBUF);
     if(i_inst->_socket==NULL){
         return NyLPC_TBool_FALSE;
     }
@@ -294,14 +294,14 @@
     NyLPC_cIPv4Config_setIp(&c2,&NyLPC_TIPv4Addr_ZERO,&NyLPC_TIPv4Addr_ZERO);
     NyLPC_cIPv4Config_setDefaultRoute(&c2,&NyLPC_TIPv4Addr_ZERO);
     //netを開始
-    NyLPC_cNetIf_start(&c2);
+    NyLPC_cNet_start(&c2);
     for(i=i_repeat-1;i>=0;i--){
         ret=NyLPC_cDhcpClient_dhcpRequest(i_inst,i_cfg);
         if(ret){
             break;
         }
     }
-    NyLPC_cNetIf_stop();
+    NyLPC_cNet_stop();
     NyLPC_cIPv4Config_finalize(&c2);
     return ret;
 }
--- a/core/netif/mimicip/NyLPC_cIPv4.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cIPv4.c	Sun Mar 15 09:33:38 2015 +0000
@@ -61,225 +61,10 @@
 #include "NyLPC_cMiMicIpUdpSocket_protected.h"
 #include "NyLPC_cIPv4IComp_protected.h"
 #include "NyLPC_cMiMicIpNetIf_protected.h"
-#include "NyLPC_cMiMicIpBaseSocket.h"
 
 
 
-/****************************************************
- * Socketテーブルに関する宣言
- ***************************************************/
 
-#define cSocketTbl_initialize(i_inst,buf) NyLPC_cPtrTbl_initialize(i_inst,buf,NyLPC_cIPv4_MAX_SOCKET)
-#define cSocketTbl_finalize(i_inst)
-
-/**
- * 条件に一致する、アクティブなTCPソケットオブジェクトを取得します。
- * この関数は、ローカルIPが一致していると仮定して検索をします。
- * @param i_rip
- * リモートIPアドレスを指定します。
- */
-static NyLPC_TcMiMicIpTcpSocket_t* cSocketTbl_getMatchTcpSocket(
-    NyLPC_TcPtrTbl_t* i_inst,
-    NyLPC_TUInt16 i_lport,
-    struct NyLPC_TIPv4Addr i_rip,
-    NyLPC_TUInt16 i_rport)
-{
-    NyLPC_TcMiMicIpBaseSocket_t** p=(NyLPC_TcMiMicIpBaseSocket_t**)(i_inst->buf);
-    NyLPC_TcMiMicIpTcpSocket_t* tp;
-    int i;
-    //一致するポートを検索
-    for(i=i_inst->size-1;i>=0;i--){
-        if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_SOCK){
-            continue;
-        }
-        tp=(NyLPC_TcMiMicIpTcpSocket_t*)p[i];
-        if(tp->tcpstateflags==UIP_CLOSED){
-            continue;
-        }
-        //パラメータの一致チェック
-        if(i_lport!=tp->uip_connr.lport || i_rport!= tp->uip_connr.rport || i_rip.v!=tp->uip_connr.ripaddr.v)
-        {
-            continue;
-        }
-        return tp;
-    }
-    return NULL;
-}
-static NyLPC_TcMiMicIpUdpSocket_t* cSocketTbl_getMatchUdpSocket(
-    NyLPC_TcPtrTbl_t* i_inst,
-    NyLPC_TUInt16 i_lport)
-{
-    NyLPC_TcMiMicIpBaseSocket_t** p=(NyLPC_TcMiMicIpBaseSocket_t**)(i_inst->buf);
-    NyLPC_TcMiMicIpUdpSocket_t* tp;
-    int i;
-    //一致するポートを検索
-    for(i=i_inst->size-1;i>=0;i--){
-        if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcMiMicIpBaseSocket_TYPEID_UDP_SOCK){
-            continue;
-        }
-        tp=(NyLPC_TcMiMicIpUdpSocket_t*)p[i];
-        //パラメータの一致チェック
-        if(i_lport==tp->uip_udp_conn.lport){
-        //unicast
-            return tp;
-        }
-    }
-    return NULL;
-}
-static NyLPC_TcMiMicIpUdpSocket_t* cSocketTbl_getMatchMulticastUdpSocket(
-    NyLPC_TcPtrTbl_t* i_inst,
-    const struct NyLPC_TIPv4Addr* i_mcast_ip,
-    NyLPC_TUInt16 i_lport)
-{
-    NyLPC_TcMiMicIpBaseSocket_t** p=(NyLPC_TcMiMicIpBaseSocket_t**)(i_inst->buf);
-    NyLPC_TcMiMicIpUdpSocket_t* tp;
-    int i;
-    //一致するポートを検索
-    for(i=i_inst->size-1;i>=0;i--){
-        if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcMiMicIpBaseSocket_TYPEID_UDP_SOCK){
-            continue;
-        }
-        tp=(NyLPC_TcMiMicIpUdpSocket_t*)p[i];
-        //パラメータの一致チェック
-        if(i_lport!=tp->uip_udp_conn.lport || (!NyLPC_TIPv4Addr_isEqual(i_mcast_ip,&(tp->uip_udp_conn.mcastaddr))))
-        {
-            continue;
-        }
-        return tp;
-    }
-    return NULL;
-}
-
-/**
- * i_port番号に一致するリスナを返します。
- */
-static NyLPC_TcMiMicIpTcpListener_t* cSocketTbl_getListenerByPeerPort(NyLPC_TcPtrTbl_t* i_inst,NyLPC_TUInt16 i_port)
-{
-    NyLPC_TcMiMicIpBaseSocket_t** p=(NyLPC_TcMiMicIpBaseSocket_t**)(i_inst->buf);
-    NyLPC_TcMiMicIpTcpListener_t* lp;
-    int i;
-    //一致するポートを検索して、acceptをコールする。
-    for(i=i_inst->size-1;i>=0;i--){
-        if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_LISTENER){
-            continue;
-        }
-        lp=(NyLPC_TcMiMicIpTcpListener_t*)p[i];
-        if(lp->_port!=i_port){
-            continue;
-        }
-        return lp;
-    }
-    return NULL;
-}
-/**
- * 指定番号のTCPポートが未使用かを返す。
- * @return
- * i_lport番のポートが未使用であればTRUE
- */
-static NyLPC_TBool cSocketTbl_isClosedTcpPort(
-    NyLPC_TcPtrTbl_t* i_inst,
-    NyLPC_TUInt16 i_lport)
-{
-    NyLPC_TcMiMicIpBaseSocket_t** p=(NyLPC_TcMiMicIpBaseSocket_t**)(i_inst->buf);
-    NyLPC_TcMiMicIpTcpSocket_t* tp;
-    int i;
-    //一致するポートを検索
-    for(i=i_inst->size-1;i>=0;i--){
-        if(p[i]==NULL){
-            continue;
-        }
-        if(p[i]->_typeid!=NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_SOCK){
-            tp=((NyLPC_TcMiMicIpTcpSocket_t*)p[i]);
-            //TCPソケット && !クローズ  && ポート一致なら使用中
-            if((tp->tcpstateflags!=UIP_CLOSED) && tp->uip_connr.lport==i_lport){
-                return NyLPC_TBool_FALSE;
-            }
-        }
-        if(p[i]->_typeid!=NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_LISTENER){
-            //Listenerソケット  && ポート一致なら使用中
-            if(((NyLPC_TcMiMicIpTcpListener_t*)p[i])->_port==i_lport){
-                return NyLPC_TBool_FALSE;
-            }
-        }
-    }
-    //未使用
-    return NyLPC_TBool_TRUE;
-}
-/**
- * テーブルにある有効なソケットのperiodicをすべて呼び出します。
- */
-static void cSocketTbl_callPeriodic(
-    NyLPC_TcPtrTbl_t* i_inst)
-{
-    NyLPC_TcMiMicIpBaseSocket_t** p=(NyLPC_TcMiMicIpBaseSocket_t**)(i_inst->buf);
-    int i;
-    for(i=i_inst->size-1;i>=0;i--){
-        if(p[i]==NULL){
-            continue;
-        }
-        switch(p[i]->_typeid){
-        case NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_SOCK:
-            //downcast!
-            NyLPC_cMiMicIpTcpSocket_periodic((NyLPC_TcMiMicIpTcpSocket_t*)(p[i]));
-            break;
-        case NyLPC_TcMiMicIpBaseSocket_TYPEID_UDP_SOCK:
-            NyLPC_cMiMicIpUdpSocket_periodic((NyLPC_TcMiMicIpUdpSocket_t*)(p[i]));
-            break;
-        default:
-            continue;
-        }
-    }
-}
-
-/**
- * テーブルにある有効なソケットのstartを全て呼び出します。
- */
-static void cSocketTbl_callSocketStart(
-    NyLPC_TcPtrTbl_t* i_inst,
-    const NyLPC_TcIPv4Config_t* i_cfg)
-{
-    NyLPC_TcMiMicIpBaseSocket_t** p=(NyLPC_TcMiMicIpBaseSocket_t**)(i_inst->buf);
-    int i;
-    for(i=i_inst->size-1;i>=0;i--){
-        if(p[i]==NULL){
-            continue;
-        }
-        switch(p[i]->_typeid){
-        case NyLPC_TcMiMicIpBaseSocket_TYPEID_UDP_SOCK:
-            NyLPC_cMiMicIpUdpSocket_startService((NyLPC_TcMiMicIpUdpSocket_t*)(p[i]),i_cfg);
-            break;
-        case NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_SOCK:
-            NyLPC_cMiMicIpTcpSocket_startService((NyLPC_TcMiMicIpTcpSocket_t*)(p[i]),i_cfg);
-            break;
-        default:
-            continue;
-        }
-    }
-}
-/**
- * テーブルにある有効なソケットのstartを全て呼び出します。
- */
-static void cSocketTbl_callSocketStop(
-    NyLPC_TcPtrTbl_t* i_inst)
-{
-    NyLPC_TcMiMicIpBaseSocket_t** p=(NyLPC_TcMiMicIpBaseSocket_t**)(i_inst->buf);
-    int i;
-    for(i=i_inst->size-1;i>=0;i--){
-        if(p[i]==NULL){
-            continue;
-        }
-        switch(p[i]->_typeid){
-        case NyLPC_TcMiMicIpBaseSocket_TYPEID_UDP_SOCK:
-            NyLPC_cMiMicIpUdpSocket_stopService((NyLPC_TcMiMicIpUdpSocket_t*)(p[i]));
-            break;
-        case NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_SOCK:
-            NyLPC_cMiMicIpTcpSocket_stopService((NyLPC_TcMiMicIpTcpSocket_t*)(p[i]));
-            break;
-        default:
-            continue;
-        }
-    }
-}
 
 /****************************************************
  * NyLPC_cIPv4
@@ -305,8 +90,6 @@
 {
     //IP制御パケットの為に40バイト以上のシステムTXメモリが必要。
     NyLPC_ArgAssert(NyLPC_cMiMicIpNetIf_SYS_TX_BUF_SIZE>40);
-    //内部テーブルの初期化
-    cSocketTbl_initialize(&(i_inst->_socket_tbl),(void**)(i_inst->_socket_array_buf));
     //instanceの初期化
     NyLPC_cMutex_initialize(&(i_inst->_sock_mutex));
     NyLPC_cMutex_initialize(&(i_inst->_listener_mutex));
@@ -321,7 +104,6 @@
 void NyLPC_cIPv4_finalize(
     NyLPC_TcIPv4_t* i_inst)
 {
-    cSocketTbl_finalize(&(i_inst->_socket_tbl));
     NyLPC_cMutex_finalize(&(i_inst->_sock_mutex));
     NyLPC_cMutex_finalize(&(i_inst->_listener_mutex));
     return;
@@ -338,7 +120,7 @@
     //リストの初期化、ここでするべき?しないべき?
     i_inst->_ref_config=i_ref_configlation;
     //configulationのアップデートを登録されてるソケットに通知
-    cSocketTbl_callSocketStart(&(i_inst->_socket_tbl),i_ref_configlation);
+    NyLPC_cMiMicIpNetIf_callSocketStart(i_ref_configlation);
     return;
 }
 
@@ -348,39 +130,11 @@
 void NyLPC_cIPv4_stop(
     NyLPC_TcIPv4_t* i_inst)
 {
-    cSocketTbl_callSocketStop(&(i_inst->_socket_tbl));
+    NyLPC_cMiMicIpNetIf_callSocketStop();
     i_inst->_ref_config=NULL;
     return;
 }
 
-/**
- * See header file.
- */
-NyLPC_TBool NyLPC_cIPv4_addSocket(
-    NyLPC_TcIPv4_t* i_inst,
-    NyLPC_TcMiMicIpBaseSocket_t* i_sock)
-{
-    //当面、stop中しか成功しない。
-    NyLPC_Assert(!NyLPC_cMiMicIpNetIf_isRun());
-    return NyLPC_cPtrTbl_add(&(i_inst->_socket_tbl),i_sock)>=0;
-}
-
-/**
- * See header file.
- */
-NyLPC_TBool NyLPC_cIPv4_removeSocket(
-    NyLPC_TcIPv4_t* i_inst,
-    NyLPC_TcMiMicIpBaseSocket_t* i_sock)
-{
-    NyLPC_TInt16 i;
-    NyLPC_Assert(!NyLPC_cMiMicIpNetIf_isRun());
-    i=NyLPC_cPtrTbl_getIndex(&(i_inst->_socket_tbl),i_sock);
-    if(i>=0){
-        NyLPC_cPtrTbl_remove(&(i_inst->_socket_tbl),i);
-        return NyLPC_TBool_TRUE;
-    }
-    return NyLPC_TBool_FALSE;
-}
 
 
 #define IS_START(i_inst) ((i_inst)->_ref_config!=NULL)
@@ -390,7 +144,7 @@
  */
 void NyLPC_cIPv4_periodec(NyLPC_TcIPv4_t* i_inst)
 {
-    cSocketTbl_callPeriodic(&(i_inst->_socket_tbl));
+    NyLPC_cMiMicIpNetIf_callPeriodic();
 }
 
 
@@ -440,7 +194,7 @@
     for(i=0;i<0x0fff;i--){
         i_inst->tcp_port_counter=(i_inst->tcp_port_counter+1)%0x0fff;
         n=i_inst->tcp_port_counter+49152;
-        if(cSocketTbl_isClosedTcpPort(&i_inst->_socket_tbl,n))
+        if(NyLPC_cMiMicIpNetIf_isClosedTcpPort(n))
         {
             return n;
         }
@@ -476,20 +230,15 @@
         goto DROP;
     }
     //アクティブなTCPソケットを探す。
-    sock=cSocketTbl_getMatchTcpSocket(&(i_inst->_socket_tbl),i_ipp->payload.tcp->destport,i_ipp->header->srcipaddr,i_ipp->payload.tcp->srcport);
+    sock=NyLPC_cMiMicIpNetIf_getMatchTcpSocket(i_ipp->payload.tcp->destport,i_ipp->header->srcipaddr,i_ipp->payload.tcp->srcport);
     if(sock!=NULL)
     {
         //既存の接続を処理
         return NyLPC_cMiMicIpTcpSocket_parseRx(sock,i_ipp);
     }
 
-    //未知の接続
-    if(!NyLPC_cPtrTbl_hasEmpty(&(i_inst->_socket_tbl))){
-        //ソケットテーブルが不十分。RST送信
-        return NyLPC_cMiMicIpTcpSocket_allocTcpReverseRstAck(i_ipp);
-    }
     //このポートに対応したListenerを得る。
-    listener=cSocketTbl_getListenerByPeerPort(&(i_inst->_socket_tbl),i_ipp->payload.tcp->destport);
+    listener=NyLPC_cMiMicIpNetIf_getListenerByPeerPort(i_ipp->payload.tcp->destport);
     if(listener==NULL){
         //Listen対象ではない。RST送信
         return NyLPC_cMiMicIpTcpSocket_allocTcpReverseRstAck(i_ipp);
@@ -510,15 +259,15 @@
     NyLPC_TcMiMicIpUdpSocket_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);
+        sock=NyLPC_cMiMicIpNetIf_getMatchUdpSocket(i_ipp->payload.udp->destport);
     }else{
         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);
+            sock=NyLPC_cMiMicIpNetIf_getMatchMulticastUdpSocket(&(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);
+            sock=NyLPC_cMiMicIpNetIf_getMatchUdpSocket(i_ipp->payload.udp->destport);
         }
     }
     if(sock==NULL)
@@ -538,4 +287,3 @@
 }
 
 
-
--- a/core/netif/mimicip/NyLPC_cIPv4.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cIPv4.h	Sun Mar 15 09:33:38 2015 +0000
@@ -107,10 +107,6 @@
     NyLPC_TcMutex_t _sock_mutex;
     /** リスナリソースの保護用。コールバック関数から呼び出されるソケット内部のリソース保護に使用する共通MUTEX*/
     NyLPC_TcMutex_t _listener_mutex;
-    /** NyLPC_cTcpSocketを管理するポインタリストです。*/
-    NyLPC_TcPtrTbl_t _socket_tbl;
-    /** _socket_tblが使用するメモリ領域です。*/
-    NyLPC_TcMiMicIpBaseSocket_t* _socket_array_buf[NyLPC_cIPv4_MAX_SOCKET];
     /** 0-0xfffまでを巡回するカウンタ*/
     NyLPC_TUInt16 tcp_port_counter;
 };
@@ -156,34 +152,6 @@
     NyLPC_TcIPv4_t* i_inst);
 
 /**
- * この関数は、NyLPC_TcBaseSocketオブジェクトを管理リストへ追加します。
- * @param i_inst
- * 操作するインスタンス。
- * @param i_sock
- * 追加するインスタンスのポインタ
- * @return
- * 追加が成功するとTRUEを返します。
- */
-NyLPC_TBool NyLPC_cIPv4_addSocket(
-    NyLPC_TcIPv4_t* i_inst,
-    NyLPC_TcMiMicIpBaseSocket_t* i_sock);
-
-/**
- * この関数は、NyLPC_cTcpSocketオブジェクトを管理リストから除外します。
- * NyLPC_TcBaseSocketが使います。
- * @param i_inst
- * 操作するインスタンス。
- * @param i_sock
- * 削除するインスタンスのポインタ
- * @return
- * 削除が成功するとTRUEを返します。
- */
-NyLPC_TBool NyLPC_cIPv4_removeSocket(
-    NyLPC_TcIPv4_t* i_inst,
-    NyLPC_TcMiMicIpBaseSocket_t* i_sock);
-
-
-/**
  * この関数は、RxIPパケットを処理して、管理下のインスタンスに処理を依頼します。
  * 現在の関数は、i_rxに最大64バイトの応答パケットのイメージを格納することがあります。
  * 応答パケットは、RXに対するACKパケットです。
@@ -233,4 +201,3 @@
 #endif /* __cplusplus */
 
 #endif
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpBaseSocket.c	Wed Nov 19 14:45:17 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-#include "NyLPC_cMiMicIpBaseSocket.h"
-#include "NyLPC_cMiMicIpNetIf_protected.h"
-
-
-void NyLPC_cMiMicIpBaseSocket_initialize(NyLPC_TcMiMicIpBaseSocket_t* i_inst,NyLPC_TUInt8 i_typeid)
-{
-	NyLPC_TcMiMicIpNetIf_t* srv=_NyLPC_TcMiMicIpNetIf_inst;
-    i_inst->_typeid=i_typeid;
-    i_inst->_parent_ipv4=&(srv->_tcpv4);
-}
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpBaseSocket.h	Wed Nov 19 14:45:17 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-/*********************************************************************************
- * PROJECT: MiMic
- * --------------------------------------------------------------------------------
- *
- * This file is part of MiMic
- * Copyright (C)2011 Ryo Iizuka
- *
- * MiMic is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * For further information please contact.
- *  http://nyatla.jp/
- *  <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
- *
- *********************************************************************************/
-#ifndef NYLPC_CMIMICIPBASESOCKET_H_
-#define NYLPC_CMIMICIPBASESOCKET_H_
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#include "NyLPC_stdlib.h"
-#include "NyLPC_cIPv4.h"
-#include "../NyLPC_iTcpSocket.h"
-#include "../NyLPC_iUdpSocket.h"
-#include "../NyLPC_iTcpListener.h"
-
-/**
- * Base socket class
- * cIPv4 classが管理するソケットオブジェクトのベースクラスです。
- */
-typedef struct NyLPC_TcMiMicIpBaseSocket NyLPC_TcMiMicIpBaseSocket_t;
-
-#define NyLPC_TcMiMicIpBaseSocket_TYPEID_UDP_SOCK 1
-#define NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_SOCK 2
-#define NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_LISTENER 3
-
-struct NyLPC_TcMiMicIpBaseSocket
-{
-	union{
-		struct NyLPC_TiUdpSocket udp_sock;
-		struct NyLPC_TiTcpSocket tcp_sock;
-		struct NyLPC_TiTcpListener tcp_listener;
-	}_super;
-    /**タイプID 継承クラスのinitializerで設定。 */
-    NyLPC_TUInt8 _typeid;
-    NyLPC_TUInt8 _padding8;
-    NyLPC_TUInt16 _padding16;
-    /** 所属してるIPv4コンローラ*/
-    NyLPC_TcIPv4_t* _parent_ipv4;
-};
-void NyLPC_cMiMicIpBaseSocket_initialize(NyLPC_TcMiMicIpBaseSocket_t* i_inst,NyLPC_TUInt8 i_typeid);
-#define NyLPC_cMiMicIpBaseSocket_finalize(i_inst)
-
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* NYLPC_CBASESOCKET_H_ */
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpNetIf.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpNetIf.c	Sun Mar 15 09:33:38 2015 +0000
@@ -58,9 +58,9 @@
 #include "NyLPC_stdlib.h"
 #include "../NyLPC_NetIf_ip_types.h"
 #include "NyLPC_cIPv4IComp_protected.h"
-#include "NyLPC_cMiMicIpTcpSocket.h"
-#include "NyLPC_cMiMicIpUdpSocket.h"
-#include "NyLPC_cMiMicIpTcpListener.h"
+#include "NyLPC_cMiMicIpTcpSocket_protected.h"
+#include "NyLPC_cMiMicIpUdpSocket_protected.h"
+#include "NyLPC_cMiMicIpTcpListener_protected.h"
 
 
 
@@ -117,8 +117,6 @@
 
 static NyLPC_TcThread_t th;
 
-
-
 NyLPC_TBool NyLPC_cMiMicIpNetIf_initialize(NyLPC_TcMiMicIpNetIf_t* i_inst)
 {
     //サービスは停止している事。 - Service must be uninitialized.
@@ -131,7 +129,6 @@
     i_inst->_status=0x00;
     NyLPC_cStopwatch_initialize(&(i_inst->_arp_sw));
     NyLPC_cStopwatch_initialize(&(i_inst->_periodic_sw));
-    NyLPC_cIPv4_initialize(&(i_inst->_tcpv4));
     NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_mutex)));
 
     _NyLPC_TcMiMicIpNetIf_inst=i_inst;
@@ -585,43 +582,228 @@
 
 
 //--------------------------------------------------------------------------------
-// フラグ
-static NyLPC_TUInt8 socket_flags[
-    NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX+
-    NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX+
-    NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX+
-    NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX];
+// ソケットテーブル
+//--------------------------------------------------------------------------------
+
+#define FLAGS_USED	0x00000001
 
-#define FLAGS_USED 0x01
-#define TCP_SOCK_FLSGS(i)		(socket_flags[(i)])
-#define UDP_SOCK_FLSGS(i)		(socket_flags[(i)+NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX])
-#define UDP_NB_SOCK_FLSGS(i)	(socket_flags[(i)+NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX+NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX])
-#define TCP_LISTENER_FLSGS(i)	(socket_flags[(i)+NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX+NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX+NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX])
+struct TTcpTable
+{
+	NyLPC_TUInt32 flags;
+	NyLPC_TcMiMicIpTcpSocket_t socket;
+	NyLPC_TUInt8 rxbuf[NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE];
+};
+struct TUdpTable
+{
+	NyLPC_TUInt32 flags;
+	NyLPC_TcMiMicIpUdpSocket_t socket;
+	NyLPC_TUInt8 rxbuf[NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE];
+};
+struct TUdpNBTable
+{
+	NyLPC_TUInt32 flags;
+	NyLPC_TcMiMicIpUdpSocket_t socket;
+};
+struct TTcpListenerTable
+{
+	NyLPC_TUInt32 flags;
+	NyLPC_TcMiMicIpTcpListener_t listener;
+};
+
 
 
-//--------------------------------------------------------------------------------
-// SOCKETインスタンスのメモリブロック
-static NyLPC_TUInt8 socket_memblock[
-	sizeof(NyLPC_TcMiMicIpTcpSocket_t)*NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX +
-	sizeof(NyLPC_TcMiMicIpUdpSocket_t)*NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX +
-	sizeof(NyLPC_TcMiMicIpUdpSocket_t)*NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX+
-	sizeof(NyLPC_TcMiMicIpTcpListener_t)*NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX];
+static struct TTcpTable tcp_socket_table[NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX];
+static struct TUdpTable udp_socket_table[NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX];
+static struct TUdpNBTable udp_socket_nb_table[NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX];
+static struct TTcpListenerTable tcp_listener_table[NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX];
+
+NyLPC_TcMiMicIpTcpListener_t* NyLPC_cMiMicIpNetIf_getListenerByPeerPort(NyLPC_TUInt16 i_port)
+{
+    int i;
+    //一致するポートを検索して、acceptをコールする。
+    for(i=NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX-1;i>=0;i--){
+        if((tcp_listener_table[i].flags&FLAGS_USED)==0){
+            continue;
+        }
+        if(tcp_listener_table[i].listener._port!=i_port){
+            continue;
+        }
+        return &tcp_listener_table[i].listener;
+    }
+    return NULL;
+}
+
+/**
+ * 指定番号のTCPポートが未使用かを返す。
+ * @return
+ * i_lport番のポートが未使用であればTRUE
+ */
+NyLPC_TBool NyLPC_cMiMicIpNetIf_isClosedTcpPort(NyLPC_TUInt16 i_lport)
+{
+    int i;
+    //未使用のTCPソケット?
+    for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
+        if(	((tcp_socket_table[i].flags&FLAGS_USED)!=0) &&
+			(NyLPC_cMiMicIpTcpSocket_getLocalPort(&tcp_socket_table[i].socket)==i_lport)&&
+			(!NyLPC_cMiMicIpTcpSocket_isClosed(&tcp_socket_table[i].socket))){
+        	//ポート使用中
+        	return NyLPC_TBool_FALSE;
+        }
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX-1;i>=0;i--){
+        if(	((tcp_listener_table[i].flags&FLAGS_USED)!=0) &&
+			(NyLPC_cMiMicIpTcpListener_getLocalPort(&tcp_listener_table[i].listener)==i_lport)){
+        	//ポート使用中
+        	return NyLPC_TBool_FALSE;
+        }
+    }
+    return NyLPC_TBool_TRUE;
+}
 
-#define TCP_SOCK_TBL(i)		(((NyLPC_TcMiMicIpTcpSocket_t*)socket_memblock)+i)
-#define UDP_SOCK_TBL(i)		(((NyLPC_TcMiMicIpUdpSocket_t*)(TCP_SOCK_TBL(NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX)))+i)
-#define UDP_NB_SOCK_TBL(i)	(((NyLPC_TcMiMicIpUdpSocket_t*)(UDP_SOCK_TBL(NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX)))+i)
-#define TCP_LISTENER_TBL(i)	(((NyLPC_TcMiMicIpTcpListener_t*)(UDP_NB_SOCK_TBL(NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX)))+i)
+/**
+ * 条件に一致する、アクティブなTCPソケットオブジェクトを取得します。
+ * この関数は、ローカルIPが一致していると仮定して検索をします。
+ * @param i_rip
+ * リモートIPアドレスを指定します。
+ */
+NyLPC_TcMiMicIpTcpSocket_t* NyLPC_cMiMicIpNetIf_getMatchTcpSocket(
+    NyLPC_TUInt16 i_lport,struct NyLPC_TIPv4Addr i_rip,NyLPC_TUInt16 i_rport)
+{
+    NyLPC_TcMiMicIpTcpSocket_t* tp;
+    int i;
+    //一致するポートを検索
+    for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
+    	if((tcp_socket_table[i].flags&FLAGS_USED)==0){
+    		continue;
+    	}
+		if(NyLPC_cMiMicIpTcpSocket_isClosed(&tcp_socket_table[i].socket)){
+    		continue;
+		}
+		tp=&tcp_socket_table[i].socket;
+        //パラメータの一致チェック
+        if(i_lport!=tp->uip_connr.lport || i_rport!= tp->uip_connr.rport || i_rip.v!=tp->uip_connr.ripaddr.v)
+        {
+            continue;
+        }
+        return tp;
+    }
+    return NULL;
+}
+NyLPC_TcMiMicIpUdpSocket_t* NyLPC_cMiMicIpNetIf_getMatchUdpSocket(
+    NyLPC_TUInt16 i_lport)
+{
+    int i;
+    for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_table[i].flags&FLAGS_USED)==0){
+    		continue;
+    	}
+        if(i_lport!=udp_socket_table[i].socket.uip_udp_conn.lport){
+        	continue;
+        }
+    	//unicast
+        return &udp_socket_table[i].socket;
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
+    		continue;
+    	}
+        if(i_lport!=udp_socket_nb_table[i].socket.uip_udp_conn.lport){
+    		continue;
+        }
+    	//unicast
+        return &udp_socket_nb_table[i].socket;
+    }
+    return NULL;
+}
+NyLPC_TcMiMicIpUdpSocket_t* NyLPC_cMiMicIpNetIf_getMatchMulticastUdpSocket(
+    const struct NyLPC_TIPv4Addr* i_mcast_ip,
+    NyLPC_TUInt16 i_lport)
+{
+    int i;
+    for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_table[i].flags&FLAGS_USED)==0){
+    		continue;
+    	}
+        if(i_lport!=udp_socket_table[i].socket.uip_udp_conn.lport || (!NyLPC_TIPv4Addr_isEqual(i_mcast_ip,&(udp_socket_table[i].socket.uip_udp_conn.mcastaddr))))
+        {
+            continue;
+        }
+        return &udp_socket_table[i].socket;
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
+    		continue;
+    	}
+        if(i_lport!=udp_socket_nb_table[i].socket.uip_udp_conn.lport || (!NyLPC_TIPv4Addr_isEqual(i_mcast_ip,&(udp_socket_nb_table[i].socket.uip_udp_conn.mcastaddr))))
+        {
+            continue;
+        }
+        return &udp_socket_nb_table[i].socket;
+    }
+    return NULL;
+}
 
 
-//--------------------------------------------------------------------------------
-// ソケットのメモリ
+void NyLPC_cMiMicIpNetIf_callPeriodic(void)
+{
+    int i;
+    for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpUdpSocket_periodic(&udp_socket_table[i].socket);
+    	}
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpUdpSocket_periodic(&udp_socket_nb_table[i].socket);
+    	}
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
+    	if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpTcpSocket_periodic(&tcp_socket_table[i].socket);
+    	}
+    }
+}
+void NyLPC_cMiMicIpNetIf_callSocketStart(
+	const NyLPC_TcIPv4Config_t* i_cfg)
+{
+    int i;
+    for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpUdpSocket_startService(&udp_socket_table[i].socket,i_cfg);
+    	}
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpUdpSocket_startService(&udp_socket_nb_table[i].socket,i_cfg);
+    	}
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
+    	if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpTcpSocket_startService(&tcp_socket_table[i].socket,i_cfg);
+    	}
+    }
+}
+void NyLPC_cMiMicIpNetIf_callSocketStop(void)
+{
+    int i;
+    for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpUdpSocket_stopService(&udp_socket_table[i].socket);
+    	}
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
+    	if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpUdpSocket_stopService(&udp_socket_nb_table[i].socket);
+    	}
+    }
+    for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
+    	if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
+            NyLPC_cMiMicIpTcpSocket_stopService(&tcp_socket_table[i].socket);
+    	}
+    }
+}
 
-static NyLPC_TUInt8 socket_buffer[
-    NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE*NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX+
-    NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE*NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX];
 
-#define TCP_SOCK_BUF(i) (socket_buffer+(i)*NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE)
-#define UDP_SOCK_BUF(i) (TCP_SOCK_BUF(NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX)+(i)*NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE)
 
 //--------------------------------------------------------------------------------
 // インタフェイス関数
@@ -635,13 +817,13 @@
 		//空きソケットの探索
 		for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX;i++){
 			//未使用なソケットを得る
-			if((TCP_SOCK_FLSGS(i)&FLAGS_USED)==0){
-				if(!NyLPC_cMiMicIpTcpSocket_initialize(TCP_SOCK_TBL(i),TCP_SOCK_BUF(i),NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE)){
+			if((tcp_socket_table[i].flags&FLAGS_USED)==0){
+				if(!NyLPC_cMiMicIpTcpSocket_initialize(&tcp_socket_table[i].socket,tcp_socket_table[i].rxbuf,NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE)){
 					return NULL;
 				}
 				//ソケットを使用中に
-				TCP_SOCK_FLSGS(i)|=FLAGS_USED;
-				return &(TCP_SOCK_TBL(i)->_super._super.tcp_sock);
+				tcp_socket_table[i].flags|=FLAGS_USED;
+				return &(tcp_socket_table[i].socket._super);
 			}
 		}
 		break;
@@ -659,12 +841,12 @@
 		//空きソケットの探索
 		for(i=0;i<NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX;i++){
 			//未使用なソケットを得る
-			if((UDP_SOCK_FLSGS(i)&FLAGS_USED)==0){
-				if(!NyLPC_cMiMicIpUdpSocket_initialize(UDP_SOCK_TBL(i),i_port,UDP_SOCK_BUF(i),NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE)){
+			if((udp_socket_table[i].flags&FLAGS_USED)==0){
+				if(!NyLPC_cMiMicIpUdpSocket_initialize(&udp_socket_table[i].socket,i_port,udp_socket_table[i].rxbuf,NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE)){
 					return NULL;
 				}
-				UDP_SOCK_FLSGS(i)|=FLAGS_USED;
-				return &(UDP_SOCK_TBL(i)->_super._super.udp_sock);
+				udp_socket_table[i].flags|=FLAGS_USED;
+				return &(udp_socket_table[i].socket._super);
 			}
 		}
 		break;
@@ -672,12 +854,12 @@
 		//空きソケットの探索
 		for(i=0;i<NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX;i++){
 			//未使用なソケットを得る
-			if((UDP_NB_SOCK_FLSGS(i)&FLAGS_USED)==0){
-				if(!NyLPC_cMiMicIpUdpSocket_initialize(UDP_NB_SOCK_TBL(i),i_port,NULL,0)){
+			if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
+				if(!NyLPC_cMiMicIpUdpSocket_initialize(&udp_socket_nb_table[i].socket,i_port,NULL,0)){
 					return NULL;
 				}
-				UDP_NB_SOCK_FLSGS(i)|=FLAGS_USED;
-				return &(UDP_NB_SOCK_TBL(i)->_super._super.udp_sock);
+				udp_socket_nb_table[i].flags|=FLAGS_USED;
+				return &(udp_socket_nb_table[i].socket._super);
 			}
 		}
 		break;
@@ -692,13 +874,13 @@
 	//空きソケットの探索
 	for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX;i++){
 		//未使用なソケットを得る
-		if((TCP_LISTENER_FLSGS(i)&FLAGS_USED)==0){
-			if(!NyLPC_cMiMicIpTcpListener_initialize(TCP_LISTENER_TBL(i),i_port)){
+		if((tcp_listener_table[i].flags&FLAGS_USED)==0){
+			if(!NyLPC_cMiMicIpTcpListener_initialize(&tcp_listener_table[i].listener,i_port)){
 				return NULL;
 			}
 			//ソケットを使用中に
-			TCP_LISTENER_FLSGS(i)|=FLAGS_USED;
-			return &(TCP_LISTENER_TBL(i)->_super._super.tcp_listener);
+			tcp_listener_table[i].flags|=FLAGS_USED;
+			return &(tcp_listener_table[i].listener._super);
 		}
 	}
 	return NULL;
@@ -725,8 +907,8 @@
 	NyLPC_TUInt16 i;
 	//空きソケットの探索
 	for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX;i++){
-		if((TCP_SOCK_TBL(i))==i_inst){
-			TCP_SOCK_FLSGS(i)&=~FLAGS_USED;
+		if((&tcp_socket_table[i].socket)==i_inst){
+			tcp_socket_table[i].flags&=~FLAGS_USED;
 			return;
 		}
 	}
@@ -736,14 +918,14 @@
 {
 	NyLPC_TUInt16 i;
 	for(i=0;i<NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX;i++){
-		if((UDP_SOCK_TBL(i))==i_inst){
-			UDP_SOCK_FLSGS(i)&=~FLAGS_USED;
+		if((&udp_socket_table[i].socket)==i_inst){
+			udp_socket_table[i].flags&=~FLAGS_USED;
 			return;
 		}
 	}
 	for(i=0;i<NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX;i++){
-		if((UDP_NB_SOCK_TBL(i))==i_inst){
-			UDP_NB_SOCK_FLSGS(i)&=~FLAGS_USED;
+		if((&udp_socket_nb_table[i].socket)==i_inst){
+			udp_socket_nb_table[i].flags&=~FLAGS_USED;
 			return;
 		}
 	}
@@ -754,8 +936,8 @@
 	NyLPC_TUInt16 i;
 	//空きソケットの探索
 	for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX;i++){
-		if((TCP_LISTENER_TBL(i))==i_inst){
-			TCP_LISTENER_FLSGS(i)&=~FLAGS_USED;
+		if((&tcp_listener_table[i].listener)==i_inst){
+			tcp_listener_table[i].flags&=~FLAGS_USED;
 			return;
 		}
 	}
--- a/core/netif/mimicip/NyLPC_cMiMicIpNetIf.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpNetIf.h	Sun Mar 15 09:33:38 2015 +0000
@@ -63,7 +63,7 @@
  **********************************************************************/
 
 #ifdef __cplusplus
-extern "C" {
+extern "C" {
 #endif /* __cplusplus */
 
 /**********************************************************************
@@ -83,7 +83,7 @@
  *  mbedのExportしたのをLPCXpressoでコンパイルするときは+192しないと落ちる。
  */
 #ifndef NyLPC_cMiMicIpNetIf_config_STACK_SIZE
-#	define NyLPC_cMiMicIpNetIf_config_STACK_SIZE (256+192+192)
+#	define NyLPC_cMiMicIpNetIf_config_STACK_SIZE (256+256+192)
 #endif
 
 /**
@@ -110,11 +110,6 @@
 #endif
 
 
-/**
- * @param i_mac_addr
- * システムで唯一のUIPサービスを初期化します。1度だけ実行できます。
- */
-NyLPC_TBool NyLPC_cMiMicIpNetIf_initialize(NyLPC_TcMiMicIpNetIf_t* i_inst);
 
 
 
@@ -123,7 +118,6 @@
 const struct NyLPC_TiNetInterface_Interface* NyLPC_cMiMicIpNetIf_getNetInterface(void);
 
 
-
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
--- a/core/netif/mimicip/NyLPC_cMiMicIpNetIf_protected.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpNetIf_protected.h	Sun Mar 15 09:33:38 2015 +0000
@@ -72,6 +72,12 @@
 extern NyLPC_TcMiMicIpNetIf_t* _NyLPC_TcMiMicIpNetIf_inst;
 
 /**
+ * @param i_mac_addr
+ * システムで唯一のUIPサービスを初期化します。1度だけ実行できます。
+ */
+NyLPC_TBool NyLPC_cMiMicIpNetIf_initialize(NyLPC_TcMiMicIpNetIf_t* i_inst);
+
+/**
  * サービスが初期化済みならtrueです。 - true if service was initialized.
  */
 #define NyLPC_cMiMicIpNetIf_isInitService() (_NyLPC_TcMiMicIpNetIf_inst!=NULL)
@@ -161,6 +167,19 @@
 void NyLPC_cMiMicIpNetIf_releaseUdpSocketMemory(const NyLPC_TcMiMicIpUdpSocket_t* i_inst);
 void NyLPC_cMiMicIpNetIf_releaseTcpListenerMemory(const NyLPC_TcMiMicIpTcpListener_t* i_inst);
 
+NyLPC_TcMiMicIpTcpListener_t* NyLPC_cMiMicIpNetIf_getListenerByPeerPort(NyLPC_TUInt16 i_port);
+NyLPC_TcMiMicIpUdpSocket_t* NyLPC_cMiMicIpNetIf_getMatchUdpSocket(NyLPC_TUInt16 i_lport);
+NyLPC_TBool NyLPC_cMiMicIpNetIf_isClosedTcpPort(NyLPC_TUInt16 i_lport);
+NyLPC_TcMiMicIpUdpSocket_t* NyLPC_cMiMicIpNetIf_getMatchMulticastUdpSocket(
+    const struct NyLPC_TIPv4Addr* i_mcast_ip,NyLPC_TUInt16 i_lport);
+NyLPC_TcMiMicIpTcpSocket_t* NyLPC_cMiMicIpNetIf_getMatchTcpSocket(
+    NyLPC_TUInt16 i_lport,struct NyLPC_TIPv4Addr i_rip,NyLPC_TUInt16 i_rport);
+void NyLPC_cMiMicIpNetIf_callPeriodic(void);
+void NyLPC_cMiMicIpNetIf_callSocketStart(const NyLPC_TcIPv4Config_t* i_cfg);
+void NyLPC_cMiMicIpNetIf_callSocketStop(void);
+
+
+
 
 
 #ifdef __cplusplus
--- a/core/netif/mimicip/NyLPC_cMiMicIpTcpListener.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpTcpListener.c	Sun Mar 15 09:33:38 2015 +0000
@@ -101,8 +101,8 @@
 
 //#define lockResource(i_inst) NyLPC_cMutex_lock(((i_inst)->_mutex))
 //#define unlockResource(i_inst) NyLPC_cMutex_unlock(((i_inst)->_mutex))
-#define lockResource(i_inst) NyLPC_cMutex_lock(NyLPC_cIPv4_getListenerMutex(((i_inst)->_super._parent_ipv4)))
-#define unlockResource(i_inst) NyLPC_cMutex_unlock(NyLPC_cIPv4_getListenerMutex(((i_inst)->_super._parent_ipv4)))
+#define lockResource(i_inst) NyLPC_cMutex_lock(NyLPC_cIPv4_getListenerMutex(((i_inst)->_parent_ipv4)))
+#define unlockResource(i_inst) NyLPC_cMutex_unlock(NyLPC_cIPv4_getListenerMutex(((i_inst)->_parent_ipv4)))
 
 
 static NyLPC_TBool listen(NyLPC_TiTcpListener_t* i_inst,NyLPC_TiTcpSocket_t* i_sock,NyLPC_TUInt32 i_wait_msec);
@@ -120,8 +120,8 @@
 NyLPC_TBool NyLPC_cMiMicIpTcpListener_initialize(NyLPC_TcMiMicIpTcpListener_t* i_inst,NyLPC_TUInt16 i_port)
 {
     NyLPC_TcMiMicIpNetIf_t* srv=_NyLPC_TcMiMicIpNetIf_inst;
-    i_inst->_super._super.tcp_listener._interface=&interface;
-    NyLPC_cMiMicIpBaseSocket_initialize(&(i_inst->_super),NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_LISTENER);
+    i_inst->_super._interface=&interface;
+    i_inst->_parent_ipv4=&srv->_tcpv4;
     NyLPC_TTcpListenerListenQ_init(&i_inst->_listen_q);
     //uipサービスは初期化済であること。
     NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
@@ -130,21 +130,14 @@
 //  i_inst->_mutex=NyLPC_cIPv4_getListenerMutex(&srv->_tcpv4);//    NyLPC_cMutex_initialize(&(i_inst->_mutex));
     i_inst->_port=NyLPC_htons(i_port);
     //管理リストへ登録。
-    return NyLPC_cIPv4_addSocket(&(srv->_tcpv4),&(i_inst->_super));
+    return NyLPC_TBool_TRUE;
 }
 
 
 
 static void finaize(NyLPC_TiTcpListener_t* i_inst)
 {
-    NyLPC_TcMiMicIpNetIf_t* srv=_NyLPC_TcMiMicIpNetIf_inst;
     NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
-    //uipサービスは初期化済であること。
-    if(!NyLPC_cIPv4_removeSocket(&(srv->_tcpv4),&(((NyLPC_TcMiMicIpTcpListener_t*)i_inst)->_super))){
-        //削除失敗、それは死を意味する。
-        NyLPC_Abort();
-    }
-    NyLPC_cMiMicIpBaseSocket_finalize(&(((NyLPC_TcMiMicIpTcpListener_t*)i_inst)->_super));
     NyLPC_cMiMicIpNetIf_releaseTcpListenerMemory((NyLPC_TcMiMicIpTcpListener_t*)i_inst);
     return;
 }
@@ -224,4 +217,3 @@
 
 
 
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpTcpListener.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpTcpListener.h	Sun Mar 15 09:33:38 2015 +0000
@@ -29,7 +29,7 @@
 
 #include "NyLPC_stdlib.h"
 #include "NyLPC_os.h"
-#include "NyLPC_cMiMicIpBaseSocket.h"
+#include "../NyLPC_iTcpListener.h"
 #include "NyLPC_cMiMicIpTcpSocket.h"
 #ifdef __cplusplus
 extern "C" {
@@ -63,7 +63,8 @@
  */
 struct NyLPC_TcMiMicIpTcpListener
 {
-    NyLPC_TcMiMicIpBaseSocket_t _super;
+    struct NyLPC_TiTcpListener _super;
+    NyLPC_TcIPv4_t* _parent_ipv4;
     NyLPC_TUInt16 _port;                /**<ネットワークオーダーのポート番号*/
 //  /**
 //   * タスク間の調停用Mutex
@@ -95,4 +96,3 @@
 #endif /* __cplusplus */
 
 #endif /* NYLPC_CTCPLISTENER_H_ */
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpTcpListener_protected.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpTcpListener_protected.h	Sun Mar 15 09:33:38 2015 +0000
@@ -40,10 +40,10 @@
  * 常にTRUE
  */
 NyLPC_TBool NyLPC_cMiMicIpTcpListener_synPacket(NyLPC_TcMiMicIpTcpListener_t* i_inst,const NyLPC_TcIPv4Payload_t* i_payload);
+#define NyLPC_cMiMicIpTcpListener_getLocalPort(i) ((i)->_port)
 
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
 
 #endif /* NYLPC_CTCPLISTENER_PROTECTED_H_ */
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpTcpSocket.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpTcpSocket.c	Sun Mar 15 09:33:38 2015 +0000
@@ -69,8 +69,8 @@
 
 //#define lockResource(i_inst) NyLPC_cMutex_lock(&((i_inst)->_smutex))
 //#define unlockResource(i_inst) NyLPC_cMutex_unlock(&((i_inst)->_smutex))
-#define lockResource(i_inst) NyLPC_cMutex_lock(NyLPC_cIPv4_getSockMutex(((i_inst)->_super._parent_ipv4)))
-#define unlockResource(i_inst) NyLPC_cMutex_unlock(NyLPC_cIPv4_getSockMutex(((i_inst)->_super._parent_ipv4)))
+#define lockResource(i_inst) NyLPC_cMutex_lock(NyLPC_cIPv4_getSockMutex(((i_inst)->_parent_ipv4)))
+#define unlockResource(i_inst) NyLPC_cMutex_unlock(NyLPC_cIPv4_getSockMutex(((i_inst)->_parent_ipv4)))
 
 static void sendRst(NyLPC_TcMiMicIpTcpSocket_t* i_inst);
 
@@ -480,8 +480,9 @@
 {
     int i;
     NyLPC_TcMiMicIpNetIf_t* srv=_NyLPC_TcMiMicIpNetIf_inst;
-    i_inst->_super._super.tcp_sock._interface=&_interface;
-    NyLPC_cMiMicIpBaseSocket_initialize(&(i_inst->_super),NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_SOCK);
+    i_inst->_super._interface=&_interface;
+    i_inst->_parent_ipv4=&srv->_tcpv4;
+
     //uipサービスは初期化済であること。
     NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
 
@@ -494,7 +495,7 @@
         i_inst->txbuf.txq[i].packet=NULL;
     }
     //管理リストへ登録。
-    return NyLPC_cIPv4_addSocket(&(srv->_tcpv4),&(i_inst->_super));
+    return NyLPC_TBool_TRUE;
 }
 
 
@@ -718,11 +719,6 @@
     int i;
 	NyLPC_TcMiMicIpTcpSocket_t* inst=(NyLPC_TcMiMicIpTcpSocket_t*)i_inst;
     NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
-    //uipサービスは初期化済であること。
-    if(!NyLPC_cIPv4_removeSocket(&(_NyLPC_TcMiMicIpNetIf_inst->_tcpv4),&(inst->_super))){
-        //削除失敗、それは死を意味する。
-        NyLPC_Abort();
-    }
     //開放漏れの保険
     if(inst->txbuf.rp!=inst->txbuf.wp){
         lockResource(inst);
@@ -733,7 +729,6 @@
     }
     NyLPC_cFifoBuffer_finalize(&(inst->rxbuf));
 //  NyLPC_cMutex_finalize(&(i_inst->_smutex));
-    NyLPC_cMiMicIpBaseSocket_finalize(&(inst->_super));
     NyLPC_cMiMicIpNetIf_releaseTcpSocketMemory(inst);
 
     return;
@@ -753,7 +748,7 @@
         NyLPC_OnErrorGoto(Error);
     }
     //ポート番号の取得(lockResourceが他のソケットと共有なので、重複ポートの割当は起こりえない。でもちょっと注意して)
-    lport=NyLPC_htons(NyLPC_cIPv4_getNewPortNumber(inst->_super._parent_ipv4));
+    lport=NyLPC_htons(NyLPC_cIPv4_getNewPortNumber(inst->_parent_ipv4));
     if(lport==0){
         NyLPC_OnErrorGoto(Error);
     }
@@ -1545,4 +1540,3 @@
 
 
 
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpTcpSocket.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpTcpSocket.h	Sun Mar 15 09:33:38 2015 +0000
@@ -31,8 +31,8 @@
 #include "NyLPC_os.h"
 #include "../NyLPC_NetIf_ip_types.h"
 #include "NyLPC_cIPv4Payload.h"
-#include "NyLPC_cMiMicIpBaseSocket.h"
-
+#include "../NyLPC_iTcpSocket.h"
+#include "NyLPC_cIPv4.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -127,9 +127,9 @@
 
 struct NyLPC_TcMiMicIpTcpSocket
 {
-    /** Base class*/
-	NyLPC_TcMiMicIpBaseSocket_t _super;
-    //この変数は、uipタスクの実行する関数のみが変更する。
+	struct NyLPC_TiTcpSocket _super;
+	NyLPC_TcIPv4_t* _parent_ipv4;
+	//この変数は、uipタスクの実行する関数のみが変更する。
     struct uip_conn uip_connr;
     NyLPC_TcFifoBuffer_t rxbuf;
     struct{
@@ -149,4 +149,3 @@
 #endif /* __cplusplus */
 
 #endif /* NYLPC_CTCPSOCKET_H_ */
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpTcpSocket_protected.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpTcpSocket_protected.h	Sun Mar 15 09:33:38 2015 +0000
@@ -26,7 +26,6 @@
 
 #ifndef NYLPC_CMIMICIPTCPSOCKET_PROTECTED_H_
 #define NYLPC_CMIMICIPTCPSOCKET_PROTECTED_H_
-#include "NyLPC_cIPv4.h"
 #include "NyLPC_cMiMicIpTcpSocket.h"
 #include "../NyLPC_cIPv4Config.h"
 #include "NyLPC_cIPv4Payload_protected.h"
@@ -106,9 +105,13 @@
 void* NyLPC_cMiMicIpTcpSocket_allocTcpReverseRstAck(
     const NyLPC_TcIPv4Payload_t* i_src);
 
+/**
+ * ローカルポートを返します。
+ */
+#define NyLPC_cMiMicIpTcpSocket_getLocalPort(i) ((i)->uip_connr.lport)
+#define NyLPC_cMiMicIpTcpSocket_isClosed(i) ((i)->tcpstateflags==UIP_CLOSED)
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
 
 #endif /* NYLPC_CTCPSOCKET_PROTECTED_H_ */
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpUdpSocket.c	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpUdpSocket.c	Sun Mar 15 09:33:38 2015 +0000
@@ -81,10 +81,10 @@
 static NyLPC_TInt32 send(NyLPC_TiUdpSocket_t* i_inst,const struct NyLPC_TIPv4Addr* i_addr,NyLPC_TUInt16 i_port,const void* i_buf_ptr,NyLPC_TInt32 i_len,NyLPC_TUInt32 i_wait_in_msec);
 static void setOnRxHandler(NyLPC_TiUdpSocket_t* i_inst,NyLPC_TiUdpSocket_onRxHandler i_handler);
 static void setOnPeriodicHandler(NyLPC_TiUdpSocket_t* i_inst,NyLPC_TiUdpSocket_onPeriodicHandler i_handler);
-static struct NyLPC_TIPv4Addr* getSockIP(const NyLPC_TiUdpSocket_t* i_inst);
+static const struct NyLPC_TIPv4Addr* getSockIP(const NyLPC_TiUdpSocket_t* i_inst);
 static void finalize(NyLPC_TiUdpSocket_t* i_inst);
 
-const struct NyLPC_TiUdpSocket_Interface interface=
+static const struct NyLPC_TiUdpSocket_Interface interface=
 {
 	joinMulticast,
 	setBroadcast,
@@ -111,9 +111,8 @@
 NyLPC_TBool NyLPC_cMiMicIpUdpSocket_initialize(NyLPC_TcMiMicIpUdpSocket_t* i_inst,NyLPC_TUInt16 i_port,void* i_rbuf,NyLPC_TUInt16 i_rbuf_len)
 {
 	NyLPC_TcMiMicIpNetIf_t* srv=_NyLPC_TcMiMicIpNetIf_inst;
-	i_inst->_super._super.udp_sock._interface=&interface;
-	i_inst->_super._super.udp_sock._tag=NULL;
-    NyLPC_cMiMicIpBaseSocket_initialize(&(i_inst->_super),NyLPC_TcMiMicIpBaseSocket_TYPEID_UDP_SOCK);
+	i_inst->_super._interface=&interface;
+	i_inst->_super._tag=NULL;
     //uipサービスは初期化済であること。
     NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
     i_inst->_smutex=NyLPC_cIPv4_getSockMutex(&(srv->_tcpv4));
@@ -125,7 +124,7 @@
 
     NyLPC_cFifoBuffer_initialize(&(i_inst->rxbuf),i_rbuf,i_rbuf_len);
     //管理リストへ登録。
-    return NyLPC_cIPv4_addSocket(&(srv->_tcpv4),&(i_inst->_super));
+    return NyLPC_TBool_TRUE;
 }
 
 
@@ -217,15 +216,9 @@
 
 static void finalize(NyLPC_TiUdpSocket_t* i_inst)
 {
-	NyLPC_TcMiMicIpNetIf_t* srv=_NyLPC_TcMiMicIpNetIf_inst;
     NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
-    //uipサービスは初期化済であること。
-    if(!NyLPC_cIPv4_removeSocket(&(srv->_tcpv4),&(((NyLPC_TcMiMicIpUdpSocket_t*)i_inst)->_super))){
-        //削除失敗、それは死を意味する。
-        NyLPC_Abort();
-    }
+
     NyLPC_cFifoBuffer_finalize(&(i_inst->rxbuf));
-    NyLPC_cMiMicIpBaseSocket_finalize(&(((NyLPC_TcMiMicIpUdpSocket_t*)i_inst)->_super));
     NyLPC_cMiMicIpNetIf_releaseUdpSocketMemory((NyLPC_TcMiMicIpUdpSocket_t*)i_inst);
     return;
 }
@@ -265,7 +258,6 @@
         lockResource(inst);
         rlen=NyLPC_cFifoBuffer_getLength(&(inst->rxbuf));
         //MUTEX UNLOCK
-        unlockResource(inst);
         if(rlen>0){
             //受信キューにデータがあれば返す。
             b=(char*)NyLPC_cFifoBuffer_getPtr(&(inst->rxbuf));
@@ -274,8 +266,11 @@
             if(o_info!=NULL){
                 *o_info=rh;
             }
+            unlockResource(inst);
+            NyLPC_cStopwatch_finalize(&sw);
             return rh->size;
         }
+        unlockResource(inst);
         //タスクスイッチ
         NyLPC_cThread_yield();
     };
@@ -291,12 +286,13 @@
     NyLPC_TUInt16 s;
     const struct NyLPC_TIPv4RxInfo* rh;
     //シークサイズを決定
+    lockResource(inst);
     s=NyLPC_cFifoBuffer_getLength(&(inst->rxbuf));
-    if(s==0){
-        return;
+    if(s>0){
+		rh=(const struct NyLPC_TIPv4RxInfo*)NyLPC_cFifoBuffer_getPtr(&(inst->rxbuf));
+		NyLPC_cFifoBuffer_pop(&(inst->rxbuf),rh->size+sizeof(struct NyLPC_TIPv4RxInfo));
     }
-    rh=(const struct NyLPC_TIPv4RxInfo*)NyLPC_cFifoBuffer_getPtr(&(inst->rxbuf));
-    NyLPC_cFifoBuffer_pop(&(inst->rxbuf),rh->size+sizeof(struct NyLPC_TIPv4RxInfo));
+    unlockResource(inst);
 }
 
 /**
@@ -410,7 +406,7 @@
 	NyLPC_TcMiMicIpUdpSocket_t* inst=(NyLPC_TcMiMicIpUdpSocket_t*)i_inst;
 	inst->as_handler.periodic=i_handler;
 }
-static struct NyLPC_TIPv4Addr* getSockIP(const NyLPC_TiUdpSocket_t* i_inst)
+static const struct NyLPC_TIPv4Addr* getSockIP(const NyLPC_TiUdpSocket_t* i_inst)
 {
 	NyLPC_TcMiMicIpUdpSocket_t* inst=(NyLPC_TcMiMicIpUdpSocket_t*)i_inst;
 	return &inst->uip_udp_conn.lipaddr;
@@ -432,4 +428,3 @@
 }
 
 
-
--- a/core/netif/mimicip/NyLPC_cMiMicIpUdpSocket.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/core/netif/mimicip/NyLPC_cMiMicIpUdpSocket.h	Sun Mar 15 09:33:38 2015 +0000
@@ -9,7 +9,6 @@
 #define NYLPC_CMIMICIPUDPSOCKET_H_
 
 #include "NyLPC_os.h"
-#include "NyLPC_cMiMicIpBaseSocket.h"
 #include "../NyLPC_iUdpSocket.h"
 
 
@@ -25,19 +24,6 @@
 typedef struct NyLPC_TcMiMicIpUdpSocket NyLPC_TcMiMicIpUdpSocket_t;
 
 
-/**
- * 受信時に非同期にコールされるハンドラ
- * UIPサービスタスクが実行する。
- * @return
- * TRUEならパケットを受信キューへ追加する。FALSEならパケットを受信キューへ追加しない。
- */
-typedef NyLPC_TBool (*NyLPC_TcMiMicIpUdpSocket_onRxHandler)(NyLPC_TiUdpSocket_t* i_inst,const void* i_buf,const struct NyLPC_TIPv4RxInfo* i_info);
-
-/**
- * 一定周期で非同期にコールされるハンドラ。
- * UIPサービスタスクが実行する。
- */
-typedef void (*NyLPC_TcMiMicIpUdpSocket_onPeriodicHandler)(NyLPC_TiUdpSocket_t* i_inst);
 
 /**
  * Representation of a uIP UDP connection.
@@ -56,16 +42,16 @@
 
 struct NyLPC_TcMiMicIpUdpSocket
 {
-	NyLPC_TcMiMicIpBaseSocket_t _super;
+	struct NyLPC_TiUdpSocket _super;
     //この変数は、uipタスクの実行する関数のみが変更する。
     struct uip_udp_conn uip_udp_conn;
     NyLPC_TcFifoBuffer_t rxbuf;
     NyLPC_TcMutex_t* _smutex;
     struct{
         /** 受信ハンドラ。サービス実装に使用する。*/
-    	NyLPC_TcMiMicIpUdpSocket_onRxHandler rx;
+    	NyLPC_TiUdpSocket_onRxHandler rx;
         /** 定期実行ハンドラ。サービス実装に使用する。最低保障周期は1s*/
-    	NyLPC_TcMiMicIpUdpSocket_onPeriodicHandler periodic;
+    	NyLPC_TiUdpSocket_onPeriodicHandler periodic;
     }as_handler;
 };
 
@@ -90,4 +76,3 @@
 
 
 #endif /* NYLPC_CUDPSOCKET_H_ */
-
--- a/mbed/Net.cpp	Wed Nov 19 14:45:17 2014 +0000
+++ b/mbed/Net.cpp	Sun Mar 15 09:33:38 2015 +0000
@@ -10,15 +10,15 @@
 
     const char* Net::UPNP_ROOT_PATH="upnp";
 
-    Net::Net()
+    Net::Net(INetif& i_netif)
     {
-        NyLPC_cNetIf_initialize();
+        NyLPC_cNet_initialize(i_netif.getInterface());
         this->_mdns=NULL;
         this->_upnp=NULL;
     }
     Net::~Net()
     {
-        NyLPC_cNetIf_finalize();
+        NyLPC_cNet_finalize();
     }
     void Net::start(NetConfig& i_cfg)
     {
@@ -28,13 +28,13 @@
             for(;;){
                 //DHCP
                 if((base_cfg->tcp_mode & NyLPC_TcNetConfig_IPV4_FLAG_MODE_DHCP)!=0){
-                    if(NyLPC_cNetIf_requestAddrDhcp(&(base_cfg->super),3)){
+                    if(NyLPC_cNet_requestAddrDhcp(&(base_cfg->super),3)){
                         break;
                     }
                 }
                 //AUTOIP
                 if((base_cfg->tcp_mode & NyLPC_TcNetConfig_IPV4_FLAG_MODE_AUTOIP)!=0){
-                    if(NyLPC_cNetIf_requestAddrApipa(&(base_cfg->super),3)){
+                    if(NyLPC_cNet_requestAddrApipa(&(base_cfg->super),3)){
                         break;
                     }
                 }
@@ -51,14 +51,14 @@
             NyLPC_cUPnP_initialize(this->_upnp,i_cfg.getHttpPort(),UPNP_ROOT_PATH,i_cfg.refUPnPDevDesc());        
 
         }
-        NyLPC_cNetIf_start(&(base_cfg->super));
+        NyLPC_cNet_start(&(base_cfg->super));
         if(this->_upnp!=NULL){
             NyLPC_cUPnP_start(this->_upnp);
         }        
     }
     void Net::stop()
     {
-        NyLPC_cNetIf_stop();
+        NyLPC_cNet_stop();
         //stop mDNS
         if(this->_mdns!=NULL){
             NyLPC_cMDnsServer_finalize(this->_mdns);        
--- a/mbed/Net.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/mbed/Net.h	Sun Mar 15 09:33:38 2015 +0000
@@ -4,7 +4,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 #include "NyLPC_net.h"
-
+#include "netif/INetIf.h"
 
 namespace MiMic
 {
@@ -24,7 +24,7 @@
          * The constructor.
          * Must be call after the RTOS started.
          */
-        Net();
+        Net(INetif& i_netif);
         virtual ~Net();
         /**
          * This function starts networking with configulation. 
--- a/mbed/TcpSocket.cpp	Wed Nov 19 14:45:17 2014 +0000
+++ b/mbed/TcpSocket.cpp	Sun Mar 15 09:33:38 2015 +0000
@@ -11,7 +11,7 @@
     
     TcpSocket::TcpSocket()
     {
-        this->_inst=NyLPC_cNetIf_createTcpSocketEx(NyLPC_TSocketType_TCP_NORMAL);
+        this->_inst=NyLPC_cNet_createTcpSocketEx(NyLPC_TSocketType_TCP_NORMAL);
         if(this->_inst==NULL){
             mbed_die();
         }
--- a/mbed/UdpSocket.cpp	Wed Nov 19 14:45:17 2014 +0000
+++ b/mbed/UdpSocket.cpp	Sun Mar 15 09:33:38 2015 +0000
@@ -20,9 +20,9 @@
     UdpSocket::UdpSocket(unsigned short i_port,bool i_nobuffer)
     {
         if(i_nobuffer){
-            this->_inst=NyLPC_cNetIf_createUdpSocketEx(i_port,NyLPC_TSocketType_UDP_NOBUF);
+            this->_inst=NyLPC_cNet_createUdpSocketEx(i_port,NyLPC_TSocketType_UDP_NOBUF);
         }else{
-            this->_inst=NyLPC_cNetIf_createUdpSocketEx(i_port,NyLPC_TSocketType_UDP_NORMAL);
+            this->_inst=NyLPC_cNet_createUdpSocketEx(i_port,NyLPC_TSocketType_UDP_NORMAL);
         }
         if(this->_inst==NULL){
             mbed_die();
--- a/mbed/mimic.h	Wed Nov 19 14:45:17 2014 +0000
+++ b/mbed/mimic.h	Sun Mar 15 09:33:38 2015 +0000
@@ -25,4 +25,8 @@
 #include "mod/ModJsonRpc.h"
 #include "LocalFileSystem2.h"
 
+#include "netif/INetIf.h"
+#include "netif/MiMicNetIf.h"
+
+
 using namespace MiMic;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed/netif/INetIf.h	Sun Mar 15 09:33:38 2015 +0000
@@ -0,0 +1,27 @@
+/*
+ * INetIf.h
+ *
+ *  Created on: 2014/12/12
+ *      Author: nyatla
+ */
+
+#pragma once
+#ifndef INETIF_H_
+#define INETIF_H_
+
+#include "NyLPC_net.h"
+#include "NyLPC_netif.h"
+
+namespace MiMic
+{
+    class INetif
+    {
+    public:
+    	virtual const NyLPC_TiNetInterface_Interface* getInterface()=0;
+    };
+}
+
+
+
+#endif /* INETIF_H_ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed/netif/MiMicNetIf.cpp	Sun Mar 15 09:33:38 2015 +0000
@@ -0,0 +1,26 @@
+
+////////////////////////////////////////////////////////////////////////////////
+// Httpd.h
+////////////////////////////////////////////////////////////////////////////////
+
+#include "MiMicNetIf.h"
+#include "mbed.h"
+
+namespace MiMic
+{
+    MiMicNetIf::MiMicNetIf(){
+ 	}
+    MiMicNetIf::~MiMicNetIf()
+    {
+//    	NyLPC_cMiMicIpNetIf_finalize();
+    }
+    const NyLPC_TiNetInterface_Interface* MiMicNetIf::getInterface()
+	{
+       	if(this->_inst==NULL){
+       		this->_inst=NyLPC_cMiMicIpNetIf_getNetInterface();
+       	}
+		return this->_inst;
+	}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed/netif/MiMicNetIf.h	Sun Mar 15 09:33:38 2015 +0000
@@ -0,0 +1,22 @@
+#pragma once
+////////////////////////////////////////////////////////////////////////////////
+// Httpd.h
+////////////////////////////////////////////////////////////////////////////////
+#include "NyLPC_net.h"
+#include "../netif/mimicip/NyLPC_cMiMicIpNetIf.h"
+#include "INetIf.h"
+namespace MiMic
+{
+    class MiMicNetIf : public INetif
+    {
+    public:
+    	const NyLPC_TiNetInterface_Interface* _inst;
+    public:
+    	MiMicNetIf();
+        virtual ~MiMicNetIf();
+    public:
+        virtual const NyLPC_TiNetInterface_Interface* getInterface();
+
+    };
+}
+