- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/tinet/netinet/udpn_usrreq_nblk.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r388 r389 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * 7 * ä¸è¨èä½æ¨©è 8 ã¯ï¼ä»¥ä¸ã® (1)ï½(4) ã®æ¡ä»¶ãï¼Free Software Foundation 9 * ã«ãã£ã¦å 10 ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨ 11 * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢ 12 * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé 13 å¸ï¼ä»¥ä¸ï¼ 14 * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 15 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 16 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 17 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 18 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 19 * ç¨ã§ããå½¢ã§åé 20 å¸ããå ´åã«ã¯ï¼åé 21 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 22 * è 23 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 24 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 25 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 26 * ç¨ã§ããªãå½¢ã§åé 27 å¸ããå ´åã«ã¯ï¼æ¬¡ã®æ¡ä»¶ãæºãããã¨ï¼ 28 * (a) åé 29 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 30 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 31 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 32 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 33 * 害ãããï¼ä¸è¨èä½æ¨©è 34 ããã³TOPPERSããã¸ã§ã¯ããå 35 責ãããã¨ï¼ 7 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation 8 * によって公表されている GNU General Public License の Version 2 に記 9 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 10 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 11 * 利用と呼ぶ)することを無償で許諾する. 12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 14 * スコード中に含まれていること. 15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 18 * の無保証規定を掲載すること. 19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 20 * 用できない形で再配布する場合には,次の条件を満たすこと. 21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 22 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 36 25 * 37 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 38 ã 39 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã 40 * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´ 41 * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼ 26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 42 30 * 43 31 * @(#) $Id$ … … 83 71 84 72 /* 85 * udp_can_snd -- ãã³ãã£ã³ã°ãã¦ããéä¿¡ã®ãã£ã³ã»ã«73 * udp_can_snd -- ペンディングしている送信のキャンセル 86 74 */ 87 75 … … 89 77 UDP_CAN_SND (T_UDP_CEP *cep, ER error) 90 78 { 91 if (cep->snd_p_dstaddr != NULL) { /* ãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/79 if (cep->snd_p_dstaddr != NULL) { /* ノンブロッキングコールでペンディング中 */ 92 80 if (IS_PTR_DEFINED(cep->callback)) 93 81 … … 101 89 cep->snd_p_dstaddr = NULL; 102 90 } 103 else if (cep->snd_tskid != TA_NULL) { /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/91 else if (cep->snd_tskid != TA_NULL) { /* 非ノンブロッキングコールでペンディング中 */ 104 92 105 93 #ifdef UDP_CFG_EXTENTIONS 106 94 107 /* å¾ 108 ã¡ä¸ã«çºçããã¨ã©ã¼æ 109 å ±ãè¨å®ããã*/ 95 /* 待ち中に発生したエラー情報を設定する。*/ 110 96 cep->error = error; 111 97 … … 115 101 cep->snd_tskid = TA_NULL; 116 102 } 117 else /* ã©ã¡ãã§ããªããªããã³ãã£ã³ã°ãã¦ããªã*/103 else /* どちらでもないならペンディングしていない */ 118 104 error = EV_NOPND; 119 105 … … 126 112 127 113 /* 128 * udp_can_rcv -- ãã³ãã£ã³ã°ãã¦ããåä¿¡ã®ãã£ã³ã»ã«114 * udp_can_rcv -- ペンディングしている受信のキャンセル 129 115 */ 130 116 … … 132 118 UDP_CAN_RCV (T_UDP_CEP *cep, ER error) 133 119 { 134 if (cep->rcv_p_dstaddr != NULL) { /* ãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/120 if (cep->rcv_p_dstaddr != NULL) { /* ノンブロッキングコールでペンディング中 */ 135 121 if (IS_PTR_DEFINED(cep->callback)) 136 122 … … 144 130 cep->rcv_p_dstaddr = NULL; 145 131 } 146 else if (cep->rcv_tskid != TA_NULL) { /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/132 else if (cep->rcv_tskid != TA_NULL) { /* 非ノンブロッキングコールでペンディング中 */ 147 133 148 134 #ifdef UDP_CFG_EXTENTIONS 149 135 150 /* å¾ 151 ã¡ä¸ã«çºçããã¨ã©ã¼æ 152 å ±ãè¨å®ããã*/ 136 /* 待ち中に発生したエラー情報を設定する。*/ 153 137 cep->error = error; 154 138 … … 158 142 cep->rcv_tskid = TA_NULL; 159 143 } 160 else /* ã©ã¡ãã§ããªããªããã³ãã£ã³ã°ãã¦ããªã*/144 else /* どちらでもないならペンディングしていない */ 161 145 error = EV_NOPND; 162 146 … … 169 153 170 154 /* 171 * udp_snd_dat -- ãã±ããã®éä¿¡ãæ¨æºæ©è½ã155 * udp_snd_dat -- パケットの送信【標準機能】 172 156 */ 173 157 … … 178 162 ER error; 179 163 180 /* p_dstaddr ã¾ã㯠data ã NULL ãªãã¨ã©ã¼*/164 /* p_dstaddr または data が NULL ならエラー */ 181 165 if (p_dstaddr == NULL || data == NULL) 182 166 return E_PAR; 183 167 184 /* ãã¼ã¿é·ããã§ãã¯ããã*/168 /* データ長をチェックする。*/ 185 169 if (len < 0 || len + IP_HDR_SIZE + UDP_HDR_SIZE > IF_MTU) 186 170 return E_PAR; … … 189 173 190 174 /* 191 * API ã IPv6 㧠IPv4 å°å½±ã¢ãã¬ã¹ãèªãããã¦ããªãã®ã«ããããããã192 * IPv4 å°å½±ã¢ãã¬ã¹ãæå®ããããã¨ã©ã¼175 * API が IPv6 で IPv4 射影アドレスが認められていないのにもかかわらず、 176 * IPv4 射影アドレスが指定されたらエラー 193 177 */ 194 178 if (in6_is_addr_ipv4mapped(&p_dstaddr->ipaddr)) … … 197 181 #endif /* of #if (API_PROTO == API_PROTO_IPV6) && !defined(DAPI_CFG_IP4MAPPED_ADDR) */ 198 182 199 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/183 /* UDP 通信端点 ID をチェックする。*/ 200 184 if (!VALID_UDP_CEPID(cepid)) 201 185 return E_ID; 202 186 203 /* UDP é信端ç¹ãå¾ãã*/187 /* UDP 通信端点を得る。*/ 204 188 cep = GET_UDP_CEP(cepid); 205 189 206 /* UDP é信端ç¹ããã§ãã¯ããã*/190 /* UDP 通信端点をチェックする。*/ 207 191 if (!VALID_UDP_CEP(cep)) 208 192 return E_NOEXS; 209 193 210 194 /* 211 * èªãã¼ãçªå·ã UDP_PORTANY ãªããèªåã§å²ãå½ã¦ãã195 * 自ポート番号が UDP_PORTANY なら、自動で割り当てる。 212 196 */ 213 197 if (cep->myaddr.portno == UDP_PORTANY) { … … 217 201 218 202 /* 219 * ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã203 * タイムアウトをチェックする。 220 204 */ 221 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/222 223 /* é信端ç¹ãããã¯ããã*/205 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 206 207 /* 通信端点をロックする。*/ 224 208 syscall(wai_sem(cep->semid_lock)); 225 209 226 210 if (cep->snd_p_dstaddr != NULL) { 227 211 228 /* ãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/212 /* ノンブロッキングコールでペンディング中 */ 229 213 error = E_QOVR; 230 214 231 /* é信端ç¹ãããã¯ã解é¤ããã*/215 /* 通信端点をロックを解除する。*/ 232 216 syscall(sig_sem(cep->semid_lock)); 233 217 } 234 218 else if (cep->snd_tskid != TA_NULL) { 235 219 236 /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/237 error = E_OBJ; 238 239 /* é信端ç¹ãããã¯ã解é¤ããã*/220 /* 非ノンブロッキングコールでペンディング中 */ 221 error = E_OBJ; 222 223 /* 通信端点をロックを解除する。*/ 240 224 syscall(sig_sem(cep->semid_lock)); 241 225 } … … 246 230 cep->snd_len = len; 247 231 248 /* é信端ç¹ãããã¯ã解é¤ããã*/232 /* 通信端点をロックを解除する。*/ 249 233 syscall(sig_sem(cep->semid_lock)); 250 234 … … 254 238 } 255 239 } 256 else { /* éãã³ããããã³ã°ã³ã¼ã«*/240 else { /* 非ノンブロッキングコール */ 257 241 258 /* é信端ç¹ãããã¯ããã*/242 /* 通信端点をロックする。*/ 259 243 syscall(wai_sem(cep->semid_lock)); 260 244 261 245 if (cep->snd_p_dstaddr != NULL) { 262 246 263 /* ãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/264 error = E_OBJ; 265 266 /* é信端ç¹ãããã¯ã解é¤ããã*/247 /* ノンブロッキングコールでペンディング中 */ 248 error = E_OBJ; 249 250 /* 通信端点をロックを解除する。*/ 267 251 syscall(sig_sem(cep->semid_lock)); 268 252 } 269 253 else if (cep->snd_tskid != TA_NULL) { 270 254 271 /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/255 /* 非ノンブロッキングコールでペンディング中 */ 272 256 error = E_QOVR; 273 257 274 /* é信端ç¹ãããã¯ã解é¤ããã*/258 /* 通信端点をロックを解除する。*/ 275 259 syscall(sig_sem(cep->semid_lock)); 276 260 } 277 261 else { 278 262 279 /* ç¾å¨ã®ã¿ã¹ã¯èå¥åãè¨é²ããã*/263 /* 現在のタスク識別子を記録する。*/ 280 264 get_tid(&(cep->snd_tskid)); 281 265 282 /* é信端ç¹ãããã¯ã解é¤ããã*/283 syscall(sig_sem(cep->semid_lock)); 284 285 /* ãã±ãããéä¿¡ããã*/266 /* 通信端点をロックを解除する。*/ 267 syscall(sig_sem(cep->semid_lock)); 268 269 /* パケットを送信する。*/ 286 270 error = UDP_SEND_DATA(cep, p_dstaddr, data, len, tmout); 287 271 } … … 296 280 297 281 /* 298 * udp_rcv_dat -- ãã±ããã®åä¿¡ãæ¨æºæ©è½ã282 * udp_rcv_dat -- パケットの受信【標準機能】 299 283 */ 300 284 … … 308 292 uint_t ulen, uhoff; 309 293 310 /* p_dstaddr ã¾ã㯠data ã NULL ããlen < 0 ãªãã¨ã©ã¼*/294 /* p_dstaddr または data が NULL か、len < 0 ならエラー */ 311 295 if (p_dstaddr == NULL || data == NULL || len < 0) 312 296 return E_PAR; 313 297 314 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/298 /* UDP 通信端点 ID をチェックする。*/ 315 299 if (!VALID_UDP_CEPID(cepid)) 316 300 return E_ID; 317 301 318 /* UDP é信端ç¹ãå¾ãã*/302 /* UDP 通信端点を得る。*/ 319 303 cep = GET_UDP_CEP(cepid); 320 304 321 /* UDP é信端ç¹ããã§ãã¯ããã*/305 /* UDP 通信端点をチェックする。*/ 322 306 if (!VALID_UDP_CEP(cep)) 323 307 return E_NOEXS; 324 308 325 309 /* 326 * ã¿ã¤ã ã¢ã¦ãããã§ãã¯ããã310 * タイムアウトをチェックする。 327 311 */ 328 312 329 if (tmout == TMO_NBLK) { /* ãã³ããããã³ã°ã³ã¼ã«*/330 331 /* é信端ç¹ãããã¯ããã*/313 if (tmout == TMO_NBLK) { /* ノンブロッキングコール */ 314 315 /* 通信端点をロックする。*/ 332 316 syscall(wai_sem(cep->semid_lock)); 333 317 334 318 if (cep->rcv_p_dstaddr != NULL) 335 319 336 /* ãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/320 /* ノンブロッキングコールでペンディング中 */ 337 321 error = E_QOVR; 338 322 339 323 else if (cep->rcv_tskid != TA_NULL) 340 324 341 /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/325 /* 非ノンブロッキングコールでペンディング中 */ 342 326 error = E_OBJ; 343 327 else { … … 348 332 } 349 333 350 /* é信端ç¹ãããã¯ã解é¤ããã*/334 /* 通信端点をロックを解除する。*/ 351 335 syscall(sig_sem(cep->semid_lock)); 352 336 return error; 353 337 } 354 else { /* éãã³ããããã³ã°ã³ã¼ã«*/355 356 /* é信端ç¹ãããã¯ããã*/338 else { /* 非ノンブロッキングコール */ 339 340 /* 通信端点をロックする。*/ 357 341 syscall(wai_sem(cep->semid_lock)); 358 342 359 343 if (cep->rcv_p_dstaddr != NULL) { 360 344 361 /* ãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/362 error = E_OBJ; 363 364 /* é信端ç¹ãããã¯ã解é¤ããã*/345 /* ノンブロッキングコールでペンディング中 */ 346 error = E_OBJ; 347 348 /* 通信端点をロックを解除する。*/ 365 349 syscall(sig_sem(cep->semid_lock)); 366 350 } 367 351 else if (cep->rcv_tskid != TA_NULL) { 368 352 369 /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/353 /* 非ノンブロッキングコールでペンディング中 */ 370 354 error = E_QOVR; 371 355 372 /* é信端ç¹ãããã¯ã解é¤ããã*/356 /* 通信端点をロックを解除する。*/ 373 357 syscall(sig_sem(cep->semid_lock)); 374 358 } 375 359 else { 376 360 377 /* ç¾å¨ã®ã¿ã¹ã¯èå¥åãè¨é²ããã*/361 /* 現在のタスク識別子を記録する。*/ 378 362 get_tid(&(cep->rcv_tskid)); 379 363 380 /* é信端ç¹ãããã¯ã解é¤ããã*/ 381 syscall(sig_sem(cep->semid_lock)); 382 383 /* å 384 ¥åãããã¾ã§å¾ 385 ã¤ã*/ 364 /* 通信端点をロックを解除する。*/ 365 syscall(sig_sem(cep->semid_lock)); 366 367 /* 入力があるまで待つ。*/ 386 368 if (cep->cb_netbuf != NULL) { 387 369 388 370 /* 389 * ããã«ããå ´åã¯ãã³ã¼ã«ããã¯é¢æ°ã®ä¸ãã 390 * udp_rcv_dat ãå¼ã³åºãã¦ãããã¨ã«ãªãã 391 * ãã§ã«å 392 ¥åæ¸ã¿ã§ããã 371 * ここにくる場合は、コールバック関数の中から 372 * udp_rcv_dat を呼び出していることになり、 373 * すでに入力済みである。 393 374 */ 394 375 input = cep->cb_netbuf; … … 400 381 } 401 382 402 /* p_dstaddr ãè¨å®ããã*/383 /* p_dstaddr を設定する。*/ 403 384 uhoff = (uint_t)GET_UDP_HDR_OFFSET(input); 404 385 udph = GET_UDP_HDR(input, uhoff); … … 406 387 IN_COPY_TO_HOST(&p_dstaddr->ipaddr, input); 407 388 408 /* ãã¼ã¿ããããã¡ã«ç§»ãã*/389 /* データをバッファに移す。*/ 409 390 ulen = ntohs(udph->ulen); 410 391 if (ulen - UDP_HDR_SIZE > len)
Note:
See TracChangeset
for help on using the changeset viewer.