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 Oct 01 13:58:53 2014 +0000
Revision:
92:4f77028cce64
Parent:
91:db8279c869d3
?????????????????; K64F??????????????; LPC?????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 0:142ee8b12fef 1 /*********************************************************************************
nyatla 0:142ee8b12fef 2 * PROJECT: MiMic
nyatla 0:142ee8b12fef 3 * --------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 4 *
nyatla 0:142ee8b12fef 5 * This file is part of MiMic
nyatla 0:142ee8b12fef 6 * Copyright (C)2011 Ryo Iizuka
nyatla 0:142ee8b12fef 7 *
nyatla 0:142ee8b12fef 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 0:142ee8b12fef 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 0:142ee8b12fef 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 0:142ee8b12fef 11 * (at your option) any later version.
nyatla 0:142ee8b12fef 12 *
nyatla 0:142ee8b12fef 13 * This program is distributed in the hope that it will be useful,
nyatla 0:142ee8b12fef 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 0:142ee8b12fef 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 0:142ee8b12fef 16 * GNU General Public License for more details.
nyatla 0:142ee8b12fef 17 *
nyatla 0:142ee8b12fef 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 0:142ee8b12fef 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 0:142ee8b12fef 20 *
nyatla 0:142ee8b12fef 21 * For further information please contact.
nyatla 0:142ee8b12fef 22 * http://nyatla.jp/
nyatla 0:142ee8b12fef 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 0:142ee8b12fef 24 *
nyatla 0:142ee8b12fef 25 *
nyatla 0:142ee8b12fef 26 * Parts of this file were leveraged from uIP:
nyatla 0:142ee8b12fef 27 *
nyatla 0:142ee8b12fef 28 * Copyright (c) 2001-2003, Adam Dunkels.
nyatla 0:142ee8b12fef 29 * All rights reserved.
nyatla 0:142ee8b12fef 30 *
nyatla 0:142ee8b12fef 31 * Redistribution and use in source and binary forms, with or without
nyatla 0:142ee8b12fef 32 * modification, are permitted provided that the following conditions
nyatla 0:142ee8b12fef 33 * are met:
nyatla 0:142ee8b12fef 34 * 1. Redistributions of source code must retain the above copyright
nyatla 0:142ee8b12fef 35 * notice, this list of conditions and the following disclaimer.
nyatla 0:142ee8b12fef 36 * 2. Redistributions in binary form must reproduce the above copyright
nyatla 0:142ee8b12fef 37 * notice, this list of conditions and the following disclaimer in the
nyatla 0:142ee8b12fef 38 * documentation and/or other materials provided with the distribution.
nyatla 0:142ee8b12fef 39 * 3. The name of the author may not be used to endorse or promote
nyatla 0:142ee8b12fef 40 * products derived from this software without specific prior
nyatla 0:142ee8b12fef 41 * written permission.
nyatla 0:142ee8b12fef 42 *
nyatla 0:142ee8b12fef 43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
nyatla 0:142ee8b12fef 44 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
nyatla 0:142ee8b12fef 45 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
nyatla 0:142ee8b12fef 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
nyatla 0:142ee8b12fef 47 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nyatla 0:142ee8b12fef 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
nyatla 0:142ee8b12fef 49 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
nyatla 0:142ee8b12fef 50 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
nyatla 0:142ee8b12fef 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
nyatla 0:142ee8b12fef 52 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
nyatla 0:142ee8b12fef 53 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nyatla 0:142ee8b12fef 54 */
nyatla 37:fc4b4fd6a649 55 #include "NyLPC_cUipService_protected.h"
nyatla 2:b96c1e90d120 56 #include "NyLPC_cIPv4IComp_protected.h"
nyatla 0:142ee8b12fef 57 #include "NyLPC_cTcpListener_protected.h"
nyatla 0:142ee8b12fef 58 #include "NyLPC_stdlib.h"
nyatla 0:142ee8b12fef 59 #include "NyLPC_uip.h"
nyatla 0:142ee8b12fef 60
nyatla 2:b96c1e90d120 61
nyatla 2:b96c1e90d120 62
nyatla 2:b96c1e90d120 63
nyatla 0:142ee8b12fef 64
nyatla 68:f7def7eb5504 65
nyatla 0:142ee8b12fef 66 /****************************************************
nyatla 0:142ee8b12fef 67 * UipServiceに関する宣言:その他
nyatla 0:142ee8b12fef 68 ***************************************************/
nyatla 0:142ee8b12fef 69 /**
nyatla 0:142ee8b12fef 70 * イーサネットフレームの読み出し構造体
nyatla 0:142ee8b12fef 71 */
nyatla 0:142ee8b12fef 72 struct TEthPacket
nyatla 0:142ee8b12fef 73 {
nyatla 0:142ee8b12fef 74 struct NyLPC_TEthernetIIHeader header;
nyatla 0:142ee8b12fef 75 union{
nyatla 0:142ee8b12fef 76 struct NyLPC_TArpHeader arp;
nyatla 0:142ee8b12fef 77 struct NyLPC_TIPv4Header ipv4;
nyatla 0:142ee8b12fef 78 }data;
nyatla 57:bc4330dfa62f 79 }PACK_STRUCT_END;
nyatla 0:142ee8b12fef 80
nyatla 0:142ee8b12fef 81
nyatla 0:142ee8b12fef 82
nyatla 0:142ee8b12fef 83 /**
nyatla 0:142ee8b12fef 84 * サービスインスタンスのポインタ。サービスが稼働中はインスタンスのポインタが有効です。
nyatla 0:142ee8b12fef 85 */
nyatla 0:142ee8b12fef 86 NyLPC_TcUipService_t* _NyLPC_TcUipService_inst=NULL;
nyatla 0:142ee8b12fef 87
nyatla 0:142ee8b12fef 88 /**
nyatla 0:142ee8b12fef 89 * 唯一のインスタンス
nyatla 0:142ee8b12fef 90 */
nyatla 0:142ee8b12fef 91 static NyLPC_TcUipService_t _service_instance;
nyatla 0:142ee8b12fef 92
nyatla 0:142ee8b12fef 93
nyatla 0:142ee8b12fef 94
nyatla 0:142ee8b12fef 95
nyatla 0:142ee8b12fef 96 /**
nyatla 0:142ee8b12fef 97 * uipタスク
nyatla 0:142ee8b12fef 98 */
nyatla 0:142ee8b12fef 99 static int uipTask(void *pvParameters);
nyatla 0:142ee8b12fef 100
nyatla 68:f7def7eb5504 101 /** イーサネットドライバからのハンドラ*/
nyatla 68:f7def7eb5504 102 static void ethernet_handler(void* i_param,NyLPC_TiEthernetDevice_EVENT i_type);
nyatla 68:f7def7eb5504 103
nyatla 0:142ee8b12fef 104 //--------------------------------------------------------------
nyatla 0:142ee8b12fef 105
nyatla 0:142ee8b12fef 106
nyatla 91:db8279c869d3 107 static NyLPC_TBool sendIPv4Tx(struct TEthPacket* i_eth_buf);
nyatla 69:8c5f220441f5 108
nyatla 57:bc4330dfa62f 109 //static void sendArpReqest(const struct TEthPacket* i_eth_packet);
nyatla 69:8c5f220441f5 110 static void sendRawEthFrameNL(void* i_buf,NyLPC_TUInt16 i_len);
nyatla 69:8c5f220441f5 111 static void releaseTxBufNL(void* i_buf);
nyatla 0:142ee8b12fef 112
nyatla 0:142ee8b12fef 113 /**メッセージなし*/
nyatla 0:142ee8b12fef 114 #define TTaskMessage_MSG_NULL 0x0000
nyatla 0:142ee8b12fef 115 /**uipコアタスクに、開始要求する*/
nyatla 0:142ee8b12fef 116 #define TTaskMessage_MSG_RUN 0x0001
nyatla 0:142ee8b12fef 117 /**uipコアタスクに、停止要求する*/
nyatla 0:142ee8b12fef 118 #define TTaskMessage_MSG_STOP 0x0002
nyatla 0:142ee8b12fef 119
nyatla 0:142ee8b12fef 120
nyatla 0:142ee8b12fef 121 NyLPC_TcThread_t th;
nyatla 0:142ee8b12fef 122
nyatla 0:142ee8b12fef 123 NyLPC_TBool NyLPC_cUipService_initialize(void)
nyatla 0:142ee8b12fef 124 {
nyatla 0:142ee8b12fef 125 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 0:142ee8b12fef 126 //サービスは停止している事。 - Service must be uninitialized.
nyatla 0:142ee8b12fef 127 NyLPC_Assert(!NyLPC_TcUipService_isInitService());
nyatla 0:142ee8b12fef 128 //IP処理部分の初期化
nyatla 0:142ee8b12fef 129 NyLPC_cIPv4_initialize(&(inst->_tcpv4));
nyatla 0:142ee8b12fef 130 //EMAC割込セマフォ
nyatla 0:142ee8b12fef 131 NyLPC_cSemaphore_initialize(&inst->_emac_semapho);
nyatla 0:142ee8b12fef 132
nyatla 48:00d211aac2ec 133 inst->_status=0x00;
nyatla 0:142ee8b12fef 134 NyLPC_cStopwatch_initialize(&(inst->_arp_sw));
nyatla 0:142ee8b12fef 135 NyLPC_cStopwatch_initialize(&(inst->_periodic_sw));
nyatla 0:142ee8b12fef 136 NyLPC_cIPv4_initialize(&(inst->_tcpv4));
nyatla 0:142ee8b12fef 137 NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(inst->_mutex)));
nyatla 0:142ee8b12fef 138
nyatla 0:142ee8b12fef 139 _NyLPC_TcUipService_inst=inst;
nyatla 0:142ee8b12fef 140 //タスク起動
nyatla 79:baa21f8763cf 141 NyLPC_cThread_initialize(&th,NyLPC_cUipService_config_STACK_SIZE,NyLPC_TcThread_PRIORITY_SERVICE);
nyatla 0:142ee8b12fef 142 NyLPC_cThread_start(&th,uipTask,NULL);
nyatla 0:142ee8b12fef 143 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 144 }
nyatla 0:142ee8b12fef 145
nyatla 0:142ee8b12fef 146
nyatla 0:142ee8b12fef 147
nyatla 0:142ee8b12fef 148
nyatla 0:142ee8b12fef 149
nyatla 0:142ee8b12fef 150
nyatla 0:142ee8b12fef 151
nyatla 0:142ee8b12fef 152 /**
nyatla 0:142ee8b12fef 153 * UIP処理を開始します。
nyatla 0:142ee8b12fef 154 * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。
nyatla 0:142ee8b12fef 155 * @param i_ref_config
nyatla 0:142ee8b12fef 156 * このコンフィギュレーションは、stopを実行するまでの間、インスタンスから参照します。外部で保持してください。
nyatla 0:142ee8b12fef 157 */
nyatla 0:142ee8b12fef 158 void NyLPC_cUipService_start(const NyLPC_TcIPv4Config_t* i_ref_config)
nyatla 0:142ee8b12fef 159 {
nyatla 0:142ee8b12fef 160 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 0:142ee8b12fef 161 NyLPC_Assert(NyLPC_TcUipService_isInitService());
nyatla 0:142ee8b12fef 162 if(!NyLPC_cUipService_isRun())
nyatla 0:142ee8b12fef 163 {
nyatla 0:142ee8b12fef 164 //はじめて起動するときに1度だけデバイス取得(タスクスイッチが動いてないと動かないからここで。)
nyatla 0:142ee8b12fef 165 if(inst->_ethif==NULL){
nyatla 0:142ee8b12fef 166 inst->_ethif=getEthernetDevicePnP();
nyatla 0:142ee8b12fef 167 }
nyatla 48:00d211aac2ec 168 //コンフィグレーションセット
nyatla 48:00d211aac2ec 169 inst->_ref_config=i_ref_config;
nyatla 48:00d211aac2ec 170 //開始要求セット
nyatla 48:00d211aac2ec 171 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcUipService_ORDER_START);
nyatla 48:00d211aac2ec 172 //Order実行待ち
nyatla 48:00d211aac2ec 173 while(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcUipService_ORDER_START)){
nyatla 0:142ee8b12fef 174 NyLPC_cThread_sleep(10);
nyatla 0:142ee8b12fef 175 }
nyatla 0:142ee8b12fef 176 }
nyatla 0:142ee8b12fef 177 return;
nyatla 0:142ee8b12fef 178 }
nyatla 0:142ee8b12fef 179 /**
nyatla 0:142ee8b12fef 180 * UIP処理を停止します。
nyatla 0:142ee8b12fef 181 * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。
nyatla 0:142ee8b12fef 182 * いまのところ、ストップシーケンスの実装は良くありません。
nyatla 0:142ee8b12fef 183 * 再設計が必要。
nyatla 0:142ee8b12fef 184 */
nyatla 0:142ee8b12fef 185 void NyLPC_cUipService_stop(void)
nyatla 0:142ee8b12fef 186 {
nyatla 0:142ee8b12fef 187 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 0:142ee8b12fef 188 NyLPC_Assert(NyLPC_TcUipService_isInitService());
nyatla 0:142ee8b12fef 189 if(NyLPC_cUipService_isRun())
nyatla 0:142ee8b12fef 190 {
nyatla 48:00d211aac2ec 191 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcUipService_ORDER_STOP);
nyatla 48:00d211aac2ec 192 //Order実行待ち
nyatla 48:00d211aac2ec 193 while(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcUipService_ORDER_STOP)){
nyatla 0:142ee8b12fef 194 NyLPC_cThread_sleep(10);
nyatla 0:142ee8b12fef 195 }
nyatla 0:142ee8b12fef 196 }
nyatla 0:142ee8b12fef 197 return;
nyatla 0:142ee8b12fef 198 }
nyatla 0:142ee8b12fef 199
nyatla 0:142ee8b12fef 200
nyatla 0:142ee8b12fef 201 const char* NyLPC_cUipService_refDeviceName(void)
nyatla 0:142ee8b12fef 202 {
nyatla 0:142ee8b12fef 203 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 68:f7def7eb5504 204 return NyLPC_cUipService_isRun()?NyLPC_iEthernetDevice_getDevicName(inst->_ethif):NULL;
nyatla 0:142ee8b12fef 205 }
nyatla 21:f2a70f15301f 206 const NyLPC_TcIPv4Config_t* NyLPC_cUipService_refCurrentConfig(void)
nyatla 21:f2a70f15301f 207 {
nyatla 21:f2a70f15301f 208 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 21:f2a70f15301f 209 return inst->_ref_config;
nyatla 21:f2a70f15301f 210 }
nyatla 0:142ee8b12fef 211 /**********************************************************************
nyatla 0:142ee8b12fef 212 *
nyatla 0:142ee8b12fef 213 * </HWコールバックに関わる宣言>
nyatla 0:142ee8b12fef 214 *
nyatla 0:142ee8b12fef 215 *********************************************************************/
nyatla 0:142ee8b12fef 216
nyatla 0:142ee8b12fef 217
nyatla 0:142ee8b12fef 218 //PERIODIC rate
nyatla 0:142ee8b12fef 219 #define PERIODIC_TIMER (1*200)
nyatla 0:142ee8b12fef 220 #define ARP_TIMER (60*1000*10)
nyatla 0:142ee8b12fef 221
nyatla 37:fc4b4fd6a649 222
nyatla 37:fc4b4fd6a649 223
nyatla 0:142ee8b12fef 224 /**
nyatla 0:142ee8b12fef 225 * 操作キューを確認して、タスクのステータスをアップデートします。
nyatla 0:142ee8b12fef 226 * 高速化のため、Proc-Callerを使用していません。複雑なタスク操作をするときには、書き換えてください。
nyatla 48:00d211aac2ec 227 * @return
nyatla 48:00d211aac2ec 228 * UIPタスクの実行状態
nyatla 0:142ee8b12fef 229 */
nyatla 48:00d211aac2ec 230 static NyLPC_TBool updateTaskStatus()
nyatla 0:142ee8b12fef 231 {
nyatla 0:142ee8b12fef 232 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 48:00d211aac2ec 233 if(NyLPC_cUipService_isRun()){
nyatla 48:00d211aac2ec 234 //開始状態
nyatla 48:00d211aac2ec 235 if(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcUipService_ORDER_STOP))
nyatla 48:00d211aac2ec 236 {
nyatla 48:00d211aac2ec 237 //停止操作
nyatla 68:f7def7eb5504 238 NyLPC_iEthernetDevice_stop(inst->_ethif);
nyatla 48:00d211aac2ec 239 NyLPC_cIPv4_stop(&(inst->_tcpv4));
nyatla 48:00d211aac2ec 240 NyLPC_cIPv4IComp_finalize(&(inst->_icomp));
nyatla 48:00d211aac2ec 241 NyLPC_cIPv4Arp_finalize(&(inst->_arp));
nyatla 48:00d211aac2ec 242 inst->_ref_config=NULL;
nyatla 48:00d211aac2ec 243 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcUipService_STATUSBIT_IS_RUNNING);
nyatla 48:00d211aac2ec 244 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcUipService_ORDER_STOP);
nyatla 48:00d211aac2ec 245 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 246 }
nyatla 48:00d211aac2ec 247 return NyLPC_TBool_TRUE;
nyatla 48:00d211aac2ec 248 }else{
nyatla 48:00d211aac2ec 249 //停止状態
nyatla 48:00d211aac2ec 250 if(NyLPC_TUInt16_isBitOn(inst->_status,NyLPC_TcUipService_ORDER_START))
nyatla 48:00d211aac2ec 251 {
nyatla 48:00d211aac2ec 252 //TCP,ICOMPの初期化
nyatla 48:00d211aac2ec 253 NyLPC_cIPv4_start(&(inst->_tcpv4),inst->_ref_config);
nyatla 48:00d211aac2ec 254 NyLPC_cIPv4IComp_initialize(&(inst->_icomp),inst->_ref_config);
nyatla 48:00d211aac2ec 255 //uip_arp_init(msg->start.ref_config);
nyatla 48:00d211aac2ec 256 NyLPC_cIPv4Arp_initialize(&(inst->_arp),inst->_ref_config);
nyatla 48:00d211aac2ec 257 NyLPC_cStopwatch_startExpire(&(inst->_arp_sw),1);//1度ARPを起動するため。
nyatla 48:00d211aac2ec 258 NyLPC_cStopwatch_startExpire(&(inst->_periodic_sw),PERIODIC_TIMER);
nyatla 48:00d211aac2ec 259 //EtherNETデバイス初期化
nyatla 68:f7def7eb5504 260 while(!NyLPC_iEthernetDevice_start(inst->_ethif,&(inst->_ref_config->eth_mac),ethernet_handler,inst));
nyatla 48:00d211aac2ec 261 NyLPC_TUInt16_setBit(inst->_status,NyLPC_TcUipService_STATUSBIT_IS_RUNNING);
nyatla 48:00d211aac2ec 262 NyLPC_TUInt16_unsetBit(inst->_status,NyLPC_TcUipService_ORDER_START);
nyatla 48:00d211aac2ec 263 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 264 }
nyatla 48:00d211aac2ec 265 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 266 }
nyatla 0:142ee8b12fef 267 }
nyatla 0:142ee8b12fef 268
nyatla 0:142ee8b12fef 269 /**
nyatla 0:142ee8b12fef 270 * uipタスクのメインループ
nyatla 0:142ee8b12fef 271 */
nyatla 0:142ee8b12fef 272 static int uipTask(void *pvParameters)
nyatla 0:142ee8b12fef 273 {
nyatla 0:142ee8b12fef 274 NyLPC_TUInt16 rx_len,tx_len;
nyatla 0:142ee8b12fef 275 struct TEthPacket* ethbuf;
nyatla 0:142ee8b12fef 276 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 69:8c5f220441f5 277 void* r;
nyatla 0:142ee8b12fef 278 (void)pvParameters;
nyatla 0:142ee8b12fef 279 for( ;; )
nyatla 0:142ee8b12fef 280 {
nyatla 0:142ee8b12fef 281 //タスク状態の更新
nyatla 48:00d211aac2ec 282 if(!updateTaskStatus())
nyatla 0:142ee8b12fef 283 {
nyatla 0:142ee8b12fef 284 //RUNステータス以外の時は、ここで終了する。
nyatla 0:142ee8b12fef 285 NyLPC_cThread_sleep(50);
nyatla 0:142ee8b12fef 286 continue;
nyatla 0:142ee8b12fef 287 }
nyatla 0:142ee8b12fef 288 //イーサネットフレームの取得
nyatla 0:142ee8b12fef 289 //Ethernet Device Lock(ARPを含む)
nyatla 2:b96c1e90d120 290 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 68:f7def7eb5504 291 ethbuf= (struct TEthPacket*)NyLPC_iEthernetDevice_getRxEthFrame(inst->_ethif,&rx_len);
nyatla 0:142ee8b12fef 292 tx_len=0;
nyatla 0:142ee8b12fef 293 while(ethbuf != NULL){
nyatla 0:142ee8b12fef 294 if(rx_len>0)
nyatla 0:142ee8b12fef 295 {
nyatla 0:142ee8b12fef 296 //ペイロードサイズを計算
nyatla 0:142ee8b12fef 297 rx_len-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 0:142ee8b12fef 298 switch(ethbuf->header.type)
nyatla 0:142ee8b12fef 299 {
nyatla 0:142ee8b12fef 300 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IP):
nyatla 0:142ee8b12fef 301 //ARPテーブルの更新
nyatla 0:142ee8b12fef 302 //uip_arp_ipin(&(ethbuf->header),ethbuf->data.ipv4.srcipaddr);
nyatla 0:142ee8b12fef 303 NyLPC_cIPv4Arp_incomingIp(&inst->_arp,&(ethbuf->header),ethbuf->data.ipv4.srcipaddr);
nyatla 69:8c5f220441f5 304 //Ethernet Device UnLock(NyLPC_cIPv4_rxがallocをコールする可能性があるので一時的にロック解除)
nyatla 0:142ee8b12fef 305 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 0:142ee8b12fef 306 //IPパケットの処理
nyatla 0:142ee8b12fef 307 r=NyLPC_cIPv4_rx(&(inst->_tcpv4),&(ethbuf->data.ipv4),rx_len);
nyatla 91:db8279c869d3 308 if(r!=NULL){
nyatla 69:8c5f220441f5 309 //IPパケットとして送信
nyatla 69:8c5f220441f5 310 NyLPC_cUipService_sendIPv4Tx(r);
nyatla 69:8c5f220441f5 311 }
nyatla 0:142ee8b12fef 312 //ロックの復帰
nyatla 0:142ee8b12fef 313 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 69:8c5f220441f5 314 if(r!=NULL){
nyatla 69:8c5f220441f5 315 releaseTxBufNL(r);
nyatla 0:142ee8b12fef 316 }
nyatla 0:142ee8b12fef 317 break;
nyatla 0:142ee8b12fef 318 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_ARP):
nyatla 69:8c5f220441f5 319 //Ethernet Device UnLock(NyLPC_cIPv4_rxがallocをコールする可能性があるので一時的にロック解除)
nyatla 69:8c5f220441f5 320 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 69:8c5f220441f5 321 r=NyLPC_cIPv4Arp_rx(&inst->_arp,&(ethbuf->data.arp),rx_len,&tx_len);
nyatla 69:8c5f220441f5 322 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 69:8c5f220441f5 323 if(r!=NULL){
nyatla 69:8c5f220441f5 324 sendRawEthFrameNL(r,tx_len);
nyatla 69:8c5f220441f5 325 releaseTxBufNL(r);
nyatla 0:142ee8b12fef 326 }
nyatla 0:142ee8b12fef 327 break;
nyatla 0:142ee8b12fef 328 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IPV6):
nyatla 0:142ee8b12fef 329 //uip_process_ipv6();
nyatla 0:142ee8b12fef 330 break;
nyatla 0:142ee8b12fef 331 default:
nyatla 0:142ee8b12fef 332 break;
nyatla 0:142ee8b12fef 333 }
nyatla 0:142ee8b12fef 334 }
nyatla 2:b96c1e90d120 335 //受信キューを進行。
nyatla 68:f7def7eb5504 336 NyLPC_iEthernetDevice_nextRxEthFrame(inst->_ethif);
nyatla 0:142ee8b12fef 337 //受信処理
nyatla 68:f7def7eb5504 338 ethbuf= (struct TEthPacket*)NyLPC_iEthernetDevice_getRxEthFrame(inst->_ethif,&rx_len);
nyatla 0:142ee8b12fef 339 }
nyatla 0:142ee8b12fef 340 //データが無い。
nyatla 0:142ee8b12fef 341 if(NyLPC_cStopwatch_isExpired(&(inst->_arp_sw))){
nyatla 0:142ee8b12fef 342 //uip_arp_timer();
nyatla 0:142ee8b12fef 343 NyLPC_cIPv4Arp_periodic(&inst->_arp);
nyatla 0:142ee8b12fef 344 NyLPC_cStopwatch_startExpire(&(inst->_arp_sw),ARP_TIMER);
nyatla 2:b96c1e90d120 345 }
nyatla 0:142ee8b12fef 346 if(NyLPC_cStopwatch_isExpired(&(inst->_periodic_sw))){
nyatla 37:fc4b4fd6a649 347 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 0:142ee8b12fef 348 NyLPC_cIPv4_periodec(&(inst->_tcpv4));
nyatla 37:fc4b4fd6a649 349 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 0:142ee8b12fef 350 NyLPC_cStopwatch_startExpire(&(inst->_periodic_sw),PERIODIC_TIMER);
nyatla 0:142ee8b12fef 351 }
nyatla 0:142ee8b12fef 352 //リソースロックの解除
nyatla 0:142ee8b12fef 353 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 0:142ee8b12fef 354 //割込によるセマフォの解除か、タイムアウトで再開する。(タイムアウト値は周期関数の実行レート以下にすること。)
nyatla 0:142ee8b12fef 355 NyLPC_cSemaphore_take(&(_NyLPC_TcUipService_inst->_emac_semapho),PERIODIC_TIMER);
nyatla 0:142ee8b12fef 356 }
nyatla 0:142ee8b12fef 357 return 0;
nyatla 0:142ee8b12fef 358 }
nyatla 0:142ee8b12fef 359
nyatla 0:142ee8b12fef 360
nyatla 0:142ee8b12fef 361 /**
nyatla 68:f7def7eb5504 362 * イーサネットドライバからのハンドラ
nyatla 68:f7def7eb5504 363 */
nyatla 68:f7def7eb5504 364 static void ethernet_handler(void* i_param,NyLPC_TiEthernetDevice_EVENT i_type)
nyatla 68:f7def7eb5504 365 {
nyatla 68:f7def7eb5504 366 switch(i_type){
nyatla 68:f7def7eb5504 367 case NyLPC_TiEthernetDevice_EVENT_ON_RX:
nyatla 68:f7def7eb5504 368 //受信系のセマフォブロックの解除
nyatla 68:f7def7eb5504 369 NyLPC_cSemaphore_giveFromISR(&(((NyLPC_TcUipService_t*)i_param)->_emac_semapho));
nyatla 68:f7def7eb5504 370 break;
nyatla 68:f7def7eb5504 371 default:
nyatla 68:f7def7eb5504 372 break;
nyatla 68:f7def7eb5504 373 }
nyatla 68:f7def7eb5504 374 }
nyatla 68:f7def7eb5504 375
nyatla 68:f7def7eb5504 376 /**
nyatla 57:bc4330dfa62f 377 * IPv4パケットのpeerIPを問い合わせるARPパケットを送信します。
nyatla 69:8c5f220441f5 378 * allocを中でコールするから要UNLOCK状態
nyatla 0:142ee8b12fef 379 */
nyatla 69:8c5f220441f5 380 void NyLPC_cUipService_sendArpRequest(const struct NyLPC_TIPv4Addr* i_addr)
nyatla 37:fc4b4fd6a649 381 {
nyatla 37:fc4b4fd6a649 382 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 91:db8279c869d3 383 void* p;
nyatla 37:fc4b4fd6a649 384 NyLPC_TUInt16 tx_len;
nyatla 37:fc4b4fd6a649 385 struct TEthPacket* ethbuf;
nyatla 69:8c5f220441f5 386 //システムTxBufを得る
nyatla 69:8c5f220441f5 387 ethbuf=(struct TEthPacket*)NyLPC_cUipService_allocSysTxBuf();
nyatla 37:fc4b4fd6a649 388 //ARPパケットを作る。
nyatla 57:bc4330dfa62f 389 NyLPC_TArpHeader_setArpRequest(&(ethbuf->data.arp),inst->_ref_config->ip_addr,&(inst->_ref_config->eth_mac),i_addr);
nyatla 37:fc4b4fd6a649 390 tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_ref_config->eth_mac));
nyatla 37:fc4b4fd6a649 391 //送信
nyatla 91:db8279c869d3 392 p=((struct NyLPC_TEthernetIIHeader*)ethbuf)-1;
nyatla 69:8c5f220441f5 393
nyatla 69:8c5f220441f5 394 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 69:8c5f220441f5 395 NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,p,tx_len);
nyatla 69:8c5f220441f5 396 NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,p);
nyatla 69:8c5f220441f5 397 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 57:bc4330dfa62f 398 }
nyatla 57:bc4330dfa62f 399
nyatla 57:bc4330dfa62f 400
nyatla 57:bc4330dfa62f 401
nyatla 57:bc4330dfa62f 402
nyatla 57:bc4330dfa62f 403 /**
nyatla 57:bc4330dfa62f 404 * allocTxBufで取得したペイロードメモリを"IPパケットとして"送信します。
nyatla 57:bc4330dfa62f 405 * @param i_eth_payload
nyatla 92:4f77028cce64 406 * [NyLPC_TEthernetIIHeader][payload]メモリの、[payload]のアドレスを指定します。
nyatla 57:bc4330dfa62f 407 * 通常は、NyLPC_cUipService_allocTxBufの返却したメモリを指定します。
nyatla 57:bc4330dfa62f 408 */
nyatla 57:bc4330dfa62f 409
nyatla 57:bc4330dfa62f 410 void NyLPC_cUipService_sendIPv4Tx(void* i_eth_payload)
nyatla 57:bc4330dfa62f 411 {
nyatla 57:bc4330dfa62f 412 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 91:db8279c869d3 413 void* p=((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1;
nyatla 57:bc4330dfa62f 414 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 57:bc4330dfa62f 415 //IPパケットの送信を試行
nyatla 91:db8279c869d3 416 if(sendIPv4Tx((struct TEthPacket*)p)){
nyatla 69:8c5f220441f5 417 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 69:8c5f220441f5 418 return;
nyatla 57:bc4330dfa62f 419 }
nyatla 57:bc4330dfa62f 420 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 69:8c5f220441f5 421 //ARPリクエストを代わりに送信
nyatla 69:8c5f220441f5 422 NyLPC_cUipService_sendArpRequest(&((struct NyLPC_TIPv4Header*)i_eth_payload)->destipaddr);
nyatla 57:bc4330dfa62f 423 return;
nyatla 57:bc4330dfa62f 424 }
nyatla 57:bc4330dfa62f 425
nyatla 57:bc4330dfa62f 426
nyatla 37:fc4b4fd6a649 427 /**
nyatla 37:fc4b4fd6a649 428 * ARPテーブルに指定したIPがあるかを返します。
nyatla 37:fc4b4fd6a649 429 */
nyatla 37:fc4b4fd6a649 430 NyLPC_TBool NyLPC_cUipService_hasArpInfo(const struct NyLPC_TIPv4Addr* i_addr)
nyatla 37:fc4b4fd6a649 431 {
nyatla 37:fc4b4fd6a649 432 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 37:fc4b4fd6a649 433 return NyLPC_cIPv4Arp_IPv4toEthAddr(&inst->_arp,*i_addr)!=NULL;
nyatla 37:fc4b4fd6a649 434 }
nyatla 0:142ee8b12fef 435
nyatla 69:8c5f220441f5 436 /**
nyatla 69:8c5f220441f5 437 * システム用の送信ペイロードを返します。
nyatla 69:8c5f220441f5 438 * 関数は必ず成功します。
nyatla 69:8c5f220441f5 439 */
nyatla 69:8c5f220441f5 440 void* NyLPC_cUipService_allocSysTxBuf(void)
nyatla 69:8c5f220441f5 441 {
nyatla 69:8c5f220441f5 442 NyLPC_TUInt16 s;
nyatla 69:8c5f220441f5 443 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 91:db8279c869d3 444 struct TEthPacket* ethbuf;
nyatla 69:8c5f220441f5 445 //排他処理をして、メモリを取得する。SYSTEMメモリはEthernetドライバの解放待ちのみなのでまとめてLOCKしておk
nyatla 69:8c5f220441f5 446 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 69:8c5f220441f5 447 for(;;){
nyatla 91:db8279c869d3 448 ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,NyLPC_TcEthernetMM_HINT_CTRL_PACKET,&s);
nyatla 69:8c5f220441f5 449 if(ethbuf==NULL){
nyatla 69:8c5f220441f5 450 NyLPC_cThread_yield();
nyatla 69:8c5f220441f5 451 continue;
nyatla 69:8c5f220441f5 452 }
nyatla 69:8c5f220441f5 453 break;
nyatla 69:8c5f220441f5 454 }
nyatla 69:8c5f220441f5 455 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 69:8c5f220441f5 456 //イーサネットバッファのアドレスを計算
nyatla 91:db8279c869d3 457 return &(ethbuf->data);
nyatla 69:8c5f220441f5 458 }
nyatla 0:142ee8b12fef 459
nyatla 57:bc4330dfa62f 460
nyatla 57:bc4330dfa62f 461
nyatla 0:142ee8b12fef 462 void* NyLPC_cUipService_allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size)
nyatla 0:142ee8b12fef 463 {
nyatla 0:142ee8b12fef 464 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 91:db8279c869d3 465 struct TEthPacket* ethbuf;
nyatla 37:fc4b4fd6a649 466 //排他処理をして、メモリを取得する。
nyatla 0:142ee8b12fef 467 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 91:db8279c869d3 468 ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,i_hint+sizeof(struct NyLPC_TEthernetIIHeader),o_size);
nyatla 0:142ee8b12fef 469 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 20:3b0b444b4deb 470 if(ethbuf==NULL){
nyatla 20:3b0b444b4deb 471 return NULL;
nyatla 0:142ee8b12fef 472 }
nyatla 20:3b0b444b4deb 473 //イーサネットバッファのサイズを計算
nyatla 20:3b0b444b4deb 474 *o_size-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 20:3b0b444b4deb 475 //イーサネットバッファのアドレスを計算
nyatla 91:db8279c869d3 476 return &(ethbuf->data);
nyatla 0:142ee8b12fef 477 }
nyatla 0:142ee8b12fef 478
nyatla 0:142ee8b12fef 479
nyatla 0:142ee8b12fef 480 void* NyLPC_cUipService_releaseTxBuf(void* i_buf)
nyatla 0:142ee8b12fef 481 {
nyatla 0:142ee8b12fef 482 //排他処理をして、メモリを開放する。
nyatla 0:142ee8b12fef 483 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 484 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 0:142ee8b12fef 485 //ペイロードの位置から、メモリブロックを再生。
nyatla 91:db8279c869d3 486 NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
nyatla 0:142ee8b12fef 487 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 0:142ee8b12fef 488 return NULL;
nyatla 0:142ee8b12fef 489 }
nyatla 0:142ee8b12fef 490
nyatla 0:142ee8b12fef 491
nyatla 0:142ee8b12fef 492
nyatla 0:142ee8b12fef 493
nyatla 0:142ee8b12fef 494
nyatla 0:142ee8b12fef 495
nyatla 0:142ee8b12fef 496
nyatla 0:142ee8b12fef 497
nyatla 0:142ee8b12fef 498 /**********
nyatla 0:142ee8b12fef 499 * イーサネットHWのコントロール関数
nyatla 0:142ee8b12fef 500 */
nyatla 69:8c5f220441f5 501 /**
nyatla 69:8c5f220441f5 502 * "IPv4パケットを格納した"イーサフレームを送信します。
nyatla 69:8c5f220441f5 503 * コール前に、必ずロックしてから呼び出してください。
nyatla 69:8c5f220441f5 504 *//*
nyatla 69:8c5f220441f5 505 static void copyAndSendIPv4Tx(const struct TEthPacket* i_buf)
nyatla 69:8c5f220441f5 506 {
nyatla 69:8c5f220441f5 507 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 69:8c5f220441f5 508 NyLPC_TUInt16 s;
nyatla 69:8c5f220441f5 509 //送信する。
nyatla 69:8c5f220441f5 510 s=NyLPC_htons(i_buf->data.ipv4.len16)+sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 69:8c5f220441f5 511 memcpy(inst->stx.buf,i_buf,s);
nyatla 69:8c5f220441f5 512 if(!sendIPv4Tx(&(inst->stx.h))){
nyatla 69:8c5f220441f5 513 //失敗した場合はARPリクエストに変換して再送
nyatla 69:8c5f220441f5 514 //@todo unchecked PASS!
nyatla 69:8c5f220441f5 515 sendArpReqest(&i_buf->data.ipv4.destipaddr);
nyatla 69:8c5f220441f5 516 }
nyatla 69:8c5f220441f5 517 return;
nyatla 69:8c5f220441f5 518 }*/
nyatla 0:142ee8b12fef 519 /**
nyatla 57:bc4330dfa62f 520 * "IPv4パケットを格納した"イーサフレームを送信します。
nyatla 0:142ee8b12fef 521 * コール前に、必ずロックしてから呼び出してください。
nyatla 0:142ee8b12fef 522 */
nyatla 69:8c5f220441f5 523 /*
nyatla 0:142ee8b12fef 524 static void copyAndSendIPv4Tx(const struct TEthPacket* i_buf)
nyatla 0:142ee8b12fef 525 {
nyatla 0:142ee8b12fef 526 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 527 NyLPC_TUInt16 s;
nyatla 0:142ee8b12fef 528 //ACK送信用の自己バッファが空くまで待つ
nyatla 0:142ee8b12fef 529 while(inst->stx.h.is_lock){
nyatla 68:f7def7eb5504 530 NyLPC_iEthernetDevice_processTx(inst->_ethif);
nyatla 0:142ee8b12fef 531 }
nyatla 0:142ee8b12fef 532 //送信する。
nyatla 0:142ee8b12fef 533 s=NyLPC_htons(i_buf->data.ipv4.len16)+sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 0:142ee8b12fef 534 memcpy(inst->stx.buf,i_buf,s);
nyatla 0:142ee8b12fef 535 if(!sendIPv4Tx(&(inst->stx.h))){
nyatla 0:142ee8b12fef 536 //失敗した場合はARPリクエストに変換して再送
nyatla 57:bc4330dfa62f 537 //@todo unchecked PASS!
nyatla 57:bc4330dfa62f 538 sendArpReqest(&i_buf->data.ipv4.destipaddr);
nyatla 0:142ee8b12fef 539 }
nyatla 0:142ee8b12fef 540 return;
nyatla 0:142ee8b12fef 541 }
nyatla 69:8c5f220441f5 542 */
nyatla 57:bc4330dfa62f 543
nyatla 0:142ee8b12fef 544
nyatla 0:142ee8b12fef 545 /**
nyatla 69:8c5f220441f5 546 * イーサネットフレームを送信します。
nyatla 69:8c5f220441f5 547 * この関数はiptaskで実行される関数からのみ使用てください。
nyatla 0:142ee8b12fef 548 * @i_buf
nyatla 0:142ee8b12fef 549 * イーサネットフレームを格納したメモリです。
nyatla 0:142ee8b12fef 550 * @i_len
nyatla 0:142ee8b12fef 551 * イーサネットペイロードのサイズです。
nyatla 0:142ee8b12fef 552 */
nyatla 69:8c5f220441f5 553 static void sendRawEthFrameNL(void* i_buf,NyLPC_TUInt16 i_len)
nyatla 0:142ee8b12fef 554 {
nyatla 69:8c5f220441f5 555 NyLPC_iEthernetDevice_sendTxEthFrame(
nyatla 69:8c5f220441f5 556 _NyLPC_TcUipService_inst->_ethif,
nyatla 91:db8279c869d3 557 ((struct NyLPC_TEthernetIIHeader*)i_buf)-1,
nyatla 69:8c5f220441f5 558 i_len);
nyatla 0:142ee8b12fef 559 return;
nyatla 0:142ee8b12fef 560 }
nyatla 69:8c5f220441f5 561 /**
nyatla 69:8c5f220441f5 562 * ロック状態で使用できるreleaseTxBuf。
nyatla 69:8c5f220441f5 563 * この関数はiptaskで実行される関数からのみ使用してください。
nyatla 69:8c5f220441f5 564 */
nyatla 69:8c5f220441f5 565 static void releaseTxBufNL(void* i_buf)
nyatla 69:8c5f220441f5 566 {
nyatla 69:8c5f220441f5 567 //ペイロードの位置から、メモリブロックを再生。
nyatla 69:8c5f220441f5 568 NyLPC_iEthernetDevice_releaseTxBuf(
nyatla 69:8c5f220441f5 569 _NyLPC_TcUipService_inst->_ethif,
nyatla 91:db8279c869d3 570 ((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
nyatla 69:8c5f220441f5 571 return;
nyatla 69:8c5f220441f5 572 }
nyatla 37:fc4b4fd6a649 573 /**
nyatla 37:fc4b4fd6a649 574 * マルチキャスとアドレスへ変換する。
nyatla 37:fc4b4fd6a649 575 */
nyatla 37:fc4b4fd6a649 576 static void ip2MulticastEmacAddr(const struct NyLPC_TIPv4Addr* i_addr,struct NyLPC_TEthAddr* o_emac)
nyatla 37:fc4b4fd6a649 577 {
nyatla 37:fc4b4fd6a649 578 NyLPC_TUInt32 n=NyLPC_htonl(i_addr->v);
nyatla 37:fc4b4fd6a649 579 o_emac->addr[0]=0x01;
nyatla 37:fc4b4fd6a649 580 o_emac->addr[1]=0x00;
nyatla 37:fc4b4fd6a649 581 o_emac->addr[2]=0x5E;
nyatla 37:fc4b4fd6a649 582 o_emac->addr[3]=((n>>16) & 0x7f);
nyatla 37:fc4b4fd6a649 583 o_emac->addr[4]=((n>> 8) & 0xff);
nyatla 37:fc4b4fd6a649 584 o_emac->addr[5]=(n & 0xff);
nyatla 37:fc4b4fd6a649 585 return;
nyatla 37:fc4b4fd6a649 586 };
nyatla 0:142ee8b12fef 587
nyatla 0:142ee8b12fef 588 /**
nyatla 0:142ee8b12fef 589 * ペイロードをIPパケットとしてネットワークへ送出します。
nyatla 0:142ee8b12fef 590 * コール前に、必ずロックしてから呼び出してください。
nyatla 0:142ee8b12fef 591 * @param i_eth_payload
nyatla 0:142ee8b12fef 592 * allocTxBufで確保したメモリを指定してください。
nyatla 0:142ee8b12fef 593 * ペイロードには、TCP/IPパケットを格納します。
nyatla 0:142ee8b12fef 594 */
nyatla 91:db8279c869d3 595 static NyLPC_TBool sendIPv4Tx(struct TEthPacket* i_eth_buf)
nyatla 0:142ee8b12fef 596 {
nyatla 0:142ee8b12fef 597 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 37:fc4b4fd6a649 598 struct NyLPC_TEthAddr emac;
nyatla 0:142ee8b12fef 599 NyLPC_TUInt16 tx_len;
nyatla 37:fc4b4fd6a649 600 const struct NyLPC_TEthAddr* eth_dest;
nyatla 0:142ee8b12fef 601 //ペイロードのアドレスから、イーサネットフレームバッファのアドレスを復元
nyatla 37:fc4b4fd6a649 602
nyatla 91:db8279c869d3 603 if(NyLPC_TIPv4Addr_isEqual(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_BROADCAST)) {
nyatla 37:fc4b4fd6a649 604 //ブロードキャストならそのまま
nyatla 37:fc4b4fd6a649 605 eth_dest=&NyLPC_TEthAddr_BROADCAST;
nyatla 91:db8279c869d3 606 }else if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
nyatla 37:fc4b4fd6a649 607 //マルチキャスト
nyatla 91:db8279c869d3 608 ip2MulticastEmacAddr(&(i_eth_buf->data.ipv4.destipaddr),&emac);
nyatla 37:fc4b4fd6a649 609 eth_dest=&emac;
nyatla 37:fc4b4fd6a649 610 }else{
nyatla 37:fc4b4fd6a649 611 //LocalIP以外ならdefaultRootへ変換
nyatla 37:fc4b4fd6a649 612 eth_dest=NyLPC_cIPv4Arp_IPv4toEthAddr(
nyatla 37:fc4b4fd6a649 613 &inst->_arp,
nyatla 91:db8279c869d3 614 NyLPC_cIPv4Config_isLocalIP(inst->_ref_config, &(i_eth_buf->data.ipv4.destipaddr))?(i_eth_buf->data.ipv4.destipaddr):(inst->_ref_config->dr_addr));
nyatla 37:fc4b4fd6a649 615 //IP->MAC変換をテスト。
nyatla 37:fc4b4fd6a649 616 if(eth_dest==NULL){
nyatla 37:fc4b4fd6a649 617 return NyLPC_TBool_FALSE;
nyatla 37:fc4b4fd6a649 618 }
nyatla 0:142ee8b12fef 619 }
nyatla 0:142ee8b12fef 620 //変換可能なら、イーサネットヘッダを更新して、送信処理へ。
nyatla 91:db8279c869d3 621 tx_len=NyLPC_TEthernetIIHeader_setIPv4Tx(&(i_eth_buf->header),&(inst->_ref_config->eth_mac),eth_dest);
nyatla 68:f7def7eb5504 622 NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,i_eth_buf,tx_len);
nyatla 0:142ee8b12fef 623 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 624 }
nyatla 0:142ee8b12fef 625
nyatla 0:142ee8b12fef 626
nyatla 0:142ee8b12fef 627
nyatla 20:3b0b444b4deb 628