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

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

libMiMic(MiMic library for mbed)は、WebService機能を提供するSDKです。 mbedでWebAPIに対応したネットワークデバイスを簡単に作ることが出来ます。

libMiMicはMiMic projectで開発しています。MiMic projectについてはこちらをご覧ください。 http://nyatla.jp/mimic/wp/

構成

libMiMicはmbedRTOS上で動作し、ユーザアプリケーションにAPIを提供します。コアAPIはC言語で記述されていますが、使用頻度の高いものについてはmbed向けのC++APIが準備されています。

/media/uploads/nyatla/libmimic-sdk.png

※libMiMicはmbedの標準イーサネットドライバをしようしていません。

標準イーサネットドライバと同時に使用することはできません。

  • MiMicIP - IPv4スタックです。レテンシとメモリ消費量を抑えたuipベースのライブラリです。
  • ARP/ICMP/UDP/TCP - 基礎的なソケットAPIを提供します。APIは独自です。
  • HTTP/1.1 Server - HTTP/1.1に対応したサーバです。マルチセッション・Chunked・持続性接続に対応しています。
  • HTTP Modules - HTTP/1.1の機能モジュールです。以下のモジュールがあります。
    • ROM file provider - ROMに格納したファイルイメージを公開します。
    • File system provider - mbedファイルシステムを公開します。
    • Onchip configuration - プログラムフラッシュを利用して設定を保存します。
    • MiMicVM processor - RPCリクエスト(MiMicVM)を処理します。
    • FileUpload - ファイルアップロードを受け取ります。
    • URL decoder - HTTPリクエストを解析します。
    • UPnP handler -UPnPメッセージを処理します。
    • WebSocket - Websocketサーバです。
  • mDNS - マルチキャストDNSサービスです。
  • UPnP - UPnP/1.0の機能を提供します。UPnP handlerと協調して動作します。(現在はデバイス探索(SSDP)・デスクリプション(Description)のみ実装してあります。)
  • DHCP/APIPA - ゼロコンフィギュレーション用のモジュールです。
  • HTTP/1.1 Client
  • mbed C++ class library - mbed向けのC++CPIです。C言語のものより簡単です。

対応機種

  • mbed(mbed LPC1768)
  • LPCXpresso1769

プログラム

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

サンプル

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

チュートリアル

English

libMiMic(MiMic library for mbed) is SDK which provides Webservice functions. It can be created networking device easily using mbed.

See more MiMic information, See MiMic project website. http://nyatla.jp/mimic/wp/

Structure

libMiMic run on mbed RTOS and provides networking API to user application. This library has C++ class API for the mbed, and low-level C language API.

/media/uploads/nyatla/libmimic-sdk.png

For WebService general, it can be written in a simple C + + API.

libMiMic does not have the standard Ethernet driver of mbed. It is not possible that will be used with the standard Ethernet driver.

  • MiMicIP - IPv4 protocol stack. This is based uip which is reduced memory and latency.
  • ARP / ICMP / UDP / TCP - Those are provide basic IP protocols.
  • HTTP/1.1 Server - The Http server compatible HTTP/1.1. It supports multi-session, chunked transport, persistent connection.
  • HTTP Modules - There are addon-module for HTTP server. The following modules.
    • ROM file module - Publish the file images in ROM.
    • File system module - Publish thefiles in mbed file system.
    • Onchip configuration module - To save the network settings to the program flash via REST.
    • MiMicVM module - To handle the (MiMicVM) RPC request.
    • FileUpload module - Accept a file via HTTP POST.
    • URL dedoce module - A versatility URL decoder.
    • UPnP handle module - To handle UPnP messages.
    • UPnP - This provides UPnP/1.0 device functions. It works together with UPnP handler.
    • Websocket - websocket (version13) server
  • mDNS Service - DNS-SD protocol server.
  • UPnP - This provides UPnP/1.0 device functions which works with UPnP handler. (You have been implemented (SSDP) ? description only (Description) device search now.) It is a module zero configuration for - DHCP / APIPA. mbed C + + class library - C of mbed for + + is the CPI. It is simple than that of the C language.
  • DHCP/APIPA - It support zero-cpnfigulation.
  • mbed C++ class library. Almost APIs for Web applications are available.
  • HTTP/1.1 Client

Supported target

  • mbed(mbed LPC1768)
  • LPCXpresso1769

Application

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

Sample

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

Tutorial

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();
+
+    };
+}
+