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.c@48:00d211aac2ec, 2013-08-07 (annotated)
- Committer:
- nyatla
- Date:
- Wed Aug 07 13:53:02 2013 +0000
- Revision:
- 48:00d211aac2ec
- Parent:
- 43:a182f2b5ff41
- Child:
- 57:bc4330dfa62f
backup
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 | 37:fc4b4fd6a649 | 56 | #include "NyLPC_uip.h" |
| nyatla | 0:142ee8b12fef | 57 | #include "NyLPC_cIPv4.h" |
| nyatla | 0:142ee8b12fef | 58 | #include "NyLPC_cIPv4Payload_protected.h" |
| nyatla | 0:142ee8b12fef | 59 | #include "NyLPC_cTcpSocket_protected.h" |
| nyatla | 37:fc4b4fd6a649 | 60 | #include "NyLPC_cUdpSocket_protected.h" |
| nyatla | 0:142ee8b12fef | 61 | #include "NyLPC_cTcpListener_protected.h" |
| nyatla | 0:142ee8b12fef | 62 | #include "NyLPC_cIPv4IComp_protected.h" |
| nyatla | 0:142ee8b12fef | 63 | #include "NyLPC_cUipService_protected.h" |
| nyatla | 0:142ee8b12fef | 64 | |
| nyatla | 0:142ee8b12fef | 65 | |
| nyatla | 0:142ee8b12fef | 66 | |
| nyatla | 0:142ee8b12fef | 67 | /**************************************************** |
| nyatla | 0:142ee8b12fef | 68 | * Socketテーブルに関する宣言 |
| nyatla | 0:142ee8b12fef | 69 | ***************************************************/ |
| nyatla | 0:142ee8b12fef | 70 | |
| nyatla | 37:fc4b4fd6a649 | 71 | #define cSocketTbl_initialize(i_inst,buf) NyLPC_cPtrTbl_initialize(i_inst,buf,NyLPC_cIPv4_MAX_SOCKET) |
| nyatla | 37:fc4b4fd6a649 | 72 | #define cSocketTbl_finalize(i_inst) |
| nyatla | 0:142ee8b12fef | 73 | |
| nyatla | 0:142ee8b12fef | 74 | /** |
| nyatla | 37:fc4b4fd6a649 | 75 | * 条件に一致する、アクティブなTCPソケットオブジェクトを取得します。 |
| nyatla | 0:142ee8b12fef | 76 | * この関数は、ローカルIPが一致していると仮定して検索をします。 |
| nyatla | 0:142ee8b12fef | 77 | * @param i_rip |
| nyatla | 0:142ee8b12fef | 78 | * リモートIPアドレスを指定します。 |
| nyatla | 0:142ee8b12fef | 79 | */ |
| nyatla | 37:fc4b4fd6a649 | 80 | static NyLPC_TcTcpSocket_t* cSocketTbl_getMatchTcpSocket( |
| nyatla | 0:142ee8b12fef | 81 | NyLPC_TcPtrTbl_t* i_inst, |
| nyatla | 0:142ee8b12fef | 82 | NyLPC_TUInt16 i_lport, |
| nyatla | 0:142ee8b12fef | 83 | struct NyLPC_TIPv4Addr i_rip, |
| nyatla | 0:142ee8b12fef | 84 | NyLPC_TUInt16 i_rport) |
| nyatla | 0:142ee8b12fef | 85 | { |
| nyatla | 37:fc4b4fd6a649 | 86 | NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf); |
| nyatla | 37:fc4b4fd6a649 | 87 | NyLPC_TcTcpSocket_t* tp; |
| nyatla | 37:fc4b4fd6a649 | 88 | int i; |
| nyatla | 37:fc4b4fd6a649 | 89 | //一致するポートを検索 |
| nyatla | 37:fc4b4fd6a649 | 90 | for(i=i_inst->size-1;i>=0;i--){ |
| nyatla | 37:fc4b4fd6a649 | 91 | if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcBaseSocket_TYPEID_TCP_SOCK){ |
| nyatla | 37:fc4b4fd6a649 | 92 | continue; |
| nyatla | 37:fc4b4fd6a649 | 93 | } |
| nyatla | 37:fc4b4fd6a649 | 94 | tp=(NyLPC_TcTcpSocket_t*)p[i]; |
| nyatla | 37:fc4b4fd6a649 | 95 | if(tp->tcpstateflags==UIP_CLOSED){ |
| nyatla | 37:fc4b4fd6a649 | 96 | continue; |
| nyatla | 37:fc4b4fd6a649 | 97 | } |
| nyatla | 37:fc4b4fd6a649 | 98 | //パラメータの一致チェック |
| nyatla | 37:fc4b4fd6a649 | 99 | if(i_lport!=tp->uip_connr.lport || i_rport!= tp->uip_connr.rport || i_rip.v!=tp->uip_connr.ripaddr.v) |
| nyatla | 37:fc4b4fd6a649 | 100 | { |
| nyatla | 37:fc4b4fd6a649 | 101 | continue; |
| nyatla | 37:fc4b4fd6a649 | 102 | } |
| nyatla | 37:fc4b4fd6a649 | 103 | return tp; |
| nyatla | 37:fc4b4fd6a649 | 104 | } |
| nyatla | 37:fc4b4fd6a649 | 105 | return NULL; |
| nyatla | 37:fc4b4fd6a649 | 106 | } |
| nyatla | 37:fc4b4fd6a649 | 107 | static NyLPC_TcUdpSocket_t* cSocketTbl_getMatchUdpSocket( |
| nyatla | 37:fc4b4fd6a649 | 108 | NyLPC_TcPtrTbl_t* i_inst, |
| nyatla | 37:fc4b4fd6a649 | 109 | NyLPC_TUInt16 i_lport) |
| nyatla | 37:fc4b4fd6a649 | 110 | { |
| nyatla | 37:fc4b4fd6a649 | 111 | NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf); |
| nyatla | 37:fc4b4fd6a649 | 112 | NyLPC_TcUdpSocket_t* tp; |
| nyatla | 37:fc4b4fd6a649 | 113 | int i; |
| nyatla | 37:fc4b4fd6a649 | 114 | //一致するポートを検索 |
| nyatla | 37:fc4b4fd6a649 | 115 | for(i=i_inst->size-1;i>=0;i--){ |
| nyatla | 37:fc4b4fd6a649 | 116 | if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcBaseSocket_TYPEID_UDP_SOCK){ |
| nyatla | 37:fc4b4fd6a649 | 117 | continue; |
| nyatla | 37:fc4b4fd6a649 | 118 | } |
| nyatla | 37:fc4b4fd6a649 | 119 | tp=(NyLPC_TcUdpSocket_t*)p[i]; |
| nyatla | 37:fc4b4fd6a649 | 120 | //パラメータの一致チェック |
| nyatla | 48:00d211aac2ec | 121 | if(i_lport==tp->uip_udp_conn.lport){ |
| nyatla | 48:00d211aac2ec | 122 | //unicast |
| nyatla | 48:00d211aac2ec | 123 | return tp; |
| nyatla | 37:fc4b4fd6a649 | 124 | } |
| nyatla | 37:fc4b4fd6a649 | 125 | } |
| nyatla | 37:fc4b4fd6a649 | 126 | return NULL; |
| nyatla | 37:fc4b4fd6a649 | 127 | } |
| nyatla | 37:fc4b4fd6a649 | 128 | static NyLPC_TcUdpSocket_t* cSocketTbl_getMatchMulticastUdpSocket( |
| nyatla | 37:fc4b4fd6a649 | 129 | NyLPC_TcPtrTbl_t* i_inst, |
| nyatla | 37:fc4b4fd6a649 | 130 | struct NyLPC_TIPv4Addr* i_mcast_ip, |
| nyatla | 37:fc4b4fd6a649 | 131 | NyLPC_TUInt16 i_lport) |
| nyatla | 37:fc4b4fd6a649 | 132 | { |
| nyatla | 37:fc4b4fd6a649 | 133 | NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf); |
| nyatla | 37:fc4b4fd6a649 | 134 | NyLPC_TcUdpSocket_t* tp; |
| nyatla | 37:fc4b4fd6a649 | 135 | int i; |
| nyatla | 37:fc4b4fd6a649 | 136 | //一致するポートを検索 |
| nyatla | 37:fc4b4fd6a649 | 137 | for(i=i_inst->size-1;i>=0;i--){ |
| nyatla | 37:fc4b4fd6a649 | 138 | if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcBaseSocket_TYPEID_UDP_SOCK){ |
| nyatla | 37:fc4b4fd6a649 | 139 | continue; |
| nyatla | 37:fc4b4fd6a649 | 140 | } |
| nyatla | 37:fc4b4fd6a649 | 141 | tp=(NyLPC_TcUdpSocket_t*)p[i]; |
| nyatla | 37:fc4b4fd6a649 | 142 | //パラメータの一致チェック |
| nyatla | 48:00d211aac2ec | 143 | if(i_lport!=tp->uip_udp_conn.lport || (!NyLPC_TIPv4Addr_isEqual(i_mcast_ip,&(tp->uip_udp_conn.mcastaddr)))) |
| nyatla | 37:fc4b4fd6a649 | 144 | { |
| nyatla | 37:fc4b4fd6a649 | 145 | continue; |
| nyatla | 37:fc4b4fd6a649 | 146 | } |
| nyatla | 37:fc4b4fd6a649 | 147 | return tp; |
| nyatla | 37:fc4b4fd6a649 | 148 | } |
| nyatla | 37:fc4b4fd6a649 | 149 | return NULL; |
| nyatla | 37:fc4b4fd6a649 | 150 | } |
| nyatla | 37:fc4b4fd6a649 | 151 | |
| nyatla | 37:fc4b4fd6a649 | 152 | /** |
| nyatla | 43:a182f2b5ff41 | 153 | * i_port番号に一致するリスナを返します。 |
| nyatla | 37:fc4b4fd6a649 | 154 | */ |
| nyatla | 43:a182f2b5ff41 | 155 | static NyLPC_TcTcpListener_t* cSocketTbl_getListenerByPeerPort(NyLPC_TcPtrTbl_t* i_inst,NyLPC_TUInt16 i_port) |
| nyatla | 37:fc4b4fd6a649 | 156 | { |
| nyatla | 37:fc4b4fd6a649 | 157 | NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf); |
| nyatla | 37:fc4b4fd6a649 | 158 | NyLPC_TcTcpListener_t* lp; |
| nyatla | 0:142ee8b12fef | 159 | int i; |
| nyatla | 0:142ee8b12fef | 160 | //一致するポートを検索して、acceptをコールする。 |
| nyatla | 0:142ee8b12fef | 161 | for(i=i_inst->size-1;i>=0;i--){ |
| nyatla | 37:fc4b4fd6a649 | 162 | if(p[i]==NULL || p[i]->_typeid!=NyLPC_TcBaseSocket_TYPEID_TCP_LISTENER){ |
| nyatla | 0:142ee8b12fef | 163 | continue; |
| nyatla | 0:142ee8b12fef | 164 | } |
| nyatla | 37:fc4b4fd6a649 | 165 | lp=(NyLPC_TcTcpListener_t*)p[i]; |
| nyatla | 43:a182f2b5ff41 | 166 | if(lp->_port!=i_port){ |
| nyatla | 0:142ee8b12fef | 167 | continue; |
| nyatla | 0:142ee8b12fef | 168 | } |
| nyatla | 37:fc4b4fd6a649 | 169 | return lp; |
| nyatla | 0:142ee8b12fef | 170 | } |
| nyatla | 0:142ee8b12fef | 171 | return NULL; |
| nyatla | 0:142ee8b12fef | 172 | } |
| nyatla | 37:fc4b4fd6a649 | 173 | |
| nyatla | 0:142ee8b12fef | 174 | /** |
| nyatla | 0:142ee8b12fef | 175 | * テーブルにある有効なソケットのperiodicをすべて呼び出します。 |
| nyatla | 0:142ee8b12fef | 176 | */ |
| nyatla | 0:142ee8b12fef | 177 | static void cSocketTbl_callPeriodic( |
| nyatla | 0:142ee8b12fef | 178 | NyLPC_TcPtrTbl_t* i_inst) |
| nyatla | 0:142ee8b12fef | 179 | { |
| nyatla | 37:fc4b4fd6a649 | 180 | NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf); |
| nyatla | 37:fc4b4fd6a649 | 181 | int i; |
| nyatla | 37:fc4b4fd6a649 | 182 | for(i=i_inst->size-1;i>=0;i--){ |
| nyatla | 37:fc4b4fd6a649 | 183 | if(p[i]==NULL){ |
| nyatla | 37:fc4b4fd6a649 | 184 | continue; |
| nyatla | 37:fc4b4fd6a649 | 185 | } |
| nyatla | 37:fc4b4fd6a649 | 186 | switch(p[i]->_typeid){ |
| nyatla | 37:fc4b4fd6a649 | 187 | case NyLPC_TcBaseSocket_TYPEID_TCP_SOCK: |
| nyatla | 37:fc4b4fd6a649 | 188 | //downcast! |
| nyatla | 37:fc4b4fd6a649 | 189 | NyLPC_cTcpSocket_periodic((NyLPC_TcTcpSocket_t*)(p[i])); |
| nyatla | 37:fc4b4fd6a649 | 190 | break; |
| nyatla | 37:fc4b4fd6a649 | 191 | case NyLPC_TcBaseSocket_TYPEID_UDP_SOCK: |
| nyatla | 37:fc4b4fd6a649 | 192 | NyLPC_cUdpSocket_periodic((NyLPC_TcUdpSocket_t*)(p[i])); |
| nyatla | 37:fc4b4fd6a649 | 193 | break; |
| nyatla | 37:fc4b4fd6a649 | 194 | default: |
| nyatla | 37:fc4b4fd6a649 | 195 | continue; |
| nyatla | 37:fc4b4fd6a649 | 196 | } |
| nyatla | 37:fc4b4fd6a649 | 197 | } |
| nyatla | 37:fc4b4fd6a649 | 198 | } |
| nyatla | 37:fc4b4fd6a649 | 199 | |
| nyatla | 37:fc4b4fd6a649 | 200 | /** |
| nyatla | 37:fc4b4fd6a649 | 201 | * テーブルにある有効なソケットのstartを全て呼び出します。 |
| nyatla | 37:fc4b4fd6a649 | 202 | */ |
| nyatla | 37:fc4b4fd6a649 | 203 | static void cSocketTbl_callSocketStart( |
| nyatla | 37:fc4b4fd6a649 | 204 | NyLPC_TcPtrTbl_t* i_inst, |
| nyatla | 37:fc4b4fd6a649 | 205 | const NyLPC_TcIPv4Config_t* i_cfg) |
| nyatla | 37:fc4b4fd6a649 | 206 | { |
| nyatla | 37:fc4b4fd6a649 | 207 | NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf); |
| nyatla | 0:142ee8b12fef | 208 | int i; |
| nyatla | 0:142ee8b12fef | 209 | for(i=i_inst->size-1;i>=0;i--){ |
| nyatla | 0:142ee8b12fef | 210 | if(p[i]==NULL){ |
| nyatla | 0:142ee8b12fef | 211 | continue; |
| nyatla | 0:142ee8b12fef | 212 | } |
| nyatla | 37:fc4b4fd6a649 | 213 | switch(p[i]->_typeid){ |
| nyatla | 37:fc4b4fd6a649 | 214 | case NyLPC_TcBaseSocket_TYPEID_UDP_SOCK: |
| nyatla | 37:fc4b4fd6a649 | 215 | NyLPC_cUdpSocket_startService((NyLPC_TcUdpSocket_t*)(p[i]),i_cfg); |
| nyatla | 37:fc4b4fd6a649 | 216 | break; |
| nyatla | 37:fc4b4fd6a649 | 217 | case NyLPC_TcBaseSocket_TYPEID_TCP_SOCK: |
| nyatla | 37:fc4b4fd6a649 | 218 | NyLPC_cTcpSocket_startService((NyLPC_TcTcpSocket_t*)(p[i]),i_cfg); |
| nyatla | 37:fc4b4fd6a649 | 219 | break; |
| nyatla | 37:fc4b4fd6a649 | 220 | default: |
| nyatla | 37:fc4b4fd6a649 | 221 | continue; |
| nyatla | 37:fc4b4fd6a649 | 222 | } |
| nyatla | 0:142ee8b12fef | 223 | } |
| nyatla | 0:142ee8b12fef | 224 | } |
| nyatla | 37:fc4b4fd6a649 | 225 | /** |
| nyatla | 37:fc4b4fd6a649 | 226 | * テーブルにある有効なソケットのstartを全て呼び出します。 |
| nyatla | 37:fc4b4fd6a649 | 227 | */ |
| nyatla | 37:fc4b4fd6a649 | 228 | static void cSocketTbl_callSocketStop( |
| nyatla | 37:fc4b4fd6a649 | 229 | NyLPC_TcPtrTbl_t* i_inst) |
| nyatla | 37:fc4b4fd6a649 | 230 | { |
| nyatla | 37:fc4b4fd6a649 | 231 | NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf); |
| nyatla | 37:fc4b4fd6a649 | 232 | int i; |
| nyatla | 37:fc4b4fd6a649 | 233 | for(i=i_inst->size-1;i>=0;i--){ |
| nyatla | 37:fc4b4fd6a649 | 234 | if(p[i]==NULL){ |
| nyatla | 37:fc4b4fd6a649 | 235 | continue; |
| nyatla | 37:fc4b4fd6a649 | 236 | } |
| nyatla | 37:fc4b4fd6a649 | 237 | switch(p[i]->_typeid){ |
| nyatla | 37:fc4b4fd6a649 | 238 | case NyLPC_TcBaseSocket_TYPEID_UDP_SOCK: |
| nyatla | 37:fc4b4fd6a649 | 239 | NyLPC_cUdpSocket_stopService((NyLPC_TcUdpSocket_t*)(p[i])); |
| nyatla | 37:fc4b4fd6a649 | 240 | break; |
| nyatla | 37:fc4b4fd6a649 | 241 | case NyLPC_TcBaseSocket_TYPEID_TCP_SOCK: |
| nyatla | 37:fc4b4fd6a649 | 242 | NyLPC_cTcpSocket_stopService((NyLPC_TcTcpSocket_t*)(p[i])); |
| nyatla | 37:fc4b4fd6a649 | 243 | break; |
| nyatla | 37:fc4b4fd6a649 | 244 | default: |
| nyatla | 37:fc4b4fd6a649 | 245 | continue; |
| nyatla | 37:fc4b4fd6a649 | 246 | } |
| nyatla | 37:fc4b4fd6a649 | 247 | } |
| nyatla | 37:fc4b4fd6a649 | 248 | } |
| nyatla | 37:fc4b4fd6a649 | 249 | |
| nyatla | 37:fc4b4fd6a649 | 250 | /**************************************************** |
| nyatla | 37:fc4b4fd6a649 | 251 | * NyLPC_cIPv4 |
| nyatla | 37:fc4b4fd6a649 | 252 | ***************************************************/ |
| nyatla | 0:142ee8b12fef | 253 | |
| nyatla | 0:142ee8b12fef | 254 | /** |
| nyatla | 0:142ee8b12fef | 255 | * Static関数 |
| nyatla | 0:142ee8b12fef | 256 | */ |
| nyatla | 0:142ee8b12fef | 257 | |
| nyatla | 0:142ee8b12fef | 258 | static NyLPC_TBool tcp_rx( |
| nyatla | 0:142ee8b12fef | 259 | NyLPC_TcIPv4_t* i_inst, |
| nyatla | 0:142ee8b12fef | 260 | NyLPC_TcIPv4Payload_t* i_ipp); |
| nyatla | 37:fc4b4fd6a649 | 261 | static NyLPC_TBool udp_rx( |
| nyatla | 37:fc4b4fd6a649 | 262 | NyLPC_TcIPv4_t* i_inst, |
| nyatla | 37:fc4b4fd6a649 | 263 | NyLPC_TcIPv4Payload_t* i_ipp); |
| nyatla | 0:142ee8b12fef | 264 | |
| nyatla | 0:142ee8b12fef | 265 | /** |
| nyatla | 0:142ee8b12fef | 266 | * See Header file. |
| nyatla | 0:142ee8b12fef | 267 | */ |
| nyatla | 0:142ee8b12fef | 268 | void NyLPC_cIPv4_initialize( |
| nyatla | 0:142ee8b12fef | 269 | NyLPC_TcIPv4_t* i_inst) |
| nyatla | 0:142ee8b12fef | 270 | { |
| nyatla | 0:142ee8b12fef | 271 | //内部テーブルの初期化 |
| nyatla | 0:142ee8b12fef | 272 | cSocketTbl_initialize(&(i_inst->_socket_tbl),(void**)(i_inst->_socket_array_buf)); |
| nyatla | 0:142ee8b12fef | 273 | //instanceの初期化 |
| nyatla | 37:fc4b4fd6a649 | 274 | NyLPC_cMutex_initialize(&(i_inst->_sock_mutex)); |
| nyatla | 37:fc4b4fd6a649 | 275 | NyLPC_cMutex_initialize(&(i_inst->_listener_mutex)); |
| nyatla | 0:142ee8b12fef | 276 | i_inst->_ref_config=NULL; |
| nyatla | 0:142ee8b12fef | 277 | return; |
| nyatla | 0:142ee8b12fef | 278 | } |
| nyatla | 0:142ee8b12fef | 279 | |
| nyatla | 0:142ee8b12fef | 280 | /** |
| nyatla | 0:142ee8b12fef | 281 | * See header file. |
| nyatla | 0:142ee8b12fef | 282 | */ |
| nyatla | 0:142ee8b12fef | 283 | void NyLPC_cIPv4_finalize( |
| nyatla | 0:142ee8b12fef | 284 | NyLPC_TcIPv4_t* i_inst) |
| nyatla | 0:142ee8b12fef | 285 | { |
| nyatla | 37:fc4b4fd6a649 | 286 | cSocketTbl_finalize(&(i_inst->_socket_tbl)); |
| nyatla | 37:fc4b4fd6a649 | 287 | NyLPC_cMutex_finalize(&(i_inst->_sock_mutex)); |
| nyatla | 37:fc4b4fd6a649 | 288 | NyLPC_cMutex_finalize(&(i_inst->_listener_mutex)); |
| nyatla | 0:142ee8b12fef | 289 | return; |
| nyatla | 0:142ee8b12fef | 290 | } |
| nyatla | 0:142ee8b12fef | 291 | |
| nyatla | 0:142ee8b12fef | 292 | /** |
| nyatla | 0:142ee8b12fef | 293 | * See header file. |
| nyatla | 0:142ee8b12fef | 294 | */ |
| nyatla | 0:142ee8b12fef | 295 | void NyLPC_cIPv4_start( |
| nyatla | 0:142ee8b12fef | 296 | NyLPC_TcIPv4_t* i_inst, |
| nyatla | 0:142ee8b12fef | 297 | const NyLPC_TcIPv4Config_t* i_ref_configlation) |
| nyatla | 0:142ee8b12fef | 298 | { |
| nyatla | 0:142ee8b12fef | 299 | NyLPC_ArgAssert(i_ref_configlation!=NULL); |
| nyatla | 0:142ee8b12fef | 300 | //リストの初期化、ここでするべき?しないべき? |
| nyatla | 0:142ee8b12fef | 301 | i_inst->_ref_config=i_ref_configlation; |
| nyatla | 37:fc4b4fd6a649 | 302 | //configulationのアップデートを登録されてるソケットに通知 |
| nyatla | 37:fc4b4fd6a649 | 303 | cSocketTbl_callSocketStart(&(i_inst->_socket_tbl),i_ref_configlation); |
| nyatla | 0:142ee8b12fef | 304 | return; |
| nyatla | 0:142ee8b12fef | 305 | } |
| nyatla | 0:142ee8b12fef | 306 | |
| nyatla | 0:142ee8b12fef | 307 | /** |
| nyatla | 0:142ee8b12fef | 308 | * See header file. |
| nyatla | 0:142ee8b12fef | 309 | */ |
| nyatla | 0:142ee8b12fef | 310 | void NyLPC_cIPv4_stop( |
| nyatla | 0:142ee8b12fef | 311 | NyLPC_TcIPv4_t* i_inst) |
| nyatla | 0:142ee8b12fef | 312 | { |
| nyatla | 37:fc4b4fd6a649 | 313 | cSocketTbl_callSocketStop(&(i_inst->_socket_tbl)); |
| nyatla | 0:142ee8b12fef | 314 | i_inst->_ref_config=NULL; |
| nyatla | 0:142ee8b12fef | 315 | return; |
| nyatla | 0:142ee8b12fef | 316 | } |
| nyatla | 0:142ee8b12fef | 317 | |
| nyatla | 0:142ee8b12fef | 318 | /** |
| nyatla | 0:142ee8b12fef | 319 | * See header file. |
| nyatla | 0:142ee8b12fef | 320 | */ |
| nyatla | 0:142ee8b12fef | 321 | NyLPC_TBool NyLPC_cIPv4_addSocket( |
| nyatla | 0:142ee8b12fef | 322 | NyLPC_TcIPv4_t* i_inst, |
| nyatla | 37:fc4b4fd6a649 | 323 | NyLPC_TcBaseSocket_t* i_sock) |
| nyatla | 0:142ee8b12fef | 324 | { |
| nyatla | 0:142ee8b12fef | 325 | //当面、stop中しか成功しない。 |
| nyatla | 0:142ee8b12fef | 326 | NyLPC_Assert(!NyLPC_cUipService_isRun()); |
| nyatla | 0:142ee8b12fef | 327 | return NyLPC_cPtrTbl_add(&(i_inst->_socket_tbl),i_sock)>=0; |
| nyatla | 0:142ee8b12fef | 328 | } |
| nyatla | 0:142ee8b12fef | 329 | |
| nyatla | 0:142ee8b12fef | 330 | /** |
| nyatla | 0:142ee8b12fef | 331 | * See header file. |
| nyatla | 0:142ee8b12fef | 332 | */ |
| nyatla | 0:142ee8b12fef | 333 | NyLPC_TBool NyLPC_cIPv4_removeSocket( |
| nyatla | 0:142ee8b12fef | 334 | NyLPC_TcIPv4_t* i_inst, |
| nyatla | 37:fc4b4fd6a649 | 335 | NyLPC_TcBaseSocket_t* i_sock) |
| nyatla | 0:142ee8b12fef | 336 | { |
| nyatla | 0:142ee8b12fef | 337 | NyLPC_TInt16 i; |
| nyatla | 0:142ee8b12fef | 338 | NyLPC_Assert(!NyLPC_cUipService_isRun()); |
| nyatla | 0:142ee8b12fef | 339 | i=NyLPC_cPtrTbl_getIndex(&(i_inst->_socket_tbl),i_sock); |
| nyatla | 0:142ee8b12fef | 340 | if(i>=0){ |
| nyatla | 0:142ee8b12fef | 341 | NyLPC_cPtrTbl_remove(&(i_inst->_socket_tbl),i); |
| nyatla | 0:142ee8b12fef | 342 | return NyLPC_TBool_TRUE; |
| nyatla | 0:142ee8b12fef | 343 | } |
| nyatla | 0:142ee8b12fef | 344 | return NyLPC_TBool_FALSE; |
| nyatla | 0:142ee8b12fef | 345 | } |
| nyatla | 0:142ee8b12fef | 346 | |
| nyatla | 0:142ee8b12fef | 347 | |
| nyatla | 0:142ee8b12fef | 348 | #define IS_START(i_inst) ((i_inst)->_ref_config!=NULL) |
| nyatla | 0:142ee8b12fef | 349 | |
| nyatla | 0:142ee8b12fef | 350 | /** |
| nyatla | 0:142ee8b12fef | 351 | * 稼動時に、1s置きに呼び出す関数です。 |
| nyatla | 0:142ee8b12fef | 352 | */ |
| nyatla | 0:142ee8b12fef | 353 | void NyLPC_cIPv4_periodec(NyLPC_TcIPv4_t* i_inst) |
| nyatla | 0:142ee8b12fef | 354 | { |
| nyatla | 0:142ee8b12fef | 355 | cSocketTbl_callPeriodic(&(i_inst->_socket_tbl)); |
| nyatla | 0:142ee8b12fef | 356 | } |
| nyatla | 0:142ee8b12fef | 357 | |
| nyatla | 0:142ee8b12fef | 358 | |
| nyatla | 0:142ee8b12fef | 359 | /** |
| nyatla | 0:142ee8b12fef | 360 | * IPv4ペイロードを処理する関数。 |
| nyatla | 0:142ee8b12fef | 361 | * この関数は、パケット受信タスクから実行します。 |
| nyatla | 0:142ee8b12fef | 362 | * @param i_rx |
| nyatla | 0:142ee8b12fef | 363 | * 先頭ポインタ。 |
| nyatla | 0:142ee8b12fef | 364 | * @return |
| nyatla | 0:142ee8b12fef | 365 | * TRUEなら、i_rxに応答パケットをセットして返します。 |
| nyatla | 0:142ee8b12fef | 366 | */ |
| nyatla | 0:142ee8b12fef | 367 | NyLPC_TBool NyLPC_cIPv4_rx(NyLPC_TcIPv4_t* i_inst,void* i_rx,NyLPC_TUInt16 i_rx_size) |
| nyatla | 0:142ee8b12fef | 368 | { |
| nyatla | 0:142ee8b12fef | 369 | NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst; |
| nyatla | 0:142ee8b12fef | 370 | NyLPC_TcIPv4Payload_t ipv4; |
| nyatla | 0:142ee8b12fef | 371 | //NOT開始状態なら受け付けないよ。 |
| nyatla | 0:142ee8b12fef | 372 | if(!IS_START(i_inst)){ |
| nyatla | 0:142ee8b12fef | 373 | NyLPC_OnErrorGoto(ERROR_DROP); |
| nyatla | 0:142ee8b12fef | 374 | } |
| nyatla | 0:142ee8b12fef | 375 | |
| nyatla | 0:142ee8b12fef | 376 | NyLPC_cIPv4Payload_initialize(&ipv4); |
| nyatla | 0:142ee8b12fef | 377 | //IPフラグメントを読出し用にセットする。 |
| nyatla | 0:142ee8b12fef | 378 | if(!NyLPC_cIPv4Payload_setRxBuf(&ipv4,i_rx,i_rx_size)) |
| nyatla | 0:142ee8b12fef | 379 | { |
| nyatla | 0:142ee8b12fef | 380 | NyLPC_OnErrorGoto(ERROR_DROP); |
| nyatla | 0:142ee8b12fef | 381 | } |
| nyatla | 0:142ee8b12fef | 382 | switch(ipv4.header->proto) |
| nyatla | 0:142ee8b12fef | 383 | { |
| nyatla | 0:142ee8b12fef | 384 | case UIP_PROTO_TCP: |
| nyatla | 0:142ee8b12fef | 385 | //TCP受信処理 |
| nyatla | 0:142ee8b12fef | 386 | return tcp_rx(i_inst,&ipv4); |
| nyatla | 0:142ee8b12fef | 387 | case UIP_PROTO_UDP: |
| nyatla | 37:fc4b4fd6a649 | 388 | //UDP処理 |
| nyatla | 37:fc4b4fd6a649 | 389 | udp_rx(i_inst,&ipv4);//r |
| nyatla | 37:fc4b4fd6a649 | 390 | return NyLPC_TBool_FALSE; |
| nyatla | 0:142ee8b12fef | 391 | case UIP_PROTO_ICMP: |
| nyatla | 0:142ee8b12fef | 392 | if(!NyLPC_cIPv4IComp_rx(&(inst->_icomp),&ipv4)){ |
| nyatla | 0:142ee8b12fef | 393 | NyLPC_OnErrorGoto(ERROR_DROP); |
| nyatla | 0:142ee8b12fef | 394 | } |
| nyatla | 0:142ee8b12fef | 395 | return NyLPC_TBool_TRUE; |
| nyatla | 0:142ee8b12fef | 396 | } |
| nyatla | 0:142ee8b12fef | 397 | return NyLPC_TBool_FALSE; |
| nyatla | 0:142ee8b12fef | 398 | ERROR_DROP: |
| nyatla | 0:142ee8b12fef | 399 | return NyLPC_TBool_FALSE; |
| nyatla | 0:142ee8b12fef | 400 | } |
| nyatla | 0:142ee8b12fef | 401 | |
| nyatla | 0:142ee8b12fef | 402 | |
| nyatla | 0:142ee8b12fef | 403 | /********************************************************************** |
| nyatla | 0:142ee8b12fef | 404 | * |
| nyatla | 0:142ee8b12fef | 405 | * public function |
| nyatla | 0:142ee8b12fef | 406 | * |
| nyatla | 0:142ee8b12fef | 407 | **********************************************************************/ |
| nyatla | 0:142ee8b12fef | 408 | |
| nyatla | 0:142ee8b12fef | 409 | |
| nyatla | 0:142ee8b12fef | 410 | static NyLPC_TBool tcp_rx( |
| nyatla | 0:142ee8b12fef | 411 | NyLPC_TcIPv4_t* i_inst, |
| nyatla | 0:142ee8b12fef | 412 | NyLPC_TcIPv4Payload_t* i_ipp) |
| nyatla | 0:142ee8b12fef | 413 | { |
| nyatla | 0:142ee8b12fef | 414 | NyLPC_TcTcpSocket_t* sock; |
| nyatla | 0:142ee8b12fef | 415 | NyLPC_TcTcpListener_t* listener; |
| nyatla | 0:142ee8b12fef | 416 | |
| nyatla | 0:142ee8b12fef | 417 | //自分自身のIPに対する呼び出し? |
| nyatla | 0:142ee8b12fef | 418 | if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&(i_inst->_ref_config->ip_addr))) |
| nyatla | 0:142ee8b12fef | 419 | { |
| nyatla | 0:142ee8b12fef | 420 | //自分以外のパケットはドロップ |
| nyatla | 0:142ee8b12fef | 421 | goto DROP; |
| nyatla | 0:142ee8b12fef | 422 | } |
| nyatla | 0:142ee8b12fef | 423 | //チェックサムの計算 |
| nyatla | 0:142ee8b12fef | 424 | if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff)) |
| nyatla | 0:142ee8b12fef | 425 | { |
| nyatla | 0:142ee8b12fef | 426 | //受信エラーのあるパケットはドロップ |
| nyatla | 0:142ee8b12fef | 427 | goto DROP; |
| nyatla | 0:142ee8b12fef | 428 | } |
| nyatla | 37:fc4b4fd6a649 | 429 | //アクティブなTCPソケットを探す。 |
| nyatla | 37:fc4b4fd6a649 | 430 | sock=cSocketTbl_getMatchTcpSocket(&(i_inst->_socket_tbl),i_ipp->payload.tcp->destport,i_ipp->header->srcipaddr,i_ipp->payload.tcp->srcport); |
| nyatla | 0:142ee8b12fef | 431 | if(sock!=NULL) |
| nyatla | 0:142ee8b12fef | 432 | { |
| nyatla | 0:142ee8b12fef | 433 | //既存の接続を処理 |
| nyatla | 0:142ee8b12fef | 434 | return NyLPC_cTcpSocket_parseRx(sock,i_ipp); |
| nyatla | 0:142ee8b12fef | 435 | |
| nyatla | 0:142ee8b12fef | 436 | }else{ |
| nyatla | 0:142ee8b12fef | 437 | //未知の接続 |
| nyatla | 0:142ee8b12fef | 438 | if(!NyLPC_cPtrTbl_hasEmpty(&(i_inst->_socket_tbl))){ |
| nyatla | 0:142ee8b12fef | 439 | //ソケットテーブルが不十分。RST送信 |
| nyatla | 0:142ee8b12fef | 440 | NyLPC_cIPv4Payload_setTcpReverseRstAck(i_ipp); |
| nyatla | 0:142ee8b12fef | 441 | return NyLPC_TBool_TRUE; |
| nyatla | 0:142ee8b12fef | 442 | } |
| nyatla | 0:142ee8b12fef | 443 | //このポートに対応したListenerを得る。 |
| nyatla | 37:fc4b4fd6a649 | 444 | listener=cSocketTbl_getListenerByPeerPort(&(i_inst->_socket_tbl),i_ipp->payload.tcp->destport); |
| nyatla | 0:142ee8b12fef | 445 | if(listener==NULL){ |
| nyatla | 0:142ee8b12fef | 446 | //Listen対象ではない。RST送信 |
| nyatla | 0:142ee8b12fef | 447 | NyLPC_cIPv4Payload_setTcpReverseRstAck(i_ipp); |
| nyatla | 0:142ee8b12fef | 448 | return NyLPC_TBool_TRUE; |
| nyatla | 0:142ee8b12fef | 449 | } |
| nyatla | 0:142ee8b12fef | 450 | //リスナにソケットのバインドを依頼する。 |
| nyatla | 43:a182f2b5ff41 | 451 | NyLPC_cTcpListener_synPacket(listener,i_ipp); |
| nyatla | 0:142ee8b12fef | 452 | return NyLPC_TBool_FALSE;//LISTEN成功。送信データなし |
| nyatla | 0:142ee8b12fef | 453 | } |
| nyatla | 0:142ee8b12fef | 454 | return NyLPC_TBool_TRUE; |
| nyatla | 0:142ee8b12fef | 455 | DROP: |
| nyatla | 0:142ee8b12fef | 456 | return NyLPC_TBool_FALSE; |
| nyatla | 0:142ee8b12fef | 457 | } |
| nyatla | 0:142ee8b12fef | 458 | |
| nyatla | 0:142ee8b12fef | 459 | |
| nyatla | 0:142ee8b12fef | 460 | |
| nyatla | 37:fc4b4fd6a649 | 461 | static NyLPC_TBool udp_rx( |
| nyatla | 37:fc4b4fd6a649 | 462 | NyLPC_TcIPv4_t* i_inst, |
| nyatla | 37:fc4b4fd6a649 | 463 | NyLPC_TcIPv4Payload_t* i_ipp) |
| nyatla | 37:fc4b4fd6a649 | 464 | { |
| nyatla | 48:00d211aac2ec | 465 | NyLPC_TcUdpSocket_t* sock=NULL; |
| nyatla | 48:00d211aac2ec | 466 | if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&(i_inst->_ref_config->ip_addr))) |
| nyatla | 48:00d211aac2ec | 467 | { |
| nyatla | 48:00d211aac2ec | 468 | sock=cSocketTbl_getMatchUdpSocket(&(i_inst->_socket_tbl),i_ipp->payload.udp->destport); |
| nyatla | 37:fc4b4fd6a649 | 469 | }else{ |
| nyatla | 48:00d211aac2ec | 470 | if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_ipp->header->destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){ |
| nyatla | 48:00d211aac2ec | 471 | //MultiCast? |
| nyatla | 48:00d211aac2ec | 472 | //マルチキャストに参加している&&portの一致するソケットを検索 |
| nyatla | 48:00d211aac2ec | 473 | sock=cSocketTbl_getMatchMulticastUdpSocket(&(i_inst->_socket_tbl),&(i_ipp->header->destipaddr),i_ipp->payload.udp->destport); |
| nyatla | 48:00d211aac2ec | 474 | }else if(!NyLPC_TIPv4Addr_isEqual(&(i_ipp->header->destipaddr),&NyLPC_TIPv4Addr_BROADCAST)){ |
| nyatla | 48:00d211aac2ec | 475 | //Broadcast? |
| nyatla | 48:00d211aac2ec | 476 | sock=cSocketTbl_getMatchUdpSocket(&(i_inst->_socket_tbl),i_ipp->payload.udp->destport); |
| nyatla | 37:fc4b4fd6a649 | 477 | } |
| nyatla | 48:00d211aac2ec | 478 | } |
| nyatla | 48:00d211aac2ec | 479 | if(sock==NULL) |
| nyatla | 48:00d211aac2ec | 480 | { |
| nyatla | 48:00d211aac2ec | 481 | goto DROP; |
| nyatla | 48:00d211aac2ec | 482 | } |
| nyatla | 48:00d211aac2ec | 483 | //パケットのエラーチェック |
| nyatla | 48:00d211aac2ec | 484 | if((NyLPC_TIPv4Header_makeTcpChecksum(i_ipp->header) != 0xffff)) |
| nyatla | 48:00d211aac2ec | 485 | { |
| nyatla | 48:00d211aac2ec | 486 | //受信エラーのあるパケットはドロップ |
| nyatla | 48:00d211aac2ec | 487 | goto DROP; |
| nyatla | 37:fc4b4fd6a649 | 488 | } |
| nyatla | 37:fc4b4fd6a649 | 489 | //既存の接続を処理 |
| nyatla | 37:fc4b4fd6a649 | 490 | return NyLPC_cUdpSocket_parseRx(sock,i_ipp); |
| nyatla | 37:fc4b4fd6a649 | 491 | DROP: |
| nyatla | 37:fc4b4fd6a649 | 492 | return NyLPC_TBool_FALSE; |
| nyatla | 37:fc4b4fd6a649 | 493 | } |
| nyatla | 0:142ee8b12fef | 494 | |
| nyatla | 0:142ee8b12fef | 495 |
MiMic Webservice library