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

Committer:
nyatla
Date:
Tue Jul 09 12:07:17 2013 +0000
Revision:
43:a182f2b5ff41
Parent:
37:fc4b4fd6a649
Child:
48:00d211aac2ec
update to r276;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 0:142ee8b12fef 1 /*********************************************************************************
nyatla 0:142ee8b12fef 2 * PROJECT: MiMic
nyatla 0:142ee8b12fef 3 * --------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 4 *
nyatla 0:142ee8b12fef 5 * This file is part of MiMic
nyatla 0:142ee8b12fef 6 * Copyright (C)2011 Ryo Iizuka
nyatla 0:142ee8b12fef 7 *
nyatla 0:142ee8b12fef 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 0:142ee8b12fef 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 0:142ee8b12fef 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 0:142ee8b12fef 11 * (at your option) any later version.
nyatla 0:142ee8b12fef 12 *
nyatla 0:142ee8b12fef 13 * This program is distributed in the hope that it will be useful,
nyatla 0:142ee8b12fef 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 0:142ee8b12fef 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 0:142ee8b12fef 16 * GNU General Public License for more details.
nyatla 0:142ee8b12fef 17 *
nyatla 0:142ee8b12fef 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 0:142ee8b12fef 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 0:142ee8b12fef 20 *
nyatla 0:142ee8b12fef 21 * For further information please contact.
nyatla 0:142ee8b12fef 22 * http://nyatla.jp/
nyatla 0:142ee8b12fef 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 0:142ee8b12fef 24 *
nyatla 0:142ee8b12fef 25 *
nyatla 0:142ee8b12fef 26 * Parts of this file were leveraged from uIP:
nyatla 0:142ee8b12fef 27 *
nyatla 0:142ee8b12fef 28 * Copyright (c) 2001-2003, Adam Dunkels.
nyatla 0:142ee8b12fef 29 * All rights reserved.
nyatla 0:142ee8b12fef 30 *
nyatla 0:142ee8b12fef 31 * Redistribution and use in source and binary forms, with or without
nyatla 0:142ee8b12fef 32 * modification, are permitted provided that the following conditions
nyatla 0:142ee8b12fef 33 * are met:
nyatla 0:142ee8b12fef 34 * 1. Redistributions of source code must retain the above copyright
nyatla 0:142ee8b12fef 35 * notice, this list of conditions and the following disclaimer.
nyatla 0:142ee8b12fef 36 * 2. Redistributions in binary form must reproduce the above copyright
nyatla 0:142ee8b12fef 37 * notice, this list of conditions and the following disclaimer in the
nyatla 0:142ee8b12fef 38 * documentation and/or other materials provided with the distribution.
nyatla 0:142ee8b12fef 39 * 3. The name of the author may not be used to endorse or promote
nyatla 0:142ee8b12fef 40 * products derived from this software without specific prior
nyatla 0:142ee8b12fef 41 * written permission.
nyatla 0:142ee8b12fef 42 *
nyatla 0:142ee8b12fef 43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
nyatla 0:142ee8b12fef 44 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
nyatla 0:142ee8b12fef 45 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
nyatla 0:142ee8b12fef 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
nyatla 0:142ee8b12fef 47 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nyatla 0:142ee8b12fef 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
nyatla 0:142ee8b12fef 49 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
nyatla 0:142ee8b12fef 50 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
nyatla 0:142ee8b12fef 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
nyatla 0:142ee8b12fef 52 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
nyatla 0:142ee8b12fef 53 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nyatla 0:142ee8b12fef 54 */
nyatla 0:142ee8b12fef 55 #include "NyLPC_stdlib.h"
nyatla 37:fc4b4fd6a649 56 #include "NyLPC_uip.h"
nyatla 0:142ee8b12fef 57 #include "NyLPC_cIPv4.h"
nyatla 0:142ee8b12fef 58 #include "NyLPC_cIPv4Payload_protected.h"
nyatla 0:142ee8b12fef 59 #include "NyLPC_cTcpSocket_protected.h"
nyatla 37:fc4b4fd6a649 60 #include "NyLPC_cUdpSocket_protected.h"
nyatla 0:142ee8b12fef 61 #include "NyLPC_cTcpListener_protected.h"
nyatla 0:142ee8b12fef 62 #include "NyLPC_cIPv4IComp_protected.h"
nyatla 0:142ee8b12fef 63 #include "NyLPC_cUipService_protected.h"
nyatla 0:142ee8b12fef 64
nyatla 0:142ee8b12fef 65
nyatla 0:142ee8b12fef 66
nyatla 0:142ee8b12fef 67 /****************************************************
nyatla 0:142ee8b12fef 68 * Socketテーブルに関する宣言
nyatla 0:142ee8b12fef 69 ***************************************************/
nyatla 0:142ee8b12fef 70
nyatla 37:fc4b4fd6a649 71 #define cSocketTbl_initialize(i_inst,buf) NyLPC_cPtrTbl_initialize(i_inst,buf,NyLPC_cIPv4_MAX_SOCKET)
nyatla 37:fc4b4fd6a649 72 #define cSocketTbl_finalize(i_inst)
nyatla 0:142ee8b12fef 73
nyatla 0:142ee8b12fef 74 /**
nyatla 37:fc4b4fd6a649 75 * 条件に一致する、アクティブなTCPソケットオブジェクトを取得します。
nyatla 0:142ee8b12fef 76 * この関数は、ローカルIPが一致していると仮定して検索をします。
nyatla 0:142ee8b12fef 77 * @param i_rip
nyatla 0:142ee8b12fef 78 * リモートIPアドレスを指定します。
nyatla 0:142ee8b12fef 79 */
nyatla 37:fc4b4fd6a649 80 static NyLPC_TcTcpSocket_t* cSocketTbl_getMatchTcpSocket(
nyatla 0:142ee8b12fef 81 NyLPC_TcPtrTbl_t* i_inst,
nyatla 0:142ee8b12fef 82 NyLPC_TUInt16 i_lport,
nyatla 0:142ee8b12fef 83 struct NyLPC_TIPv4Addr i_rip,
nyatla 0:142ee8b12fef 84 NyLPC_TUInt16 i_rport)
nyatla 0:142ee8b12fef 85 {
nyatla 37:fc4b4fd6a649 86 NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);
nyatla 37:fc4b4fd6a649 87 NyLPC_TcTcpSocket_t* tp;
nyatla 37:fc4b4fd6a649 88 int i;
nyatla 37:fc4b4fd6a649 89 //一致するポートを検索
nyatla 37:fc4b4fd6a649 90 for(i=i_inst->size-1;i>=0;i--){
nyatla 37:fc4b4fd6a649 91 if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcBaseSocket_TYPEID_TCP_SOCK){
nyatla 37:fc4b4fd6a649 92 continue;
nyatla 37:fc4b4fd6a649 93 }
nyatla 37:fc4b4fd6a649 94 tp=(NyLPC_TcTcpSocket_t*)p[i];
nyatla 37:fc4b4fd6a649 95 if(tp->tcpstateflags==UIP_CLOSED){
nyatla 37:fc4b4fd6a649 96 continue;
nyatla 37:fc4b4fd6a649 97 }
nyatla 37:fc4b4fd6a649 98 //パラメータの一致チェック
nyatla 37:fc4b4fd6a649 99 if(i_lport!=tp->uip_connr.lport || i_rport!= tp->uip_connr.rport || i_rip.v!=tp->uip_connr.ripaddr.v)
nyatla 37:fc4b4fd6a649 100 {
nyatla 37:fc4b4fd6a649 101 continue;
nyatla 37:fc4b4fd6a649 102 }
nyatla 37:fc4b4fd6a649 103 return tp;
nyatla 37:fc4b4fd6a649 104 }
nyatla 37:fc4b4fd6a649 105 return NULL;
nyatla 37:fc4b4fd6a649 106 }
nyatla 37:fc4b4fd6a649 107 static NyLPC_TcUdpSocket_t* cSocketTbl_getMatchUdpSocket(
nyatla 37:fc4b4fd6a649 108 NyLPC_TcPtrTbl_t* i_inst,
nyatla 37:fc4b4fd6a649 109 NyLPC_TUInt16 i_lport)
nyatla 37:fc4b4fd6a649 110 {
nyatla 37:fc4b4fd6a649 111 NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);
nyatla 37:fc4b4fd6a649 112 NyLPC_TcUdpSocket_t* tp;
nyatla 37:fc4b4fd6a649 113 int i;
nyatla 37:fc4b4fd6a649 114 //一致するポートを検索
nyatla 37:fc4b4fd6a649 115 for(i=i_inst->size-1;i>=0;i--){
nyatla 37:fc4b4fd6a649 116 if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcBaseSocket_TYPEID_UDP_SOCK){
nyatla 37:fc4b4fd6a649 117 continue;
nyatla 37:fc4b4fd6a649 118 }
nyatla 37:fc4b4fd6a649 119 tp=(NyLPC_TcUdpSocket_t*)p[i];
nyatla 37:fc4b4fd6a649 120 //パラメータの一致チェック
nyatla 37:fc4b4fd6a649 121 if(i_lport!=tp->uip_udp_conn.lport)
nyatla 37:fc4b4fd6a649 122 {
nyatla 37:fc4b4fd6a649 123 continue;
nyatla 37:fc4b4fd6a649 124 }
nyatla 37:fc4b4fd6a649 125 return tp;
nyatla 37:fc4b4fd6a649 126 }
nyatla 37:fc4b4fd6a649 127 return NULL;
nyatla 37:fc4b4fd6a649 128 }
nyatla 37:fc4b4fd6a649 129 static NyLPC_TcUdpSocket_t* cSocketTbl_getMatchMulticastUdpSocket(
nyatla 37:fc4b4fd6a649 130 NyLPC_TcPtrTbl_t* i_inst,
nyatla 37:fc4b4fd6a649 131 struct NyLPC_TIPv4Addr* i_mcast_ip,
nyatla 37:fc4b4fd6a649 132 NyLPC_TUInt16 i_lport)
nyatla 37:fc4b4fd6a649 133 {
nyatla 37:fc4b4fd6a649 134 NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);
nyatla 37:fc4b4fd6a649 135 NyLPC_TcUdpSocket_t* tp;
nyatla 37:fc4b4fd6a649 136 int i;
nyatla 37:fc4b4fd6a649 137 //一致するポートを検索
nyatla 37:fc4b4fd6a649 138 for(i=i_inst->size-1;i>=0;i--){
nyatla 37:fc4b4fd6a649 139 if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcBaseSocket_TYPEID_UDP_SOCK){
nyatla 37:fc4b4fd6a649 140 continue;
nyatla 37:fc4b4fd6a649 141 }
nyatla 37:fc4b4fd6a649 142 tp=(NyLPC_TcUdpSocket_t*)p[i];
nyatla 37:fc4b4fd6a649 143 //パラメータの一致チェック
nyatla 37:fc4b4fd6a649 144 if(i_lport!=tp->uip_udp_conn.lport || NyLPC_TIPv4Addr_isEqual(i_mcast_ip,&(tp->uip_udp_conn.lipaddr)))
nyatla 37:fc4b4fd6a649 145 {
nyatla 37:fc4b4fd6a649 146 continue;
nyatla 37:fc4b4fd6a649 147 }
nyatla 37:fc4b4fd6a649 148 return tp;
nyatla 37:fc4b4fd6a649 149 }
nyatla 37:fc4b4fd6a649 150 return NULL;
nyatla 37:fc4b4fd6a649 151 }
nyatla 37:fc4b4fd6a649 152
nyatla 37:fc4b4fd6a649 153 /**
nyatla 43:a182f2b5ff41 154 * i_port番号に一致するリスナを返します。
nyatla 37:fc4b4fd6a649 155 */
nyatla 43:a182f2b5ff41 156 static NyLPC_TcTcpListener_t* cSocketTbl_getListenerByPeerPort(NyLPC_TcPtrTbl_t* i_inst,NyLPC_TUInt16 i_port)
nyatla 37:fc4b4fd6a649 157 {
nyatla 37:fc4b4fd6a649 158 NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);
nyatla 37:fc4b4fd6a649 159 NyLPC_TcTcpListener_t* lp;
nyatla 0:142ee8b12fef 160 int i;
nyatla 0:142ee8b12fef 161 //一致するポートを検索して、acceptをコールする。
nyatla 0:142ee8b12fef 162 for(i=i_inst->size-1;i>=0;i--){
nyatla 37:fc4b4fd6a649 163 if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcBaseSocket_TYPEID_TCP_LISTENER){
nyatla 0:142ee8b12fef 164 continue;
nyatla 0:142ee8b12fef 165 }
nyatla 37:fc4b4fd6a649 166 lp=(NyLPC_TcTcpListener_t*)p[i];
nyatla 43:a182f2b5ff41 167 if(lp->_port!=i_port){
nyatla 0:142ee8b12fef 168 continue;
nyatla 0:142ee8b12fef 169 }
nyatla 37:fc4b4fd6a649 170 return lp;
nyatla 0:142ee8b12fef 171 }
nyatla 0:142ee8b12fef 172 return NULL;
nyatla 0:142ee8b12fef 173 }
nyatla 37:fc4b4fd6a649 174
nyatla 0:142ee8b12fef 175 /**
nyatla 0:142ee8b12fef 176 * テーブルにある有効なソケットのperiodicをすべて呼び出します。
nyatla 0:142ee8b12fef 177 */
nyatla 0:142ee8b12fef 178 static void cSocketTbl_callPeriodic(
nyatla 0:142ee8b12fef 179 NyLPC_TcPtrTbl_t* i_inst)
nyatla 0:142ee8b12fef 180 {
nyatla 37:fc4b4fd6a649 181 NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);
nyatla 37:fc4b4fd6a649 182 int i;
nyatla 37:fc4b4fd6a649 183 for(i=i_inst->size-1;i>=0;i--){
nyatla 37:fc4b4fd6a649 184 if(p[i]==NULL){
nyatla 37:fc4b4fd6a649 185 continue;
nyatla 37:fc4b4fd6a649 186 }
nyatla 37:fc4b4fd6a649 187 switch(p[i]->_typeid){
nyatla 37:fc4b4fd6a649 188 case NyLPC_TcBaseSocket_TYPEID_TCP_SOCK:
nyatla 37:fc4b4fd6a649 189 //downcast!
nyatla 37:fc4b4fd6a649 190 NyLPC_cTcpSocket_periodic((NyLPC_TcTcpSocket_t*)(p[i]));
nyatla 37:fc4b4fd6a649 191 break;
nyatla 37:fc4b4fd6a649 192 case NyLPC_TcBaseSocket_TYPEID_UDP_SOCK:
nyatla 37:fc4b4fd6a649 193 NyLPC_cUdpSocket_periodic((NyLPC_TcUdpSocket_t*)(p[i]));
nyatla 37:fc4b4fd6a649 194 break;
nyatla 37:fc4b4fd6a649 195 default:
nyatla 37:fc4b4fd6a649 196 continue;
nyatla 37:fc4b4fd6a649 197 }
nyatla 37:fc4b4fd6a649 198 }
nyatla 37:fc4b4fd6a649 199 }
nyatla 37:fc4b4fd6a649 200
nyatla 37:fc4b4fd6a649 201 /**
nyatla 37:fc4b4fd6a649 202 * テーブルにある有効なソケットのstartを全て呼び出します。
nyatla 37:fc4b4fd6a649 203 */
nyatla 37:fc4b4fd6a649 204 static void cSocketTbl_callSocketStart(
nyatla 37:fc4b4fd6a649 205 NyLPC_TcPtrTbl_t* i_inst,
nyatla 37:fc4b4fd6a649 206 const NyLPC_TcIPv4Config_t* i_cfg)
nyatla 37:fc4b4fd6a649 207 {
nyatla 37:fc4b4fd6a649 208 NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);
nyatla 0:142ee8b12fef 209 int i;
nyatla 0:142ee8b12fef 210 for(i=i_inst->size-1;i>=0;i--){
nyatla 0:142ee8b12fef 211 if(p[i]==NULL){
nyatla 0:142ee8b12fef 212 continue;
nyatla 0:142ee8b12fef 213 }
nyatla 37:fc4b4fd6a649 214 switch(p[i]->_typeid){
nyatla 37:fc4b4fd6a649 215 case NyLPC_TcBaseSocket_TYPEID_UDP_SOCK:
nyatla 37:fc4b4fd6a649 216 NyLPC_cUdpSocket_startService((NyLPC_TcUdpSocket_t*)(p[i]),i_cfg);
nyatla 37:fc4b4fd6a649 217 break;
nyatla 37:fc4b4fd6a649 218 case NyLPC_TcBaseSocket_TYPEID_TCP_SOCK:
nyatla 37:fc4b4fd6a649 219 NyLPC_cTcpSocket_startService((NyLPC_TcTcpSocket_t*)(p[i]),i_cfg);
nyatla 37:fc4b4fd6a649 220 break;
nyatla 37:fc4b4fd6a649 221 default:
nyatla 37:fc4b4fd6a649 222 continue;
nyatla 37:fc4b4fd6a649 223 }
nyatla 0:142ee8b12fef 224 }
nyatla 0:142ee8b12fef 225 }
nyatla 37:fc4b4fd6a649 226 /**
nyatla 37:fc4b4fd6a649 227 * テーブルにある有効なソケットのstartを全て呼び出します。
nyatla 37:fc4b4fd6a649 228 */
nyatla 37:fc4b4fd6a649 229 static void cSocketTbl_callSocketStop(
nyatla 37:fc4b4fd6a649 230 NyLPC_TcPtrTbl_t* i_inst)
nyatla 37:fc4b4fd6a649 231 {
nyatla 37:fc4b4fd6a649 232 NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);
nyatla 37:fc4b4fd6a649 233 int i;
nyatla 37:fc4b4fd6a649 234 for(i=i_inst->size-1;i>=0;i--){
nyatla 37:fc4b4fd6a649 235 if(p[i]==NULL){
nyatla 37:fc4b4fd6a649 236 continue;
nyatla 37:fc4b4fd6a649 237 }
nyatla 37:fc4b4fd6a649 238 switch(p[i]->_typeid){
nyatla 37:fc4b4fd6a649 239 case NyLPC_TcBaseSocket_TYPEID_UDP_SOCK:
nyatla 37:fc4b4fd6a649 240 NyLPC_cUdpSocket_stopService((NyLPC_TcUdpSocket_t*)(p[i]));
nyatla 37:fc4b4fd6a649 241 break;
nyatla 37:fc4b4fd6a649 242 case NyLPC_TcBaseSocket_TYPEID_TCP_SOCK:
nyatla 37:fc4b4fd6a649 243 NyLPC_cTcpSocket_stopService((NyLPC_TcTcpSocket_t*)(p[i]));
nyatla 37:fc4b4fd6a649 244 break;
nyatla 37:fc4b4fd6a649 245 default:
nyatla 37:fc4b4fd6a649 246 continue;
nyatla 37:fc4b4fd6a649 247 }
nyatla 37:fc4b4fd6a649 248 }
nyatla 37:fc4b4fd6a649 249 }
nyatla 37:fc4b4fd6a649 250
nyatla 37:fc4b4fd6a649 251 /****************************************************
nyatla 37:fc4b4fd6a649 252 * NyLPC_cIPv4
nyatla 37:fc4b4fd6a649 253 ***************************************************/
nyatla 0:142ee8b12fef 254
nyatla 0:142ee8b12fef 255 /**
nyatla 0:142ee8b12fef 256 * Static関数
nyatla 0:142ee8b12fef 257 */
nyatla 0:142ee8b12fef 258
nyatla 0:142ee8b12fef 259 static NyLPC_TBool tcp_rx(
nyatla 0:142ee8b12fef 260 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 261 NyLPC_TcIPv4Payload_t* i_ipp);
nyatla 37:fc4b4fd6a649 262 static NyLPC_TBool udp_rx(
nyatla 37:fc4b4fd6a649 263 NyLPC_TcIPv4_t* i_inst,
nyatla 37:fc4b4fd6a649 264 NyLPC_TcIPv4Payload_t* i_ipp);
nyatla 0:142ee8b12fef 265
nyatla 0:142ee8b12fef 266 /**
nyatla 0:142ee8b12fef 267 * See Header file.
nyatla 0:142ee8b12fef 268 */
nyatla 0:142ee8b12fef 269 void NyLPC_cIPv4_initialize(
nyatla 0:142ee8b12fef 270 NyLPC_TcIPv4_t* i_inst)
nyatla 0:142ee8b12fef 271 {
nyatla 0:142ee8b12fef 272 //内部テーブルの初期化
nyatla 0:142ee8b12fef 273 cSocketTbl_initialize(&(i_inst->_socket_tbl),(void**)(i_inst->_socket_array_buf));
nyatla 0:142ee8b12fef 274 //instanceの初期化
nyatla 37:fc4b4fd6a649 275 NyLPC_cMutex_initialize(&(i_inst->_sock_mutex));
nyatla 37:fc4b4fd6a649 276 NyLPC_cMutex_initialize(&(i_inst->_listener_mutex));
nyatla 0:142ee8b12fef 277 i_inst->_ref_config=NULL;
nyatla 0:142ee8b12fef 278 return;
nyatla 0:142ee8b12fef 279 }
nyatla 0:142ee8b12fef 280
nyatla 0:142ee8b12fef 281 /**
nyatla 0:142ee8b12fef 282 * See header file.
nyatla 0:142ee8b12fef 283 */
nyatla 0:142ee8b12fef 284 void NyLPC_cIPv4_finalize(
nyatla 0:142ee8b12fef 285 NyLPC_TcIPv4_t* i_inst)
nyatla 0:142ee8b12fef 286 {
nyatla 37:fc4b4fd6a649 287 cSocketTbl_finalize(&(i_inst->_socket_tbl));
nyatla 37:fc4b4fd6a649 288 NyLPC_cMutex_finalize(&(i_inst->_sock_mutex));
nyatla 37:fc4b4fd6a649 289 NyLPC_cMutex_finalize(&(i_inst->_listener_mutex));
nyatla 0:142ee8b12fef 290 return;
nyatla 0:142ee8b12fef 291 }
nyatla 0:142ee8b12fef 292
nyatla 0:142ee8b12fef 293 /**
nyatla 0:142ee8b12fef 294 * See header file.
nyatla 0:142ee8b12fef 295 */
nyatla 0:142ee8b12fef 296 void NyLPC_cIPv4_start(
nyatla 0:142ee8b12fef 297 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 298 const NyLPC_TcIPv4Config_t* i_ref_configlation)
nyatla 0:142ee8b12fef 299 {
nyatla 0:142ee8b12fef 300 NyLPC_ArgAssert(i_ref_configlation!=NULL);
nyatla 0:142ee8b12fef 301 //リストの初期化、ここでするべき?しないべき?
nyatla 0:142ee8b12fef 302 i_inst->_ref_config=i_ref_configlation;
nyatla 37:fc4b4fd6a649 303 //configulationのアップデートを登録されてるソケットに通知
nyatla 37:fc4b4fd6a649 304 cSocketTbl_callSocketStart(&(i_inst->_socket_tbl),i_ref_configlation);
nyatla 0:142ee8b12fef 305 return;
nyatla 0:142ee8b12fef 306 }
nyatla 0:142ee8b12fef 307
nyatla 0:142ee8b12fef 308 /**
nyatla 0:142ee8b12fef 309 * See header file.
nyatla 0:142ee8b12fef 310 */
nyatla 0:142ee8b12fef 311 void NyLPC_cIPv4_stop(
nyatla 0:142ee8b12fef 312 NyLPC_TcIPv4_t* i_inst)
nyatla 0:142ee8b12fef 313 {
nyatla 37:fc4b4fd6a649 314 cSocketTbl_callSocketStop(&(i_inst->_socket_tbl));
nyatla 0:142ee8b12fef 315 i_inst->_ref_config=NULL;
nyatla 0:142ee8b12fef 316 return;
nyatla 0:142ee8b12fef 317 }
nyatla 0:142ee8b12fef 318
nyatla 0:142ee8b12fef 319 /**
nyatla 0:142ee8b12fef 320 * See header file.
nyatla 0:142ee8b12fef 321 */
nyatla 0:142ee8b12fef 322 NyLPC_TBool NyLPC_cIPv4_addSocket(
nyatla 0:142ee8b12fef 323 NyLPC_TcIPv4_t* i_inst,
nyatla 37:fc4b4fd6a649 324 NyLPC_TcBaseSocket_t* i_sock)
nyatla 0:142ee8b12fef 325 {
nyatla 0:142ee8b12fef 326 //当面、stop中しか成功しない。
nyatla 0:142ee8b12fef 327 NyLPC_Assert(!NyLPC_cUipService_isRun());
nyatla 0:142ee8b12fef 328 return NyLPC_cPtrTbl_add(&(i_inst->_socket_tbl),i_sock)>=0;
nyatla 0:142ee8b12fef 329 }
nyatla 0:142ee8b12fef 330
nyatla 0:142ee8b12fef 331 /**
nyatla 0:142ee8b12fef 332 * See header file.
nyatla 0:142ee8b12fef 333 */
nyatla 0:142ee8b12fef 334 NyLPC_TBool NyLPC_cIPv4_removeSocket(
nyatla 0:142ee8b12fef 335 NyLPC_TcIPv4_t* i_inst,
nyatla 37:fc4b4fd6a649 336 NyLPC_TcBaseSocket_t* i_sock)
nyatla 0:142ee8b12fef 337 {
nyatla 0:142ee8b12fef 338 NyLPC_TInt16 i;
nyatla 0:142ee8b12fef 339 NyLPC_Assert(!NyLPC_cUipService_isRun());
nyatla 0:142ee8b12fef 340 i=NyLPC_cPtrTbl_getIndex(&(i_inst->_socket_tbl),i_sock);
nyatla 0:142ee8b12fef 341 if(i>=0){
nyatla 0:142ee8b12fef 342 NyLPC_cPtrTbl_remove(&(i_inst->_socket_tbl),i);
nyatla 0:142ee8b12fef 343 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 344 }
nyatla 0:142ee8b12fef 345 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 346 }
nyatla 0:142ee8b12fef 347
nyatla 0:142ee8b12fef 348
nyatla 0:142ee8b12fef 349 #define IS_START(i_inst) ((i_inst)->_ref_config!=NULL)
nyatla 0:142ee8b12fef 350
nyatla 0:142ee8b12fef 351 /**
nyatla 0:142ee8b12fef 352 * 稼動時に、1s置きに呼び出す関数です。
nyatla 0:142ee8b12fef 353 */
nyatla 0:142ee8b12fef 354 void NyLPC_cIPv4_periodec(NyLPC_TcIPv4_t* i_inst)
nyatla 0:142ee8b12fef 355 {
nyatla 0:142ee8b12fef 356 cSocketTbl_callPeriodic(&(i_inst->_socket_tbl));
nyatla 0:142ee8b12fef 357 }
nyatla 0:142ee8b12fef 358
nyatla 0:142ee8b12fef 359
nyatla 0:142ee8b12fef 360 /**
nyatla 0:142ee8b12fef 361 * IPv4ペイロードを処理する関数。
nyatla 0:142ee8b12fef 362 * この関数は、パケット受信タスクから実行します。
nyatla 0:142ee8b12fef 363 * @param i_rx
nyatla 0:142ee8b12fef 364 * 先頭ポインタ。
nyatla 0:142ee8b12fef 365 * @return
nyatla 0:142ee8b12fef 366 * TRUEなら、i_rxに応答パケットをセットして返します。
nyatla 0:142ee8b12fef 367 */
nyatla 0:142ee8b12fef 368 NyLPC_TBool NyLPC_cIPv4_rx(NyLPC_TcIPv4_t* i_inst,void* i_rx,NyLPC_TUInt16 i_rx_size)
nyatla 0:142ee8b12fef 369 {
nyatla 0:142ee8b12fef 370 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 371 NyLPC_TcIPv4Payload_t ipv4;
nyatla 0:142ee8b12fef 372 //NOT開始状態なら受け付けないよ。
nyatla 0:142ee8b12fef 373 if(!IS_START(i_inst)){
nyatla 0:142ee8b12fef 374 NyLPC_OnErrorGoto(ERROR_DROP);
nyatla 0:142ee8b12fef 375 }
nyatla 0:142ee8b12fef 376
nyatla 0:142ee8b12fef 377 NyLPC_cIPv4Payload_initialize(&ipv4);
nyatla 0:142ee8b12fef 378 //IPフラグメントを読出し用にセットする。
nyatla 0:142ee8b12fef 379 if(!NyLPC_cIPv4Payload_setRxBuf(&ipv4,i_rx,i_rx_size))
nyatla 0:142ee8b12fef 380 {
nyatla 0:142ee8b12fef 381 NyLPC_OnErrorGoto(ERROR_DROP);
nyatla 0:142ee8b12fef 382 }
nyatla 0:142ee8b12fef 383 switch(ipv4.header->proto)
nyatla 0:142ee8b12fef 384 {
nyatla 0:142ee8b12fef 385 case UIP_PROTO_TCP:
nyatla 0:142ee8b12fef 386 //TCP受信処理
nyatla 0:142ee8b12fef 387 return tcp_rx(i_inst,&ipv4);
nyatla 0:142ee8b12fef 388 case UIP_PROTO_UDP:
nyatla 37:fc4b4fd6a649 389 //UDP処理
nyatla 37:fc4b4fd6a649 390 udp_rx(i_inst,&ipv4);//r
nyatla 37:fc4b4fd6a649 391 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 392 case UIP_PROTO_ICMP:
nyatla 0:142ee8b12fef 393 if(!NyLPC_cIPv4IComp_rx(&(inst->_icomp),&ipv4)){
nyatla 0:142ee8b12fef 394 NyLPC_OnErrorGoto(ERROR_DROP);
nyatla 0:142ee8b12fef 395 }
nyatla 0:142ee8b12fef 396 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 397 }
nyatla 0:142ee8b12fef 398 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 399 ERROR_DROP:
nyatla 0:142ee8b12fef 400 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 401 }
nyatla 0:142ee8b12fef 402
nyatla 0:142ee8b12fef 403
nyatla 0:142ee8b12fef 404 /**********************************************************************
nyatla 0:142ee8b12fef 405 *
nyatla 0:142ee8b12fef 406 * public function
nyatla 0:142ee8b12fef 407 *
nyatla 0:142ee8b12fef 408 **********************************************************************/
nyatla 0:142ee8b12fef 409
nyatla 0:142ee8b12fef 410
nyatla 0:142ee8b12fef 411 static NyLPC_TBool tcp_rx(
nyatla 0:142ee8b12fef 412 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 413 NyLPC_TcIPv4Payload_t* i_ipp)
nyatla 0:142ee8b12fef 414 {
nyatla 0:142ee8b12fef 415 NyLPC_TcTcpSocket_t* sock;
nyatla 0:142ee8b12fef 416 NyLPC_TcTcpListener_t* listener;
nyatla 0:142ee8b12fef 417
nyatla 0:142ee8b12fef 418 //自分自身のIPに対する呼び出し?
nyatla 0:142ee8b12fef 419 if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&(i_inst->_ref_config->ip_addr)))
nyatla 0:142ee8b12fef 420 {
nyatla 0:142ee8b12fef 421 //自分以外のパケットはドロップ
nyatla 0:142ee8b12fef 422 goto DROP;
nyatla 0:142ee8b12fef 423 }
nyatla 0:142ee8b12fef 424 //チェックサムの計算
nyatla 0:142ee8b12fef 425 if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff))
nyatla 0:142ee8b12fef 426 {
nyatla 0:142ee8b12fef 427 //受信エラーのあるパケットはドロップ
nyatla 0:142ee8b12fef 428 goto DROP;
nyatla 0:142ee8b12fef 429 }
nyatla 37:fc4b4fd6a649 430 //アクティブなTCPソケットを探す。
nyatla 37:fc4b4fd6a649 431 sock=cSocketTbl_getMatchTcpSocket(&(i_inst->_socket_tbl),i_ipp->payload.tcp->destport,i_ipp->header->srcipaddr,i_ipp->payload.tcp->srcport);
nyatla 0:142ee8b12fef 432 if(sock!=NULL)
nyatla 0:142ee8b12fef 433 {
nyatla 0:142ee8b12fef 434 //既存の接続を処理
nyatla 0:142ee8b12fef 435 return NyLPC_cTcpSocket_parseRx(sock,i_ipp);
nyatla 0:142ee8b12fef 436
nyatla 0:142ee8b12fef 437 }else{
nyatla 0:142ee8b12fef 438 //未知の接続
nyatla 0:142ee8b12fef 439 if(!NyLPC_cPtrTbl_hasEmpty(&(i_inst->_socket_tbl))){
nyatla 0:142ee8b12fef 440 //ソケットテーブルが不十分。RST送信
nyatla 0:142ee8b12fef 441 NyLPC_cIPv4Payload_setTcpReverseRstAck(i_ipp);
nyatla 0:142ee8b12fef 442 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 443 }
nyatla 0:142ee8b12fef 444 //このポートに対応したListenerを得る。
nyatla 37:fc4b4fd6a649 445 listener=cSocketTbl_getListenerByPeerPort(&(i_inst->_socket_tbl),i_ipp->payload.tcp->destport);
nyatla 0:142ee8b12fef 446 if(listener==NULL){
nyatla 0:142ee8b12fef 447 //Listen対象ではない。RST送信
nyatla 0:142ee8b12fef 448 NyLPC_cIPv4Payload_setTcpReverseRstAck(i_ipp);
nyatla 0:142ee8b12fef 449 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 450 }
nyatla 0:142ee8b12fef 451 //リスナにソケットのバインドを依頼する。
nyatla 43:a182f2b5ff41 452 NyLPC_cTcpListener_synPacket(listener,i_ipp);
nyatla 0:142ee8b12fef 453 return NyLPC_TBool_FALSE;//LISTEN成功。送信データなし
nyatla 0:142ee8b12fef 454 }
nyatla 0:142ee8b12fef 455 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 456 DROP:
nyatla 0:142ee8b12fef 457 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 458 }
nyatla 0:142ee8b12fef 459
nyatla 0:142ee8b12fef 460
nyatla 0:142ee8b12fef 461
nyatla 37:fc4b4fd6a649 462 static NyLPC_TBool udp_rx(
nyatla 37:fc4b4fd6a649 463 NyLPC_TcIPv4_t* i_inst,
nyatla 37:fc4b4fd6a649 464 NyLPC_TcIPv4Payload_t* i_ipp)
nyatla 37:fc4b4fd6a649 465 {
nyatla 37:fc4b4fd6a649 466 NyLPC_TcUdpSocket_t* sock;
nyatla 37:fc4b4fd6a649 467 //Multicastか調べる
nyatla 37:fc4b4fd6a649 468 if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_ipp->header->destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
nyatla 37:fc4b4fd6a649 469 //Multicastパケット
nyatla 37:fc4b4fd6a649 470
nyatla 37:fc4b4fd6a649 471 //チェックサムの計算
nyatla 37:fc4b4fd6a649 472 if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff))
nyatla 37:fc4b4fd6a649 473 {
nyatla 37:fc4b4fd6a649 474 //受信エラーのあるパケットはドロップ
nyatla 37:fc4b4fd6a649 475 goto DROP;
nyatla 37:fc4b4fd6a649 476 }
nyatla 37:fc4b4fd6a649 477 //マルチキャストに参加している&&portの一致するソケットを検索
nyatla 37:fc4b4fd6a649 478 sock=cSocketTbl_getMatchMulticastUdpSocket(&(i_inst->_socket_tbl),&(i_ipp->header->destipaddr),i_ipp->payload.udp->destport);
nyatla 37:fc4b4fd6a649 479 if(sock==NULL)
nyatla 37:fc4b4fd6a649 480 {
nyatla 37:fc4b4fd6a649 481 goto DROP;
nyatla 37:fc4b4fd6a649 482 }
nyatla 37:fc4b4fd6a649 483 }else{
nyatla 37:fc4b4fd6a649 484 //ユニキャストパケット
nyatla 37:fc4b4fd6a649 485
nyatla 37:fc4b4fd6a649 486 //自分自身のIPに対する呼び出し?
nyatla 37:fc4b4fd6a649 487 if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&(i_inst->_ref_config->ip_addr)))
nyatla 37:fc4b4fd6a649 488 {
nyatla 37:fc4b4fd6a649 489 //自分以外のパケットはドロップ
nyatla 37:fc4b4fd6a649 490 goto DROP;
nyatla 37:fc4b4fd6a649 491 }
nyatla 37:fc4b4fd6a649 492 //チェックサムの計算
nyatla 37:fc4b4fd6a649 493 if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff))
nyatla 37:fc4b4fd6a649 494 {
nyatla 37:fc4b4fd6a649 495 //受信エラーのあるパケットはドロップ
nyatla 37:fc4b4fd6a649 496 goto DROP;
nyatla 37:fc4b4fd6a649 497 }
nyatla 37:fc4b4fd6a649 498 //ポートの一致するUDPソケットを探す。
nyatla 37:fc4b4fd6a649 499 sock=cSocketTbl_getMatchUdpSocket(&(i_inst->_socket_tbl),i_ipp->payload.udp->destport);
nyatla 37:fc4b4fd6a649 500 if(sock==NULL)
nyatla 37:fc4b4fd6a649 501 {
nyatla 37:fc4b4fd6a649 502 goto DROP;
nyatla 37:fc4b4fd6a649 503 }
nyatla 37:fc4b4fd6a649 504 }
nyatla 37:fc4b4fd6a649 505 //既存の接続を処理
nyatla 37:fc4b4fd6a649 506 return NyLPC_cUdpSocket_parseRx(sock,i_ipp);
nyatla 37:fc4b4fd6a649 507 DROP:
nyatla 37:fc4b4fd6a649 508 return NyLPC_TBool_FALSE;
nyatla 37:fc4b4fd6a649 509 }
nyatla 0:142ee8b12fef 510
nyatla 0:142ee8b12fef 511