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:
Sun Mar 15 09:33:38 2015 +0000
Revision:
110:257739f9b31e
Parent:
109:18f12ac01097
Child:
113:e40058804062
51d1c88c8a56d6295311cfd20aa197a9cd650b2d; ????; NetworkInterface???????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 109:18f12ac01097 1 /*********************************************************************************
nyatla 109:18f12ac01097 2 * PROJECT: MiMic
nyatla 109:18f12ac01097 3 * --------------------------------------------------------------------------------
nyatla 109:18f12ac01097 4 *
nyatla 109:18f12ac01097 5 * This file is part of MiMic
nyatla 109:18f12ac01097 6 * Copyright (C)2011 Ryo Iizuka
nyatla 109:18f12ac01097 7 *
nyatla 109:18f12ac01097 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 109:18f12ac01097 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 109:18f12ac01097 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 109:18f12ac01097 11 * (at your option) any later version.
nyatla 109:18f12ac01097 12 *
nyatla 109:18f12ac01097 13 * This program is distributed in the hope that it will be useful,
nyatla 109:18f12ac01097 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 109:18f12ac01097 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 109:18f12ac01097 16 * GNU General Public License for more details.
nyatla 109:18f12ac01097 17 *
nyatla 109:18f12ac01097 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 109:18f12ac01097 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 109:18f12ac01097 20 *
nyatla 109:18f12ac01097 21 * For further information please contact.
nyatla 109:18f12ac01097 22 * http://nyatla.jp/
nyatla 109:18f12ac01097 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 109:18f12ac01097 24 *
nyatla 109:18f12ac01097 25 *
nyatla 109:18f12ac01097 26 * Parts of this file were leveraged from uIP:
nyatla 109:18f12ac01097 27 *
nyatla 109:18f12ac01097 28 * Copyright (c) 2001-2003, Adam Dunkels.
nyatla 109:18f12ac01097 29 * All rights reserved.
nyatla 109:18f12ac01097 30 *
nyatla 109:18f12ac01097 31 * Redistribution and use in source and binary forms, with or without
nyatla 109:18f12ac01097 32 * modification, are permitted provided that the following conditions
nyatla 109:18f12ac01097 33 * are met:
nyatla 109:18f12ac01097 34 * 1. Redistributions of source code must retain the above copyright
nyatla 109:18f12ac01097 35 * notice, this list of conditions and the following disclaimer.
nyatla 109:18f12ac01097 36 * 2. Redistributions in binary form must reproduce the above copyright
nyatla 109:18f12ac01097 37 * notice, this list of conditions and the following disclaimer in the
nyatla 109:18f12ac01097 38 * documentation and/or other materials provided with the distribution.
nyatla 109:18f12ac01097 39 * 3. The name of the author may not be used to endorse or promote
nyatla 109:18f12ac01097 40 * products derived from this software without specific prior
nyatla 109:18f12ac01097 41 * written permission.
nyatla 109:18f12ac01097 42 *
nyatla 109:18f12ac01097 43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
nyatla 109:18f12ac01097 44 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
nyatla 109:18f12ac01097 45 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
nyatla 109:18f12ac01097 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
nyatla 109:18f12ac01097 47 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nyatla 109:18f12ac01097 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
nyatla 109:18f12ac01097 49 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
nyatla 109:18f12ac01097 50 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
nyatla 109:18f12ac01097 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
nyatla 109:18f12ac01097 52 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
nyatla 109:18f12ac01097 53 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nyatla 109:18f12ac01097 54 */
nyatla 109:18f12ac01097 55 //#include "NyLPC_cIPv4IComp_protected.h"
nyatla 109:18f12ac01097 56 //#include "NyLPC_cTcpListener_protected.h"
nyatla 109:18f12ac01097 57 #include "NyLPC_cMiMicIpNetIf_protected.h"
nyatla 109:18f12ac01097 58 #include "NyLPC_stdlib.h"
nyatla 109:18f12ac01097 59 #include "../NyLPC_NetIf_ip_types.h"
nyatla 109:18f12ac01097 60 #include "NyLPC_cIPv4IComp_protected.h"
nyatla 110:257739f9b31e 61 #include "NyLPC_cMiMicIpTcpSocket_protected.h"
nyatla 110:257739f9b31e 62 #include "NyLPC_cMiMicIpUdpSocket_protected.h"
nyatla 110:257739f9b31e 63 #include "NyLPC_cMiMicIpTcpListener_protected.h"
nyatla 109:18f12ac01097 64
nyatla 109:18f12ac01097 65
nyatla 109:18f12ac01097 66
nyatla 109:18f12ac01097 67
nyatla 109:18f12ac01097 68
nyatla 109:18f12ac01097 69 /****************************************************
nyatla 109:18f12ac01097 70 * UipServiceに関する宣言:その他
nyatla 109:18f12ac01097 71 ***************************************************/
nyatla 109:18f12ac01097 72 /**
nyatla 109:18f12ac01097 73 * イーサネットフレームの読み出し構造体
nyatla 109:18f12ac01097 74 */
nyatla 109:18f12ac01097 75 struct TEthPacket
nyatla 109:18f12ac01097 76 {
nyatla 109:18f12ac01097 77 struct NyLPC_TEthernetIIHeader header;
nyatla 109:18f12ac01097 78 union{
nyatla 109:18f12ac01097 79 struct NyLPC_TArpHeader arp;
nyatla 109:18f12ac01097 80 struct NyLPC_TIPv4Header ipv4;
nyatla 109:18f12ac01097 81 }data;
nyatla 109:18f12ac01097 82 }PACK_STRUCT_END;
nyatla 109:18f12ac01097 83
nyatla 109:18f12ac01097 84
nyatla 109:18f12ac01097 85
nyatla 109:18f12ac01097 86 /**
nyatla 109:18f12ac01097 87 * サービスインスタンスのポインタ。サービスが稼働中はインスタンスのポインタが有効です。
nyatla 109:18f12ac01097 88 */
nyatla 109:18f12ac01097 89 NyLPC_TcMiMicIpNetIf_t* _NyLPC_TcMiMicIpNetIf_inst=NULL;
nyatla 109:18f12ac01097 90
nyatla 109:18f12ac01097 91
nyatla 109:18f12ac01097 92
nyatla 109:18f12ac01097 93 /**
nyatla 109:18f12ac01097 94 * uipタスク
nyatla 109:18f12ac01097 95 */
nyatla 109:18f12ac01097 96 static int uipTask(void *pvParameters);
nyatla 109:18f12ac01097 97
nyatla 109:18f12ac01097 98 /** イーサネットドライバからのハンドラ*/
nyatla 109:18f12ac01097 99 static void ethernet_handler(void* i_param,NyLPC_TiEthernetDevice_EVENT i_type);
nyatla 109:18f12ac01097 100
nyatla 109:18f12ac01097 101 //--------------------------------------------------------------
nyatla 109:18f12ac01097 102
nyatla 109:18f12ac01097 103
nyatla 109:18f12ac01097 104 static NyLPC_TBool sendIPv4Tx(struct TEthPacket* i_eth_buf);
nyatla 109:18f12ac01097 105
nyatla 109:18f12ac01097 106 //static void sendArpReqest(const struct TEthPacket* i_eth_packet);
nyatla 109:18f12ac01097 107 static void sendRawEthFrameNL(void* i_buf,NyLPC_TUInt16 i_len);
nyatla 109:18f12ac01097 108 static void releaseTxBufNL(void* i_buf);
nyatla 109:18f12ac01097 109
nyatla 109:18f12ac01097 110 /**メッセージなし*/
nyatla 109:18f12ac01097 111 #define TTaskMessage_MSG_NULL 0x0000
nyatla 109:18f12ac01097 112 /**uipコアタスクに、開始要求する*/
nyatla 109:18f12ac01097 113 #define TTaskMessage_MSG_RUN 0x0001
nyatla 109:18f12ac01097 114 /**uipコアタスクに、停止要求する*/
nyatla 109:18f12ac01097 115 #define TTaskMessage_MSG_STOP 0x0002
nyatla 109:18f12ac01097 116
nyatla 109:18f12ac01097 117
nyatla 109:18f12ac01097 118 static NyLPC_TcThread_t th;
nyatla 109:18f12ac01097 119
nyatla 109:18f12ac01097 120 NyLPC_TBool NyLPC_cMiMicIpNetIf_initialize(NyLPC_TcMiMicIpNetIf_t* i_inst)
nyatla 109:18f12ac01097 121 {
nyatla 109:18f12ac01097 122 //サービスは停止している事。 - Service must be uninitialized.
nyatla 109:18f12ac01097 123 NyLPC_Assert(!NyLPC_cMiMicIpNetIf_isInitService());
nyatla 109:18f12ac01097 124 //IP処理部分の初期化
nyatla 109:18f12ac01097 125 NyLPC_cIPv4_initialize(&(i_inst->_tcpv4));
nyatla 109:18f12ac01097 126 //EMAC割込セマフォ
nyatla 109:18f12ac01097 127 NyLPC_cSemaphore_initialize(&i_inst->_emac_semapho);
nyatla 109:18f12ac01097 128
nyatla 109:18f12ac01097 129 i_inst->_status=0x00;
nyatla 109:18f12ac01097 130 NyLPC_cStopwatch_initialize(&(i_inst->_arp_sw));
nyatla 109:18f12ac01097 131 NyLPC_cStopwatch_initialize(&(i_inst->_periodic_sw));
nyatla 109:18f12ac01097 132 NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_mutex)));
nyatla 109:18f12ac01097 133
nyatla 109:18f12ac01097 134 _NyLPC_TcMiMicIpNetIf_inst=i_inst;
nyatla 109:18f12ac01097 135 //タスク起動
nyatla 109:18f12ac01097 136 NyLPC_cThread_initialize(&th,NyLPC_cMiMicIpNetIf_config_STACK_SIZE,NyLPC_TcThread_PRIORITY_SERVICE);
nyatla 109:18f12ac01097 137 NyLPC_cThread_start(&th,uipTask,NULL);
nyatla 109:18f12ac01097 138 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 139 }
nyatla 109:18f12ac01097 140
nyatla 109:18f12ac01097 141
nyatla 109:18f12ac01097 142
nyatla 109:18f12ac01097 143
nyatla 109:18f12ac01097 144
nyatla 109:18f12ac01097 145
nyatla 109:18f12ac01097 146
nyatla 109:18f12ac01097 147 /**
nyatla 109:18f12ac01097 148 * UIP処理を開始します。
nyatla 109:18f12ac01097 149 * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。
nyatla 109:18f12ac01097 150 * @param i_ref_config
nyatla 109:18f12ac01097 151 * このコンフィギュレーションは、stopを実行するまでの間、インスタンスから参照します。外部で保持してください。
nyatla 109:18f12ac01097 152 */
nyatla 109:18f12ac01097 153 void NyLPC_cMiMicIpNetIf_start(const NyLPC_TcIPv4Config_t* i_ref_config)
nyatla 109:18f12ac01097 154 {
nyatla 109:18f12ac01097 155 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 156 NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
nyatla 109:18f12ac01097 157 if(!NyLPC_cMiMicIpNetIf_isRun())
nyatla 109:18f12ac01097 158 {
nyatla 109:18f12ac01097 159 //はじめて起動するときに1度だけデバイス取得(タスクスイッチが動いてないと動かないからここで。)
nyatla 109:18f12ac01097 160 if(inst->_ethif==NULL){
nyatla 109:18f12ac01097 161 inst->_ethif=getEthernetDevicePnP();
nyatla 109:18f12ac01097 162 }
nyatla 109:18f12ac01097 163 //コンフィグレーションセット
nyatla 109:18f12ac01097 164 inst->_netinfo.current_config=i_ref_config;
nyatla 109:18f12ac01097 165 //開始要求セット
nyatla 109:18f12ac01097 166 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_START);
nyatla 109:18f12ac01097 167 //Order実行待ち
nyatla 109:18f12ac01097 168 while(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_START)){
nyatla 109:18f12ac01097 169 NyLPC_cThread_sleep(10);
nyatla 109:18f12ac01097 170 }
nyatla 109:18f12ac01097 171 //デバイス情報の追記
nyatla 109:18f12ac01097 172 inst->_netinfo.device_name=NyLPC_iEthernetDevice_getDevicName(inst->_ethif);
nyatla 109:18f12ac01097 173 }
nyatla 109:18f12ac01097 174 return;
nyatla 109:18f12ac01097 175 }
nyatla 109:18f12ac01097 176 /**
nyatla 109:18f12ac01097 177 * UIP処理を停止します。
nyatla 109:18f12ac01097 178 * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。
nyatla 109:18f12ac01097 179 * いまのところ、ストップシーケンスの実装は良くありません。
nyatla 109:18f12ac01097 180 * 再設計が必要。
nyatla 109:18f12ac01097 181 */
nyatla 109:18f12ac01097 182 void NyLPC_cMiMicIpNetIf_stop(void)
nyatla 109:18f12ac01097 183 {
nyatla 109:18f12ac01097 184 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 185 NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
nyatla 109:18f12ac01097 186 if(NyLPC_cMiMicIpNetIf_isRun())
nyatla 109:18f12ac01097 187 {
nyatla 109:18f12ac01097 188 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_STOP);
nyatla 109:18f12ac01097 189 //Order実行待ち
nyatla 109:18f12ac01097 190 while(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_STOP)){
nyatla 109:18f12ac01097 191 NyLPC_cThread_sleep(10);
nyatla 109:18f12ac01097 192 }
nyatla 109:18f12ac01097 193 }
nyatla 109:18f12ac01097 194 return;
nyatla 109:18f12ac01097 195 }
nyatla 109:18f12ac01097 196
nyatla 109:18f12ac01097 197 static const struct NyLPC_TNetInterfaceInfo* NyLPC_cMiMicIpNetIf_getInterfaceInfo(void)
nyatla 109:18f12ac01097 198 {
nyatla 109:18f12ac01097 199 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 200 return &inst->_netinfo;
nyatla 109:18f12ac01097 201 }
nyatla 109:18f12ac01097 202
nyatla 109:18f12ac01097 203 /**********************************************************************
nyatla 109:18f12ac01097 204 *
nyatla 109:18f12ac01097 205 * </HWコールバックに関わる宣言>
nyatla 109:18f12ac01097 206 *
nyatla 109:18f12ac01097 207 *********************************************************************/
nyatla 109:18f12ac01097 208
nyatla 109:18f12ac01097 209
nyatla 109:18f12ac01097 210 //PERIODIC rate
nyatla 109:18f12ac01097 211 #define PERIODIC_TIMER (1*200)
nyatla 109:18f12ac01097 212 #define ARP_TIMER (60*1000*10)
nyatla 109:18f12ac01097 213
nyatla 109:18f12ac01097 214
nyatla 109:18f12ac01097 215
nyatla 109:18f12ac01097 216 /**
nyatla 109:18f12ac01097 217 * 操作キューを確認して、タスクのステータスをアップデートします。
nyatla 109:18f12ac01097 218 * 高速化のため、Proc-Callerを使用していません。複雑なタスク操作をするときには、書き換えてください。
nyatla 109:18f12ac01097 219 * @return
nyatla 109:18f12ac01097 220 * UIPタスクの実行状態
nyatla 109:18f12ac01097 221 */
nyatla 109:18f12ac01097 222 static NyLPC_TBool updateTaskStatus()
nyatla 109:18f12ac01097 223 {
nyatla 109:18f12ac01097 224 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 225 if(NyLPC_cMiMicIpNetIf_isRun()){
nyatla 109:18f12ac01097 226 //開始状態
nyatla 109:18f12ac01097 227 if(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_STOP))
nyatla 109:18f12ac01097 228 {
nyatla 109:18f12ac01097 229 //停止操作
nyatla 109:18f12ac01097 230 NyLPC_iEthernetDevice_stop(inst->_ethif);
nyatla 109:18f12ac01097 231 NyLPC_cIPv4_stop(&(inst->_tcpv4));
nyatla 109:18f12ac01097 232 NyLPC_cIPv4IComp_finalize(&(inst->_icomp));
nyatla 109:18f12ac01097 233 NyLPC_cIPv4Arp_finalize(&(inst->_arp));
nyatla 109:18f12ac01097 234 // inst->_ref_config=NULL;
nyatla 109:18f12ac01097 235 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcMiMicIpNetIf_STATUSBIT_IS_RUNNING);
nyatla 109:18f12ac01097 236 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_STOP);
nyatla 109:18f12ac01097 237 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 238 }
nyatla 109:18f12ac01097 239 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 240 }else{
nyatla 109:18f12ac01097 241 //停止状態
nyatla 109:18f12ac01097 242 if(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_START))
nyatla 109:18f12ac01097 243 {
nyatla 109:18f12ac01097 244 //TCP,ICOMPの初期化
nyatla 109:18f12ac01097 245 NyLPC_cIPv4_start(&(inst->_tcpv4),inst->_netinfo.current_config);
nyatla 109:18f12ac01097 246 NyLPC_cIPv4IComp_initialize(&(inst->_icomp),inst->_netinfo.current_config);
nyatla 109:18f12ac01097 247 //uip_arp_init(msg->start.ref_config);
nyatla 109:18f12ac01097 248 NyLPC_cIPv4Arp_initialize(&(inst->_arp),inst->_netinfo.current_config);
nyatla 109:18f12ac01097 249 NyLPC_cStopwatch_startExpire(&(inst->_arp_sw),1);//1度ARPを起動するため。
nyatla 109:18f12ac01097 250 NyLPC_cStopwatch_startExpire(&(inst->_periodic_sw),PERIODIC_TIMER);
nyatla 109:18f12ac01097 251 //EtherNETデバイス初期化
nyatla 109:18f12ac01097 252 while(!NyLPC_iEthernetDevice_start(inst->_ethif,&(inst->_netinfo.current_config->eth_mac),ethernet_handler,inst));
nyatla 109:18f12ac01097 253 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcMiMicIpNetIf_STATUSBIT_IS_RUNNING);
nyatla 109:18f12ac01097 254 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_START);
nyatla 109:18f12ac01097 255 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 256 }
nyatla 109:18f12ac01097 257 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 258 }
nyatla 109:18f12ac01097 259 }
nyatla 109:18f12ac01097 260
nyatla 109:18f12ac01097 261 /**
nyatla 109:18f12ac01097 262 * uipタスクのメインループ
nyatla 109:18f12ac01097 263 */
nyatla 109:18f12ac01097 264 static int uipTask(void *pvParameters)
nyatla 109:18f12ac01097 265 {
nyatla 109:18f12ac01097 266 NyLPC_TUInt16 rx_len,tx_len;
nyatla 109:18f12ac01097 267 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 268 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 269 void* r;
nyatla 109:18f12ac01097 270 (void)pvParameters;
nyatla 109:18f12ac01097 271 for( ;; )
nyatla 109:18f12ac01097 272 {
nyatla 109:18f12ac01097 273 //タスク状態の更新
nyatla 109:18f12ac01097 274 if(!updateTaskStatus())
nyatla 109:18f12ac01097 275 {
nyatla 109:18f12ac01097 276 //RUNステータス以外の時は、ここで終了する。
nyatla 109:18f12ac01097 277 NyLPC_cThread_sleep(50);
nyatla 109:18f12ac01097 278 continue;
nyatla 109:18f12ac01097 279 }
nyatla 109:18f12ac01097 280 //イーサネットフレームの取得
nyatla 109:18f12ac01097 281 //Ethernet Device Lock(ARPを含む)
nyatla 109:18f12ac01097 282 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 283 ethbuf= (struct TEthPacket*)NyLPC_iEthernetDevice_getRxEthFrame(inst->_ethif,&rx_len);
nyatla 109:18f12ac01097 284 tx_len=0;
nyatla 109:18f12ac01097 285 while(ethbuf != NULL){
nyatla 109:18f12ac01097 286 if(rx_len>0)
nyatla 109:18f12ac01097 287 {
nyatla 109:18f12ac01097 288 //ペイロードサイズを計算
nyatla 109:18f12ac01097 289 rx_len-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 109:18f12ac01097 290 switch(ethbuf->header.type)
nyatla 109:18f12ac01097 291 {
nyatla 109:18f12ac01097 292 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IP):
nyatla 109:18f12ac01097 293 //ARPテーブルの更新
nyatla 109:18f12ac01097 294 //uip_arp_ipin(&(ethbuf->header),ethbuf->data.ipv4.srcipaddr);
nyatla 109:18f12ac01097 295 NyLPC_cIPv4Arp_incomingIp(&inst->_arp,&(ethbuf->header),ethbuf->data.ipv4.srcipaddr);
nyatla 109:18f12ac01097 296 //Ethernet Device UnLock(NyLPC_cIPv4_rxがallocをコールする可能性があるので一時的にロック解除)
nyatla 109:18f12ac01097 297 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 298 //IPパケットの処理
nyatla 109:18f12ac01097 299 r=NyLPC_cIPv4_rx(&(inst->_tcpv4),&(ethbuf->data.ipv4),rx_len);
nyatla 109:18f12ac01097 300 if(r!=NULL){
nyatla 109:18f12ac01097 301 //IPパケットとして送信
nyatla 109:18f12ac01097 302 NyLPC_cMiMicIpNetIf_sendIPv4Tx(r);
nyatla 109:18f12ac01097 303 }
nyatla 109:18f12ac01097 304 //ロックの復帰
nyatla 109:18f12ac01097 305 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 306 if(r!=NULL){
nyatla 109:18f12ac01097 307 releaseTxBufNL(r);
nyatla 109:18f12ac01097 308 }
nyatla 109:18f12ac01097 309 break;
nyatla 109:18f12ac01097 310 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_ARP):
nyatla 109:18f12ac01097 311 //Ethernet Device UnLock(NyLPC_cIPv4_rxがallocをコールする可能性があるので一時的にロック解除)
nyatla 109:18f12ac01097 312 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 313 r=NyLPC_cIPv4Arp_rx(&inst->_arp,&(ethbuf->data.arp),rx_len,&tx_len);
nyatla 109:18f12ac01097 314 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 315 if(r!=NULL){
nyatla 109:18f12ac01097 316 sendRawEthFrameNL(r,tx_len);
nyatla 109:18f12ac01097 317 releaseTxBufNL(r);
nyatla 109:18f12ac01097 318 }
nyatla 109:18f12ac01097 319 break;
nyatla 109:18f12ac01097 320 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IPV6):
nyatla 109:18f12ac01097 321 //uip_process_ipv6();
nyatla 109:18f12ac01097 322 break;
nyatla 109:18f12ac01097 323 default:
nyatla 109:18f12ac01097 324 break;
nyatla 109:18f12ac01097 325 }
nyatla 109:18f12ac01097 326 }
nyatla 109:18f12ac01097 327 //受信キューを進行。
nyatla 109:18f12ac01097 328 NyLPC_iEthernetDevice_nextRxEthFrame(inst->_ethif);
nyatla 109:18f12ac01097 329 //受信処理
nyatla 109:18f12ac01097 330 ethbuf= (struct TEthPacket*)NyLPC_iEthernetDevice_getRxEthFrame(inst->_ethif,&rx_len);
nyatla 109:18f12ac01097 331 }
nyatla 109:18f12ac01097 332 //データが無い。
nyatla 109:18f12ac01097 333 if(NyLPC_cStopwatch_isExpired(&(inst->_arp_sw))){
nyatla 109:18f12ac01097 334 //uip_arp_timer();
nyatla 109:18f12ac01097 335 NyLPC_cIPv4Arp_periodic(&inst->_arp);
nyatla 109:18f12ac01097 336 NyLPC_cStopwatch_startExpire(&(inst->_arp_sw),ARP_TIMER);
nyatla 109:18f12ac01097 337 }
nyatla 109:18f12ac01097 338 if(NyLPC_cStopwatch_isExpired(&(inst->_periodic_sw))){
nyatla 109:18f12ac01097 339 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 340 NyLPC_cIPv4_periodec(&(inst->_tcpv4));
nyatla 109:18f12ac01097 341 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 342 NyLPC_cStopwatch_startExpire(&(inst->_periodic_sw),PERIODIC_TIMER);
nyatla 109:18f12ac01097 343 }
nyatla 109:18f12ac01097 344 //リソースロックの解除
nyatla 109:18f12ac01097 345 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 346 //割込によるセマフォの解除か、タイムアウトで再開する。(タイムアウト値は周期関数の実行レート以下にすること。)
nyatla 109:18f12ac01097 347 NyLPC_cSemaphore_take(&(_NyLPC_TcMiMicIpNetIf_inst->_emac_semapho),PERIODIC_TIMER);
nyatla 109:18f12ac01097 348 }
nyatla 109:18f12ac01097 349 return 0;
nyatla 109:18f12ac01097 350 }
nyatla 109:18f12ac01097 351
nyatla 109:18f12ac01097 352
nyatla 109:18f12ac01097 353 /**
nyatla 109:18f12ac01097 354 * イーサネットドライバからのハンドラ
nyatla 109:18f12ac01097 355 */
nyatla 109:18f12ac01097 356 static void ethernet_handler(void* i_param,NyLPC_TiEthernetDevice_EVENT i_type)
nyatla 109:18f12ac01097 357 {
nyatla 109:18f12ac01097 358 switch(i_type){
nyatla 109:18f12ac01097 359 case NyLPC_TiEthernetDevice_EVENT_ON_RX:
nyatla 109:18f12ac01097 360 //受信系のセマフォブロックの解除
nyatla 109:18f12ac01097 361 NyLPC_cSemaphore_giveFromISR(&(((NyLPC_TcMiMicIpNetIf_t*)i_param)->_emac_semapho));
nyatla 109:18f12ac01097 362 break;
nyatla 109:18f12ac01097 363 default:
nyatla 109:18f12ac01097 364 break;
nyatla 109:18f12ac01097 365 }
nyatla 109:18f12ac01097 366 }
nyatla 109:18f12ac01097 367
nyatla 109:18f12ac01097 368 /**
nyatla 109:18f12ac01097 369 * IPv4パケットのpeerIPを問い合わせるARPパケットを送信します。
nyatla 109:18f12ac01097 370 * allocを中でコールするから要UNLOCK状態
nyatla 109:18f12ac01097 371 */
nyatla 109:18f12ac01097 372 void NyLPC_cMiMicIpNetIf_sendArpRequest(const struct NyLPC_TIPv4Addr* i_addr)
nyatla 109:18f12ac01097 373 {
nyatla 109:18f12ac01097 374 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 375 void* p;
nyatla 109:18f12ac01097 376 NyLPC_TUInt16 tx_len;
nyatla 109:18f12ac01097 377 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 378 //システムTxBufを得る
nyatla 109:18f12ac01097 379 ethbuf=(struct TEthPacket*)NyLPC_cMiMicIpNetIf_allocSysTxBuf();
nyatla 109:18f12ac01097 380 //ARPパケットを作る。
nyatla 109:18f12ac01097 381 NyLPC_TArpHeader_setArpRequest(&(ethbuf->data.arp),inst->_netinfo.current_config->ip_addr,&(inst->_netinfo.current_config->eth_mac),i_addr);
nyatla 109:18f12ac01097 382 tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_netinfo.current_config->eth_mac));
nyatla 109:18f12ac01097 383 //送信
nyatla 109:18f12ac01097 384 p=((struct NyLPC_TEthernetIIHeader*)ethbuf)-1;
nyatla 109:18f12ac01097 385
nyatla 109:18f12ac01097 386 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 387 NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,p,tx_len);
nyatla 109:18f12ac01097 388 NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,p);
nyatla 109:18f12ac01097 389 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 390 }
nyatla 109:18f12ac01097 391
nyatla 109:18f12ac01097 392
nyatla 109:18f12ac01097 393
nyatla 109:18f12ac01097 394
nyatla 109:18f12ac01097 395 /**
nyatla 109:18f12ac01097 396 * allocTxBufで取得したペイロードメモリを"IPパケットとして"送信します。
nyatla 109:18f12ac01097 397 * @param i_eth_payload
nyatla 109:18f12ac01097 398 * [NyLPC_TEthernetIIHeader][payload]メモリの、[payload]のアドレスを指定します。
nyatla 109:18f12ac01097 399 * 通常は、NyLPC_cUipService_allocTxBufの返却したメモリを指定します。
nyatla 109:18f12ac01097 400 */
nyatla 109:18f12ac01097 401
nyatla 109:18f12ac01097 402 void NyLPC_cMiMicIpNetIf_sendIPv4Tx(void* i_eth_payload)
nyatla 109:18f12ac01097 403 {
nyatla 109:18f12ac01097 404 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 405 void* p=((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1;
nyatla 109:18f12ac01097 406 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 407 //IPパケットの送信を試行
nyatla 109:18f12ac01097 408 if(sendIPv4Tx((struct TEthPacket*)p)){
nyatla 109:18f12ac01097 409 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 410 return;
nyatla 109:18f12ac01097 411 }
nyatla 109:18f12ac01097 412 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 413 //ARPリクエストを代わりに送信
nyatla 109:18f12ac01097 414 NyLPC_cMiMicIpNetIf_sendArpRequest(&((struct NyLPC_TIPv4Header*)i_eth_payload)->destipaddr);
nyatla 109:18f12ac01097 415 return;
nyatla 109:18f12ac01097 416 }
nyatla 109:18f12ac01097 417
nyatla 109:18f12ac01097 418
nyatla 109:18f12ac01097 419 /**
nyatla 109:18f12ac01097 420 * ARPテーブルに指定したIPがあるかを返します。
nyatla 109:18f12ac01097 421 */
nyatla 109:18f12ac01097 422 NyLPC_TBool NyLPC_cMiMicIpNetIf_hasArpInfo(const struct NyLPC_TIPv4Addr* i_addr)
nyatla 109:18f12ac01097 423 {
nyatla 109:18f12ac01097 424 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 425 return NyLPC_cIPv4Arp_IPv4toEthAddr(&inst->_arp,*i_addr)!=NULL;
nyatla 109:18f12ac01097 426 }
nyatla 109:18f12ac01097 427
nyatla 109:18f12ac01097 428 /**
nyatla 109:18f12ac01097 429 * システム用の送信ペイロードを返します。
nyatla 109:18f12ac01097 430 * 関数は必ず成功します。
nyatla 109:18f12ac01097 431 */
nyatla 109:18f12ac01097 432 void* NyLPC_cMiMicIpNetIf_allocSysTxBuf(void)
nyatla 109:18f12ac01097 433 {
nyatla 109:18f12ac01097 434 NyLPC_TUInt16 s;
nyatla 109:18f12ac01097 435 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 436 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 437 //排他処理をして、メモリを取得する。SYSTEMメモリはEthernetドライバの解放待ちのみなのでまとめてLOCKしておk
nyatla 109:18f12ac01097 438 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 439 for(;;){
nyatla 109:18f12ac01097 440 ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,NyLPC_TcEthernetMM_HINT_CTRL_PACKET,&s);
nyatla 109:18f12ac01097 441 if(ethbuf==NULL){
nyatla 109:18f12ac01097 442 NyLPC_cThread_yield();
nyatla 109:18f12ac01097 443 continue;
nyatla 109:18f12ac01097 444 }
nyatla 109:18f12ac01097 445 break;
nyatla 109:18f12ac01097 446 }
nyatla 109:18f12ac01097 447 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 448 //イーサネットバッファのアドレスを計算
nyatla 109:18f12ac01097 449 return &(ethbuf->data);
nyatla 109:18f12ac01097 450 }
nyatla 109:18f12ac01097 451
nyatla 109:18f12ac01097 452
nyatla 109:18f12ac01097 453
nyatla 109:18f12ac01097 454 void* NyLPC_cMiMicIpNetIf_allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size)
nyatla 109:18f12ac01097 455 {
nyatla 109:18f12ac01097 456 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 457 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 458 //排他処理をして、メモリを取得する。
nyatla 109:18f12ac01097 459 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 460 ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,i_hint+sizeof(struct NyLPC_TEthernetIIHeader),o_size);
nyatla 109:18f12ac01097 461 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 462 if(ethbuf==NULL){
nyatla 109:18f12ac01097 463 return NULL;
nyatla 109:18f12ac01097 464 }
nyatla 109:18f12ac01097 465 //イーサネットバッファのサイズを計算
nyatla 109:18f12ac01097 466 *o_size-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 109:18f12ac01097 467 //イーサネットバッファのアドレスを計算
nyatla 109:18f12ac01097 468 return &(ethbuf->data);
nyatla 109:18f12ac01097 469 }
nyatla 109:18f12ac01097 470
nyatla 109:18f12ac01097 471
nyatla 109:18f12ac01097 472 void* NyLPC_cMiMicIpNetIf_releaseTxBuf(void* i_buf)
nyatla 109:18f12ac01097 473 {
nyatla 109:18f12ac01097 474 //排他処理をして、メモリを開放する。
nyatla 109:18f12ac01097 475 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 476 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 477 //ペイロードの位置から、メモリブロックを再生。
nyatla 109:18f12ac01097 478 NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
nyatla 109:18f12ac01097 479 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 480 return NULL;
nyatla 109:18f12ac01097 481 }
nyatla 109:18f12ac01097 482
nyatla 109:18f12ac01097 483
nyatla 109:18f12ac01097 484
nyatla 109:18f12ac01097 485
nyatla 109:18f12ac01097 486
nyatla 109:18f12ac01097 487
nyatla 109:18f12ac01097 488
nyatla 109:18f12ac01097 489
nyatla 109:18f12ac01097 490
nyatla 109:18f12ac01097 491 /**
nyatla 109:18f12ac01097 492 * イーサネットフレームを送信します。
nyatla 109:18f12ac01097 493 * この関数はiptaskで実行される関数からのみ使用てください。
nyatla 109:18f12ac01097 494 * @i_buf
nyatla 109:18f12ac01097 495 * イーサネットフレームを格納したメモリです。
nyatla 109:18f12ac01097 496 * @i_len
nyatla 109:18f12ac01097 497 * イーサネットペイロードのサイズです。
nyatla 109:18f12ac01097 498 */
nyatla 109:18f12ac01097 499 static void sendRawEthFrameNL(void* i_buf,NyLPC_TUInt16 i_len)
nyatla 109:18f12ac01097 500 {
nyatla 109:18f12ac01097 501 NyLPC_iEthernetDevice_sendTxEthFrame(
nyatla 109:18f12ac01097 502 _NyLPC_TcMiMicIpNetIf_inst->_ethif,
nyatla 109:18f12ac01097 503 ((struct NyLPC_TEthernetIIHeader*)i_buf)-1,
nyatla 109:18f12ac01097 504 i_len);
nyatla 109:18f12ac01097 505 return;
nyatla 109:18f12ac01097 506 }
nyatla 109:18f12ac01097 507 /**
nyatla 109:18f12ac01097 508 * ロック状態で使用できるreleaseTxBuf。
nyatla 109:18f12ac01097 509 * この関数はiptaskで実行される関数からのみ使用してください。
nyatla 109:18f12ac01097 510 */
nyatla 109:18f12ac01097 511 static void releaseTxBufNL(void* i_buf)
nyatla 109:18f12ac01097 512 {
nyatla 109:18f12ac01097 513 //ペイロードの位置から、メモリブロックを再生。
nyatla 109:18f12ac01097 514 NyLPC_iEthernetDevice_releaseTxBuf(
nyatla 109:18f12ac01097 515 _NyLPC_TcMiMicIpNetIf_inst->_ethif,
nyatla 109:18f12ac01097 516 ((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
nyatla 109:18f12ac01097 517 return;
nyatla 109:18f12ac01097 518 }
nyatla 109:18f12ac01097 519 /**
nyatla 109:18f12ac01097 520 * マルチキャスとアドレスへ変換する。
nyatla 109:18f12ac01097 521 */
nyatla 109:18f12ac01097 522 static void ip2MulticastEmacAddr(const struct NyLPC_TIPv4Addr* i_addr,struct NyLPC_TEthAddr* o_emac)
nyatla 109:18f12ac01097 523 {
nyatla 109:18f12ac01097 524 NyLPC_TUInt32 n=NyLPC_htonl(i_addr->v);
nyatla 109:18f12ac01097 525 o_emac->addr[0]=0x01;
nyatla 109:18f12ac01097 526 o_emac->addr[1]=0x00;
nyatla 109:18f12ac01097 527 o_emac->addr[2]=0x5E;
nyatla 109:18f12ac01097 528 o_emac->addr[3]=((n>>16) & 0x7f);
nyatla 109:18f12ac01097 529 o_emac->addr[4]=((n>> 8) & 0xff);
nyatla 109:18f12ac01097 530 o_emac->addr[5]=(n & 0xff);
nyatla 109:18f12ac01097 531 return;
nyatla 109:18f12ac01097 532 };
nyatla 109:18f12ac01097 533
nyatla 109:18f12ac01097 534 /**
nyatla 109:18f12ac01097 535 * ペイロードをIPパケットとしてネットワークへ送出します。
nyatla 109:18f12ac01097 536 * コール前に、必ずロックしてから呼び出してください。
nyatla 109:18f12ac01097 537 * @param i_eth_payload
nyatla 109:18f12ac01097 538 * allocTxBufで確保したメモリを指定してください。
nyatla 109:18f12ac01097 539 * ペイロードには、TCP/IPパケットを格納します。
nyatla 109:18f12ac01097 540 */
nyatla 109:18f12ac01097 541 static NyLPC_TBool sendIPv4Tx(struct TEthPacket* i_eth_buf)
nyatla 109:18f12ac01097 542 {
nyatla 109:18f12ac01097 543 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 544 struct NyLPC_TEthAddr emac;
nyatla 109:18f12ac01097 545 NyLPC_TUInt16 tx_len;
nyatla 109:18f12ac01097 546 const struct NyLPC_TEthAddr* eth_dest;
nyatla 109:18f12ac01097 547 //ペイロードのアドレスから、イーサネットフレームバッファのアドレスを復元
nyatla 109:18f12ac01097 548
nyatla 109:18f12ac01097 549 if(NyLPC_TIPv4Addr_isEqual(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_BROADCAST)) {
nyatla 109:18f12ac01097 550 //ブロードキャストならそのまま
nyatla 109:18f12ac01097 551 eth_dest=&NyLPC_TEthAddr_BROADCAST;
nyatla 109:18f12ac01097 552 }else if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
nyatla 109:18f12ac01097 553 //マルチキャスト
nyatla 109:18f12ac01097 554 ip2MulticastEmacAddr(&(i_eth_buf->data.ipv4.destipaddr),&emac);
nyatla 109:18f12ac01097 555 eth_dest=&emac;
nyatla 109:18f12ac01097 556 }else{
nyatla 109:18f12ac01097 557 //LocalIP以外ならdefaultRootへ変換
nyatla 109:18f12ac01097 558 eth_dest=NyLPC_cIPv4Arp_IPv4toEthAddr(
nyatla 109:18f12ac01097 559 &inst->_arp,
nyatla 109:18f12ac01097 560 NyLPC_cIPv4Config_isLocalIP(inst->_netinfo.current_config, &(i_eth_buf->data.ipv4.destipaddr))?(i_eth_buf->data.ipv4.destipaddr):(inst->_netinfo.current_config->dr_addr));
nyatla 109:18f12ac01097 561 //IP->MAC変換をテスト。
nyatla 109:18f12ac01097 562 if(eth_dest==NULL){
nyatla 109:18f12ac01097 563 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 564 }
nyatla 109:18f12ac01097 565 }
nyatla 109:18f12ac01097 566 //変換可能なら、イーサネットヘッダを更新して、送信処理へ。
nyatla 109:18f12ac01097 567 tx_len=NyLPC_TEthernetIIHeader_setIPv4Tx(&(i_eth_buf->header),&(inst->_netinfo.current_config->eth_mac),eth_dest);
nyatla 109:18f12ac01097 568 NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,i_eth_buf,tx_len);
nyatla 109:18f12ac01097 569 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 570 }
nyatla 109:18f12ac01097 571
nyatla 109:18f12ac01097 572 static NyLPC_TBool isInitService(void)
nyatla 109:18f12ac01097 573 {
nyatla 109:18f12ac01097 574 return _NyLPC_TcMiMicIpNetIf_inst!=NULL;
nyatla 109:18f12ac01097 575 }
nyatla 109:18f12ac01097 576
nyatla 109:18f12ac01097 577 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 578 //
nyatla 109:18f12ac01097 579 // NetIF Interface
nyatla 109:18f12ac01097 580 //
nyatla 109:18f12ac01097 581 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 582
nyatla 109:18f12ac01097 583
nyatla 109:18f12ac01097 584 //--------------------------------------------------------------------------------
nyatla 110:257739f9b31e 585 // ソケットテーブル
nyatla 110:257739f9b31e 586 //--------------------------------------------------------------------------------
nyatla 110:257739f9b31e 587
nyatla 110:257739f9b31e 588 #define FLAGS_USED 0x00000001
nyatla 109:18f12ac01097 589
nyatla 110:257739f9b31e 590 struct TTcpTable
nyatla 110:257739f9b31e 591 {
nyatla 110:257739f9b31e 592 NyLPC_TUInt32 flags;
nyatla 110:257739f9b31e 593 NyLPC_TcMiMicIpTcpSocket_t socket;
nyatla 110:257739f9b31e 594 NyLPC_TUInt8 rxbuf[NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE];
nyatla 110:257739f9b31e 595 };
nyatla 110:257739f9b31e 596 struct TUdpTable
nyatla 110:257739f9b31e 597 {
nyatla 110:257739f9b31e 598 NyLPC_TUInt32 flags;
nyatla 110:257739f9b31e 599 NyLPC_TcMiMicIpUdpSocket_t socket;
nyatla 110:257739f9b31e 600 NyLPC_TUInt8 rxbuf[NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE];
nyatla 110:257739f9b31e 601 };
nyatla 110:257739f9b31e 602 struct TUdpNBTable
nyatla 110:257739f9b31e 603 {
nyatla 110:257739f9b31e 604 NyLPC_TUInt32 flags;
nyatla 110:257739f9b31e 605 NyLPC_TcMiMicIpUdpSocket_t socket;
nyatla 110:257739f9b31e 606 };
nyatla 110:257739f9b31e 607 struct TTcpListenerTable
nyatla 110:257739f9b31e 608 {
nyatla 110:257739f9b31e 609 NyLPC_TUInt32 flags;
nyatla 110:257739f9b31e 610 NyLPC_TcMiMicIpTcpListener_t listener;
nyatla 110:257739f9b31e 611 };
nyatla 110:257739f9b31e 612
nyatla 109:18f12ac01097 613
nyatla 109:18f12ac01097 614
nyatla 110:257739f9b31e 615 static struct TTcpTable tcp_socket_table[NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX];
nyatla 110:257739f9b31e 616 static struct TUdpTable udp_socket_table[NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX];
nyatla 110:257739f9b31e 617 static struct TUdpNBTable udp_socket_nb_table[NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX];
nyatla 110:257739f9b31e 618 static struct TTcpListenerTable tcp_listener_table[NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX];
nyatla 110:257739f9b31e 619
nyatla 110:257739f9b31e 620 NyLPC_TcMiMicIpTcpListener_t* NyLPC_cMiMicIpNetIf_getListenerByPeerPort(NyLPC_TUInt16 i_port)
nyatla 110:257739f9b31e 621 {
nyatla 110:257739f9b31e 622 int i;
nyatla 110:257739f9b31e 623 //一致するポートを検索して、acceptをコールする。
nyatla 110:257739f9b31e 624 for(i=NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 625 if((tcp_listener_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 626 continue;
nyatla 110:257739f9b31e 627 }
nyatla 110:257739f9b31e 628 if(tcp_listener_table[i].listener._port!=i_port){
nyatla 110:257739f9b31e 629 continue;
nyatla 110:257739f9b31e 630 }
nyatla 110:257739f9b31e 631 return &tcp_listener_table[i].listener;
nyatla 110:257739f9b31e 632 }
nyatla 110:257739f9b31e 633 return NULL;
nyatla 110:257739f9b31e 634 }
nyatla 110:257739f9b31e 635
nyatla 110:257739f9b31e 636 /**
nyatla 110:257739f9b31e 637 * 指定番号のTCPポートが未使用かを返す。
nyatla 110:257739f9b31e 638 * @return
nyatla 110:257739f9b31e 639 * i_lport番のポートが未使用であればTRUE
nyatla 110:257739f9b31e 640 */
nyatla 110:257739f9b31e 641 NyLPC_TBool NyLPC_cMiMicIpNetIf_isClosedTcpPort(NyLPC_TUInt16 i_lport)
nyatla 110:257739f9b31e 642 {
nyatla 110:257739f9b31e 643 int i;
nyatla 110:257739f9b31e 644 //未使用のTCPソケット?
nyatla 110:257739f9b31e 645 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 646 if( ((tcp_socket_table[i].flags&FLAGS_USED)!=0) &&
nyatla 110:257739f9b31e 647 (NyLPC_cMiMicIpTcpSocket_getLocalPort(&tcp_socket_table[i].socket)==i_lport)&&
nyatla 110:257739f9b31e 648 (!NyLPC_cMiMicIpTcpSocket_isClosed(&tcp_socket_table[i].socket))){
nyatla 110:257739f9b31e 649 //ポート使用中
nyatla 110:257739f9b31e 650 return NyLPC_TBool_FALSE;
nyatla 110:257739f9b31e 651 }
nyatla 110:257739f9b31e 652 }
nyatla 110:257739f9b31e 653 for(i=NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 654 if( ((tcp_listener_table[i].flags&FLAGS_USED)!=0) &&
nyatla 110:257739f9b31e 655 (NyLPC_cMiMicIpTcpListener_getLocalPort(&tcp_listener_table[i].listener)==i_lport)){
nyatla 110:257739f9b31e 656 //ポート使用中
nyatla 110:257739f9b31e 657 return NyLPC_TBool_FALSE;
nyatla 110:257739f9b31e 658 }
nyatla 110:257739f9b31e 659 }
nyatla 110:257739f9b31e 660 return NyLPC_TBool_TRUE;
nyatla 110:257739f9b31e 661 }
nyatla 109:18f12ac01097 662
nyatla 110:257739f9b31e 663 /**
nyatla 110:257739f9b31e 664 * 条件に一致する、アクティブなTCPソケットオブジェクトを取得します。
nyatla 110:257739f9b31e 665 * この関数は、ローカルIPが一致していると仮定して検索をします。
nyatla 110:257739f9b31e 666 * @param i_rip
nyatla 110:257739f9b31e 667 * リモートIPアドレスを指定します。
nyatla 110:257739f9b31e 668 */
nyatla 110:257739f9b31e 669 NyLPC_TcMiMicIpTcpSocket_t* NyLPC_cMiMicIpNetIf_getMatchTcpSocket(
nyatla 110:257739f9b31e 670 NyLPC_TUInt16 i_lport,struct NyLPC_TIPv4Addr i_rip,NyLPC_TUInt16 i_rport)
nyatla 110:257739f9b31e 671 {
nyatla 110:257739f9b31e 672 NyLPC_TcMiMicIpTcpSocket_t* tp;
nyatla 110:257739f9b31e 673 int i;
nyatla 110:257739f9b31e 674 //一致するポートを検索
nyatla 110:257739f9b31e 675 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 676 if((tcp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 677 continue;
nyatla 110:257739f9b31e 678 }
nyatla 110:257739f9b31e 679 if(NyLPC_cMiMicIpTcpSocket_isClosed(&tcp_socket_table[i].socket)){
nyatla 110:257739f9b31e 680 continue;
nyatla 110:257739f9b31e 681 }
nyatla 110:257739f9b31e 682 tp=&tcp_socket_table[i].socket;
nyatla 110:257739f9b31e 683 //パラメータの一致チェック
nyatla 110:257739f9b31e 684 if(i_lport!=tp->uip_connr.lport || i_rport!= tp->uip_connr.rport || i_rip.v!=tp->uip_connr.ripaddr.v)
nyatla 110:257739f9b31e 685 {
nyatla 110:257739f9b31e 686 continue;
nyatla 110:257739f9b31e 687 }
nyatla 110:257739f9b31e 688 return tp;
nyatla 110:257739f9b31e 689 }
nyatla 110:257739f9b31e 690 return NULL;
nyatla 110:257739f9b31e 691 }
nyatla 110:257739f9b31e 692 NyLPC_TcMiMicIpUdpSocket_t* NyLPC_cMiMicIpNetIf_getMatchUdpSocket(
nyatla 110:257739f9b31e 693 NyLPC_TUInt16 i_lport)
nyatla 110:257739f9b31e 694 {
nyatla 110:257739f9b31e 695 int i;
nyatla 110:257739f9b31e 696 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 697 if((udp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 698 continue;
nyatla 110:257739f9b31e 699 }
nyatla 110:257739f9b31e 700 if(i_lport!=udp_socket_table[i].socket.uip_udp_conn.lport){
nyatla 110:257739f9b31e 701 continue;
nyatla 110:257739f9b31e 702 }
nyatla 110:257739f9b31e 703 //unicast
nyatla 110:257739f9b31e 704 return &udp_socket_table[i].socket;
nyatla 110:257739f9b31e 705 }
nyatla 110:257739f9b31e 706 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 707 if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 708 continue;
nyatla 110:257739f9b31e 709 }
nyatla 110:257739f9b31e 710 if(i_lport!=udp_socket_nb_table[i].socket.uip_udp_conn.lport){
nyatla 110:257739f9b31e 711 continue;
nyatla 110:257739f9b31e 712 }
nyatla 110:257739f9b31e 713 //unicast
nyatla 110:257739f9b31e 714 return &udp_socket_nb_table[i].socket;
nyatla 110:257739f9b31e 715 }
nyatla 110:257739f9b31e 716 return NULL;
nyatla 110:257739f9b31e 717 }
nyatla 110:257739f9b31e 718 NyLPC_TcMiMicIpUdpSocket_t* NyLPC_cMiMicIpNetIf_getMatchMulticastUdpSocket(
nyatla 110:257739f9b31e 719 const struct NyLPC_TIPv4Addr* i_mcast_ip,
nyatla 110:257739f9b31e 720 NyLPC_TUInt16 i_lport)
nyatla 110:257739f9b31e 721 {
nyatla 110:257739f9b31e 722 int i;
nyatla 110:257739f9b31e 723 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 724 if((udp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 725 continue;
nyatla 110:257739f9b31e 726 }
nyatla 110:257739f9b31e 727 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))))
nyatla 110:257739f9b31e 728 {
nyatla 110:257739f9b31e 729 continue;
nyatla 110:257739f9b31e 730 }
nyatla 110:257739f9b31e 731 return &udp_socket_table[i].socket;
nyatla 110:257739f9b31e 732 }
nyatla 110:257739f9b31e 733 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 734 if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 735 continue;
nyatla 110:257739f9b31e 736 }
nyatla 110:257739f9b31e 737 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))))
nyatla 110:257739f9b31e 738 {
nyatla 110:257739f9b31e 739 continue;
nyatla 110:257739f9b31e 740 }
nyatla 110:257739f9b31e 741 return &udp_socket_nb_table[i].socket;
nyatla 110:257739f9b31e 742 }
nyatla 110:257739f9b31e 743 return NULL;
nyatla 110:257739f9b31e 744 }
nyatla 109:18f12ac01097 745
nyatla 109:18f12ac01097 746
nyatla 110:257739f9b31e 747 void NyLPC_cMiMicIpNetIf_callPeriodic(void)
nyatla 110:257739f9b31e 748 {
nyatla 110:257739f9b31e 749 int i;
nyatla 110:257739f9b31e 750 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 751 if((udp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 752 NyLPC_cMiMicIpUdpSocket_periodic(&udp_socket_table[i].socket);
nyatla 110:257739f9b31e 753 }
nyatla 110:257739f9b31e 754 }
nyatla 110:257739f9b31e 755 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 756 if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 757 NyLPC_cMiMicIpUdpSocket_periodic(&udp_socket_nb_table[i].socket);
nyatla 110:257739f9b31e 758 }
nyatla 110:257739f9b31e 759 }
nyatla 110:257739f9b31e 760 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 761 if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 762 NyLPC_cMiMicIpTcpSocket_periodic(&tcp_socket_table[i].socket);
nyatla 110:257739f9b31e 763 }
nyatla 110:257739f9b31e 764 }
nyatla 110:257739f9b31e 765 }
nyatla 110:257739f9b31e 766 void NyLPC_cMiMicIpNetIf_callSocketStart(
nyatla 110:257739f9b31e 767 const NyLPC_TcIPv4Config_t* i_cfg)
nyatla 110:257739f9b31e 768 {
nyatla 110:257739f9b31e 769 int i;
nyatla 110:257739f9b31e 770 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 771 if((udp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 772 NyLPC_cMiMicIpUdpSocket_startService(&udp_socket_table[i].socket,i_cfg);
nyatla 110:257739f9b31e 773 }
nyatla 110:257739f9b31e 774 }
nyatla 110:257739f9b31e 775 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 776 if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 777 NyLPC_cMiMicIpUdpSocket_startService(&udp_socket_nb_table[i].socket,i_cfg);
nyatla 110:257739f9b31e 778 }
nyatla 110:257739f9b31e 779 }
nyatla 110:257739f9b31e 780 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 781 if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 782 NyLPC_cMiMicIpTcpSocket_startService(&tcp_socket_table[i].socket,i_cfg);
nyatla 110:257739f9b31e 783 }
nyatla 110:257739f9b31e 784 }
nyatla 110:257739f9b31e 785 }
nyatla 110:257739f9b31e 786 void NyLPC_cMiMicIpNetIf_callSocketStop(void)
nyatla 110:257739f9b31e 787 {
nyatla 110:257739f9b31e 788 int i;
nyatla 110:257739f9b31e 789 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 790 if((udp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 791 NyLPC_cMiMicIpUdpSocket_stopService(&udp_socket_table[i].socket);
nyatla 110:257739f9b31e 792 }
nyatla 110:257739f9b31e 793 }
nyatla 110:257739f9b31e 794 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 795 if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 796 NyLPC_cMiMicIpUdpSocket_stopService(&udp_socket_nb_table[i].socket);
nyatla 110:257739f9b31e 797 }
nyatla 110:257739f9b31e 798 }
nyatla 110:257739f9b31e 799 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 800 if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 801 NyLPC_cMiMicIpTcpSocket_stopService(&tcp_socket_table[i].socket);
nyatla 110:257739f9b31e 802 }
nyatla 110:257739f9b31e 803 }
nyatla 110:257739f9b31e 804 }
nyatla 109:18f12ac01097 805
nyatla 109:18f12ac01097 806
nyatla 109:18f12ac01097 807
nyatla 109:18f12ac01097 808 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 809 // インタフェイス関数
nyatla 109:18f12ac01097 810
nyatla 109:18f12ac01097 811 static NyLPC_TiTcpSocket_t* createTcpSocetEx(NyLPC_TSocketType i_socktype)
nyatla 109:18f12ac01097 812 {
nyatla 109:18f12ac01097 813 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 814 switch(i_socktype){
nyatla 109:18f12ac01097 815 case NyLPC_TSocketType_TCP_HTTP:
nyatla 109:18f12ac01097 816 case NyLPC_TSocketType_TCP_NORMAL:
nyatla 109:18f12ac01097 817 //空きソケットの探索
nyatla 109:18f12ac01097 818 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 819 //未使用なソケットを得る
nyatla 110:257739f9b31e 820 if((tcp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 821 if(!NyLPC_cMiMicIpTcpSocket_initialize(&tcp_socket_table[i].socket,tcp_socket_table[i].rxbuf,NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE)){
nyatla 109:18f12ac01097 822 return NULL;
nyatla 109:18f12ac01097 823 }
nyatla 109:18f12ac01097 824 //ソケットを使用中に
nyatla 110:257739f9b31e 825 tcp_socket_table[i].flags|=FLAGS_USED;
nyatla 110:257739f9b31e 826 return &(tcp_socket_table[i].socket._super);
nyatla 109:18f12ac01097 827 }
nyatla 109:18f12ac01097 828 }
nyatla 109:18f12ac01097 829 break;
nyatla 109:18f12ac01097 830 default:
nyatla 109:18f12ac01097 831 break;
nyatla 109:18f12ac01097 832 }
nyatla 109:18f12ac01097 833 return NULL;
nyatla 109:18f12ac01097 834 }
nyatla 109:18f12ac01097 835
nyatla 109:18f12ac01097 836 static NyLPC_TiUdpSocket_t* createUdpSocetEx(NyLPC_TUInt16 i_port,NyLPC_TSocketType i_socktype)
nyatla 109:18f12ac01097 837 {
nyatla 109:18f12ac01097 838 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 839 switch(i_socktype){
nyatla 109:18f12ac01097 840 case NyLPC_TSocketType_UDP_NORMAL:
nyatla 109:18f12ac01097 841 //空きソケットの探索
nyatla 109:18f12ac01097 842 for(i=0;i<NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 843 //未使用なソケットを得る
nyatla 110:257739f9b31e 844 if((udp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 845 if(!NyLPC_cMiMicIpUdpSocket_initialize(&udp_socket_table[i].socket,i_port,udp_socket_table[i].rxbuf,NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE)){
nyatla 109:18f12ac01097 846 return NULL;
nyatla 109:18f12ac01097 847 }
nyatla 110:257739f9b31e 848 udp_socket_table[i].flags|=FLAGS_USED;
nyatla 110:257739f9b31e 849 return &(udp_socket_table[i].socket._super);
nyatla 109:18f12ac01097 850 }
nyatla 109:18f12ac01097 851 }
nyatla 109:18f12ac01097 852 break;
nyatla 109:18f12ac01097 853 case NyLPC_TSocketType_UDP_NOBUF:
nyatla 109:18f12ac01097 854 //空きソケットの探索
nyatla 109:18f12ac01097 855 for(i=0;i<NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 856 //未使用なソケットを得る
nyatla 110:257739f9b31e 857 if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 858 if(!NyLPC_cMiMicIpUdpSocket_initialize(&udp_socket_nb_table[i].socket,i_port,NULL,0)){
nyatla 109:18f12ac01097 859 return NULL;
nyatla 109:18f12ac01097 860 }
nyatla 110:257739f9b31e 861 udp_socket_nb_table[i].flags|=FLAGS_USED;
nyatla 110:257739f9b31e 862 return &(udp_socket_nb_table[i].socket._super);
nyatla 109:18f12ac01097 863 }
nyatla 109:18f12ac01097 864 }
nyatla 109:18f12ac01097 865 break;
nyatla 109:18f12ac01097 866 default:
nyatla 109:18f12ac01097 867 break;
nyatla 109:18f12ac01097 868 }
nyatla 109:18f12ac01097 869 return NULL;
nyatla 109:18f12ac01097 870 }
nyatla 109:18f12ac01097 871 static NyLPC_TiTcpListener_t* createTcpListener(NyLPC_TUInt16 i_port)
nyatla 109:18f12ac01097 872 {
nyatla 109:18f12ac01097 873 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 874 //空きソケットの探索
nyatla 109:18f12ac01097 875 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX;i++){
nyatla 109:18f12ac01097 876 //未使用なソケットを得る
nyatla 110:257739f9b31e 877 if((tcp_listener_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 878 if(!NyLPC_cMiMicIpTcpListener_initialize(&tcp_listener_table[i].listener,i_port)){
nyatla 109:18f12ac01097 879 return NULL;
nyatla 109:18f12ac01097 880 }
nyatla 109:18f12ac01097 881 //ソケットを使用中に
nyatla 110:257739f9b31e 882 tcp_listener_table[i].flags|=FLAGS_USED;
nyatla 110:257739f9b31e 883 return &(tcp_listener_table[i].listener._super);
nyatla 109:18f12ac01097 884 }
nyatla 109:18f12ac01097 885 }
nyatla 109:18f12ac01097 886 return NULL;
nyatla 109:18f12ac01097 887 }
nyatla 109:18f12ac01097 888
nyatla 109:18f12ac01097 889
nyatla 109:18f12ac01097 890 static const struct NyLPC_TiNetInterface_Interface _interface=
nyatla 109:18f12ac01097 891 {
nyatla 109:18f12ac01097 892 createTcpSocetEx,
nyatla 109:18f12ac01097 893 createUdpSocetEx,
nyatla 109:18f12ac01097 894 createTcpListener,
nyatla 109:18f12ac01097 895 NyLPC_cMiMicIpNetIf_start,
nyatla 109:18f12ac01097 896 NyLPC_cMiMicIpNetIf_stop,
nyatla 109:18f12ac01097 897 NyLPC_cMiMicIpNetIf_sendArpRequest,
nyatla 109:18f12ac01097 898 NyLPC_cMiMicIpNetIf_hasArpInfo,
nyatla 109:18f12ac01097 899 isInitService,//NyLPC_TiNetInterface_isInitService isinitservice;
nyatla 109:18f12ac01097 900 NyLPC_cMiMicIpNetIf_getInterfaceInfo
nyatla 109:18f12ac01097 901 };
nyatla 109:18f12ac01097 902 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 903 // インスタンスのリリース(protected)
nyatla 109:18f12ac01097 904
nyatla 109:18f12ac01097 905 void NyLPC_cMiMicIpNetIf_releaseTcpSocketMemory(const NyLPC_TcMiMicIpTcpSocket_t* i_inst)
nyatla 109:18f12ac01097 906 {
nyatla 109:18f12ac01097 907 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 908 //空きソケットの探索
nyatla 109:18f12ac01097 909 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX;i++){
nyatla 110:257739f9b31e 910 if((&tcp_socket_table[i].socket)==i_inst){
nyatla 110:257739f9b31e 911 tcp_socket_table[i].flags&=~FLAGS_USED;
nyatla 109:18f12ac01097 912 return;
nyatla 109:18f12ac01097 913 }
nyatla 109:18f12ac01097 914 }
nyatla 109:18f12ac01097 915 return;
nyatla 109:18f12ac01097 916 }
nyatla 109:18f12ac01097 917 void NyLPC_cMiMicIpNetIf_releaseUdpSocketMemory(const NyLPC_TcMiMicIpUdpSocket_t* i_inst)
nyatla 109:18f12ac01097 918 {
nyatla 109:18f12ac01097 919 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 920 for(i=0;i<NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX;i++){
nyatla 110:257739f9b31e 921 if((&udp_socket_table[i].socket)==i_inst){
nyatla 110:257739f9b31e 922 udp_socket_table[i].flags&=~FLAGS_USED;
nyatla 109:18f12ac01097 923 return;
nyatla 109:18f12ac01097 924 }
nyatla 109:18f12ac01097 925 }
nyatla 109:18f12ac01097 926 for(i=0;i<NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX;i++){
nyatla 110:257739f9b31e 927 if((&udp_socket_nb_table[i].socket)==i_inst){
nyatla 110:257739f9b31e 928 udp_socket_nb_table[i].flags&=~FLAGS_USED;
nyatla 109:18f12ac01097 929 return;
nyatla 109:18f12ac01097 930 }
nyatla 109:18f12ac01097 931 }
nyatla 109:18f12ac01097 932 return;
nyatla 109:18f12ac01097 933 }
nyatla 109:18f12ac01097 934 void NyLPC_cMiMicIpNetIf_releaseTcpListenerMemory(const NyLPC_TcMiMicIpTcpListener_t* i_inst)
nyatla 109:18f12ac01097 935 {
nyatla 109:18f12ac01097 936 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 937 //空きソケットの探索
nyatla 109:18f12ac01097 938 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX;i++){
nyatla 110:257739f9b31e 939 if((&tcp_listener_table[i].listener)==i_inst){
nyatla 110:257739f9b31e 940 tcp_listener_table[i].flags&=~FLAGS_USED;
nyatla 109:18f12ac01097 941 return;
nyatla 109:18f12ac01097 942 }
nyatla 109:18f12ac01097 943 }
nyatla 109:18f12ac01097 944 return;
nyatla 109:18f12ac01097 945 }
nyatla 109:18f12ac01097 946
nyatla 109:18f12ac01097 947 static NyLPC_TcMiMicIpNetIf_t _netif;
nyatla 109:18f12ac01097 948
nyatla 109:18f12ac01097 949 const struct NyLPC_TiNetInterface_Interface* NyLPC_cMiMicIpNetIf_getNetInterface(void)
nyatla 109:18f12ac01097 950 {
nyatla 109:18f12ac01097 951 NyLPC_cMiMicIpNetIf_initialize(&_netif);
nyatla 109:18f12ac01097 952 return &_interface;
nyatla 109:18f12ac01097 953 }
nyatla 109:18f12ac01097 954
nyatla 109:18f12ac01097 955
nyatla 109:18f12ac01097 956