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:
Fri Sep 13 06:38:16 2013 +0000
Revision:
57:bc4330dfa62f
Parent:
37:fc4b4fd6a649
Child:
69:8c5f220441f5
update mimic core r329;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 0:142ee8b12fef 1 /*********************************************************************************
nyatla 0:142ee8b12fef 2 * PROJECT: MiMic
nyatla 0:142ee8b12fef 3 * --------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 4 *
nyatla 0:142ee8b12fef 5 * This file is part of MiMic
nyatla 0:142ee8b12fef 6 * Copyright (C)2011 Ryo Iizuka
nyatla 0:142ee8b12fef 7 *
nyatla 0:142ee8b12fef 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 0:142ee8b12fef 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 0:142ee8b12fef 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 0:142ee8b12fef 11 * (at your option) any later version.
nyatla 0:142ee8b12fef 12 *
nyatla 0:142ee8b12fef 13 * This program is distributed in the hope that it will be useful,
nyatla 0:142ee8b12fef 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 0:142ee8b12fef 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 0:142ee8b12fef 16 * GNU General Public License for more details.
nyatla 0:142ee8b12fef 17 *
nyatla 0:142ee8b12fef 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 0:142ee8b12fef 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 0:142ee8b12fef 20 *
nyatla 0:142ee8b12fef 21 * For further information please contact.
nyatla 0:142ee8b12fef 22 * http://nyatla.jp/
nyatla 0:142ee8b12fef 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 0:142ee8b12fef 24 *
nyatla 0:142ee8b12fef 25 *
nyatla 0:142ee8b12fef 26 * Parts of this file were leveraged from uIP:
nyatla 0:142ee8b12fef 27 *
nyatla 0:142ee8b12fef 28 * Copyright (c) 2001-2003, Adam Dunkels.
nyatla 0:142ee8b12fef 29 * All rights reserved.
nyatla 0:142ee8b12fef 30 *
nyatla 0:142ee8b12fef 31 * Redistribution and use in source and binary forms, with or without
nyatla 0:142ee8b12fef 32 * modification, are permitted provided that the following conditions
nyatla 0:142ee8b12fef 33 * are met:
nyatla 0:142ee8b12fef 34 * 1. Redistributions of source code must retain the above copyright
nyatla 0:142ee8b12fef 35 * notice, this list of conditions and the following disclaimer.
nyatla 0:142ee8b12fef 36 * 2. Redistributions in binary form must reproduce the above copyright
nyatla 0:142ee8b12fef 37 * notice, this list of conditions and the following disclaimer in the
nyatla 0:142ee8b12fef 38 * documentation and/or other materials provided with the distribution.
nyatla 0:142ee8b12fef 39 * 3. The name of the author may not be used to endorse or promote
nyatla 0:142ee8b12fef 40 * products derived from this software without specific prior
nyatla 0:142ee8b12fef 41 * written permission.
nyatla 0:142ee8b12fef 42 *
nyatla 0:142ee8b12fef 43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
nyatla 0:142ee8b12fef 44 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
nyatla 0:142ee8b12fef 45 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
nyatla 0:142ee8b12fef 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
nyatla 0:142ee8b12fef 47 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nyatla 0:142ee8b12fef 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
nyatla 0:142ee8b12fef 49 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
nyatla 0:142ee8b12fef 50 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
nyatla 0:142ee8b12fef 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
nyatla 0:142ee8b12fef 52 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
nyatla 0:142ee8b12fef 53 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nyatla 0:142ee8b12fef 54 */
nyatla 0:142ee8b12fef 55 #include "NyLPC_uip.h"
nyatla 0:142ee8b12fef 56
nyatla 0:142ee8b12fef 57
nyatla 0:142ee8b12fef 58
nyatla 0:142ee8b12fef 59 const struct NyLPC_TIPv4Addr NyLPC_TIPv4Addr_ZERO={0x00000000};
nyatla 0:142ee8b12fef 60 const struct NyLPC_TIPv4Addr NyLPC_TIPv4Addr_ALL ={0xffffffff};
nyatla 37:fc4b4fd6a649 61 const struct NyLPC_TIPv4Addr NyLPC_TIPv4Addr_BROADCAST = { 0xffffffff };
nyatla 37:fc4b4fd6a649 62 const struct NyLPC_TIPv4Addr NyLPC_TIPv4Addr_MULTICAST = NyLPC_TIPv4Addr_pack(224,0,0,0);
nyatla 37:fc4b4fd6a649 63 const struct NyLPC_TIPv4Addr NyLPC_TIPv4Addr_MULTICAST_MASK = NyLPC_TIPv4Addr_pack(224,0,0,0);
nyatla 37:fc4b4fd6a649 64 const struct NyLPC_TIPv4Addr NyLPC_TIPv4Addr_APIPA_MASK = NyLPC_TIPv4Addr_pack(255,255,0,0);
nyatla 0:142ee8b12fef 65
nyatla 57:bc4330dfa62f 66 NyLPC_TInt16 NyLPC_TIPv4Addr_toString(const struct NyLPC_TIPv4Addr* i_ip,NyLPC_TChar* i_buf)
nyatla 57:bc4330dfa62f 67 {
nyatla 57:bc4330dfa62f 68 NyLPC_TUInt32 ip;
nyatla 57:bc4330dfa62f 69 NyLPC_TChar* p=i_buf;
nyatla 57:bc4330dfa62f 70 NyLPC_TUInt8 v;
nyatla 57:bc4330dfa62f 71 NyLPC_TInt8 l;
nyatla 57:bc4330dfa62f 72 //IPをホストオーダーにする。
nyatla 57:bc4330dfa62f 73 ip=NyLPC_NTOHL(i_ip->v);
nyatla 57:bc4330dfa62f 74 for(l=3;l>=0;l--){
nyatla 57:bc4330dfa62f 75 v=(ip>>(8*l))&0xff;
nyatla 57:bc4330dfa62f 76 if(v>100){
nyatla 57:bc4330dfa62f 77 *p=(v/100)+'0';
nyatla 57:bc4330dfa62f 78 v=v%100;
nyatla 57:bc4330dfa62f 79 p++;
nyatla 57:bc4330dfa62f 80 }
nyatla 57:bc4330dfa62f 81 if(v>10){
nyatla 57:bc4330dfa62f 82 *p=(v/10)+'0';
nyatla 57:bc4330dfa62f 83 v=v%10;
nyatla 57:bc4330dfa62f 84 p++;
nyatla 57:bc4330dfa62f 85 }
nyatla 57:bc4330dfa62f 86 *p=v+'0';
nyatla 57:bc4330dfa62f 87 *(p+1)='.';
nyatla 57:bc4330dfa62f 88 p+=2;
nyatla 57:bc4330dfa62f 89 }
nyatla 57:bc4330dfa62f 90 *(p-1)='\0';
nyatla 57:bc4330dfa62f 91 return p-i_buf-1;
nyatla 57:bc4330dfa62f 92 }
nyatla 57:bc4330dfa62f 93
nyatla 0:142ee8b12fef 94
nyatla 0:142ee8b12fef 95 NyLPC_TUInt16 NyLPC_uip_chksum(NyLPC_TUInt16 sum, const NyLPC_TUInt8 *data, NyLPC_TUInt16 len)
nyatla 0:142ee8b12fef 96 {
nyatla 0:142ee8b12fef 97 NyLPC_TUInt16 t;
nyatla 0:142ee8b12fef 98 const NyLPC_TUInt8 *dataptr;
nyatla 0:142ee8b12fef 99 const NyLPC_TUInt8 *last_byte;
nyatla 0:142ee8b12fef 100
nyatla 0:142ee8b12fef 101 dataptr = data;
nyatla 0:142ee8b12fef 102 last_byte = data + len - 1;
nyatla 0:142ee8b12fef 103
nyatla 0:142ee8b12fef 104 while (dataptr < last_byte) { /* At least two more bytes */
nyatla 0:142ee8b12fef 105 t = (dataptr[0] << 8) + dataptr[1];
nyatla 0:142ee8b12fef 106 sum += t;
nyatla 0:142ee8b12fef 107 if (sum < t) {
nyatla 0:142ee8b12fef 108 sum++; /* carry */
nyatla 0:142ee8b12fef 109 }
nyatla 0:142ee8b12fef 110 dataptr += 2;
nyatla 0:142ee8b12fef 111 }
nyatla 0:142ee8b12fef 112
nyatla 0:142ee8b12fef 113 if (dataptr == last_byte) {
nyatla 0:142ee8b12fef 114 t = (dataptr[0] << 8) + 0;
nyatla 0:142ee8b12fef 115 sum += t;
nyatla 0:142ee8b12fef 116 if (sum < t) {
nyatla 0:142ee8b12fef 117 sum++; /* carry */
nyatla 0:142ee8b12fef 118 }
nyatla 0:142ee8b12fef 119 }
nyatla 0:142ee8b12fef 120
nyatla 0:142ee8b12fef 121 /* Return sum in host byte order. */
nyatla 0:142ee8b12fef 122 return sum;
nyatla 0:142ee8b12fef 123 }
nyatla 0:142ee8b12fef 124
nyatla 0:142ee8b12fef 125 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 126 *
nyatla 0:142ee8b12fef 127 * struct NyLPC_TEthernetIIHeader
nyatla 0:142ee8b12fef 128 *
nyatla 0:142ee8b12fef 129 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 130
nyatla 0:142ee8b12fef 131 /**
nyatla 0:142ee8b12fef 132 * Ethernetヘッダの内容を、ARPパケットの内容に一致するように書き換えます。
nyatla 0:142ee8b12fef 133 * i_structの後方にあるものと仮定します。
nyatla 0:142ee8b12fef 134 * 戻り値は、フレームの長さです。
nyatla 0:142ee8b12fef 135 */
nyatla 0:142ee8b12fef 136 NyLPC_TUInt16 NyLPC_TEthernetIIHeader_setArpTx(
nyatla 0:142ee8b12fef 137 struct NyLPC_TEthernetIIHeader* i_struct,
nyatla 0:142ee8b12fef 138 const struct NyLPC_TEthAddr* i_my_eth_addr)
nyatla 0:142ee8b12fef 139 {
nyatla 0:142ee8b12fef 140 struct NyLPC_TArpHeader* arph=(struct NyLPC_TArpHeader*)(((NyLPC_TUInt8*)i_struct)+sizeof(struct NyLPC_TEthernetIIHeader));
nyatla 0:142ee8b12fef 141
nyatla 0:142ee8b12fef 142 i_struct->type = NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_ARP);
nyatla 0:142ee8b12fef 143 switch(arph->opcode){
nyatla 0:142ee8b12fef 144 case NyLPC_HTONS(ARP_REPLY):
nyatla 0:142ee8b12fef 145 memcpy(i_struct->src.addr, i_my_eth_addr->addr, 6);
nyatla 0:142ee8b12fef 146 memcpy(i_struct->dest.addr, arph->dhwaddr.addr, 6);
nyatla 0:142ee8b12fef 147 break;
nyatla 0:142ee8b12fef 148 case NyLPC_HTONS(ARP_REQUEST):
nyatla 0:142ee8b12fef 149 memset(i_struct->dest.addr, 0xff, 6);
nyatla 0:142ee8b12fef 150 memcpy(i_struct->src.addr, i_my_eth_addr->addr, 6);
nyatla 0:142ee8b12fef 151 break;
nyatla 0:142ee8b12fef 152 }
nyatla 0:142ee8b12fef 153 return sizeof(struct NyLPC_TEthernetIIHeader)+sizeof(struct NyLPC_TArpHeader);
nyatla 0:142ee8b12fef 154 }
nyatla 0:142ee8b12fef 155
nyatla 0:142ee8b12fef 156 /**
nyatla 0:142ee8b12fef 157 * イーサネットヘッダをIPv4向けにセットアップする。
nyatla 0:142ee8b12fef 158 * 関数は、ペイロードをIPv4ヘッダとして、フレームサイズを計算する。
nyatla 0:142ee8b12fef 159 */
nyatla 0:142ee8b12fef 160 NyLPC_TUInt16 NyLPC_TEthernetIIHeader_setIPv4Tx(
nyatla 0:142ee8b12fef 161 struct NyLPC_TEthernetIIHeader* i_eth,
nyatla 0:142ee8b12fef 162 const struct NyLPC_TEthAddr* i_src_eth_addr,
nyatla 0:142ee8b12fef 163 const struct NyLPC_TEthAddr* i_dest_eth_addr)
nyatla 0:142ee8b12fef 164 {
nyatla 0:142ee8b12fef 165 struct NyLPC_TIPv4Header* iph=(struct NyLPC_TIPv4Header*)(((NyLPC_TUInt8*)i_eth)+sizeof(struct NyLPC_TEthernetIIHeader));
nyatla 0:142ee8b12fef 166
nyatla 0:142ee8b12fef 167 i_eth->type = NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IP);
nyatla 0:142ee8b12fef 168 /* Build an ethernet header. */
nyatla 0:142ee8b12fef 169 memcpy(i_eth->dest.addr,i_dest_eth_addr, 6);
nyatla 0:142ee8b12fef 170 memcpy(i_eth->src.addr, i_src_eth_addr->addr, 6);
nyatla 0:142ee8b12fef 171
nyatla 0:142ee8b12fef 172
nyatla 0:142ee8b12fef 173 //IPフラグメントに応じたサイズ計算
nyatla 0:142ee8b12fef 174 switch(iph->proto){
nyatla 0:142ee8b12fef 175 case UIP_PROTO_TCP:
nyatla 0:142ee8b12fef 176 return sizeof(struct NyLPC_TEthernetIIHeader)+NyLPC_htons(iph->len16);
nyatla 0:142ee8b12fef 177 case UIP_PROTO_UDP:
nyatla 37:fc4b4fd6a649 178 return sizeof(struct NyLPC_TEthernetIIHeader)+NyLPC_htons(iph->len16);
nyatla 0:142ee8b12fef 179 case UIP_PROTO_ICMP:
nyatla 0:142ee8b12fef 180 return sizeof(struct NyLPC_TEthernetIIHeader)+NyLPC_htons(iph->len16);
nyatla 0:142ee8b12fef 181 }
nyatla 0:142ee8b12fef 182 return 0;
nyatla 0:142ee8b12fef 183 }
nyatla 0:142ee8b12fef 184 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 185 *
nyatla 0:142ee8b12fef 186 * struct NyLPC_TIPv4Header
nyatla 0:142ee8b12fef 187 *
nyatla 0:142ee8b12fef 188 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 189
nyatla 0:142ee8b12fef 190 /**
nyatla 0:142ee8b12fef 191 * based on uip_ipchksum
nyatla 0:142ee8b12fef 192 */
nyatla 0:142ee8b12fef 193 NyLPC_TUInt16 NyLPC_TIPv4Header_makeIpChecksum(const struct NyLPC_TIPv4Header* ip_header)
nyatla 0:142ee8b12fef 194 {
nyatla 0:142ee8b12fef 195 NyLPC_TUInt16 sum;
nyatla 0:142ee8b12fef 196 sum = NyLPC_uip_chksum(0, (const NyLPC_TUInt8 *)ip_header,NyLPC_TIPv4Header_getHeaderLength(ip_header));
nyatla 0:142ee8b12fef 197 return (sum == 0) ? 0xffff : NyLPC_htons(sum);
nyatla 0:142ee8b12fef 198 }
nyatla 0:142ee8b12fef 199
nyatla 0:142ee8b12fef 200
nyatla 0:142ee8b12fef 201
nyatla 0:142ee8b12fef 202 NyLPC_TBool NyLPC_TIPv4Header_isCorrectIpCheckSum(const struct NyLPC_TIPv4Header* ip_header)
nyatla 0:142ee8b12fef 203 {
nyatla 0:142ee8b12fef 204 return (NyLPC_TIPv4Header_makeIpChecksum(ip_header)==0xffff);
nyatla 0:142ee8b12fef 205 }
nyatla 0:142ee8b12fef 206
nyatla 0:142ee8b12fef 207 NyLPC_TBool NyLPC_cIPv4Packet_isCorrectTcpCheckSum(const struct NyLPC_TIPv4Header* ip_header)
nyatla 0:142ee8b12fef 208 {
nyatla 0:142ee8b12fef 209 return (NyLPC_TIPv4Header_makeTcpChecksum(ip_header) == 0xffff);
nyatla 0:142ee8b12fef 210 }
nyatla 0:142ee8b12fef 211
nyatla 0:142ee8b12fef 212
nyatla 0:142ee8b12fef 213
nyatla 0:142ee8b12fef 214
nyatla 0:142ee8b12fef 215 /**
nyatla 0:142ee8b12fef 216 * TCPチェックサムを計算します。
nyatla 0:142ee8b12fef 217 * ペイロードはIPヘッダの後方に連続して存在する物と仮定します。
nyatla 0:142ee8b12fef 218 * i_lenは、ペイロード長さ
nyatla 0:142ee8b12fef 219 */
nyatla 0:142ee8b12fef 220 NyLPC_TUInt16 NyLPC_TIPv4Header_makeTcpChecksum(
nyatla 0:142ee8b12fef 221 const struct NyLPC_TIPv4Header* i_iph)
nyatla 0:142ee8b12fef 222 {
nyatla 0:142ee8b12fef 223 NyLPC_TUInt16 sum;
nyatla 0:142ee8b12fef 224 NyLPC_TUInt16 iph_len=NyLPC_TIPv4Header_getHeaderLength(i_iph);
nyatla 0:142ee8b12fef 225 NyLPC_TUInt16 len = NyLPC_ntohs((i_iph)->len16)- iph_len;
nyatla 0:142ee8b12fef 226 NyLPC_ArgAssert(i_iph!=NULL);
nyatla 0:142ee8b12fef 227 /*TCP疑似ヘッダ部分*/
nyatla 0:142ee8b12fef 228 /* IP protocol and length fields. This addition cannot carry. */
nyatla 0:142ee8b12fef 229 sum = len + i_iph->proto;
nyatla 0:142ee8b12fef 230 /* Sum IP source and destination addresses. */
nyatla 0:142ee8b12fef 231 sum = NyLPC_uip_chksum(sum, (NyLPC_TUInt8 *) &(i_iph->srcipaddr), 2 * sizeof(struct NyLPC_TIPv4Addr));
nyatla 0:142ee8b12fef 232 /* Sum TCP header and data. */
nyatla 0:142ee8b12fef 233 sum = NyLPC_uip_chksum(sum, (((NyLPC_TUInt8 *)(i_iph))+iph_len),len);
nyatla 0:142ee8b12fef 234 // sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], i_len_of_data);
nyatla 0:142ee8b12fef 235 return (sum == 0) ? 0xffff : NyLPC_htons(sum);
nyatla 0:142ee8b12fef 236 }
nyatla 0:142ee8b12fef 237 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 238 *
nyatla 0:142ee8b12fef 239 * struct NyLPC_TIPv6Header
nyatla 0:142ee8b12fef 240 *
nyatla 0:142ee8b12fef 241 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 242 #define IPV6_HEADER_SIZE 40
nyatla 0:142ee8b12fef 243 /**
nyatla 0:142ee8b12fef 244 * IPヘッダーを作って埋める関数
nyatla 0:142ee8b12fef 245 */
nyatla 0:142ee8b12fef 246 void NyLPC_TIPv6Header_setSendHeader(
nyatla 0:142ee8b12fef 247 struct NyLPC_TIPv6Header* i_iph,
nyatla 0:142ee8b12fef 248 uip_ip6addr_t i_src,
nyatla 0:142ee8b12fef 249 uip_ip6addr_t i_dest,
nyatla 0:142ee8b12fef 250 NyLPC_TUInt8 i_proto,
nyatla 0:142ee8b12fef 251 NyLPC_TUInt8 i_ttl,
nyatla 0:142ee8b12fef 252 NyLPC_TUInt16 i_len)
nyatla 0:142ee8b12fef 253 {
nyatla 0:142ee8b12fef 254 i_iph->srcipaddr=i_src;
nyatla 0:142ee8b12fef 255 i_iph->destipaddr=i_dest;
nyatla 0:142ee8b12fef 256 i_iph->proto=i_proto;
nyatla 0:142ee8b12fef 257 i_iph->ttl = i_ttl;
nyatla 0:142ee8b12fef 258 i_iph->vtc = 0x60;
nyatla 0:142ee8b12fef 259 i_iph->tcflow = 0x00;
nyatla 0:142ee8b12fef 260 i_iph->flow = 0x00;
nyatla 0:142ee8b12fef 261 i_iph->len16= NyLPC_htons(i_len - IPV6_HEADER_SIZE);
nyatla 0:142ee8b12fef 262 return;
nyatla 0:142ee8b12fef 263 }
nyatla 0:142ee8b12fef 264
nyatla 0:142ee8b12fef 265
nyatla 0:142ee8b12fef 266 /**
nyatla 0:142ee8b12fef 267 * チェックサムは、TCP疑似ヘッダから計算。
nyatla 0:142ee8b12fef 268 * i_tcpiphの送信/受信アドレス、ProtocolID,DATAフィールドは有効であること。
nyatla 0:142ee8b12fef 269 */
nyatla 0:142ee8b12fef 270 NyLPC_TUInt16 NyLPC_TIPv6Header_makeTcpChecksum(
nyatla 0:142ee8b12fef 271 struct NyLPC_TIPv6Header* i_iph,
nyatla 0:142ee8b12fef 272 NyLPC_TUInt16 i_len)
nyatla 0:142ee8b12fef 273 {
nyatla 0:142ee8b12fef 274 NyLPC_TUInt16 sum;
nyatla 0:142ee8b12fef 275 NyLPC_TUInt16 len;
nyatla 0:142ee8b12fef 276 len = i_len;
nyatla 0:142ee8b12fef 277 /*TCP疑似ヘッダ部分*/
nyatla 0:142ee8b12fef 278 /* IP protocol and length fields. This addition cannot carry. */
nyatla 0:142ee8b12fef 279 sum = len + i_iph->proto;
nyatla 0:142ee8b12fef 280 /* Sum IP source and destination addresses. */
nyatla 0:142ee8b12fef 281 sum = NyLPC_uip_chksum(sum, (NyLPC_TUInt8 *) &(i_iph->srcipaddr), 2 * sizeof(uip_ip6addr_t));
nyatla 0:142ee8b12fef 282 /* Sum TCP header and data. */
nyatla 0:142ee8b12fef 283 sum = NyLPC_uip_chksum(sum, (((NyLPC_TUInt8 *)(i_iph))+IPV6_HEADER_SIZE),len);
nyatla 0:142ee8b12fef 284 // sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], i_len_of_data);
nyatla 0:142ee8b12fef 285 return (sum == 0) ? 0xffff : NyLPC_htons(sum);
nyatla 0:142ee8b12fef 286 }
nyatla 0:142ee8b12fef 287
nyatla 0:142ee8b12fef 288
nyatla 0:142ee8b12fef 289
nyatla 0:142ee8b12fef 290 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 291 *
nyatla 0:142ee8b12fef 292 * struct NyLPC_TTcpHeader
nyatla 0:142ee8b12fef 293 *
nyatla 0:142ee8b12fef 294 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 295
nyatla 0:142ee8b12fef 296
nyatla 0:142ee8b12fef 297 /**
nyatla 0:142ee8b12fef 298 * MMSオプションの値を返す。
nyatla 0:142ee8b12fef 299 */
nyatla 0:142ee8b12fef 300 NyLPC_TBool NyLPC_TTcpHeader_getTcpMmsOpt(
nyatla 0:142ee8b12fef 301 const struct NyLPC_TTcpHeader* i_struct,NyLPC_TUInt16* o_val)
nyatla 0:142ee8b12fef 302 {
nyatla 0:142ee8b12fef 303 NyLPC_TUInt8* opt;
nyatla 0:142ee8b12fef 304 opt=NyLPC_TTcpHeader_getTcpOptFragmentPtr(i_struct,TCP_OPT_MSS);
nyatla 0:142ee8b12fef 305 if(opt!=NULL){
nyatla 0:142ee8b12fef 306 if (*(opt+1) == TCP_OPT_MSS_LEN)
nyatla 0:142ee8b12fef 307 {
nyatla 0:142ee8b12fef 308 // An MSS option with the right option length.
nyatla 0:142ee8b12fef 309 *o_val = ((NyLPC_TUInt16) (*(opt+2)) << 8) | (NyLPC_TUInt16) (*(opt + 3));
nyatla 0:142ee8b12fef 310 //And we are done processing options.
nyatla 0:142ee8b12fef 311 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 312 }
nyatla 0:142ee8b12fef 313 }
nyatla 0:142ee8b12fef 314 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 315 }
nyatla 0:142ee8b12fef 316
nyatla 0:142ee8b12fef 317 #define DEFAULT_TCP_HEADER_LEN 20
nyatla 0:142ee8b12fef 318 /**
nyatla 0:142ee8b12fef 319 * TCPフラグメントのポインタを返す。
nyatla 0:142ee8b12fef 320 */
nyatla 0:142ee8b12fef 321 NyLPC_TUInt8* NyLPC_TTcpHeader_getTcpOptFragmentPtr(
nyatla 0:142ee8b12fef 322 const struct NyLPC_TTcpHeader* i_struct,
nyatla 0:142ee8b12fef 323 NyLPC_TUInt8 i_opt_id)
nyatla 0:142ee8b12fef 324 {
nyatla 0:142ee8b12fef 325 NyLPC_TUInt8 opt;
nyatla 0:142ee8b12fef 326 int c;
nyatla 0:142ee8b12fef 327 NyLPC_TUInt8* opt_buf=((NyLPC_TUInt8*)(i_struct+1));
nyatla 0:142ee8b12fef 328
nyatla 0:142ee8b12fef 329 /* Parse the TCP MSS option, if present. */
nyatla 0:142ee8b12fef 330 if ((i_struct->tcpoffset & 0xf0) > 0x50){
nyatla 0:142ee8b12fef 331 for (c = 0; c < ((i_struct->tcpoffset >> 4) - 5) << 2;)
nyatla 0:142ee8b12fef 332 {
nyatla 0:142ee8b12fef 333 opt=opt_buf[c];
nyatla 0:142ee8b12fef 334 if(opt==i_opt_id){
nyatla 0:142ee8b12fef 335 return opt_buf+c;//found!
nyatla 0:142ee8b12fef 336 }
nyatla 0:142ee8b12fef 337 switch(opt)
nyatla 0:142ee8b12fef 338 {
nyatla 0:142ee8b12fef 339 case TCP_OPT_NOOP:
nyatla 0:142ee8b12fef 340 continue;//NOP option.
nyatla 0:142ee8b12fef 341 case TCP_OPT_END:
nyatla 0:142ee8b12fef 342 return NULL;//End of options.
nyatla 0:142ee8b12fef 343 default:
nyatla 0:142ee8b12fef 344 // All other options have a length field, so that we easily can skip past them.
nyatla 0:142ee8b12fef 345 if (opt_buf[1 + c] == 0) {
nyatla 0:142ee8b12fef 346 // If the length field is zero, the options are malformed and we don't process them further.
nyatla 0:142ee8b12fef 347 NyLPC_OnErrorGoto(ERROR_INVALID_OPTION);
nyatla 0:142ee8b12fef 348 }
nyatla 0:142ee8b12fef 349 c += opt_buf[1 + c];
nyatla 0:142ee8b12fef 350 }
nyatla 0:142ee8b12fef 351 }
nyatla 0:142ee8b12fef 352 }
nyatla 0:142ee8b12fef 353 ERROR_INVALID_OPTION:
nyatla 0:142ee8b12fef 354 return NULL;
nyatla 0:142ee8b12fef 355 }
nyatla 0:142ee8b12fef 356 /*
nyatla 0:142ee8b12fef 357 * Optionパラメタを書きだす。
nyatla 0:142ee8b12fef 358 */
nyatla 0:142ee8b12fef 359 void NyLPC_TTcpHeader_setMmsOpt(NyLPC_TUInt8* i_opt_addr,NyLPC_TUInt16 i_mms)
nyatla 0:142ee8b12fef 360 {
nyatla 0:142ee8b12fef 361 i_opt_addr[0] = TCP_OPT_MSS;
nyatla 0:142ee8b12fef 362 i_opt_addr[1] = TCP_OPT_MSS_LEN;
nyatla 0:142ee8b12fef 363 i_opt_addr[2] = (i_mms) / 256;
nyatla 0:142ee8b12fef 364 i_opt_addr[3] = (i_mms) & 255;
nyatla 0:142ee8b12fef 365 return;
nyatla 0:142ee8b12fef 366 }
nyatla 0:142ee8b12fef 367
nyatla 0:142ee8b12fef 368
nyatla 0:142ee8b12fef 369 NyLPC_TUInt16 NyLPC_TTcpHeader_getHeaderLength(const struct NyLPC_TTcpHeader* ip_header)
nyatla 0:142ee8b12fef 370 {
nyatla 0:142ee8b12fef 371 return (ip_header->tcpoffset>>4)*4;
nyatla 0:142ee8b12fef 372 }
nyatla 37:fc4b4fd6a649 373 /*--------------------------------------------------------------------------------
nyatla 37:fc4b4fd6a649 374 *
nyatla 37:fc4b4fd6a649 375 * struct NyLPC_TUdpHeader
nyatla 37:fc4b4fd6a649 376 *
nyatla 37:fc4b4fd6a649 377 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 378
nyatla 0:142ee8b12fef 379
nyatla 0:142ee8b12fef 380
nyatla 0:142ee8b12fef 381 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 382 *
nyatla 0:142ee8b12fef 383 * struct NyLPC_TArpHeader
nyatla 0:142ee8b12fef 384 *
nyatla 0:142ee8b12fef 385 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 386 /**
nyatla 57:bc4330dfa62f 387 * i_req_addrを問い合わせるARP_REQUESTを生成します。
nyatla 0:142ee8b12fef 388 */
nyatla 0:142ee8b12fef 389 void NyLPC_TArpHeader_setArpRequest(
nyatla 0:142ee8b12fef 390 struct NyLPC_TArpHeader* i_struct,
nyatla 0:142ee8b12fef 391 const struct NyLPC_TIPv4Addr i_saddr,
nyatla 0:142ee8b12fef 392 const struct NyLPC_TEthAddr* i_srceth,
nyatla 57:bc4330dfa62f 393 const struct NyLPC_TIPv4Addr* i_req_addr)
nyatla 0:142ee8b12fef 394 {
nyatla 0:142ee8b12fef 395 memset(i_struct->dhwaddr.addr, 0x00, 6);
nyatla 0:142ee8b12fef 396 memcpy(i_struct->shwaddr.addr, i_srceth, 6);
nyatla 57:bc4330dfa62f 397 i_struct->dipaddr=*i_req_addr;
nyatla 0:142ee8b12fef 398 i_struct->sipaddr=i_saddr;
nyatla 0:142ee8b12fef 399 i_struct->opcode = NyLPC_HTONS(ARP_REQUEST); /* ARP request. */
nyatla 0:142ee8b12fef 400 i_struct->hwtype = NyLPC_HTONS(ARP_HWTYPE_ETH);
nyatla 0:142ee8b12fef 401 i_struct->protocol = NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IP);
nyatla 0:142ee8b12fef 402 i_struct->hwlen = 6;
nyatla 0:142ee8b12fef 403 i_struct->protolen = 4;
nyatla 0:142ee8b12fef 404 return;
nyatla 0:142ee8b12fef 405 }
nyatla 0:142ee8b12fef 406
nyatla 0:142ee8b12fef 407 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 408 *
nyatla 0:142ee8b12fef 409 * class IPv4Route
nyatla 0:142ee8b12fef 410 *
nyatla 0:142ee8b12fef 411 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 412
nyatla 0:142ee8b12fef 413