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:
Sat Jun 04 06:51:04 2016 +0000
Revision:
114:f6aef16d4e60
Parent:
113:e40058804062
include????????; ???????????

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 NyLPC_TUInt16 tx_len;
nyatla 109:18f12ac01097 376 struct TEthPacket* ethbuf;
nyatla 113:e40058804062 377 //システムTXメモリを得てイーサフレームのポインタを復元
nyatla 113:e40058804062 378 ethbuf=(struct TEthPacket*)(((struct NyLPC_TEthernetIIHeader*)NyLPC_cMiMicIpNetIf_allocSysTxBuf()-1));
nyatla 109:18f12ac01097 379 //ARPパケットを作る。
nyatla 109:18f12ac01097 380 NyLPC_TArpHeader_setArpRequest(&(ethbuf->data.arp),inst->_netinfo.current_config->ip_addr,&(inst->_netinfo.current_config->eth_mac),i_addr);
nyatla 109:18f12ac01097 381 tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_netinfo.current_config->eth_mac));
nyatla 109:18f12ac01097 382 //送信
nyatla 109:18f12ac01097 383 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 113:e40058804062 384 NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,ethbuf,tx_len);
nyatla 113:e40058804062 385 NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,ethbuf);//NyLPC_cMiMicIpNetIf_releaseTxBufの代用だから元のイーサフレームメモリの値で開放
nyatla 109:18f12ac01097 386 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 387 }
nyatla 109:18f12ac01097 388
nyatla 109:18f12ac01097 389
nyatla 109:18f12ac01097 390
nyatla 109:18f12ac01097 391
nyatla 109:18f12ac01097 392 /**
nyatla 109:18f12ac01097 393 * allocTxBufで取得したペイロードメモリを"IPパケットとして"送信します。
nyatla 109:18f12ac01097 394 * @param i_eth_payload
nyatla 109:18f12ac01097 395 * [NyLPC_TEthernetIIHeader][payload]メモリの、[payload]のアドレスを指定します。
nyatla 109:18f12ac01097 396 * 通常は、NyLPC_cUipService_allocTxBufの返却したメモリを指定します。
nyatla 109:18f12ac01097 397 */
nyatla 109:18f12ac01097 398
nyatla 109:18f12ac01097 399 void NyLPC_cMiMicIpNetIf_sendIPv4Tx(void* i_eth_payload)
nyatla 109:18f12ac01097 400 {
nyatla 109:18f12ac01097 401 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 402 void* p=((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1;
nyatla 109:18f12ac01097 403 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 404 //IPパケットの送信を試行
nyatla 109:18f12ac01097 405 if(sendIPv4Tx((struct TEthPacket*)p)){
nyatla 109:18f12ac01097 406 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 407 return;
nyatla 109:18f12ac01097 408 }
nyatla 109:18f12ac01097 409 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 410 //ARPリクエストを代わりに送信
nyatla 109:18f12ac01097 411 NyLPC_cMiMicIpNetIf_sendArpRequest(&((struct NyLPC_TIPv4Header*)i_eth_payload)->destipaddr);
nyatla 109:18f12ac01097 412 return;
nyatla 109:18f12ac01097 413 }
nyatla 109:18f12ac01097 414
nyatla 109:18f12ac01097 415
nyatla 109:18f12ac01097 416 /**
nyatla 109:18f12ac01097 417 * ARPテーブルに指定したIPがあるかを返します。
nyatla 109:18f12ac01097 418 */
nyatla 109:18f12ac01097 419 NyLPC_TBool NyLPC_cMiMicIpNetIf_hasArpInfo(const struct NyLPC_TIPv4Addr* i_addr)
nyatla 109:18f12ac01097 420 {
nyatla 109:18f12ac01097 421 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 422 return NyLPC_cIPv4Arp_IPv4toEthAddr(&inst->_arp,*i_addr)!=NULL;
nyatla 109:18f12ac01097 423 }
nyatla 109:18f12ac01097 424
nyatla 109:18f12ac01097 425 /**
nyatla 109:18f12ac01097 426 * システム用の送信ペイロードを返します。
nyatla 109:18f12ac01097 427 * 関数は必ず成功します。
nyatla 109:18f12ac01097 428 */
nyatla 109:18f12ac01097 429 void* NyLPC_cMiMicIpNetIf_allocSysTxBuf(void)
nyatla 109:18f12ac01097 430 {
nyatla 109:18f12ac01097 431 NyLPC_TUInt16 s;
nyatla 109:18f12ac01097 432 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 433 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 434 //排他処理をして、メモリを取得する。SYSTEMメモリはEthernetドライバの解放待ちのみなのでまとめてLOCKしておk
nyatla 109:18f12ac01097 435 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 436 for(;;){
nyatla 109:18f12ac01097 437 ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,NyLPC_TcEthernetMM_HINT_CTRL_PACKET,&s);
nyatla 109:18f12ac01097 438 if(ethbuf==NULL){
nyatla 109:18f12ac01097 439 NyLPC_cThread_yield();
nyatla 109:18f12ac01097 440 continue;
nyatla 109:18f12ac01097 441 }
nyatla 109:18f12ac01097 442 break;
nyatla 109:18f12ac01097 443 }
nyatla 109:18f12ac01097 444 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 445 //イーサネットバッファのアドレスを計算
nyatla 109:18f12ac01097 446 return &(ethbuf->data);
nyatla 109:18f12ac01097 447 }
nyatla 109:18f12ac01097 448
nyatla 109:18f12ac01097 449
nyatla 109:18f12ac01097 450
nyatla 109:18f12ac01097 451 void* NyLPC_cMiMicIpNetIf_allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size)
nyatla 109:18f12ac01097 452 {
nyatla 109:18f12ac01097 453 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 454 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 455 //排他処理をして、メモリを取得する。
nyatla 109:18f12ac01097 456 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 457 ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,i_hint+sizeof(struct NyLPC_TEthernetIIHeader),o_size);
nyatla 109:18f12ac01097 458 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 459 if(ethbuf==NULL){
nyatla 109:18f12ac01097 460 return NULL;
nyatla 109:18f12ac01097 461 }
nyatla 109:18f12ac01097 462 //イーサネットバッファのサイズを計算
nyatla 109:18f12ac01097 463 *o_size-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 109:18f12ac01097 464 //イーサネットバッファのアドレスを計算
nyatla 109:18f12ac01097 465 return &(ethbuf->data);
nyatla 109:18f12ac01097 466 }
nyatla 109:18f12ac01097 467
nyatla 109:18f12ac01097 468
nyatla 109:18f12ac01097 469 void* NyLPC_cMiMicIpNetIf_releaseTxBuf(void* i_buf)
nyatla 109:18f12ac01097 470 {
nyatla 109:18f12ac01097 471 //排他処理をして、メモリを開放する。
nyatla 109:18f12ac01097 472 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 473 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 474 //ペイロードの位置から、メモリブロックを再生。
nyatla 109:18f12ac01097 475 NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
nyatla 109:18f12ac01097 476 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 477 return NULL;
nyatla 109:18f12ac01097 478 }
nyatla 109:18f12ac01097 479
nyatla 109:18f12ac01097 480
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 * この関数はiptaskで実行される関数からのみ使用てください。
nyatla 109:18f12ac01097 491 * @i_buf
nyatla 109:18f12ac01097 492 * イーサネットフレームを格納したメモリです。
nyatla 109:18f12ac01097 493 * @i_len
nyatla 109:18f12ac01097 494 * イーサネットペイロードのサイズです。
nyatla 109:18f12ac01097 495 */
nyatla 109:18f12ac01097 496 static void sendRawEthFrameNL(void* i_buf,NyLPC_TUInt16 i_len)
nyatla 109:18f12ac01097 497 {
nyatla 109:18f12ac01097 498 NyLPC_iEthernetDevice_sendTxEthFrame(
nyatla 109:18f12ac01097 499 _NyLPC_TcMiMicIpNetIf_inst->_ethif,
nyatla 109:18f12ac01097 500 ((struct NyLPC_TEthernetIIHeader*)i_buf)-1,
nyatla 109:18f12ac01097 501 i_len);
nyatla 109:18f12ac01097 502 return;
nyatla 109:18f12ac01097 503 }
nyatla 109:18f12ac01097 504 /**
nyatla 109:18f12ac01097 505 * ロック状態で使用できるreleaseTxBuf。
nyatla 109:18f12ac01097 506 * この関数はiptaskで実行される関数からのみ使用してください。
nyatla 109:18f12ac01097 507 */
nyatla 109:18f12ac01097 508 static void releaseTxBufNL(void* i_buf)
nyatla 109:18f12ac01097 509 {
nyatla 109:18f12ac01097 510 //ペイロードの位置から、メモリブロックを再生。
nyatla 109:18f12ac01097 511 NyLPC_iEthernetDevice_releaseTxBuf(
nyatla 109:18f12ac01097 512 _NyLPC_TcMiMicIpNetIf_inst->_ethif,
nyatla 109:18f12ac01097 513 ((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
nyatla 109:18f12ac01097 514 return;
nyatla 109:18f12ac01097 515 }
nyatla 109:18f12ac01097 516 /**
nyatla 109:18f12ac01097 517 * マルチキャスとアドレスへ変換する。
nyatla 109:18f12ac01097 518 */
nyatla 109:18f12ac01097 519 static void ip2MulticastEmacAddr(const struct NyLPC_TIPv4Addr* i_addr,struct NyLPC_TEthAddr* o_emac)
nyatla 109:18f12ac01097 520 {
nyatla 109:18f12ac01097 521 NyLPC_TUInt32 n=NyLPC_htonl(i_addr->v);
nyatla 109:18f12ac01097 522 o_emac->addr[0]=0x01;
nyatla 109:18f12ac01097 523 o_emac->addr[1]=0x00;
nyatla 109:18f12ac01097 524 o_emac->addr[2]=0x5E;
nyatla 109:18f12ac01097 525 o_emac->addr[3]=((n>>16) & 0x7f);
nyatla 109:18f12ac01097 526 o_emac->addr[4]=((n>> 8) & 0xff);
nyatla 109:18f12ac01097 527 o_emac->addr[5]=(n & 0xff);
nyatla 109:18f12ac01097 528 return;
nyatla 109:18f12ac01097 529 };
nyatla 109:18f12ac01097 530
nyatla 109:18f12ac01097 531 /**
nyatla 109:18f12ac01097 532 * ペイロードをIPパケットとしてネットワークへ送出します。
nyatla 109:18f12ac01097 533 * コール前に、必ずロックしてから呼び出してください。
nyatla 109:18f12ac01097 534 * @param i_eth_payload
nyatla 109:18f12ac01097 535 * allocTxBufで確保したメモリを指定してください。
nyatla 109:18f12ac01097 536 * ペイロードには、TCP/IPパケットを格納します。
nyatla 109:18f12ac01097 537 */
nyatla 109:18f12ac01097 538 static NyLPC_TBool sendIPv4Tx(struct TEthPacket* i_eth_buf)
nyatla 109:18f12ac01097 539 {
nyatla 109:18f12ac01097 540 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 541 struct NyLPC_TEthAddr emac;
nyatla 109:18f12ac01097 542 NyLPC_TUInt16 tx_len;
nyatla 109:18f12ac01097 543 const struct NyLPC_TEthAddr* eth_dest;
nyatla 109:18f12ac01097 544 //ペイロードのアドレスから、イーサネットフレームバッファのアドレスを復元
nyatla 109:18f12ac01097 545
nyatla 109:18f12ac01097 546 if(NyLPC_TIPv4Addr_isEqual(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_BROADCAST)) {
nyatla 109:18f12ac01097 547 //ブロードキャストならそのまま
nyatla 109:18f12ac01097 548 eth_dest=&NyLPC_TEthAddr_BROADCAST;
nyatla 109:18f12ac01097 549 }else if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
nyatla 109:18f12ac01097 550 //マルチキャスト
nyatla 109:18f12ac01097 551 ip2MulticastEmacAddr(&(i_eth_buf->data.ipv4.destipaddr),&emac);
nyatla 109:18f12ac01097 552 eth_dest=&emac;
nyatla 109:18f12ac01097 553 }else{
nyatla 109:18f12ac01097 554 //LocalIP以外ならdefaultRootへ変換
nyatla 109:18f12ac01097 555 eth_dest=NyLPC_cIPv4Arp_IPv4toEthAddr(
nyatla 109:18f12ac01097 556 &inst->_arp,
nyatla 109:18f12ac01097 557 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 558 //IP->MAC変換をテスト。
nyatla 109:18f12ac01097 559 if(eth_dest==NULL){
nyatla 109:18f12ac01097 560 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 561 }
nyatla 109:18f12ac01097 562 }
nyatla 109:18f12ac01097 563 //変換可能なら、イーサネットヘッダを更新して、送信処理へ。
nyatla 109:18f12ac01097 564 tx_len=NyLPC_TEthernetIIHeader_setIPv4Tx(&(i_eth_buf->header),&(inst->_netinfo.current_config->eth_mac),eth_dest);
nyatla 109:18f12ac01097 565 NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,i_eth_buf,tx_len);
nyatla 109:18f12ac01097 566 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 567 }
nyatla 109:18f12ac01097 568
nyatla 109:18f12ac01097 569 static NyLPC_TBool isInitService(void)
nyatla 109:18f12ac01097 570 {
nyatla 109:18f12ac01097 571 return _NyLPC_TcMiMicIpNetIf_inst!=NULL;
nyatla 109:18f12ac01097 572 }
nyatla 109:18f12ac01097 573
nyatla 109:18f12ac01097 574 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 575 //
nyatla 109:18f12ac01097 576 // NetIF Interface
nyatla 109:18f12ac01097 577 //
nyatla 109:18f12ac01097 578 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 579
nyatla 109:18f12ac01097 580
nyatla 109:18f12ac01097 581 //--------------------------------------------------------------------------------
nyatla 110:257739f9b31e 582 // ソケットテーブル
nyatla 110:257739f9b31e 583 //--------------------------------------------------------------------------------
nyatla 110:257739f9b31e 584
nyatla 110:257739f9b31e 585 #define FLAGS_USED 0x00000001
nyatla 109:18f12ac01097 586
nyatla 110:257739f9b31e 587 struct TTcpTable
nyatla 110:257739f9b31e 588 {
nyatla 110:257739f9b31e 589 NyLPC_TUInt32 flags;
nyatla 110:257739f9b31e 590 NyLPC_TcMiMicIpTcpSocket_t socket;
nyatla 110:257739f9b31e 591 NyLPC_TUInt8 rxbuf[NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE];
nyatla 110:257739f9b31e 592 };
nyatla 110:257739f9b31e 593 struct TUdpTable
nyatla 110:257739f9b31e 594 {
nyatla 110:257739f9b31e 595 NyLPC_TUInt32 flags;
nyatla 110:257739f9b31e 596 NyLPC_TcMiMicIpUdpSocket_t socket;
nyatla 110:257739f9b31e 597 NyLPC_TUInt8 rxbuf[NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE];
nyatla 110:257739f9b31e 598 };
nyatla 110:257739f9b31e 599 struct TUdpNBTable
nyatla 110:257739f9b31e 600 {
nyatla 110:257739f9b31e 601 NyLPC_TUInt32 flags;
nyatla 110:257739f9b31e 602 NyLPC_TcMiMicIpUdpSocket_t socket;
nyatla 110:257739f9b31e 603 };
nyatla 110:257739f9b31e 604 struct TTcpListenerTable
nyatla 110:257739f9b31e 605 {
nyatla 110:257739f9b31e 606 NyLPC_TUInt32 flags;
nyatla 110:257739f9b31e 607 NyLPC_TcMiMicIpTcpListener_t listener;
nyatla 110:257739f9b31e 608 };
nyatla 110:257739f9b31e 609
nyatla 109:18f12ac01097 610
nyatla 109:18f12ac01097 611
nyatla 110:257739f9b31e 612 static struct TTcpTable tcp_socket_table[NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX];
nyatla 110:257739f9b31e 613 static struct TUdpTable udp_socket_table[NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX];
nyatla 110:257739f9b31e 614 static struct TUdpNBTable udp_socket_nb_table[NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX];
nyatla 110:257739f9b31e 615 static struct TTcpListenerTable tcp_listener_table[NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX];
nyatla 110:257739f9b31e 616
nyatla 110:257739f9b31e 617 NyLPC_TcMiMicIpTcpListener_t* NyLPC_cMiMicIpNetIf_getListenerByPeerPort(NyLPC_TUInt16 i_port)
nyatla 110:257739f9b31e 618 {
nyatla 110:257739f9b31e 619 int i;
nyatla 110:257739f9b31e 620 //一致するポートを検索して、acceptをコールする。
nyatla 110:257739f9b31e 621 for(i=NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 622 if((tcp_listener_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 623 continue;
nyatla 110:257739f9b31e 624 }
nyatla 110:257739f9b31e 625 if(tcp_listener_table[i].listener._port!=i_port){
nyatla 110:257739f9b31e 626 continue;
nyatla 110:257739f9b31e 627 }
nyatla 110:257739f9b31e 628 return &tcp_listener_table[i].listener;
nyatla 110:257739f9b31e 629 }
nyatla 110:257739f9b31e 630 return NULL;
nyatla 110:257739f9b31e 631 }
nyatla 110:257739f9b31e 632
nyatla 110:257739f9b31e 633 /**
nyatla 110:257739f9b31e 634 * 指定番号のTCPポートが未使用かを返す。
nyatla 110:257739f9b31e 635 * @return
nyatla 110:257739f9b31e 636 * i_lport番のポートが未使用であればTRUE
nyatla 110:257739f9b31e 637 */
nyatla 110:257739f9b31e 638 NyLPC_TBool NyLPC_cMiMicIpNetIf_isClosedTcpPort(NyLPC_TUInt16 i_lport)
nyatla 110:257739f9b31e 639 {
nyatla 110:257739f9b31e 640 int i;
nyatla 110:257739f9b31e 641 //未使用のTCPソケット?
nyatla 110:257739f9b31e 642 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 643 if( ((tcp_socket_table[i].flags&FLAGS_USED)!=0) &&
nyatla 110:257739f9b31e 644 (NyLPC_cMiMicIpTcpSocket_getLocalPort(&tcp_socket_table[i].socket)==i_lport)&&
nyatla 110:257739f9b31e 645 (!NyLPC_cMiMicIpTcpSocket_isClosed(&tcp_socket_table[i].socket))){
nyatla 110:257739f9b31e 646 //ポート使用中
nyatla 110:257739f9b31e 647 return NyLPC_TBool_FALSE;
nyatla 110:257739f9b31e 648 }
nyatla 110:257739f9b31e 649 }
nyatla 110:257739f9b31e 650 for(i=NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 651 if( ((tcp_listener_table[i].flags&FLAGS_USED)!=0) &&
nyatla 110:257739f9b31e 652 (NyLPC_cMiMicIpTcpListener_getLocalPort(&tcp_listener_table[i].listener)==i_lport)){
nyatla 110:257739f9b31e 653 //ポート使用中
nyatla 110:257739f9b31e 654 return NyLPC_TBool_FALSE;
nyatla 110:257739f9b31e 655 }
nyatla 110:257739f9b31e 656 }
nyatla 110:257739f9b31e 657 return NyLPC_TBool_TRUE;
nyatla 110:257739f9b31e 658 }
nyatla 109:18f12ac01097 659
nyatla 110:257739f9b31e 660 /**
nyatla 110:257739f9b31e 661 * 条件に一致する、アクティブなTCPソケットオブジェクトを取得します。
nyatla 110:257739f9b31e 662 * この関数は、ローカルIPが一致していると仮定して検索をします。
nyatla 110:257739f9b31e 663 * @param i_rip
nyatla 110:257739f9b31e 664 * リモートIPアドレスを指定します。
nyatla 110:257739f9b31e 665 */
nyatla 110:257739f9b31e 666 NyLPC_TcMiMicIpTcpSocket_t* NyLPC_cMiMicIpNetIf_getMatchTcpSocket(
nyatla 110:257739f9b31e 667 NyLPC_TUInt16 i_lport,struct NyLPC_TIPv4Addr i_rip,NyLPC_TUInt16 i_rport)
nyatla 110:257739f9b31e 668 {
nyatla 110:257739f9b31e 669 NyLPC_TcMiMicIpTcpSocket_t* tp;
nyatla 110:257739f9b31e 670 int i;
nyatla 110:257739f9b31e 671 //一致するポートを検索
nyatla 110:257739f9b31e 672 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 673 if((tcp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 674 continue;
nyatla 110:257739f9b31e 675 }
nyatla 110:257739f9b31e 676 if(NyLPC_cMiMicIpTcpSocket_isClosed(&tcp_socket_table[i].socket)){
nyatla 110:257739f9b31e 677 continue;
nyatla 110:257739f9b31e 678 }
nyatla 110:257739f9b31e 679 tp=&tcp_socket_table[i].socket;
nyatla 110:257739f9b31e 680 //パラメータの一致チェック
nyatla 110:257739f9b31e 681 if(i_lport!=tp->uip_connr.lport || i_rport!= tp->uip_connr.rport || i_rip.v!=tp->uip_connr.ripaddr.v)
nyatla 110:257739f9b31e 682 {
nyatla 110:257739f9b31e 683 continue;
nyatla 110:257739f9b31e 684 }
nyatla 110:257739f9b31e 685 return tp;
nyatla 110:257739f9b31e 686 }
nyatla 110:257739f9b31e 687 return NULL;
nyatla 110:257739f9b31e 688 }
nyatla 110:257739f9b31e 689 NyLPC_TcMiMicIpUdpSocket_t* NyLPC_cMiMicIpNetIf_getMatchUdpSocket(
nyatla 110:257739f9b31e 690 NyLPC_TUInt16 i_lport)
nyatla 110:257739f9b31e 691 {
nyatla 110:257739f9b31e 692 int i;
nyatla 110:257739f9b31e 693 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 694 if((udp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 695 continue;
nyatla 110:257739f9b31e 696 }
nyatla 110:257739f9b31e 697 if(i_lport!=udp_socket_table[i].socket.uip_udp_conn.lport){
nyatla 110:257739f9b31e 698 continue;
nyatla 110:257739f9b31e 699 }
nyatla 110:257739f9b31e 700 //unicast
nyatla 110:257739f9b31e 701 return &udp_socket_table[i].socket;
nyatla 110:257739f9b31e 702 }
nyatla 110:257739f9b31e 703 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 704 if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 705 continue;
nyatla 110:257739f9b31e 706 }
nyatla 110:257739f9b31e 707 if(i_lport!=udp_socket_nb_table[i].socket.uip_udp_conn.lport){
nyatla 110:257739f9b31e 708 continue;
nyatla 110:257739f9b31e 709 }
nyatla 110:257739f9b31e 710 //unicast
nyatla 110:257739f9b31e 711 return &udp_socket_nb_table[i].socket;
nyatla 110:257739f9b31e 712 }
nyatla 110:257739f9b31e 713 return NULL;
nyatla 110:257739f9b31e 714 }
nyatla 110:257739f9b31e 715 NyLPC_TcMiMicIpUdpSocket_t* NyLPC_cMiMicIpNetIf_getMatchMulticastUdpSocket(
nyatla 110:257739f9b31e 716 const struct NyLPC_TIPv4Addr* i_mcast_ip,
nyatla 110:257739f9b31e 717 NyLPC_TUInt16 i_lport)
nyatla 110:257739f9b31e 718 {
nyatla 110:257739f9b31e 719 int i;
nyatla 110:257739f9b31e 720 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 721 if((udp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 722 continue;
nyatla 110:257739f9b31e 723 }
nyatla 110:257739f9b31e 724 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 725 {
nyatla 110:257739f9b31e 726 continue;
nyatla 110:257739f9b31e 727 }
nyatla 110:257739f9b31e 728 return &udp_socket_table[i].socket;
nyatla 110:257739f9b31e 729 }
nyatla 110:257739f9b31e 730 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 731 if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 732 continue;
nyatla 110:257739f9b31e 733 }
nyatla 110:257739f9b31e 734 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 735 {
nyatla 110:257739f9b31e 736 continue;
nyatla 110:257739f9b31e 737 }
nyatla 110:257739f9b31e 738 return &udp_socket_nb_table[i].socket;
nyatla 110:257739f9b31e 739 }
nyatla 110:257739f9b31e 740 return NULL;
nyatla 110:257739f9b31e 741 }
nyatla 109:18f12ac01097 742
nyatla 109:18f12ac01097 743
nyatla 110:257739f9b31e 744 void NyLPC_cMiMicIpNetIf_callPeriodic(void)
nyatla 110:257739f9b31e 745 {
nyatla 110:257739f9b31e 746 int i;
nyatla 110:257739f9b31e 747 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 748 if((udp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 749 NyLPC_cMiMicIpUdpSocket_periodic(&udp_socket_table[i].socket);
nyatla 110:257739f9b31e 750 }
nyatla 110:257739f9b31e 751 }
nyatla 110:257739f9b31e 752 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 753 if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 754 NyLPC_cMiMicIpUdpSocket_periodic(&udp_socket_nb_table[i].socket);
nyatla 110:257739f9b31e 755 }
nyatla 110:257739f9b31e 756 }
nyatla 110:257739f9b31e 757 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 758 if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 759 NyLPC_cMiMicIpTcpSocket_periodic(&tcp_socket_table[i].socket);
nyatla 110:257739f9b31e 760 }
nyatla 110:257739f9b31e 761 }
nyatla 110:257739f9b31e 762 }
nyatla 110:257739f9b31e 763 void NyLPC_cMiMicIpNetIf_callSocketStart(
nyatla 110:257739f9b31e 764 const NyLPC_TcIPv4Config_t* i_cfg)
nyatla 110:257739f9b31e 765 {
nyatla 110:257739f9b31e 766 int i;
nyatla 110:257739f9b31e 767 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 768 if((udp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 769 NyLPC_cMiMicIpUdpSocket_startService(&udp_socket_table[i].socket,i_cfg);
nyatla 110:257739f9b31e 770 }
nyatla 110:257739f9b31e 771 }
nyatla 110:257739f9b31e 772 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 773 if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 774 NyLPC_cMiMicIpUdpSocket_startService(&udp_socket_nb_table[i].socket,i_cfg);
nyatla 110:257739f9b31e 775 }
nyatla 110:257739f9b31e 776 }
nyatla 110:257739f9b31e 777 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 778 if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 779 NyLPC_cMiMicIpTcpSocket_startService(&tcp_socket_table[i].socket,i_cfg);
nyatla 110:257739f9b31e 780 }
nyatla 110:257739f9b31e 781 }
nyatla 110:257739f9b31e 782 }
nyatla 110:257739f9b31e 783 void NyLPC_cMiMicIpNetIf_callSocketStop(void)
nyatla 110:257739f9b31e 784 {
nyatla 110:257739f9b31e 785 int i;
nyatla 110:257739f9b31e 786 for(i=NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 787 if((udp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 788 NyLPC_cMiMicIpUdpSocket_stopService(&udp_socket_table[i].socket);
nyatla 110:257739f9b31e 789 }
nyatla 110:257739f9b31e 790 }
nyatla 110:257739f9b31e 791 for(i=NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 792 if((udp_socket_nb_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 793 NyLPC_cMiMicIpUdpSocket_stopService(&udp_socket_nb_table[i].socket);
nyatla 110:257739f9b31e 794 }
nyatla 110:257739f9b31e 795 }
nyatla 110:257739f9b31e 796 for(i=NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX-1;i>=0;i--){
nyatla 110:257739f9b31e 797 if((tcp_socket_table[i].flags&FLAGS_USED)!=0){
nyatla 110:257739f9b31e 798 NyLPC_cMiMicIpTcpSocket_stopService(&tcp_socket_table[i].socket);
nyatla 110:257739f9b31e 799 }
nyatla 110:257739f9b31e 800 }
nyatla 110:257739f9b31e 801 }
nyatla 109:18f12ac01097 802
nyatla 109:18f12ac01097 803
nyatla 109:18f12ac01097 804
nyatla 109:18f12ac01097 805 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 806 // インタフェイス関数
nyatla 109:18f12ac01097 807
nyatla 109:18f12ac01097 808 static NyLPC_TiTcpSocket_t* createTcpSocetEx(NyLPC_TSocketType i_socktype)
nyatla 109:18f12ac01097 809 {
nyatla 109:18f12ac01097 810 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 811 switch(i_socktype){
nyatla 109:18f12ac01097 812 case NyLPC_TSocketType_TCP_HTTP:
nyatla 109:18f12ac01097 813 case NyLPC_TSocketType_TCP_NORMAL:
nyatla 109:18f12ac01097 814 //空きソケットの探索
nyatla 109:18f12ac01097 815 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 816 //未使用なソケットを得る
nyatla 110:257739f9b31e 817 if((tcp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 818 if(!NyLPC_cMiMicIpTcpSocket_initialize(&tcp_socket_table[i].socket,tcp_socket_table[i].rxbuf,NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE)){
nyatla 109:18f12ac01097 819 return NULL;
nyatla 109:18f12ac01097 820 }
nyatla 109:18f12ac01097 821 //ソケットを使用中に
nyatla 110:257739f9b31e 822 tcp_socket_table[i].flags|=FLAGS_USED;
nyatla 110:257739f9b31e 823 return &(tcp_socket_table[i].socket._super);
nyatla 109:18f12ac01097 824 }
nyatla 109:18f12ac01097 825 }
nyatla 109:18f12ac01097 826 break;
nyatla 109:18f12ac01097 827 default:
nyatla 109:18f12ac01097 828 break;
nyatla 109:18f12ac01097 829 }
nyatla 109:18f12ac01097 830 return NULL;
nyatla 109:18f12ac01097 831 }
nyatla 109:18f12ac01097 832
nyatla 109:18f12ac01097 833 static NyLPC_TiUdpSocket_t* createUdpSocetEx(NyLPC_TUInt16 i_port,NyLPC_TSocketType i_socktype)
nyatla 109:18f12ac01097 834 {
nyatla 109:18f12ac01097 835 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 836 switch(i_socktype){
nyatla 109:18f12ac01097 837 case NyLPC_TSocketType_UDP_NORMAL:
nyatla 109:18f12ac01097 838 //空きソケットの探索
nyatla 109:18f12ac01097 839 for(i=0;i<NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 840 //未使用なソケットを得る
nyatla 110:257739f9b31e 841 if((udp_socket_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 842 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 843 return NULL;
nyatla 109:18f12ac01097 844 }
nyatla 110:257739f9b31e 845 udp_socket_table[i].flags|=FLAGS_USED;
nyatla 110:257739f9b31e 846 return &(udp_socket_table[i].socket._super);
nyatla 109:18f12ac01097 847 }
nyatla 109:18f12ac01097 848 }
nyatla 109:18f12ac01097 849 break;
nyatla 109:18f12ac01097 850 case NyLPC_TSocketType_UDP_NOBUF:
nyatla 109:18f12ac01097 851 //空きソケットの探索
nyatla 109:18f12ac01097 852 for(i=0;i<NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 853 //未使用なソケットを得る
nyatla 110:257739f9b31e 854 if((udp_socket_nb_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 855 if(!NyLPC_cMiMicIpUdpSocket_initialize(&udp_socket_nb_table[i].socket,i_port,NULL,0)){
nyatla 109:18f12ac01097 856 return NULL;
nyatla 109:18f12ac01097 857 }
nyatla 110:257739f9b31e 858 udp_socket_nb_table[i].flags|=FLAGS_USED;
nyatla 110:257739f9b31e 859 return &(udp_socket_nb_table[i].socket._super);
nyatla 109:18f12ac01097 860 }
nyatla 109:18f12ac01097 861 }
nyatla 109:18f12ac01097 862 break;
nyatla 109:18f12ac01097 863 default:
nyatla 109:18f12ac01097 864 break;
nyatla 109:18f12ac01097 865 }
nyatla 109:18f12ac01097 866 return NULL;
nyatla 109:18f12ac01097 867 }
nyatla 109:18f12ac01097 868 static NyLPC_TiTcpListener_t* createTcpListener(NyLPC_TUInt16 i_port)
nyatla 109:18f12ac01097 869 {
nyatla 109:18f12ac01097 870 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 871 //空きソケットの探索
nyatla 109:18f12ac01097 872 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX;i++){
nyatla 109:18f12ac01097 873 //未使用なソケットを得る
nyatla 110:257739f9b31e 874 if((tcp_listener_table[i].flags&FLAGS_USED)==0){
nyatla 110:257739f9b31e 875 if(!NyLPC_cMiMicIpTcpListener_initialize(&tcp_listener_table[i].listener,i_port)){
nyatla 109:18f12ac01097 876 return NULL;
nyatla 109:18f12ac01097 877 }
nyatla 109:18f12ac01097 878 //ソケットを使用中に
nyatla 110:257739f9b31e 879 tcp_listener_table[i].flags|=FLAGS_USED;
nyatla 110:257739f9b31e 880 return &(tcp_listener_table[i].listener._super);
nyatla 109:18f12ac01097 881 }
nyatla 109:18f12ac01097 882 }
nyatla 109:18f12ac01097 883 return NULL;
nyatla 109:18f12ac01097 884 }
nyatla 109:18f12ac01097 885
nyatla 109:18f12ac01097 886
nyatla 109:18f12ac01097 887 static const struct NyLPC_TiNetInterface_Interface _interface=
nyatla 109:18f12ac01097 888 {
nyatla 109:18f12ac01097 889 createTcpSocetEx,
nyatla 109:18f12ac01097 890 createUdpSocetEx,
nyatla 109:18f12ac01097 891 createTcpListener,
nyatla 109:18f12ac01097 892 NyLPC_cMiMicIpNetIf_start,
nyatla 109:18f12ac01097 893 NyLPC_cMiMicIpNetIf_stop,
nyatla 109:18f12ac01097 894 NyLPC_cMiMicIpNetIf_sendArpRequest,
nyatla 109:18f12ac01097 895 NyLPC_cMiMicIpNetIf_hasArpInfo,
nyatla 109:18f12ac01097 896 isInitService,//NyLPC_TiNetInterface_isInitService isinitservice;
nyatla 109:18f12ac01097 897 NyLPC_cMiMicIpNetIf_getInterfaceInfo
nyatla 109:18f12ac01097 898 };
nyatla 109:18f12ac01097 899 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 900 // インスタンスのリリース(protected)
nyatla 109:18f12ac01097 901
nyatla 109:18f12ac01097 902 void NyLPC_cMiMicIpNetIf_releaseTcpSocketMemory(const NyLPC_TcMiMicIpTcpSocket_t* i_inst)
nyatla 109:18f12ac01097 903 {
nyatla 109:18f12ac01097 904 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 905 //空きソケットの探索
nyatla 109:18f12ac01097 906 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX;i++){
nyatla 110:257739f9b31e 907 if((&tcp_socket_table[i].socket)==i_inst){
nyatla 110:257739f9b31e 908 tcp_socket_table[i].flags&=~FLAGS_USED;
nyatla 109:18f12ac01097 909 return;
nyatla 109:18f12ac01097 910 }
nyatla 109:18f12ac01097 911 }
nyatla 109:18f12ac01097 912 return;
nyatla 109:18f12ac01097 913 }
nyatla 109:18f12ac01097 914 void NyLPC_cMiMicIpNetIf_releaseUdpSocketMemory(const NyLPC_TcMiMicIpUdpSocket_t* i_inst)
nyatla 109:18f12ac01097 915 {
nyatla 109:18f12ac01097 916 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 917 for(i=0;i<NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX;i++){
nyatla 110:257739f9b31e 918 if((&udp_socket_table[i].socket)==i_inst){
nyatla 110:257739f9b31e 919 udp_socket_table[i].flags&=~FLAGS_USED;
nyatla 109:18f12ac01097 920 return;
nyatla 109:18f12ac01097 921 }
nyatla 109:18f12ac01097 922 }
nyatla 109:18f12ac01097 923 for(i=0;i<NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX;i++){
nyatla 110:257739f9b31e 924 if((&udp_socket_nb_table[i].socket)==i_inst){
nyatla 110:257739f9b31e 925 udp_socket_nb_table[i].flags&=~FLAGS_USED;
nyatla 109:18f12ac01097 926 return;
nyatla 109:18f12ac01097 927 }
nyatla 109:18f12ac01097 928 }
nyatla 109:18f12ac01097 929 return;
nyatla 109:18f12ac01097 930 }
nyatla 109:18f12ac01097 931 void NyLPC_cMiMicIpNetIf_releaseTcpListenerMemory(const NyLPC_TcMiMicIpTcpListener_t* i_inst)
nyatla 109:18f12ac01097 932 {
nyatla 109:18f12ac01097 933 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 934 //空きソケットの探索
nyatla 109:18f12ac01097 935 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX;i++){
nyatla 110:257739f9b31e 936 if((&tcp_listener_table[i].listener)==i_inst){
nyatla 110:257739f9b31e 937 tcp_listener_table[i].flags&=~FLAGS_USED;
nyatla 109:18f12ac01097 938 return;
nyatla 109:18f12ac01097 939 }
nyatla 109:18f12ac01097 940 }
nyatla 109:18f12ac01097 941 return;
nyatla 109:18f12ac01097 942 }
nyatla 109:18f12ac01097 943
nyatla 109:18f12ac01097 944 static NyLPC_TcMiMicIpNetIf_t _netif;
nyatla 109:18f12ac01097 945
nyatla 109:18f12ac01097 946 const struct NyLPC_TiNetInterface_Interface* NyLPC_cMiMicIpNetIf_getNetInterface(void)
nyatla 109:18f12ac01097 947 {
nyatla 109:18f12ac01097 948 NyLPC_cMiMicIpNetIf_initialize(&_netif);
nyatla 109:18f12ac01097 949 return &_interface;
nyatla 109:18f12ac01097 950 }
nyatla 109:18f12ac01097 951
nyatla 109:18f12ac01097 952
nyatla 109:18f12ac01097 953