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 Jul 23 03:44:28 2014 +0000
Revision:
88:89598b2097fa
Parent:
69:8c5f220441f5
mbed1768???UPnP????????????; IP???????????????

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 88:89598b2097fa 76 if(v>=100){
nyatla 57:bc4330dfa62f 77 *p=(v/100)+'0';
nyatla 57:bc4330dfa62f 78 p++;
nyatla 57:bc4330dfa62f 79 }
nyatla 88:89598b2097fa 80 if(v>=10){
nyatla 88:89598b2097fa 81 *p=((v%100)/10)+'0';
nyatla 57:bc4330dfa62f 82 p++;
nyatla 57:bc4330dfa62f 83 }
nyatla 88:89598b2097fa 84 *p=(v%10)+'0';
nyatla 57:bc4330dfa62f 85 *(p+1)='.';
nyatla 57:bc4330dfa62f 86 p+=2;
nyatla 57:bc4330dfa62f 87 }
nyatla 57:bc4330dfa62f 88 *(p-1)='\0';
nyatla 57:bc4330dfa62f 89 return p-i_buf-1;
nyatla 57:bc4330dfa62f 90 }
nyatla 57:bc4330dfa62f 91
nyatla 0:142ee8b12fef 92
nyatla 0:142ee8b12fef 93 NyLPC_TUInt16 NyLPC_uip_chksum(NyLPC_TUInt16 sum, const NyLPC_TUInt8 *data, NyLPC_TUInt16 len)
nyatla 0:142ee8b12fef 94 {
nyatla 0:142ee8b12fef 95 NyLPC_TUInt16 t;
nyatla 0:142ee8b12fef 96 const NyLPC_TUInt8 *dataptr;
nyatla 0:142ee8b12fef 97 const NyLPC_TUInt8 *last_byte;
nyatla 0:142ee8b12fef 98
nyatla 0:142ee8b12fef 99 dataptr = data;
nyatla 0:142ee8b12fef 100 last_byte = data + len - 1;
nyatla 0:142ee8b12fef 101
nyatla 0:142ee8b12fef 102 while (dataptr < last_byte) { /* At least two more bytes */
nyatla 0:142ee8b12fef 103 t = (dataptr[0] << 8) + dataptr[1];
nyatla 0:142ee8b12fef 104 sum += t;
nyatla 0:142ee8b12fef 105 if (sum < t) {
nyatla 0:142ee8b12fef 106 sum++; /* carry */
nyatla 0:142ee8b12fef 107 }
nyatla 0:142ee8b12fef 108 dataptr += 2;
nyatla 0:142ee8b12fef 109 }
nyatla 0:142ee8b12fef 110
nyatla 0:142ee8b12fef 111 if (dataptr == last_byte) {
nyatla 0:142ee8b12fef 112 t = (dataptr[0] << 8) + 0;
nyatla 0:142ee8b12fef 113 sum += t;
nyatla 0:142ee8b12fef 114 if (sum < t) {
nyatla 0:142ee8b12fef 115 sum++; /* carry */
nyatla 0:142ee8b12fef 116 }
nyatla 0:142ee8b12fef 117 }
nyatla 0:142ee8b12fef 118
nyatla 0:142ee8b12fef 119 /* Return sum in host byte order. */
nyatla 0:142ee8b12fef 120 return sum;
nyatla 0:142ee8b12fef 121 }
nyatla 0:142ee8b12fef 122
nyatla 0:142ee8b12fef 123 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 124 *
nyatla 0:142ee8b12fef 125 * struct NyLPC_TEthernetIIHeader
nyatla 0:142ee8b12fef 126 *
nyatla 0:142ee8b12fef 127 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 128
nyatla 0:142ee8b12fef 129 /**
nyatla 0:142ee8b12fef 130 * Ethernetヘッダの内容を、ARPパケットの内容に一致するように書き換えます。
nyatla 0:142ee8b12fef 131 * i_structの後方にあるものと仮定します。
nyatla 0:142ee8b12fef 132 * 戻り値は、フレームの長さです。
nyatla 0:142ee8b12fef 133 */
nyatla 0:142ee8b12fef 134 NyLPC_TUInt16 NyLPC_TEthernetIIHeader_setArpTx(
nyatla 0:142ee8b12fef 135 struct NyLPC_TEthernetIIHeader* i_struct,
nyatla 0:142ee8b12fef 136 const struct NyLPC_TEthAddr* i_my_eth_addr)
nyatla 0:142ee8b12fef 137 {
nyatla 0:142ee8b12fef 138 struct NyLPC_TArpHeader* arph=(struct NyLPC_TArpHeader*)(((NyLPC_TUInt8*)i_struct)+sizeof(struct NyLPC_TEthernetIIHeader));
nyatla 0:142ee8b12fef 139
nyatla 0:142ee8b12fef 140 i_struct->type = NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_ARP);
nyatla 0:142ee8b12fef 141 switch(arph->opcode){
nyatla 0:142ee8b12fef 142 case NyLPC_HTONS(ARP_REPLY):
nyatla 0:142ee8b12fef 143 memcpy(i_struct->src.addr, i_my_eth_addr->addr, 6);
nyatla 0:142ee8b12fef 144 memcpy(i_struct->dest.addr, arph->dhwaddr.addr, 6);
nyatla 0:142ee8b12fef 145 break;
nyatla 0:142ee8b12fef 146 case NyLPC_HTONS(ARP_REQUEST):
nyatla 0:142ee8b12fef 147 memset(i_struct->dest.addr, 0xff, 6);
nyatla 0:142ee8b12fef 148 memcpy(i_struct->src.addr, i_my_eth_addr->addr, 6);
nyatla 0:142ee8b12fef 149 break;
nyatla 0:142ee8b12fef 150 }
nyatla 0:142ee8b12fef 151 return sizeof(struct NyLPC_TEthernetIIHeader)+sizeof(struct NyLPC_TArpHeader);
nyatla 0:142ee8b12fef 152 }
nyatla 0:142ee8b12fef 153
nyatla 0:142ee8b12fef 154 /**
nyatla 0:142ee8b12fef 155 * イーサネットヘッダをIPv4向けにセットアップする。
nyatla 0:142ee8b12fef 156 * 関数は、ペイロードをIPv4ヘッダとして、フレームサイズを計算する。
nyatla 0:142ee8b12fef 157 */
nyatla 0:142ee8b12fef 158 NyLPC_TUInt16 NyLPC_TEthernetIIHeader_setIPv4Tx(
nyatla 0:142ee8b12fef 159 struct NyLPC_TEthernetIIHeader* i_eth,
nyatla 0:142ee8b12fef 160 const struct NyLPC_TEthAddr* i_src_eth_addr,
nyatla 0:142ee8b12fef 161 const struct NyLPC_TEthAddr* i_dest_eth_addr)
nyatla 0:142ee8b12fef 162 {
nyatla 0:142ee8b12fef 163 struct NyLPC_TIPv4Header* iph=(struct NyLPC_TIPv4Header*)(((NyLPC_TUInt8*)i_eth)+sizeof(struct NyLPC_TEthernetIIHeader));
nyatla 0:142ee8b12fef 164
nyatla 0:142ee8b12fef 165 i_eth->type = NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IP);
nyatla 0:142ee8b12fef 166 /* Build an ethernet header. */
nyatla 0:142ee8b12fef 167 memcpy(i_eth->dest.addr,i_dest_eth_addr, 6);
nyatla 0:142ee8b12fef 168 memcpy(i_eth->src.addr, i_src_eth_addr->addr, 6);
nyatla 0:142ee8b12fef 169
nyatla 0:142ee8b12fef 170
nyatla 0:142ee8b12fef 171 //IPフラグメントに応じたサイズ計算
nyatla 0:142ee8b12fef 172 switch(iph->proto){
nyatla 0:142ee8b12fef 173 case UIP_PROTO_TCP:
nyatla 0:142ee8b12fef 174 return sizeof(struct NyLPC_TEthernetIIHeader)+NyLPC_htons(iph->len16);
nyatla 0:142ee8b12fef 175 case UIP_PROTO_UDP:
nyatla 37:fc4b4fd6a649 176 return sizeof(struct NyLPC_TEthernetIIHeader)+NyLPC_htons(iph->len16);
nyatla 0:142ee8b12fef 177 case UIP_PROTO_ICMP:
nyatla 0:142ee8b12fef 178 return sizeof(struct NyLPC_TEthernetIIHeader)+NyLPC_htons(iph->len16);
nyatla 0:142ee8b12fef 179 }
nyatla 0:142ee8b12fef 180 return 0;
nyatla 0:142ee8b12fef 181 }
nyatla 0:142ee8b12fef 182 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 183 *
nyatla 0:142ee8b12fef 184 * struct NyLPC_TIPv4Header
nyatla 0:142ee8b12fef 185 *
nyatla 0:142ee8b12fef 186 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 187
nyatla 0:142ee8b12fef 188 /**
nyatla 0:142ee8b12fef 189 * based on uip_ipchksum
nyatla 0:142ee8b12fef 190 */
nyatla 0:142ee8b12fef 191 NyLPC_TUInt16 NyLPC_TIPv4Header_makeIpChecksum(const struct NyLPC_TIPv4Header* ip_header)
nyatla 0:142ee8b12fef 192 {
nyatla 0:142ee8b12fef 193 NyLPC_TUInt16 sum;
nyatla 0:142ee8b12fef 194 sum = NyLPC_uip_chksum(0, (const NyLPC_TUInt8 *)ip_header,NyLPC_TIPv4Header_getHeaderLength(ip_header));
nyatla 0:142ee8b12fef 195 return (sum == 0) ? 0xffff : NyLPC_htons(sum);
nyatla 0:142ee8b12fef 196 }
nyatla 0:142ee8b12fef 197
nyatla 0:142ee8b12fef 198
nyatla 0:142ee8b12fef 199
nyatla 0:142ee8b12fef 200 NyLPC_TBool NyLPC_TIPv4Header_isCorrectIpCheckSum(const struct NyLPC_TIPv4Header* ip_header)
nyatla 0:142ee8b12fef 201 {
nyatla 0:142ee8b12fef 202 return (NyLPC_TIPv4Header_makeIpChecksum(ip_header)==0xffff);
nyatla 0:142ee8b12fef 203 }
nyatla 0:142ee8b12fef 204
nyatla 0:142ee8b12fef 205 NyLPC_TBool NyLPC_cIPv4Packet_isCorrectTcpCheckSum(const struct NyLPC_TIPv4Header* ip_header)
nyatla 0:142ee8b12fef 206 {
nyatla 0:142ee8b12fef 207 return (NyLPC_TIPv4Header_makeTcpChecksum(ip_header) == 0xffff);
nyatla 0:142ee8b12fef 208 }
nyatla 0:142ee8b12fef 209
nyatla 0:142ee8b12fef 210
nyatla 0:142ee8b12fef 211
nyatla 0:142ee8b12fef 212
nyatla 0:142ee8b12fef 213 /**
nyatla 0:142ee8b12fef 214 * TCPチェックサムを計算します。
nyatla 0:142ee8b12fef 215 * ペイロードはIPヘッダの後方に連続して存在する物と仮定します。
nyatla 0:142ee8b12fef 216 * i_lenは、ペイロード長さ
nyatla 0:142ee8b12fef 217 */
nyatla 0:142ee8b12fef 218 NyLPC_TUInt16 NyLPC_TIPv4Header_makeTcpChecksum(
nyatla 0:142ee8b12fef 219 const struct NyLPC_TIPv4Header* i_iph)
nyatla 0:142ee8b12fef 220 {
nyatla 0:142ee8b12fef 221 NyLPC_TUInt16 sum;
nyatla 0:142ee8b12fef 222 NyLPC_TUInt16 iph_len=NyLPC_TIPv4Header_getHeaderLength(i_iph);
nyatla 0:142ee8b12fef 223 NyLPC_TUInt16 len = NyLPC_ntohs((i_iph)->len16)- iph_len;
nyatla 0:142ee8b12fef 224 NyLPC_ArgAssert(i_iph!=NULL);
nyatla 0:142ee8b12fef 225 /*TCP疑似ヘッダ部分*/
nyatla 0:142ee8b12fef 226 /* IP protocol and length fields. This addition cannot carry. */
nyatla 0:142ee8b12fef 227 sum = len + i_iph->proto;
nyatla 0:142ee8b12fef 228 /* Sum IP source and destination addresses. */
nyatla 0:142ee8b12fef 229 sum = NyLPC_uip_chksum(sum, (NyLPC_TUInt8 *) &(i_iph->srcipaddr), 2 * sizeof(struct NyLPC_TIPv4Addr));
nyatla 0:142ee8b12fef 230 /* Sum TCP header and data. */
nyatla 0:142ee8b12fef 231 sum = NyLPC_uip_chksum(sum, (((NyLPC_TUInt8 *)(i_iph))+iph_len),len);
nyatla 0:142ee8b12fef 232 // sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], i_len_of_data);
nyatla 0:142ee8b12fef 233 return (sum == 0) ? 0xffff : NyLPC_htons(sum);
nyatla 0:142ee8b12fef 234 }
nyatla 69:8c5f220441f5 235
nyatla 69:8c5f220441f5 236 static NyLPC_TUInt16 pid=0x3939;
nyatla 69:8c5f220441f5 237 /**
nyatla 69:8c5f220441f5 238 * IPヘッダを送信パケット用に設定する。
nyatla 69:8c5f220441f5 239 * ipid16にはコールされるたびに新しい値を設定する。
nyatla 69:8c5f220441f5 240 * ipcecksumには0を設定する。
nyatla 69:8c5f220441f5 241 * この関数は、パケットサイズ,ローカルIP/リモートIPの設定はしない。
nyatla 69:8c5f220441f5 242 */
nyatla 69:8c5f220441f5 243 void NyLPC_TIPv4Header_writeTxIpHeader(
nyatla 69:8c5f220441f5 244 struct NyLPC_TIPv4Header* i_struct,
nyatla 69:8c5f220441f5 245 NyLPC_TUInt8 i_proto)
nyatla 69:8c5f220441f5 246 {
nyatla 69:8c5f220441f5 247 //IPパケットのセット
nyatla 69:8c5f220441f5 248 i_struct->proto=i_proto;
nyatla 69:8c5f220441f5 249 i_struct->ttl = UIP_DEFAULT_IP_TTL;
nyatla 69:8c5f220441f5 250 i_struct->tos = 0;
nyatla 69:8c5f220441f5 251 i_struct->ipid16=(pid++);
nyatla 69:8c5f220441f5 252 i_struct->ipoffset=0;//NyLPC_HTONS(0|0x4000);
nyatla 69:8c5f220441f5 253 i_struct->ipchksum = 0;
nyatla 69:8c5f220441f5 254 }
nyatla 0:142ee8b12fef 255 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 256 *
nyatla 0:142ee8b12fef 257 * struct NyLPC_TIPv6Header
nyatla 0:142ee8b12fef 258 *
nyatla 0:142ee8b12fef 259 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 260 #define IPV6_HEADER_SIZE 40
nyatla 0:142ee8b12fef 261 /**
nyatla 0:142ee8b12fef 262 * IPヘッダーを作って埋める関数
nyatla 0:142ee8b12fef 263 */
nyatla 0:142ee8b12fef 264 void NyLPC_TIPv6Header_setSendHeader(
nyatla 0:142ee8b12fef 265 struct NyLPC_TIPv6Header* i_iph,
nyatla 0:142ee8b12fef 266 uip_ip6addr_t i_src,
nyatla 0:142ee8b12fef 267 uip_ip6addr_t i_dest,
nyatla 0:142ee8b12fef 268 NyLPC_TUInt8 i_proto,
nyatla 0:142ee8b12fef 269 NyLPC_TUInt8 i_ttl,
nyatla 0:142ee8b12fef 270 NyLPC_TUInt16 i_len)
nyatla 0:142ee8b12fef 271 {
nyatla 0:142ee8b12fef 272 i_iph->srcipaddr=i_src;
nyatla 0:142ee8b12fef 273 i_iph->destipaddr=i_dest;
nyatla 0:142ee8b12fef 274 i_iph->proto=i_proto;
nyatla 0:142ee8b12fef 275 i_iph->ttl = i_ttl;
nyatla 0:142ee8b12fef 276 i_iph->vtc = 0x60;
nyatla 0:142ee8b12fef 277 i_iph->tcflow = 0x00;
nyatla 0:142ee8b12fef 278 i_iph->flow = 0x00;
nyatla 0:142ee8b12fef 279 i_iph->len16= NyLPC_htons(i_len - IPV6_HEADER_SIZE);
nyatla 0:142ee8b12fef 280 return;
nyatla 0:142ee8b12fef 281 }
nyatla 0:142ee8b12fef 282
nyatla 0:142ee8b12fef 283
nyatla 0:142ee8b12fef 284 /**
nyatla 0:142ee8b12fef 285 * チェックサムは、TCP疑似ヘッダから計算。
nyatla 0:142ee8b12fef 286 * i_tcpiphの送信/受信アドレス、ProtocolID,DATAフィールドは有効であること。
nyatla 0:142ee8b12fef 287 */
nyatla 0:142ee8b12fef 288 NyLPC_TUInt16 NyLPC_TIPv6Header_makeTcpChecksum(
nyatla 0:142ee8b12fef 289 struct NyLPC_TIPv6Header* i_iph,
nyatla 0:142ee8b12fef 290 NyLPC_TUInt16 i_len)
nyatla 0:142ee8b12fef 291 {
nyatla 0:142ee8b12fef 292 NyLPC_TUInt16 sum;
nyatla 0:142ee8b12fef 293 NyLPC_TUInt16 len;
nyatla 0:142ee8b12fef 294 len = i_len;
nyatla 0:142ee8b12fef 295 /*TCP疑似ヘッダ部分*/
nyatla 0:142ee8b12fef 296 /* IP protocol and length fields. This addition cannot carry. */
nyatla 0:142ee8b12fef 297 sum = len + i_iph->proto;
nyatla 0:142ee8b12fef 298 /* Sum IP source and destination addresses. */
nyatla 0:142ee8b12fef 299 sum = NyLPC_uip_chksum(sum, (NyLPC_TUInt8 *) &(i_iph->srcipaddr), 2 * sizeof(uip_ip6addr_t));
nyatla 0:142ee8b12fef 300 /* Sum TCP header and data. */
nyatla 0:142ee8b12fef 301 sum = NyLPC_uip_chksum(sum, (((NyLPC_TUInt8 *)(i_iph))+IPV6_HEADER_SIZE),len);
nyatla 0:142ee8b12fef 302 // sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], i_len_of_data);
nyatla 0:142ee8b12fef 303 return (sum == 0) ? 0xffff : NyLPC_htons(sum);
nyatla 0:142ee8b12fef 304 }
nyatla 0:142ee8b12fef 305
nyatla 0:142ee8b12fef 306
nyatla 0:142ee8b12fef 307
nyatla 0:142ee8b12fef 308 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 309 *
nyatla 0:142ee8b12fef 310 * struct NyLPC_TTcpHeader
nyatla 0:142ee8b12fef 311 *
nyatla 0:142ee8b12fef 312 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 313
nyatla 0:142ee8b12fef 314
nyatla 0:142ee8b12fef 315 /**
nyatla 0:142ee8b12fef 316 * MMSオプションの値を返す。
nyatla 0:142ee8b12fef 317 */
nyatla 0:142ee8b12fef 318 NyLPC_TBool NyLPC_TTcpHeader_getTcpMmsOpt(
nyatla 0:142ee8b12fef 319 const struct NyLPC_TTcpHeader* i_struct,NyLPC_TUInt16* o_val)
nyatla 0:142ee8b12fef 320 {
nyatla 0:142ee8b12fef 321 NyLPC_TUInt8* opt;
nyatla 0:142ee8b12fef 322 opt=NyLPC_TTcpHeader_getTcpOptFragmentPtr(i_struct,TCP_OPT_MSS);
nyatla 0:142ee8b12fef 323 if(opt!=NULL){
nyatla 0:142ee8b12fef 324 if (*(opt+1) == TCP_OPT_MSS_LEN)
nyatla 0:142ee8b12fef 325 {
nyatla 0:142ee8b12fef 326 // An MSS option with the right option length.
nyatla 0:142ee8b12fef 327 *o_val = ((NyLPC_TUInt16) (*(opt+2)) << 8) | (NyLPC_TUInt16) (*(opt + 3));
nyatla 0:142ee8b12fef 328 //And we are done processing options.
nyatla 0:142ee8b12fef 329 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 330 }
nyatla 0:142ee8b12fef 331 }
nyatla 0:142ee8b12fef 332 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 333 }
nyatla 0:142ee8b12fef 334
nyatla 0:142ee8b12fef 335 #define DEFAULT_TCP_HEADER_LEN 20
nyatla 0:142ee8b12fef 336 /**
nyatla 0:142ee8b12fef 337 * TCPフラグメントのポインタを返す。
nyatla 0:142ee8b12fef 338 */
nyatla 0:142ee8b12fef 339 NyLPC_TUInt8* NyLPC_TTcpHeader_getTcpOptFragmentPtr(
nyatla 0:142ee8b12fef 340 const struct NyLPC_TTcpHeader* i_struct,
nyatla 0:142ee8b12fef 341 NyLPC_TUInt8 i_opt_id)
nyatla 0:142ee8b12fef 342 {
nyatla 0:142ee8b12fef 343 NyLPC_TUInt8 opt;
nyatla 0:142ee8b12fef 344 int c;
nyatla 0:142ee8b12fef 345 NyLPC_TUInt8* opt_buf=((NyLPC_TUInt8*)(i_struct+1));
nyatla 0:142ee8b12fef 346
nyatla 0:142ee8b12fef 347 /* Parse the TCP MSS option, if present. */
nyatla 0:142ee8b12fef 348 if ((i_struct->tcpoffset & 0xf0) > 0x50){
nyatla 0:142ee8b12fef 349 for (c = 0; c < ((i_struct->tcpoffset >> 4) - 5) << 2;)
nyatla 0:142ee8b12fef 350 {
nyatla 0:142ee8b12fef 351 opt=opt_buf[c];
nyatla 0:142ee8b12fef 352 if(opt==i_opt_id){
nyatla 0:142ee8b12fef 353 return opt_buf+c;//found!
nyatla 0:142ee8b12fef 354 }
nyatla 0:142ee8b12fef 355 switch(opt)
nyatla 0:142ee8b12fef 356 {
nyatla 0:142ee8b12fef 357 case TCP_OPT_NOOP:
nyatla 0:142ee8b12fef 358 continue;//NOP option.
nyatla 0:142ee8b12fef 359 case TCP_OPT_END:
nyatla 0:142ee8b12fef 360 return NULL;//End of options.
nyatla 0:142ee8b12fef 361 default:
nyatla 0:142ee8b12fef 362 // All other options have a length field, so that we easily can skip past them.
nyatla 0:142ee8b12fef 363 if (opt_buf[1 + c] == 0) {
nyatla 0:142ee8b12fef 364 // If the length field is zero, the options are malformed and we don't process them further.
nyatla 0:142ee8b12fef 365 NyLPC_OnErrorGoto(ERROR_INVALID_OPTION);
nyatla 0:142ee8b12fef 366 }
nyatla 0:142ee8b12fef 367 c += opt_buf[1 + c];
nyatla 0:142ee8b12fef 368 }
nyatla 0:142ee8b12fef 369 }
nyatla 0:142ee8b12fef 370 }
nyatla 0:142ee8b12fef 371 ERROR_INVALID_OPTION:
nyatla 0:142ee8b12fef 372 return NULL;
nyatla 0:142ee8b12fef 373 }
nyatla 0:142ee8b12fef 374 /*
nyatla 0:142ee8b12fef 375 * Optionパラメタを書きだす。
nyatla 0:142ee8b12fef 376 */
nyatla 0:142ee8b12fef 377 void NyLPC_TTcpHeader_setMmsOpt(NyLPC_TUInt8* i_opt_addr,NyLPC_TUInt16 i_mms)
nyatla 0:142ee8b12fef 378 {
nyatla 0:142ee8b12fef 379 i_opt_addr[0] = TCP_OPT_MSS;
nyatla 0:142ee8b12fef 380 i_opt_addr[1] = TCP_OPT_MSS_LEN;
nyatla 0:142ee8b12fef 381 i_opt_addr[2] = (i_mms) / 256;
nyatla 0:142ee8b12fef 382 i_opt_addr[3] = (i_mms) & 255;
nyatla 0:142ee8b12fef 383 return;
nyatla 0:142ee8b12fef 384 }
nyatla 0:142ee8b12fef 385
nyatla 0:142ee8b12fef 386
nyatla 0:142ee8b12fef 387 NyLPC_TUInt16 NyLPC_TTcpHeader_getHeaderLength(const struct NyLPC_TTcpHeader* ip_header)
nyatla 0:142ee8b12fef 388 {
nyatla 0:142ee8b12fef 389 return (ip_header->tcpoffset>>4)*4;
nyatla 0:142ee8b12fef 390 }
nyatla 37:fc4b4fd6a649 391 /*--------------------------------------------------------------------------------
nyatla 37:fc4b4fd6a649 392 *
nyatla 37:fc4b4fd6a649 393 * struct NyLPC_TUdpHeader
nyatla 37:fc4b4fd6a649 394 *
nyatla 37:fc4b4fd6a649 395 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 396
nyatla 0:142ee8b12fef 397
nyatla 0:142ee8b12fef 398
nyatla 0:142ee8b12fef 399 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 400 *
nyatla 0:142ee8b12fef 401 * struct NyLPC_TArpHeader
nyatla 0:142ee8b12fef 402 *
nyatla 0:142ee8b12fef 403 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 404 /**
nyatla 57:bc4330dfa62f 405 * i_req_addrを問い合わせるARP_REQUESTを生成します。
nyatla 0:142ee8b12fef 406 */
nyatla 0:142ee8b12fef 407 void NyLPC_TArpHeader_setArpRequest(
nyatla 0:142ee8b12fef 408 struct NyLPC_TArpHeader* i_struct,
nyatla 0:142ee8b12fef 409 const struct NyLPC_TIPv4Addr i_saddr,
nyatla 0:142ee8b12fef 410 const struct NyLPC_TEthAddr* i_srceth,
nyatla 57:bc4330dfa62f 411 const struct NyLPC_TIPv4Addr* i_req_addr)
nyatla 0:142ee8b12fef 412 {
nyatla 0:142ee8b12fef 413 memset(i_struct->dhwaddr.addr, 0x00, 6);
nyatla 0:142ee8b12fef 414 memcpy(i_struct->shwaddr.addr, i_srceth, 6);
nyatla 57:bc4330dfa62f 415 i_struct->dipaddr=*i_req_addr;
nyatla 0:142ee8b12fef 416 i_struct->sipaddr=i_saddr;
nyatla 0:142ee8b12fef 417 i_struct->opcode = NyLPC_HTONS(ARP_REQUEST); /* ARP request. */
nyatla 0:142ee8b12fef 418 i_struct->hwtype = NyLPC_HTONS(ARP_HWTYPE_ETH);
nyatla 0:142ee8b12fef 419 i_struct->protocol = NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IP);
nyatla 0:142ee8b12fef 420 i_struct->hwlen = 6;
nyatla 0:142ee8b12fef 421 i_struct->protolen = 4;
nyatla 0:142ee8b12fef 422 return;
nyatla 0:142ee8b12fef 423 }
nyatla 0:142ee8b12fef 424
nyatla 0:142ee8b12fef 425 /*--------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 426 *
nyatla 0:142ee8b12fef 427 * class IPv4Route
nyatla 0:142ee8b12fef 428 *
nyatla 0:142ee8b12fef 429 *------------------------------------------------------------------------------*/
nyatla 0:142ee8b12fef 430
nyatla 0:142ee8b12fef 431