Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more
core/uip/NyLPC_cIPv4.cpp@1:9f6a78395432, 2013-03-25 (annotated)
- Committer:
- nyatla
- Date:
- Mon Mar 25 05:23:49 2013 +0000
- Revision:
- 1:9f6a78395432
- Parent:
- uip/NyLPC_cIPv4.cpp@0:142ee8b12fef
MiMic repository r191???
Who changed what in which revision?
| User | Revision | Line number | New 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 |
MiMic Webservice library