Ryo Iizuka / libMiMic

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

Committer:
nyatla
Date:
Wed Jan 30 03:46:05 2013 +0000
Revision:
0:142ee8b12fef
ported core classes

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_stdlib.h"
nyatla 0:142ee8b12fef 56 #include "NyLPC_cIPv4.h"
nyatla 0:142ee8b12fef 57 #include "NyLPC_cIPv4Payload_protected.h"
nyatla 0:142ee8b12fef 58 #include "NyLPC_cTcpSocket_protected.h"
nyatla 0:142ee8b12fef 59 #include "NyLPC_cTcpListener_protected.h"
nyatla 0:142ee8b12fef 60 #include "NyLPC_cIPv4IComp_protected.h"
nyatla 0:142ee8b12fef 61 #include "NyLPC_cUipService_protected.h"
nyatla 0:142ee8b12fef 62
nyatla 0:142ee8b12fef 63
nyatla 0:142ee8b12fef 64
nyatla 0:142ee8b12fef 65 /****************************************************
nyatla 0:142ee8b12fef 66 * Listenerテーブルに関する宣言
nyatla 0:142ee8b12fef 67 ***************************************************/
nyatla 0:142ee8b12fef 68
nyatla 0:142ee8b12fef 69
nyatla 0:142ee8b12fef 70
nyatla 0:142ee8b12fef 71 #define cListenerTbl_initialize(i_inst,buf) NyLPC_cPtrTbl_initialize(i_inst,buf,NyLPC_cIPv4_MAX_TCP_LISTENER)
nyatla 0:142ee8b12fef 72
nyatla 0:142ee8b12fef 73 /**
nyatla 0:142ee8b12fef 74 * i_peer番号に一致するリスナを返します。
nyatla 0:142ee8b12fef 75 */
nyatla 0:142ee8b12fef 76 static NyLPC_TcTcpListener_t* cListenerTbl_getByPeerPort(NyLPC_TcPtrTbl_t* i_inst,NyLPC_TUInt16 i_peer_port)
nyatla 0:142ee8b12fef 77 {
nyatla 0:142ee8b12fef 78 NyLPC_TcTcpListener_t** p=(NyLPC_TcTcpListener_t**)(i_inst->buf);
nyatla 0:142ee8b12fef 79 int i;
nyatla 0:142ee8b12fef 80 //一致するポートを検索して、acceptをコールする。
nyatla 0:142ee8b12fef 81 for(i=i_inst->size-1;i>=0;i--){
nyatla 0:142ee8b12fef 82 if(p[i]==NULL){
nyatla 0:142ee8b12fef 83 continue;
nyatla 0:142ee8b12fef 84 }
nyatla 0:142ee8b12fef 85 if(p[i]->_port!=i_peer_port){
nyatla 0:142ee8b12fef 86 continue;
nyatla 0:142ee8b12fef 87 }
nyatla 0:142ee8b12fef 88 return p[i];
nyatla 0:142ee8b12fef 89 }
nyatla 0:142ee8b12fef 90 return NULL;
nyatla 0:142ee8b12fef 91 }
nyatla 0:142ee8b12fef 92
nyatla 0:142ee8b12fef 93 /****************************************************
nyatla 0:142ee8b12fef 94 * Socketテーブルに関する宣言
nyatla 0:142ee8b12fef 95 ***************************************************/
nyatla 0:142ee8b12fef 96
nyatla 0:142ee8b12fef 97 #define cSocketTbl_initialize(i_inst,buf) NyLPC_cPtrTbl_initialize(i_inst,buf,NyLPC_cIPv4_MAX_TCP_SOCKET)
nyatla 0:142ee8b12fef 98
nyatla 0:142ee8b12fef 99
nyatla 0:142ee8b12fef 100 /**
nyatla 0:142ee8b12fef 101 * 条件に一致する、アクティブなソケットオブジェクトを取得します。
nyatla 0:142ee8b12fef 102 * この関数は、ローカルIPが一致していると仮定して検索をします。
nyatla 0:142ee8b12fef 103 * @param i_rip
nyatla 0:142ee8b12fef 104 * リモートIPアドレスを指定します。
nyatla 0:142ee8b12fef 105 */
nyatla 0:142ee8b12fef 106 static NyLPC_TcTcpSocket_t* cSocketTbl_getMatchSocket(
nyatla 0:142ee8b12fef 107 NyLPC_TcPtrTbl_t* i_inst,
nyatla 0:142ee8b12fef 108 NyLPC_TUInt16 i_lport,
nyatla 0:142ee8b12fef 109 struct NyLPC_TIPv4Addr i_rip,
nyatla 0:142ee8b12fef 110 NyLPC_TUInt16 i_rport)
nyatla 0:142ee8b12fef 111 {
nyatla 0:142ee8b12fef 112 NyLPC_TcTcpSocket_t** p=(NyLPC_TcTcpSocket_t**)(i_inst->buf);
nyatla 0:142ee8b12fef 113 int i;
nyatla 0:142ee8b12fef 114 //一致するポートを検索して、acceptをコールする。
nyatla 0:142ee8b12fef 115 for(i=i_inst->size-1;i>=0;i--){
nyatla 0:142ee8b12fef 116 if(p[i]==NULL){
nyatla 0:142ee8b12fef 117 continue;
nyatla 0:142ee8b12fef 118 }
nyatla 0:142ee8b12fef 119 if(p[i]->tcpstateflags==UIP_CLOSED){
nyatla 0:142ee8b12fef 120 continue;
nyatla 0:142ee8b12fef 121 }
nyatla 0:142ee8b12fef 122 //パラメータの一致チェック
nyatla 0:142ee8b12fef 123 if(i_lport!=p[i]->uip_connr.lport || i_rport!= p[i]->uip_connr.rport || i_rip.v!=p[i]->uip_connr.ripaddr.v)
nyatla 0:142ee8b12fef 124 {
nyatla 0:142ee8b12fef 125 continue;
nyatla 0:142ee8b12fef 126 }
nyatla 0:142ee8b12fef 127 return p[i];
nyatla 0:142ee8b12fef 128 }
nyatla 0:142ee8b12fef 129 return NULL;
nyatla 0:142ee8b12fef 130 }
nyatla 0:142ee8b12fef 131 /**
nyatla 0:142ee8b12fef 132 * テーブルにある有効なソケットのperiodicをすべて呼び出します。
nyatla 0:142ee8b12fef 133 */
nyatla 0:142ee8b12fef 134 static void cSocketTbl_callPeriodic(
nyatla 0:142ee8b12fef 135 NyLPC_TcPtrTbl_t* i_inst)
nyatla 0:142ee8b12fef 136 {
nyatla 0:142ee8b12fef 137 NyLPC_TcTcpSocket_t** p=(NyLPC_TcTcpSocket_t**)(i_inst->buf);
nyatla 0:142ee8b12fef 138 int i;
nyatla 0:142ee8b12fef 139 for(i=i_inst->size-1;i>=0;i--){
nyatla 0:142ee8b12fef 140 if(p[i]==NULL){
nyatla 0:142ee8b12fef 141 continue;
nyatla 0:142ee8b12fef 142 }
nyatla 0:142ee8b12fef 143 NyLPC_cTcpSocket_periodic(p[i]);
nyatla 0:142ee8b12fef 144 }
nyatla 0:142ee8b12fef 145 }
nyatla 0:142ee8b12fef 146
nyatla 0:142ee8b12fef 147 /**
nyatla 0:142ee8b12fef 148 * Static関数
nyatla 0:142ee8b12fef 149 */
nyatla 0:142ee8b12fef 150
nyatla 0:142ee8b12fef 151 static NyLPC_TBool tcp_rx(
nyatla 0:142ee8b12fef 152 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 153 NyLPC_TcIPv4Payload_t* i_ipp);
nyatla 0:142ee8b12fef 154
nyatla 0:142ee8b12fef 155 /****************************************************
nyatla 0:142ee8b12fef 156 * NyLPC_cIPv4
nyatla 0:142ee8b12fef 157 ***************************************************/
nyatla 0:142ee8b12fef 158
nyatla 0:142ee8b12fef 159 /**
nyatla 0:142ee8b12fef 160 * See Header file.
nyatla 0:142ee8b12fef 161 */
nyatla 0:142ee8b12fef 162 void NyLPC_cIPv4_initialize(
nyatla 0:142ee8b12fef 163 NyLPC_TcIPv4_t* i_inst)
nyatla 0:142ee8b12fef 164 {
nyatla 0:142ee8b12fef 165 //内部テーブルの初期化
nyatla 0:142ee8b12fef 166 cListenerTbl_initialize(&(i_inst->_listener_tbl),(void**)(i_inst->_listener_array_buf));
nyatla 0:142ee8b12fef 167 cSocketTbl_initialize(&(i_inst->_socket_tbl),(void**)(i_inst->_socket_array_buf));
nyatla 0:142ee8b12fef 168 //instanceの初期化
nyatla 0:142ee8b12fef 169 i_inst->_ref_config=NULL;
nyatla 0:142ee8b12fef 170 return;
nyatla 0:142ee8b12fef 171 }
nyatla 0:142ee8b12fef 172
nyatla 0:142ee8b12fef 173 /**
nyatla 0:142ee8b12fef 174 * See header file.
nyatla 0:142ee8b12fef 175 */
nyatla 0:142ee8b12fef 176 void NyLPC_cIPv4_finalize(
nyatla 0:142ee8b12fef 177 NyLPC_TcIPv4_t* i_inst)
nyatla 0:142ee8b12fef 178 {
nyatla 0:142ee8b12fef 179 return;
nyatla 0:142ee8b12fef 180 }
nyatla 0:142ee8b12fef 181
nyatla 0:142ee8b12fef 182 /**
nyatla 0:142ee8b12fef 183 * See header file.
nyatla 0:142ee8b12fef 184 */
nyatla 0:142ee8b12fef 185 void NyLPC_cIPv4_start(
nyatla 0:142ee8b12fef 186 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 187 const NyLPC_TcIPv4Config_t* i_ref_configlation)
nyatla 0:142ee8b12fef 188 {
nyatla 0:142ee8b12fef 189 NyLPC_ArgAssert(i_ref_configlation!=NULL);
nyatla 0:142ee8b12fef 190 //リストの初期化、ここでするべき?しないべき?
nyatla 0:142ee8b12fef 191 i_inst->_ref_config=i_ref_configlation;
nyatla 0:142ee8b12fef 192 return;
nyatla 0:142ee8b12fef 193 }
nyatla 0:142ee8b12fef 194
nyatla 0:142ee8b12fef 195 /**
nyatla 0:142ee8b12fef 196 * See header file.
nyatla 0:142ee8b12fef 197 */
nyatla 0:142ee8b12fef 198 void NyLPC_cIPv4_stop(
nyatla 0:142ee8b12fef 199 NyLPC_TcIPv4_t* i_inst)
nyatla 0:142ee8b12fef 200 {
nyatla 0:142ee8b12fef 201 //実行タイミングが未設計。当分は使わないこと。
nyatla 0:142ee8b12fef 202 //新規ソケットの生成を打ち切って、すべてのソケットが停止するのを待つ?
nyatla 0:142ee8b12fef 203 i_inst->_ref_config=NULL;
nyatla 0:142ee8b12fef 204 return;
nyatla 0:142ee8b12fef 205 }
nyatla 0:142ee8b12fef 206
nyatla 0:142ee8b12fef 207 /**
nyatla 0:142ee8b12fef 208 * See header file.
nyatla 0:142ee8b12fef 209 */
nyatla 0:142ee8b12fef 210 NyLPC_TBool NyLPC_cIPv4_addSocket(
nyatla 0:142ee8b12fef 211 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 212 NyLPC_TcTcpSocket_t* i_sock)
nyatla 0:142ee8b12fef 213 {
nyatla 0:142ee8b12fef 214 //当面、stop中しか成功しない。
nyatla 0:142ee8b12fef 215 NyLPC_Assert(!NyLPC_cUipService_isRun());
nyatla 0:142ee8b12fef 216 return NyLPC_cPtrTbl_add(&(i_inst->_socket_tbl),i_sock)>=0;
nyatla 0:142ee8b12fef 217 }
nyatla 0:142ee8b12fef 218
nyatla 0:142ee8b12fef 219 /**
nyatla 0:142ee8b12fef 220 * See header file.
nyatla 0:142ee8b12fef 221 */
nyatla 0:142ee8b12fef 222 NyLPC_TBool NyLPC_cIPv4_removeSocket(
nyatla 0:142ee8b12fef 223 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 224 NyLPC_TcTcpSocket_t* i_sock)
nyatla 0:142ee8b12fef 225 {
nyatla 0:142ee8b12fef 226 NyLPC_TInt16 i;
nyatla 0:142ee8b12fef 227 NyLPC_Assert(!NyLPC_cUipService_isRun());
nyatla 0:142ee8b12fef 228 i=NyLPC_cPtrTbl_getIndex(&(i_inst->_socket_tbl),i_sock);
nyatla 0:142ee8b12fef 229 if(i>=0){
nyatla 0:142ee8b12fef 230 NyLPC_cPtrTbl_remove(&(i_inst->_socket_tbl),i);
nyatla 0:142ee8b12fef 231 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 232 }
nyatla 0:142ee8b12fef 233 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 234 }
nyatla 0:142ee8b12fef 235
nyatla 0:142ee8b12fef 236 /**
nyatla 0:142ee8b12fef 237 * See header file.
nyatla 0:142ee8b12fef 238 */
nyatla 0:142ee8b12fef 239 NyLPC_TBool NyLPC_cIPv4_addListener(
nyatla 0:142ee8b12fef 240 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 241 NyLPC_TcTcpListener_t* i_listener)
nyatla 0:142ee8b12fef 242 {
nyatla 0:142ee8b12fef 243 //当面、stop中しか成功しない。
nyatla 0:142ee8b12fef 244 NyLPC_Assert(!NyLPC_cUipService_isRun());
nyatla 0:142ee8b12fef 245 return NyLPC_cPtrTbl_add(&(i_inst->_listener_tbl),i_listener)>=0;
nyatla 0:142ee8b12fef 246 }
nyatla 0:142ee8b12fef 247
nyatla 0:142ee8b12fef 248 /**
nyatla 0:142ee8b12fef 249 * See header file.
nyatla 0:142ee8b12fef 250 */
nyatla 0:142ee8b12fef 251 NyLPC_TBool NyLPC_cIPv4_removeListener(
nyatla 0:142ee8b12fef 252 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 253 NyLPC_TcTcpListener_t* i_listener)
nyatla 0:142ee8b12fef 254 {
nyatla 0:142ee8b12fef 255 NyLPC_TInt16 i;
nyatla 0:142ee8b12fef 256 NyLPC_Assert(!NyLPC_cUipService_isRun());
nyatla 0:142ee8b12fef 257 i=NyLPC_cPtrTbl_getIndex(&(i_inst->_listener_tbl),i_listener);
nyatla 0:142ee8b12fef 258 if(i>=0){
nyatla 0:142ee8b12fef 259 NyLPC_cPtrTbl_remove(&(i_inst->_listener_tbl),i);
nyatla 0:142ee8b12fef 260 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 261 }
nyatla 0:142ee8b12fef 262 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 263 }
nyatla 0:142ee8b12fef 264
nyatla 0:142ee8b12fef 265
nyatla 0:142ee8b12fef 266
nyatla 0:142ee8b12fef 267
nyatla 0:142ee8b12fef 268
nyatla 0:142ee8b12fef 269 #define IS_START(i_inst) ((i_inst)->_ref_config!=NULL)
nyatla 0:142ee8b12fef 270
nyatla 0:142ee8b12fef 271 /**
nyatla 0:142ee8b12fef 272 * 稼動時に、1s置きに呼び出す関数です。
nyatla 0:142ee8b12fef 273 */
nyatla 0:142ee8b12fef 274 void NyLPC_cIPv4_periodec(NyLPC_TcIPv4_t* i_inst)
nyatla 0:142ee8b12fef 275 {
nyatla 0:142ee8b12fef 276 cSocketTbl_callPeriodic(&(i_inst->_socket_tbl));
nyatla 0:142ee8b12fef 277 }
nyatla 0:142ee8b12fef 278
nyatla 0:142ee8b12fef 279
nyatla 0:142ee8b12fef 280 /**
nyatla 0:142ee8b12fef 281 * IPv4ペイロードを処理する関数。
nyatla 0:142ee8b12fef 282 * この関数は、パケット受信タスクから実行します。
nyatla 0:142ee8b12fef 283 * @param i_rx
nyatla 0:142ee8b12fef 284 * 先頭ポインタ。
nyatla 0:142ee8b12fef 285 * @return
nyatla 0:142ee8b12fef 286 * TRUEなら、i_rxに応答パケットをセットして返します。
nyatla 0:142ee8b12fef 287 */
nyatla 0:142ee8b12fef 288 NyLPC_TBool NyLPC_cIPv4_rx(NyLPC_TcIPv4_t* i_inst,void* i_rx,NyLPC_TUInt16 i_rx_size)
nyatla 0:142ee8b12fef 289 {
nyatla 0:142ee8b12fef 290 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 291 NyLPC_TcIPv4Payload_t ipv4;
nyatla 0:142ee8b12fef 292 //NOT開始状態なら受け付けないよ。
nyatla 0:142ee8b12fef 293 if(!IS_START(i_inst)){
nyatla 0:142ee8b12fef 294 NyLPC_OnErrorGoto(ERROR_DROP);
nyatla 0:142ee8b12fef 295 }
nyatla 0:142ee8b12fef 296
nyatla 0:142ee8b12fef 297 NyLPC_cIPv4Payload_initialize(&ipv4);
nyatla 0:142ee8b12fef 298 //IPフラグメントを読出し用にセットする。
nyatla 0:142ee8b12fef 299 if(!NyLPC_cIPv4Payload_setRxBuf(&ipv4,i_rx,i_rx_size))
nyatla 0:142ee8b12fef 300 {
nyatla 0:142ee8b12fef 301 NyLPC_OnErrorGoto(ERROR_DROP);
nyatla 0:142ee8b12fef 302 }
nyatla 0:142ee8b12fef 303 switch(ipv4.header->proto)
nyatla 0:142ee8b12fef 304 {
nyatla 0:142ee8b12fef 305 case UIP_PROTO_TCP:
nyatla 0:142ee8b12fef 306 //TCP受信処理
nyatla 0:142ee8b12fef 307 return tcp_rx(i_inst,&ipv4);
nyatla 0:142ee8b12fef 308 case UIP_PROTO_UDP:
nyatla 0:142ee8b12fef 309 // //uip_process_UDP();//実装したら解除いして
nyatla 0:142ee8b12fef 310 NyLPC_OnErrorGoto(ERROR_DROP);
nyatla 0:142ee8b12fef 311 case UIP_PROTO_ICMP:
nyatla 0:142ee8b12fef 312 if(!NyLPC_cIPv4IComp_rx(&(inst->_icomp),&ipv4)){
nyatla 0:142ee8b12fef 313 NyLPC_OnErrorGoto(ERROR_DROP);
nyatla 0:142ee8b12fef 314 }
nyatla 0:142ee8b12fef 315 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 316 }
nyatla 0:142ee8b12fef 317 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 318 ERROR_DROP:
nyatla 0:142ee8b12fef 319 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 320 }
nyatla 0:142ee8b12fef 321
nyatla 0:142ee8b12fef 322
nyatla 0:142ee8b12fef 323 /**********************************************************************
nyatla 0:142ee8b12fef 324 *
nyatla 0:142ee8b12fef 325 * public function
nyatla 0:142ee8b12fef 326 *
nyatla 0:142ee8b12fef 327 **********************************************************************/
nyatla 0:142ee8b12fef 328
nyatla 0:142ee8b12fef 329
nyatla 0:142ee8b12fef 330 static NyLPC_TBool tcp_rx(
nyatla 0:142ee8b12fef 331 NyLPC_TcIPv4_t* i_inst,
nyatla 0:142ee8b12fef 332 NyLPC_TcIPv4Payload_t* i_ipp)
nyatla 0:142ee8b12fef 333 {
nyatla 0:142ee8b12fef 334 NyLPC_TcTcpSocket_t* sock;
nyatla 0:142ee8b12fef 335 NyLPC_TcTcpListener_t* listener;
nyatla 0:142ee8b12fef 336
nyatla 0:142ee8b12fef 337 //自分自身のIPに対する呼び出し?
nyatla 0:142ee8b12fef 338 if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&(i_inst->_ref_config->ip_addr)))
nyatla 0:142ee8b12fef 339 {
nyatla 0:142ee8b12fef 340 //自分以外のパケットはドロップ
nyatla 0:142ee8b12fef 341 goto DROP;
nyatla 0:142ee8b12fef 342 }
nyatla 0:142ee8b12fef 343 //チェックサムの計算
nyatla 0:142ee8b12fef 344 if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff))
nyatla 0:142ee8b12fef 345 {
nyatla 0:142ee8b12fef 346 //受信エラーのあるパケットはドロップ
nyatla 0:142ee8b12fef 347 goto DROP;
nyatla 0:142ee8b12fef 348 }
nyatla 0:142ee8b12fef 349 //アクティブなソケットを探す。
nyatla 0:142ee8b12fef 350 sock=cSocketTbl_getMatchSocket(&(i_inst->_socket_tbl),i_ipp->payload.tcp->destport,i_ipp->header->srcipaddr,i_ipp->payload.tcp->srcport);
nyatla 0:142ee8b12fef 351 if(sock!=NULL)
nyatla 0:142ee8b12fef 352 {
nyatla 0:142ee8b12fef 353 //既存の接続を処理
nyatla 0:142ee8b12fef 354 return NyLPC_cTcpSocket_parseRx(sock,i_ipp);
nyatla 0:142ee8b12fef 355
nyatla 0:142ee8b12fef 356 }else{
nyatla 0:142ee8b12fef 357 //未知の接続
nyatla 0:142ee8b12fef 358 if(!NyLPC_cPtrTbl_hasEmpty(&(i_inst->_socket_tbl))){
nyatla 0:142ee8b12fef 359 //ソケットテーブルが不十分。RST送信
nyatla 0:142ee8b12fef 360 NyLPC_cIPv4Payload_setTcpReverseRstAck(i_ipp);
nyatla 0:142ee8b12fef 361 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 362 }
nyatla 0:142ee8b12fef 363 //このポートに対応したListenerを得る。
nyatla 0:142ee8b12fef 364 listener=cListenerTbl_getByPeerPort(&(i_inst->_listener_tbl),i_ipp->payload.tcp->destport);
nyatla 0:142ee8b12fef 365 if(listener==NULL){
nyatla 0:142ee8b12fef 366 //Listen対象ではない。RST送信
nyatla 0:142ee8b12fef 367 NyLPC_cIPv4Payload_setTcpReverseRstAck(i_ipp);
nyatla 0:142ee8b12fef 368 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 369 }
nyatla 0:142ee8b12fef 370 //リスナにソケットのバインドを依頼する。
nyatla 0:142ee8b12fef 371 sock=NyLPC_cTcpListener_makeSynRcvdSocket(listener,i_inst->_ref_config,i_ipp);
nyatla 0:142ee8b12fef 372 if(sock==NULL){
nyatla 0:142ee8b12fef 373 //Listen失敗。ドロップ
nyatla 0:142ee8b12fef 374 goto DROP;
nyatla 0:142ee8b12fef 375 }
nyatla 0:142ee8b12fef 376 // //Socketの割当に成功。管理リストへ追加
nyatla 0:142ee8b12fef 377 // NyLPC_AbortIfNot(NyLPC_cPtrTbl_add(&(i_inst->_socket_tbl),sock)>=0);
nyatla 0:142ee8b12fef 378 return NyLPC_TBool_FALSE;//LISTEN成功。送信データなし
nyatla 0:142ee8b12fef 379 }
nyatla 0:142ee8b12fef 380 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 381 DROP:
nyatla 0:142ee8b12fef 382 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 383 }
nyatla 0:142ee8b12fef 384
nyatla 0:142ee8b12fef 385
nyatla 0:142ee8b12fef 386
nyatla 0:142ee8b12fef 387
nyatla 0:142ee8b12fef 388
nyatla 0:142ee8b12fef 389