Ryo Iizuka / libMiMic

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

Committer:
nyatla
Date:
Wed Jun 19 09:33:01 2013 +0000
Revision:
37:fc4b4fd6a649
Parent:
12:efe841863fc8
Child:
43:a182f2b5ff41
update; MiMic Core r263; add mDNS service,DHCP client,APIPA client

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