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:
Wed Nov 19 14:45:17 2014 +0000
Revision:
109:18f12ac01097
Child:
110:257739f9b31e
new MiMicIP API;

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 109:18f12ac01097 61 #include "NyLPC_cMiMicIpTcpSocket.h"
nyatla 109:18f12ac01097 62 #include "NyLPC_cMiMicIpUdpSocket.h"
nyatla 109:18f12ac01097 63 #include "NyLPC_cMiMicIpTcpListener.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
nyatla 109:18f12ac01097 121
nyatla 109:18f12ac01097 122 NyLPC_TBool NyLPC_cMiMicIpNetIf_initialize(NyLPC_TcMiMicIpNetIf_t* i_inst)
nyatla 109:18f12ac01097 123 {
nyatla 109:18f12ac01097 124 //サービスは停止している事。 - Service must be uninitialized.
nyatla 109:18f12ac01097 125 NyLPC_Assert(!NyLPC_cMiMicIpNetIf_isInitService());
nyatla 109:18f12ac01097 126 //IP処理部分の初期化
nyatla 109:18f12ac01097 127 NyLPC_cIPv4_initialize(&(i_inst->_tcpv4));
nyatla 109:18f12ac01097 128 //EMAC割込セマフォ
nyatla 109:18f12ac01097 129 NyLPC_cSemaphore_initialize(&i_inst->_emac_semapho);
nyatla 109:18f12ac01097 130
nyatla 109:18f12ac01097 131 i_inst->_status=0x00;
nyatla 109:18f12ac01097 132 NyLPC_cStopwatch_initialize(&(i_inst->_arp_sw));
nyatla 109:18f12ac01097 133 NyLPC_cStopwatch_initialize(&(i_inst->_periodic_sw));
nyatla 109:18f12ac01097 134 NyLPC_cIPv4_initialize(&(i_inst->_tcpv4));
nyatla 109:18f12ac01097 135 NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_mutex)));
nyatla 109:18f12ac01097 136
nyatla 109:18f12ac01097 137 _NyLPC_TcMiMicIpNetIf_inst=i_inst;
nyatla 109:18f12ac01097 138 //タスク起動
nyatla 109:18f12ac01097 139 NyLPC_cThread_initialize(&th,NyLPC_cMiMicIpNetIf_config_STACK_SIZE,NyLPC_TcThread_PRIORITY_SERVICE);
nyatla 109:18f12ac01097 140 NyLPC_cThread_start(&th,uipTask,NULL);
nyatla 109:18f12ac01097 141 return NyLPC_TBool_TRUE;
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
nyatla 109:18f12ac01097 149
nyatla 109:18f12ac01097 150 /**
nyatla 109:18f12ac01097 151 * UIP処理を開始します。
nyatla 109:18f12ac01097 152 * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。
nyatla 109:18f12ac01097 153 * @param i_ref_config
nyatla 109:18f12ac01097 154 * このコンフィギュレーションは、stopを実行するまでの間、インスタンスから参照します。外部で保持してください。
nyatla 109:18f12ac01097 155 */
nyatla 109:18f12ac01097 156 void NyLPC_cMiMicIpNetIf_start(const NyLPC_TcIPv4Config_t* i_ref_config)
nyatla 109:18f12ac01097 157 {
nyatla 109:18f12ac01097 158 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 159 NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
nyatla 109:18f12ac01097 160 if(!NyLPC_cMiMicIpNetIf_isRun())
nyatla 109:18f12ac01097 161 {
nyatla 109:18f12ac01097 162 //はじめて起動するときに1度だけデバイス取得(タスクスイッチが動いてないと動かないからここで。)
nyatla 109:18f12ac01097 163 if(inst->_ethif==NULL){
nyatla 109:18f12ac01097 164 inst->_ethif=getEthernetDevicePnP();
nyatla 109:18f12ac01097 165 }
nyatla 109:18f12ac01097 166 //コンフィグレーションセット
nyatla 109:18f12ac01097 167 inst->_netinfo.current_config=i_ref_config;
nyatla 109:18f12ac01097 168 //開始要求セット
nyatla 109:18f12ac01097 169 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_START);
nyatla 109:18f12ac01097 170 //Order実行待ち
nyatla 109:18f12ac01097 171 while(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_START)){
nyatla 109:18f12ac01097 172 NyLPC_cThread_sleep(10);
nyatla 109:18f12ac01097 173 }
nyatla 109:18f12ac01097 174 //デバイス情報の追記
nyatla 109:18f12ac01097 175 inst->_netinfo.device_name=NyLPC_iEthernetDevice_getDevicName(inst->_ethif);
nyatla 109:18f12ac01097 176 }
nyatla 109:18f12ac01097 177 return;
nyatla 109:18f12ac01097 178 }
nyatla 109:18f12ac01097 179 /**
nyatla 109:18f12ac01097 180 * UIP処理を停止します。
nyatla 109:18f12ac01097 181 * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。
nyatla 109:18f12ac01097 182 * いまのところ、ストップシーケンスの実装は良くありません。
nyatla 109:18f12ac01097 183 * 再設計が必要。
nyatla 109:18f12ac01097 184 */
nyatla 109:18f12ac01097 185 void NyLPC_cMiMicIpNetIf_stop(void)
nyatla 109:18f12ac01097 186 {
nyatla 109:18f12ac01097 187 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 188 NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
nyatla 109:18f12ac01097 189 if(NyLPC_cMiMicIpNetIf_isRun())
nyatla 109:18f12ac01097 190 {
nyatla 109:18f12ac01097 191 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_STOP);
nyatla 109:18f12ac01097 192 //Order実行待ち
nyatla 109:18f12ac01097 193 while(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_STOP)){
nyatla 109:18f12ac01097 194 NyLPC_cThread_sleep(10);
nyatla 109:18f12ac01097 195 }
nyatla 109:18f12ac01097 196 }
nyatla 109:18f12ac01097 197 return;
nyatla 109:18f12ac01097 198 }
nyatla 109:18f12ac01097 199
nyatla 109:18f12ac01097 200 static const struct NyLPC_TNetInterfaceInfo* NyLPC_cMiMicIpNetIf_getInterfaceInfo(void)
nyatla 109:18f12ac01097 201 {
nyatla 109:18f12ac01097 202 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 203 return &inst->_netinfo;
nyatla 109:18f12ac01097 204 }
nyatla 109:18f12ac01097 205
nyatla 109:18f12ac01097 206 /**********************************************************************
nyatla 109:18f12ac01097 207 *
nyatla 109:18f12ac01097 208 * </HWコールバックに関わる宣言>
nyatla 109:18f12ac01097 209 *
nyatla 109:18f12ac01097 210 *********************************************************************/
nyatla 109:18f12ac01097 211
nyatla 109:18f12ac01097 212
nyatla 109:18f12ac01097 213 //PERIODIC rate
nyatla 109:18f12ac01097 214 #define PERIODIC_TIMER (1*200)
nyatla 109:18f12ac01097 215 #define ARP_TIMER (60*1000*10)
nyatla 109:18f12ac01097 216
nyatla 109:18f12ac01097 217
nyatla 109:18f12ac01097 218
nyatla 109:18f12ac01097 219 /**
nyatla 109:18f12ac01097 220 * 操作キューを確認して、タスクのステータスをアップデートします。
nyatla 109:18f12ac01097 221 * 高速化のため、Proc-Callerを使用していません。複雑なタスク操作をするときには、書き換えてください。
nyatla 109:18f12ac01097 222 * @return
nyatla 109:18f12ac01097 223 * UIPタスクの実行状態
nyatla 109:18f12ac01097 224 */
nyatla 109:18f12ac01097 225 static NyLPC_TBool updateTaskStatus()
nyatla 109:18f12ac01097 226 {
nyatla 109:18f12ac01097 227 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 228 if(NyLPC_cMiMicIpNetIf_isRun()){
nyatla 109:18f12ac01097 229 //開始状態
nyatla 109:18f12ac01097 230 if(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_STOP))
nyatla 109:18f12ac01097 231 {
nyatla 109:18f12ac01097 232 //停止操作
nyatla 109:18f12ac01097 233 NyLPC_iEthernetDevice_stop(inst->_ethif);
nyatla 109:18f12ac01097 234 NyLPC_cIPv4_stop(&(inst->_tcpv4));
nyatla 109:18f12ac01097 235 NyLPC_cIPv4IComp_finalize(&(inst->_icomp));
nyatla 109:18f12ac01097 236 NyLPC_cIPv4Arp_finalize(&(inst->_arp));
nyatla 109:18f12ac01097 237 // inst->_ref_config=NULL;
nyatla 109:18f12ac01097 238 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcMiMicIpNetIf_STATUSBIT_IS_RUNNING);
nyatla 109:18f12ac01097 239 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_STOP);
nyatla 109:18f12ac01097 240 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 241 }
nyatla 109:18f12ac01097 242 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 243 }else{
nyatla 109:18f12ac01097 244 //停止状態
nyatla 109:18f12ac01097 245 if(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_START))
nyatla 109:18f12ac01097 246 {
nyatla 109:18f12ac01097 247 //TCP,ICOMPの初期化
nyatla 109:18f12ac01097 248 NyLPC_cIPv4_start(&(inst->_tcpv4),inst->_netinfo.current_config);
nyatla 109:18f12ac01097 249 NyLPC_cIPv4IComp_initialize(&(inst->_icomp),inst->_netinfo.current_config);
nyatla 109:18f12ac01097 250 //uip_arp_init(msg->start.ref_config);
nyatla 109:18f12ac01097 251 NyLPC_cIPv4Arp_initialize(&(inst->_arp),inst->_netinfo.current_config);
nyatla 109:18f12ac01097 252 NyLPC_cStopwatch_startExpire(&(inst->_arp_sw),1);//1度ARPを起動するため。
nyatla 109:18f12ac01097 253 NyLPC_cStopwatch_startExpire(&(inst->_periodic_sw),PERIODIC_TIMER);
nyatla 109:18f12ac01097 254 //EtherNETデバイス初期化
nyatla 109:18f12ac01097 255 while(!NyLPC_iEthernetDevice_start(inst->_ethif,&(inst->_netinfo.current_config->eth_mac),ethernet_handler,inst));
nyatla 109:18f12ac01097 256 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcMiMicIpNetIf_STATUSBIT_IS_RUNNING);
nyatla 109:18f12ac01097 257 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcMiMicIpNetIf_ORDER_START);
nyatla 109:18f12ac01097 258 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 259 }
nyatla 109:18f12ac01097 260 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 261 }
nyatla 109:18f12ac01097 262 }
nyatla 109:18f12ac01097 263
nyatla 109:18f12ac01097 264 /**
nyatla 109:18f12ac01097 265 * uipタスクのメインループ
nyatla 109:18f12ac01097 266 */
nyatla 109:18f12ac01097 267 static int uipTask(void *pvParameters)
nyatla 109:18f12ac01097 268 {
nyatla 109:18f12ac01097 269 NyLPC_TUInt16 rx_len,tx_len;
nyatla 109:18f12ac01097 270 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 271 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 272 void* r;
nyatla 109:18f12ac01097 273 (void)pvParameters;
nyatla 109:18f12ac01097 274 for( ;; )
nyatla 109:18f12ac01097 275 {
nyatla 109:18f12ac01097 276 //タスク状態の更新
nyatla 109:18f12ac01097 277 if(!updateTaskStatus())
nyatla 109:18f12ac01097 278 {
nyatla 109:18f12ac01097 279 //RUNステータス以外の時は、ここで終了する。
nyatla 109:18f12ac01097 280 NyLPC_cThread_sleep(50);
nyatla 109:18f12ac01097 281 continue;
nyatla 109:18f12ac01097 282 }
nyatla 109:18f12ac01097 283 //イーサネットフレームの取得
nyatla 109:18f12ac01097 284 //Ethernet Device Lock(ARPを含む)
nyatla 109:18f12ac01097 285 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 286 ethbuf= (struct TEthPacket*)NyLPC_iEthernetDevice_getRxEthFrame(inst->_ethif,&rx_len);
nyatla 109:18f12ac01097 287 tx_len=0;
nyatla 109:18f12ac01097 288 while(ethbuf != NULL){
nyatla 109:18f12ac01097 289 if(rx_len>0)
nyatla 109:18f12ac01097 290 {
nyatla 109:18f12ac01097 291 //ペイロードサイズを計算
nyatla 109:18f12ac01097 292 rx_len-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 109:18f12ac01097 293 switch(ethbuf->header.type)
nyatla 109:18f12ac01097 294 {
nyatla 109:18f12ac01097 295 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IP):
nyatla 109:18f12ac01097 296 //ARPテーブルの更新
nyatla 109:18f12ac01097 297 //uip_arp_ipin(&(ethbuf->header),ethbuf->data.ipv4.srcipaddr);
nyatla 109:18f12ac01097 298 NyLPC_cIPv4Arp_incomingIp(&inst->_arp,&(ethbuf->header),ethbuf->data.ipv4.srcipaddr);
nyatla 109:18f12ac01097 299 //Ethernet Device UnLock(NyLPC_cIPv4_rxがallocをコールする可能性があるので一時的にロック解除)
nyatla 109:18f12ac01097 300 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 301 //IPパケットの処理
nyatla 109:18f12ac01097 302 r=NyLPC_cIPv4_rx(&(inst->_tcpv4),&(ethbuf->data.ipv4),rx_len);
nyatla 109:18f12ac01097 303 if(r!=NULL){
nyatla 109:18f12ac01097 304 //IPパケットとして送信
nyatla 109:18f12ac01097 305 NyLPC_cMiMicIpNetIf_sendIPv4Tx(r);
nyatla 109:18f12ac01097 306 }
nyatla 109:18f12ac01097 307 //ロックの復帰
nyatla 109:18f12ac01097 308 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 309 if(r!=NULL){
nyatla 109:18f12ac01097 310 releaseTxBufNL(r);
nyatla 109:18f12ac01097 311 }
nyatla 109:18f12ac01097 312 break;
nyatla 109:18f12ac01097 313 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_ARP):
nyatla 109:18f12ac01097 314 //Ethernet Device UnLock(NyLPC_cIPv4_rxがallocをコールする可能性があるので一時的にロック解除)
nyatla 109:18f12ac01097 315 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 316 r=NyLPC_cIPv4Arp_rx(&inst->_arp,&(ethbuf->data.arp),rx_len,&tx_len);
nyatla 109:18f12ac01097 317 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 318 if(r!=NULL){
nyatla 109:18f12ac01097 319 sendRawEthFrameNL(r,tx_len);
nyatla 109:18f12ac01097 320 releaseTxBufNL(r);
nyatla 109:18f12ac01097 321 }
nyatla 109:18f12ac01097 322 break;
nyatla 109:18f12ac01097 323 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IPV6):
nyatla 109:18f12ac01097 324 //uip_process_ipv6();
nyatla 109:18f12ac01097 325 break;
nyatla 109:18f12ac01097 326 default:
nyatla 109:18f12ac01097 327 break;
nyatla 109:18f12ac01097 328 }
nyatla 109:18f12ac01097 329 }
nyatla 109:18f12ac01097 330 //受信キューを進行。
nyatla 109:18f12ac01097 331 NyLPC_iEthernetDevice_nextRxEthFrame(inst->_ethif);
nyatla 109:18f12ac01097 332 //受信処理
nyatla 109:18f12ac01097 333 ethbuf= (struct TEthPacket*)NyLPC_iEthernetDevice_getRxEthFrame(inst->_ethif,&rx_len);
nyatla 109:18f12ac01097 334 }
nyatla 109:18f12ac01097 335 //データが無い。
nyatla 109:18f12ac01097 336 if(NyLPC_cStopwatch_isExpired(&(inst->_arp_sw))){
nyatla 109:18f12ac01097 337 //uip_arp_timer();
nyatla 109:18f12ac01097 338 NyLPC_cIPv4Arp_periodic(&inst->_arp);
nyatla 109:18f12ac01097 339 NyLPC_cStopwatch_startExpire(&(inst->_arp_sw),ARP_TIMER);
nyatla 109:18f12ac01097 340 }
nyatla 109:18f12ac01097 341 if(NyLPC_cStopwatch_isExpired(&(inst->_periodic_sw))){
nyatla 109:18f12ac01097 342 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 343 NyLPC_cIPv4_periodec(&(inst->_tcpv4));
nyatla 109:18f12ac01097 344 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 345 NyLPC_cStopwatch_startExpire(&(inst->_periodic_sw),PERIODIC_TIMER);
nyatla 109:18f12ac01097 346 }
nyatla 109:18f12ac01097 347 //リソースロックの解除
nyatla 109:18f12ac01097 348 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 349 //割込によるセマフォの解除か、タイムアウトで再開する。(タイムアウト値は周期関数の実行レート以下にすること。)
nyatla 109:18f12ac01097 350 NyLPC_cSemaphore_take(&(_NyLPC_TcMiMicIpNetIf_inst->_emac_semapho),PERIODIC_TIMER);
nyatla 109:18f12ac01097 351 }
nyatla 109:18f12ac01097 352 return 0;
nyatla 109:18f12ac01097 353 }
nyatla 109:18f12ac01097 354
nyatla 109:18f12ac01097 355
nyatla 109:18f12ac01097 356 /**
nyatla 109:18f12ac01097 357 * イーサネットドライバからのハンドラ
nyatla 109:18f12ac01097 358 */
nyatla 109:18f12ac01097 359 static void ethernet_handler(void* i_param,NyLPC_TiEthernetDevice_EVENT i_type)
nyatla 109:18f12ac01097 360 {
nyatla 109:18f12ac01097 361 switch(i_type){
nyatla 109:18f12ac01097 362 case NyLPC_TiEthernetDevice_EVENT_ON_RX:
nyatla 109:18f12ac01097 363 //受信系のセマフォブロックの解除
nyatla 109:18f12ac01097 364 NyLPC_cSemaphore_giveFromISR(&(((NyLPC_TcMiMicIpNetIf_t*)i_param)->_emac_semapho));
nyatla 109:18f12ac01097 365 break;
nyatla 109:18f12ac01097 366 default:
nyatla 109:18f12ac01097 367 break;
nyatla 109:18f12ac01097 368 }
nyatla 109:18f12ac01097 369 }
nyatla 109:18f12ac01097 370
nyatla 109:18f12ac01097 371 /**
nyatla 109:18f12ac01097 372 * IPv4パケットのpeerIPを問い合わせるARPパケットを送信します。
nyatla 109:18f12ac01097 373 * allocを中でコールするから要UNLOCK状態
nyatla 109:18f12ac01097 374 */
nyatla 109:18f12ac01097 375 void NyLPC_cMiMicIpNetIf_sendArpRequest(const struct NyLPC_TIPv4Addr* i_addr)
nyatla 109:18f12ac01097 376 {
nyatla 109:18f12ac01097 377 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 378 void* p;
nyatla 109:18f12ac01097 379 NyLPC_TUInt16 tx_len;
nyatla 109:18f12ac01097 380 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 381 //システムTxBufを得る
nyatla 109:18f12ac01097 382 ethbuf=(struct TEthPacket*)NyLPC_cMiMicIpNetIf_allocSysTxBuf();
nyatla 109:18f12ac01097 383 //ARPパケットを作る。
nyatla 109:18f12ac01097 384 NyLPC_TArpHeader_setArpRequest(&(ethbuf->data.arp),inst->_netinfo.current_config->ip_addr,&(inst->_netinfo.current_config->eth_mac),i_addr);
nyatla 109:18f12ac01097 385 tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_netinfo.current_config->eth_mac));
nyatla 109:18f12ac01097 386 //送信
nyatla 109:18f12ac01097 387 p=((struct NyLPC_TEthernetIIHeader*)ethbuf)-1;
nyatla 109:18f12ac01097 388
nyatla 109:18f12ac01097 389 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 390 NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,p,tx_len);
nyatla 109:18f12ac01097 391 NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,p);
nyatla 109:18f12ac01097 392 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 393 }
nyatla 109:18f12ac01097 394
nyatla 109:18f12ac01097 395
nyatla 109:18f12ac01097 396
nyatla 109:18f12ac01097 397
nyatla 109:18f12ac01097 398 /**
nyatla 109:18f12ac01097 399 * allocTxBufで取得したペイロードメモリを"IPパケットとして"送信します。
nyatla 109:18f12ac01097 400 * @param i_eth_payload
nyatla 109:18f12ac01097 401 * [NyLPC_TEthernetIIHeader][payload]メモリの、[payload]のアドレスを指定します。
nyatla 109:18f12ac01097 402 * 通常は、NyLPC_cUipService_allocTxBufの返却したメモリを指定します。
nyatla 109:18f12ac01097 403 */
nyatla 109:18f12ac01097 404
nyatla 109:18f12ac01097 405 void NyLPC_cMiMicIpNetIf_sendIPv4Tx(void* i_eth_payload)
nyatla 109:18f12ac01097 406 {
nyatla 109:18f12ac01097 407 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 408 void* p=((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1;
nyatla 109:18f12ac01097 409 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 410 //IPパケットの送信を試行
nyatla 109:18f12ac01097 411 if(sendIPv4Tx((struct TEthPacket*)p)){
nyatla 109:18f12ac01097 412 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 413 return;
nyatla 109:18f12ac01097 414 }
nyatla 109:18f12ac01097 415 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 416 //ARPリクエストを代わりに送信
nyatla 109:18f12ac01097 417 NyLPC_cMiMicIpNetIf_sendArpRequest(&((struct NyLPC_TIPv4Header*)i_eth_payload)->destipaddr);
nyatla 109:18f12ac01097 418 return;
nyatla 109:18f12ac01097 419 }
nyatla 109:18f12ac01097 420
nyatla 109:18f12ac01097 421
nyatla 109:18f12ac01097 422 /**
nyatla 109:18f12ac01097 423 * ARPテーブルに指定したIPがあるかを返します。
nyatla 109:18f12ac01097 424 */
nyatla 109:18f12ac01097 425 NyLPC_TBool NyLPC_cMiMicIpNetIf_hasArpInfo(const struct NyLPC_TIPv4Addr* i_addr)
nyatla 109:18f12ac01097 426 {
nyatla 109:18f12ac01097 427 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 428 return NyLPC_cIPv4Arp_IPv4toEthAddr(&inst->_arp,*i_addr)!=NULL;
nyatla 109:18f12ac01097 429 }
nyatla 109:18f12ac01097 430
nyatla 109:18f12ac01097 431 /**
nyatla 109:18f12ac01097 432 * システム用の送信ペイロードを返します。
nyatla 109:18f12ac01097 433 * 関数は必ず成功します。
nyatla 109:18f12ac01097 434 */
nyatla 109:18f12ac01097 435 void* NyLPC_cMiMicIpNetIf_allocSysTxBuf(void)
nyatla 109:18f12ac01097 436 {
nyatla 109:18f12ac01097 437 NyLPC_TUInt16 s;
nyatla 109:18f12ac01097 438 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 439 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 440 //排他処理をして、メモリを取得する。SYSTEMメモリはEthernetドライバの解放待ちのみなのでまとめてLOCKしておk
nyatla 109:18f12ac01097 441 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 442 for(;;){
nyatla 109:18f12ac01097 443 ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,NyLPC_TcEthernetMM_HINT_CTRL_PACKET,&s);
nyatla 109:18f12ac01097 444 if(ethbuf==NULL){
nyatla 109:18f12ac01097 445 NyLPC_cThread_yield();
nyatla 109:18f12ac01097 446 continue;
nyatla 109:18f12ac01097 447 }
nyatla 109:18f12ac01097 448 break;
nyatla 109:18f12ac01097 449 }
nyatla 109:18f12ac01097 450 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 451 //イーサネットバッファのアドレスを計算
nyatla 109:18f12ac01097 452 return &(ethbuf->data);
nyatla 109:18f12ac01097 453 }
nyatla 109:18f12ac01097 454
nyatla 109:18f12ac01097 455
nyatla 109:18f12ac01097 456
nyatla 109:18f12ac01097 457 void* NyLPC_cMiMicIpNetIf_allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size)
nyatla 109:18f12ac01097 458 {
nyatla 109:18f12ac01097 459 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 460 struct TEthPacket* ethbuf;
nyatla 109:18f12ac01097 461 //排他処理をして、メモリを取得する。
nyatla 109:18f12ac01097 462 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 463 ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,i_hint+sizeof(struct NyLPC_TEthernetIIHeader),o_size);
nyatla 109:18f12ac01097 464 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 465 if(ethbuf==NULL){
nyatla 109:18f12ac01097 466 return NULL;
nyatla 109:18f12ac01097 467 }
nyatla 109:18f12ac01097 468 //イーサネットバッファのサイズを計算
nyatla 109:18f12ac01097 469 *o_size-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 109:18f12ac01097 470 //イーサネットバッファのアドレスを計算
nyatla 109:18f12ac01097 471 return &(ethbuf->data);
nyatla 109:18f12ac01097 472 }
nyatla 109:18f12ac01097 473
nyatla 109:18f12ac01097 474
nyatla 109:18f12ac01097 475 void* NyLPC_cMiMicIpNetIf_releaseTxBuf(void* i_buf)
nyatla 109:18f12ac01097 476 {
nyatla 109:18f12ac01097 477 //排他処理をして、メモリを開放する。
nyatla 109:18f12ac01097 478 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 479 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 109:18f12ac01097 480 //ペイロードの位置から、メモリブロックを再生。
nyatla 109:18f12ac01097 481 NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
nyatla 109:18f12ac01097 482 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 109:18f12ac01097 483 return NULL;
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
nyatla 109:18f12ac01097 494 /**
nyatla 109:18f12ac01097 495 * イーサネットフレームを送信します。
nyatla 109:18f12ac01097 496 * この関数はiptaskで実行される関数からのみ使用てください。
nyatla 109:18f12ac01097 497 * @i_buf
nyatla 109:18f12ac01097 498 * イーサネットフレームを格納したメモリです。
nyatla 109:18f12ac01097 499 * @i_len
nyatla 109:18f12ac01097 500 * イーサネットペイロードのサイズです。
nyatla 109:18f12ac01097 501 */
nyatla 109:18f12ac01097 502 static void sendRawEthFrameNL(void* i_buf,NyLPC_TUInt16 i_len)
nyatla 109:18f12ac01097 503 {
nyatla 109:18f12ac01097 504 NyLPC_iEthernetDevice_sendTxEthFrame(
nyatla 109:18f12ac01097 505 _NyLPC_TcMiMicIpNetIf_inst->_ethif,
nyatla 109:18f12ac01097 506 ((struct NyLPC_TEthernetIIHeader*)i_buf)-1,
nyatla 109:18f12ac01097 507 i_len);
nyatla 109:18f12ac01097 508 return;
nyatla 109:18f12ac01097 509 }
nyatla 109:18f12ac01097 510 /**
nyatla 109:18f12ac01097 511 * ロック状態で使用できるreleaseTxBuf。
nyatla 109:18f12ac01097 512 * この関数はiptaskで実行される関数からのみ使用してください。
nyatla 109:18f12ac01097 513 */
nyatla 109:18f12ac01097 514 static void releaseTxBufNL(void* i_buf)
nyatla 109:18f12ac01097 515 {
nyatla 109:18f12ac01097 516 //ペイロードの位置から、メモリブロックを再生。
nyatla 109:18f12ac01097 517 NyLPC_iEthernetDevice_releaseTxBuf(
nyatla 109:18f12ac01097 518 _NyLPC_TcMiMicIpNetIf_inst->_ethif,
nyatla 109:18f12ac01097 519 ((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
nyatla 109:18f12ac01097 520 return;
nyatla 109:18f12ac01097 521 }
nyatla 109:18f12ac01097 522 /**
nyatla 109:18f12ac01097 523 * マルチキャスとアドレスへ変換する。
nyatla 109:18f12ac01097 524 */
nyatla 109:18f12ac01097 525 static void ip2MulticastEmacAddr(const struct NyLPC_TIPv4Addr* i_addr,struct NyLPC_TEthAddr* o_emac)
nyatla 109:18f12ac01097 526 {
nyatla 109:18f12ac01097 527 NyLPC_TUInt32 n=NyLPC_htonl(i_addr->v);
nyatla 109:18f12ac01097 528 o_emac->addr[0]=0x01;
nyatla 109:18f12ac01097 529 o_emac->addr[1]=0x00;
nyatla 109:18f12ac01097 530 o_emac->addr[2]=0x5E;
nyatla 109:18f12ac01097 531 o_emac->addr[3]=((n>>16) & 0x7f);
nyatla 109:18f12ac01097 532 o_emac->addr[4]=((n>> 8) & 0xff);
nyatla 109:18f12ac01097 533 o_emac->addr[5]=(n & 0xff);
nyatla 109:18f12ac01097 534 return;
nyatla 109:18f12ac01097 535 };
nyatla 109:18f12ac01097 536
nyatla 109:18f12ac01097 537 /**
nyatla 109:18f12ac01097 538 * ペイロードをIPパケットとしてネットワークへ送出します。
nyatla 109:18f12ac01097 539 * コール前に、必ずロックしてから呼び出してください。
nyatla 109:18f12ac01097 540 * @param i_eth_payload
nyatla 109:18f12ac01097 541 * allocTxBufで確保したメモリを指定してください。
nyatla 109:18f12ac01097 542 * ペイロードには、TCP/IPパケットを格納します。
nyatla 109:18f12ac01097 543 */
nyatla 109:18f12ac01097 544 static NyLPC_TBool sendIPv4Tx(struct TEthPacket* i_eth_buf)
nyatla 109:18f12ac01097 545 {
nyatla 109:18f12ac01097 546 NyLPC_TcMiMicIpNetIf_t* inst=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 547 struct NyLPC_TEthAddr emac;
nyatla 109:18f12ac01097 548 NyLPC_TUInt16 tx_len;
nyatla 109:18f12ac01097 549 const struct NyLPC_TEthAddr* eth_dest;
nyatla 109:18f12ac01097 550 //ペイロードのアドレスから、イーサネットフレームバッファのアドレスを復元
nyatla 109:18f12ac01097 551
nyatla 109:18f12ac01097 552 if(NyLPC_TIPv4Addr_isEqual(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_BROADCAST)) {
nyatla 109:18f12ac01097 553 //ブロードキャストならそのまま
nyatla 109:18f12ac01097 554 eth_dest=&NyLPC_TEthAddr_BROADCAST;
nyatla 109:18f12ac01097 555 }else if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
nyatla 109:18f12ac01097 556 //マルチキャスト
nyatla 109:18f12ac01097 557 ip2MulticastEmacAddr(&(i_eth_buf->data.ipv4.destipaddr),&emac);
nyatla 109:18f12ac01097 558 eth_dest=&emac;
nyatla 109:18f12ac01097 559 }else{
nyatla 109:18f12ac01097 560 //LocalIP以外ならdefaultRootへ変換
nyatla 109:18f12ac01097 561 eth_dest=NyLPC_cIPv4Arp_IPv4toEthAddr(
nyatla 109:18f12ac01097 562 &inst->_arp,
nyatla 109:18f12ac01097 563 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 564 //IP->MAC変換をテスト。
nyatla 109:18f12ac01097 565 if(eth_dest==NULL){
nyatla 109:18f12ac01097 566 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 567 }
nyatla 109:18f12ac01097 568 }
nyatla 109:18f12ac01097 569 //変換可能なら、イーサネットヘッダを更新して、送信処理へ。
nyatla 109:18f12ac01097 570 tx_len=NyLPC_TEthernetIIHeader_setIPv4Tx(&(i_eth_buf->header),&(inst->_netinfo.current_config->eth_mac),eth_dest);
nyatla 109:18f12ac01097 571 NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,i_eth_buf,tx_len);
nyatla 109:18f12ac01097 572 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 573 }
nyatla 109:18f12ac01097 574
nyatla 109:18f12ac01097 575 static NyLPC_TBool isInitService(void)
nyatla 109:18f12ac01097 576 {
nyatla 109:18f12ac01097 577 return _NyLPC_TcMiMicIpNetIf_inst!=NULL;
nyatla 109:18f12ac01097 578 }
nyatla 109:18f12ac01097 579
nyatla 109:18f12ac01097 580 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 581 //
nyatla 109:18f12ac01097 582 // NetIF Interface
nyatla 109:18f12ac01097 583 //
nyatla 109:18f12ac01097 584 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 585
nyatla 109:18f12ac01097 586
nyatla 109:18f12ac01097 587 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 588 // フラグ
nyatla 109:18f12ac01097 589 static NyLPC_TUInt8 socket_flags[
nyatla 109:18f12ac01097 590 NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX+
nyatla 109:18f12ac01097 591 NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX+
nyatla 109:18f12ac01097 592 NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX+
nyatla 109:18f12ac01097 593 NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX];
nyatla 109:18f12ac01097 594
nyatla 109:18f12ac01097 595 #define FLAGS_USED 0x01
nyatla 109:18f12ac01097 596 #define TCP_SOCK_FLSGS(i) (socket_flags[(i)])
nyatla 109:18f12ac01097 597 #define UDP_SOCK_FLSGS(i) (socket_flags[(i)+NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX])
nyatla 109:18f12ac01097 598 #define UDP_NB_SOCK_FLSGS(i) (socket_flags[(i)+NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX+NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX])
nyatla 109:18f12ac01097 599 #define TCP_LISTENER_FLSGS(i) (socket_flags[(i)+NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX+NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX+NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX])
nyatla 109:18f12ac01097 600
nyatla 109:18f12ac01097 601
nyatla 109:18f12ac01097 602 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 603 // SOCKETインスタンスのメモリブロック
nyatla 109:18f12ac01097 604 static NyLPC_TUInt8 socket_memblock[
nyatla 109:18f12ac01097 605 sizeof(NyLPC_TcMiMicIpTcpSocket_t)*NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX +
nyatla 109:18f12ac01097 606 sizeof(NyLPC_TcMiMicIpUdpSocket_t)*NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX +
nyatla 109:18f12ac01097 607 sizeof(NyLPC_TcMiMicIpUdpSocket_t)*NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX+
nyatla 109:18f12ac01097 608 sizeof(NyLPC_TcMiMicIpTcpListener_t)*NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX];
nyatla 109:18f12ac01097 609
nyatla 109:18f12ac01097 610 #define TCP_SOCK_TBL(i) (((NyLPC_TcMiMicIpTcpSocket_t*)socket_memblock)+i)
nyatla 109:18f12ac01097 611 #define UDP_SOCK_TBL(i) (((NyLPC_TcMiMicIpUdpSocket_t*)(TCP_SOCK_TBL(NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX)))+i)
nyatla 109:18f12ac01097 612 #define UDP_NB_SOCK_TBL(i) (((NyLPC_TcMiMicIpUdpSocket_t*)(UDP_SOCK_TBL(NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX)))+i)
nyatla 109:18f12ac01097 613 #define TCP_LISTENER_TBL(i) (((NyLPC_TcMiMicIpTcpListener_t*)(UDP_NB_SOCK_TBL(NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX)))+i)
nyatla 109:18f12ac01097 614
nyatla 109:18f12ac01097 615
nyatla 109:18f12ac01097 616 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 617 // ソケットのメモリ
nyatla 109:18f12ac01097 618
nyatla 109:18f12ac01097 619 static NyLPC_TUInt8 socket_buffer[
nyatla 109:18f12ac01097 620 NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE*NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX+
nyatla 109:18f12ac01097 621 NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE*NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX];
nyatla 109:18f12ac01097 622
nyatla 109:18f12ac01097 623 #define TCP_SOCK_BUF(i) (socket_buffer+(i)*NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE)
nyatla 109:18f12ac01097 624 #define UDP_SOCK_BUF(i) (TCP_SOCK_BUF(NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX)+(i)*NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE)
nyatla 109:18f12ac01097 625
nyatla 109:18f12ac01097 626 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 627 // インタフェイス関数
nyatla 109:18f12ac01097 628
nyatla 109:18f12ac01097 629 static NyLPC_TiTcpSocket_t* createTcpSocetEx(NyLPC_TSocketType i_socktype)
nyatla 109:18f12ac01097 630 {
nyatla 109:18f12ac01097 631 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 632 switch(i_socktype){
nyatla 109:18f12ac01097 633 case NyLPC_TSocketType_TCP_HTTP:
nyatla 109:18f12ac01097 634 case NyLPC_TSocketType_TCP_NORMAL:
nyatla 109:18f12ac01097 635 //空きソケットの探索
nyatla 109:18f12ac01097 636 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 637 //未使用なソケットを得る
nyatla 109:18f12ac01097 638 if((TCP_SOCK_FLSGS(i)&FLAGS_USED)==0){
nyatla 109:18f12ac01097 639 if(!NyLPC_cMiMicIpTcpSocket_initialize(TCP_SOCK_TBL(i),TCP_SOCK_BUF(i),NyLPC_cMiMicIpNetIf_config_TCPSOCKET_RX_BUFFER_SIZE)){
nyatla 109:18f12ac01097 640 return NULL;
nyatla 109:18f12ac01097 641 }
nyatla 109:18f12ac01097 642 //ソケットを使用中に
nyatla 109:18f12ac01097 643 TCP_SOCK_FLSGS(i)|=FLAGS_USED;
nyatla 109:18f12ac01097 644 return &(TCP_SOCK_TBL(i)->_super._super.tcp_sock);
nyatla 109:18f12ac01097 645 }
nyatla 109:18f12ac01097 646 }
nyatla 109:18f12ac01097 647 break;
nyatla 109:18f12ac01097 648 default:
nyatla 109:18f12ac01097 649 break;
nyatla 109:18f12ac01097 650 }
nyatla 109:18f12ac01097 651 return NULL;
nyatla 109:18f12ac01097 652 }
nyatla 109:18f12ac01097 653
nyatla 109:18f12ac01097 654 static NyLPC_TiUdpSocket_t* createUdpSocetEx(NyLPC_TUInt16 i_port,NyLPC_TSocketType i_socktype)
nyatla 109:18f12ac01097 655 {
nyatla 109:18f12ac01097 656 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 657 switch(i_socktype){
nyatla 109:18f12ac01097 658 case NyLPC_TSocketType_UDP_NORMAL:
nyatla 109:18f12ac01097 659 //空きソケットの探索
nyatla 109:18f12ac01097 660 for(i=0;i<NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 661 //未使用なソケットを得る
nyatla 109:18f12ac01097 662 if((UDP_SOCK_FLSGS(i)&FLAGS_USED)==0){
nyatla 109:18f12ac01097 663 if(!NyLPC_cMiMicIpUdpSocket_initialize(UDP_SOCK_TBL(i),i_port,UDP_SOCK_BUF(i),NyLPC_cMiMicIpNetIf_config_UDPSOCKET_RX_BUFFER_SIZE)){
nyatla 109:18f12ac01097 664 return NULL;
nyatla 109:18f12ac01097 665 }
nyatla 109:18f12ac01097 666 UDP_SOCK_FLSGS(i)|=FLAGS_USED;
nyatla 109:18f12ac01097 667 return &(UDP_SOCK_TBL(i)->_super._super.udp_sock);
nyatla 109:18f12ac01097 668 }
nyatla 109:18f12ac01097 669 }
nyatla 109:18f12ac01097 670 break;
nyatla 109:18f12ac01097 671 case NyLPC_TSocketType_UDP_NOBUF:
nyatla 109:18f12ac01097 672 //空きソケットの探索
nyatla 109:18f12ac01097 673 for(i=0;i<NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 674 //未使用なソケットを得る
nyatla 109:18f12ac01097 675 if((UDP_NB_SOCK_FLSGS(i)&FLAGS_USED)==0){
nyatla 109:18f12ac01097 676 if(!NyLPC_cMiMicIpUdpSocket_initialize(UDP_NB_SOCK_TBL(i),i_port,NULL,0)){
nyatla 109:18f12ac01097 677 return NULL;
nyatla 109:18f12ac01097 678 }
nyatla 109:18f12ac01097 679 UDP_NB_SOCK_FLSGS(i)|=FLAGS_USED;
nyatla 109:18f12ac01097 680 return &(UDP_NB_SOCK_TBL(i)->_super._super.udp_sock);
nyatla 109:18f12ac01097 681 }
nyatla 109:18f12ac01097 682 }
nyatla 109:18f12ac01097 683 break;
nyatla 109:18f12ac01097 684 default:
nyatla 109:18f12ac01097 685 break;
nyatla 109:18f12ac01097 686 }
nyatla 109:18f12ac01097 687 return NULL;
nyatla 109:18f12ac01097 688 }
nyatla 109:18f12ac01097 689 static NyLPC_TiTcpListener_t* createTcpListener(NyLPC_TUInt16 i_port)
nyatla 109:18f12ac01097 690 {
nyatla 109:18f12ac01097 691 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 692 //空きソケットの探索
nyatla 109:18f12ac01097 693 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX;i++){
nyatla 109:18f12ac01097 694 //未使用なソケットを得る
nyatla 109:18f12ac01097 695 if((TCP_LISTENER_FLSGS(i)&FLAGS_USED)==0){
nyatla 109:18f12ac01097 696 if(!NyLPC_cMiMicIpTcpListener_initialize(TCP_LISTENER_TBL(i),i_port)){
nyatla 109:18f12ac01097 697 return NULL;
nyatla 109:18f12ac01097 698 }
nyatla 109:18f12ac01097 699 //ソケットを使用中に
nyatla 109:18f12ac01097 700 TCP_LISTENER_FLSGS(i)|=FLAGS_USED;
nyatla 109:18f12ac01097 701 return &(TCP_LISTENER_TBL(i)->_super._super.tcp_listener);
nyatla 109:18f12ac01097 702 }
nyatla 109:18f12ac01097 703 }
nyatla 109:18f12ac01097 704 return NULL;
nyatla 109:18f12ac01097 705 }
nyatla 109:18f12ac01097 706
nyatla 109:18f12ac01097 707
nyatla 109:18f12ac01097 708 static const struct NyLPC_TiNetInterface_Interface _interface=
nyatla 109:18f12ac01097 709 {
nyatla 109:18f12ac01097 710 createTcpSocetEx,
nyatla 109:18f12ac01097 711 createUdpSocetEx,
nyatla 109:18f12ac01097 712 createTcpListener,
nyatla 109:18f12ac01097 713 NyLPC_cMiMicIpNetIf_start,
nyatla 109:18f12ac01097 714 NyLPC_cMiMicIpNetIf_stop,
nyatla 109:18f12ac01097 715 NyLPC_cMiMicIpNetIf_sendArpRequest,
nyatla 109:18f12ac01097 716 NyLPC_cMiMicIpNetIf_hasArpInfo,
nyatla 109:18f12ac01097 717 isInitService,//NyLPC_TiNetInterface_isInitService isinitservice;
nyatla 109:18f12ac01097 718 NyLPC_cMiMicIpNetIf_getInterfaceInfo
nyatla 109:18f12ac01097 719 };
nyatla 109:18f12ac01097 720 //--------------------------------------------------------------------------------
nyatla 109:18f12ac01097 721 // インスタンスのリリース(protected)
nyatla 109:18f12ac01097 722
nyatla 109:18f12ac01097 723 void NyLPC_cMiMicIpNetIf_releaseTcpSocketMemory(const NyLPC_TcMiMicIpTcpSocket_t* i_inst)
nyatla 109:18f12ac01097 724 {
nyatla 109:18f12ac01097 725 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 726 //空きソケットの探索
nyatla 109:18f12ac01097 727 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 728 if((TCP_SOCK_TBL(i))==i_inst){
nyatla 109:18f12ac01097 729 TCP_SOCK_FLSGS(i)&=~FLAGS_USED;
nyatla 109:18f12ac01097 730 return;
nyatla 109:18f12ac01097 731 }
nyatla 109:18f12ac01097 732 }
nyatla 109:18f12ac01097 733 return;
nyatla 109:18f12ac01097 734 }
nyatla 109:18f12ac01097 735 void NyLPC_cMiMicIpNetIf_releaseUdpSocketMemory(const NyLPC_TcMiMicIpUdpSocket_t* i_inst)
nyatla 109:18f12ac01097 736 {
nyatla 109:18f12ac01097 737 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 738 for(i=0;i<NyLPC_cMiMicIpNetIf_config_UDPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 739 if((UDP_SOCK_TBL(i))==i_inst){
nyatla 109:18f12ac01097 740 UDP_SOCK_FLSGS(i)&=~FLAGS_USED;
nyatla 109:18f12ac01097 741 return;
nyatla 109:18f12ac01097 742 }
nyatla 109:18f12ac01097 743 }
nyatla 109:18f12ac01097 744 for(i=0;i<NyLPC_cMiMicIpNetIf_config_NB_UDPSOCKET_MAX;i++){
nyatla 109:18f12ac01097 745 if((UDP_NB_SOCK_TBL(i))==i_inst){
nyatla 109:18f12ac01097 746 UDP_NB_SOCK_FLSGS(i)&=~FLAGS_USED;
nyatla 109:18f12ac01097 747 return;
nyatla 109:18f12ac01097 748 }
nyatla 109:18f12ac01097 749 }
nyatla 109:18f12ac01097 750 return;
nyatla 109:18f12ac01097 751 }
nyatla 109:18f12ac01097 752 void NyLPC_cMiMicIpNetIf_releaseTcpListenerMemory(const NyLPC_TcMiMicIpTcpListener_t* i_inst)
nyatla 109:18f12ac01097 753 {
nyatla 109:18f12ac01097 754 NyLPC_TUInt16 i;
nyatla 109:18f12ac01097 755 //空きソケットの探索
nyatla 109:18f12ac01097 756 for(i=0;i<NyLPC_cMiMicIpNetIf_config_TCPLISTENER_MAX;i++){
nyatla 109:18f12ac01097 757 if((TCP_LISTENER_TBL(i))==i_inst){
nyatla 109:18f12ac01097 758 TCP_LISTENER_FLSGS(i)&=~FLAGS_USED;
nyatla 109:18f12ac01097 759 return;
nyatla 109:18f12ac01097 760 }
nyatla 109:18f12ac01097 761 }
nyatla 109:18f12ac01097 762 return;
nyatla 109:18f12ac01097 763 }
nyatla 109:18f12ac01097 764
nyatla 109:18f12ac01097 765 static NyLPC_TcMiMicIpNetIf_t _netif;
nyatla 109:18f12ac01097 766
nyatla 109:18f12ac01097 767 const struct NyLPC_TiNetInterface_Interface* NyLPC_cMiMicIpNetIf_getNetInterface(void)
nyatla 109:18f12ac01097 768 {
nyatla 109:18f12ac01097 769 NyLPC_cMiMicIpNetIf_initialize(&_netif);
nyatla 109:18f12ac01097 770 return &_interface;
nyatla 109:18f12ac01097 771 }
nyatla 109:18f12ac01097 772
nyatla 109:18f12ac01097 773
nyatla 109:18f12ac01097 774