Changeset 321 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_usrreq.c
- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_usrreq.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r279 r321 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$ … … 81 69 82 70 /* 83 * ãã³ããããã³ã°ã³ã¼ã«ãçµè¾¼ã¾ãªãå ´åã«ãªã³ã¯ãããé¢æ°ã®å®ç¾©71 * ノンブロッキングコールを組込まない場合にリンクされる関数の定義 84 72 */ 85 73 … … 131 119 132 120 /* 133 * IPv4 㨠IPv6 ã®åãæ¿ããã¯ã121 * IPv4 と IPv6 の切り替えマクロ 134 122 */ 135 123 … … 151 139 152 140 /* 153 * TINET ãã©ã¤ãã©ãªåããªãå ´åã¯ãå 154 ¨ã¦ã®æ©è½ã 155 * ãªãã¸ã§ã¯ããã¡ã¤ã«ã«åºåããããããã¯ããæå¹ã«ããã 141 * TINET をライブラリ化しない場合は、全ての機能を 142 * オブジェクトファイルに出力するため、マクロを有効にする。 156 143 */ 157 144 … … 174 161 175 162 /* 176 * udp_send_data -- ãã±ããéä¿¡ã®ä¸»è¦é¨163 * udp_send_data -- パケット送信の主要部 177 164 */ 178 165 … … 192 179 NET_COUNT_UDP(net_count_udp.out_packets, 1); 193 180 194 /* IP ãã¼ã¿ã°ã©ã å²ãå½ã¦ã®æéã tmout ããæ¸ããã*/181 /* IP データグラム割り当ての時間を tmout から減ずる。*/ 195 182 if (!(tmout == TMO_POL || tmout == TMO_FEVR)) 196 183 syscall(get_tim(&before)); 197 184 198 /* IP ãã¼ã¿ã°ã©ã ãå²ãå½ã¦ãã*/185 /* IP データグラムを割り当てる。*/ 199 186 if ((error = IN_GET_DATAGRAM(&output, (uint_t)(UDP_HDR_SIZE + len), 0, 200 187 &p_dstaddr->ipaddr, … … 204 191 goto err_ret; 205 192 206 /* IP ãã¼ã¿ã°ã©ã å²ãå½ã¦ã®æéã tmout ããæ¸ããã*/193 /* IP データグラム割り当ての時間を tmout から減ずる。*/ 207 194 if (!(tmout == TMO_POL || tmout == TMO_FEVR)) { 208 195 syscall(get_tim(&after)); … … 215 202 } 216 203 217 /* UDP ãããã«æ 218 å ±ãè¨å®ããã*/ 204 /* UDP ヘッダに情報を設定する。*/ 219 205 udph = GET_UDP_HDR(output, IF_IP_UDP_HDR_OFFSET); 220 206 udph->sport = htons(cep->myaddr.portno); … … 223 209 udph->sum = 0; 224 210 225 /* ãã¼ã¿ãã³ãã¼ããã*/211 /* データをコピーする。*/ 226 212 memcpy((void*)GET_UDP_SDU(output, IF_IP_UDP_HDR_OFFSET), data, (size_t)len); 227 213 … … 230 216 sum = IN_CKSUM(output, IPPROTO_UDP, IF_IP_UDP_HDR_OFFSET, (uint_t)(UDP_HDR_SIZE + len)); 231 217 232 /* è¨ç®ãããã§ãã¯ãµã ã®å¤ã 0 ãªã 0xffff ãå 233 ¥ããã*/ 218 /* 計算したチェックサムの値が 0 なら 0xffff を入れる。*/ 234 219 if (sum == 0) 235 220 sum = 0xffff; … … 238 223 #endif /* of #ifdef UDP_CFG_OUT_CHECKSUM */ 239 224 240 /* ãããã¯ã¼ã¯ãããã¡é·ã調æ´ããã*/225 /* ネットワークバッファ長を調整する。*/ 241 226 output->len = (uint16_t)(IF_IP_UDP_HDR_SIZE + len); 242 227 243 /* ãããã¯ã¼ã¯å±¤ (IP) ã®åºåé¢æ°ãå¼ã³åºãã*/228 /* ネットワーク層 (IP) の出力関数を呼び出す。*/ 244 229 if ((error = IP_OUTPUT(output, tmout)) == E_OK) { 245 230 NET_COUNT_MIB(udp_stats.udpOutDatagrams, 1); … … 257 242 258 243 /* 259 * udp_cre_cep -- UDP é信端ç¹ã®çæãæ¡å¼µæ©è½ã244 * udp_cre_cep -- UDP 通信端点の生成【拡張機能】 260 245 */ 261 246 … … 270 255 ER error; 271 256 272 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/257 /* UDP 通信端点 ID をチェックする。*/ 273 258 if (!VALID_UDP_CEPID(cepid)) 274 259 return E_ID; 275 260 276 /* pk_ccep ã NULL ãªãã¨ã©ã¼*/261 /* pk_ccep が NULL ならエラー */ 277 262 if (pk_ccep == NULL) 278 263 return E_PAR; 279 264 280 /* UDP é信端ç¹ãå¾ãã*/265 /* UDP 通信端点を得る。*/ 281 266 cep = GET_UDP_CEP(cepid); 282 267 283 /* UDP é信端ç¹ããã§ãã¯ããã*/268 /* UDP 通信端点をチェックする。*/ 284 269 if (VALID_UDP_CEP(cep)) 285 270 return E_OBJ; 286 271 287 /* UDP é信端ç¹ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/272 /* UDP 通信端点が、動的生成用でなければエラー */ 288 273 if (!DYNAMIC_UDP_CEP(cep)) 289 274 return E_ID; 290 275 291 /* é信端ç¹ãããã¯ããã*/276 /* 通信端点をロックする。*/ 292 277 syscall(wai_sem(cep->semid_lock)); 293 278 294 279 /* 295 * UDP é信端ç¹ããã§ãã¯ãããçææ¸ã¿ã§ããã°ã¨ã©ã¼280 * UDP 通信端点をチェックする。生成済みであればエラー 296 281 */ 297 282 if (VALID_UDP_CEP(cep)) … … 300 285 301 286 /* 302 * èªãã¼ãçªå·ã UDP_PORTANY ãªããèªåã§å²ãå½ã¦ãã287 * 自ポート番号が UDP_PORTANY なら、自動で割り当てる。 303 288 */ 304 289 if (pk_ccep->myaddr.portno == UDP_PORTANY) … … 309 294 if (error == E_OK) { 310 295 311 /* UDP é信端ç¹çææ 312 å ±ãã³ãã¼ããã*/ 313 cep->cepatr = pk_ccep->cepatr; /* é信端ç¹å±æ§ */ 314 cep->myaddr.ipaddr = pk_ccep->myaddr.ipaddr; /* èªåã®ã¢ãã¬ã¹ */ 315 cep->callback = (void*)pk_ccep->callback; /* ã³ã¼ã«ãã㯠*/ 316 317 /* UDP é信端ç¹ãçææ¸ã¿ã«ããã*/ 296 /* UDP 通信端点生成情報をコピーする。*/ 297 cep->cepatr = pk_ccep->cepatr; /* 通信端点属性 */ 298 cep->myaddr.ipaddr = pk_ccep->myaddr.ipaddr; /* 自分のアドレス */ 299 cep->callback = (void*)pk_ccep->callback; /* コールバック */ 300 301 /* UDP 通信端点を生成済みにする。*/ 318 302 cep->flags |= UDP_CEP_FLG_VALID; 319 303 } 320 304 } 321 305 322 /* é信端ç¹ã®ããã¯ã解é¤ããã*/306 /* 通信端点のロックを解除する。*/ 323 307 syscall(sig_sem(cep->semid_lock)); 324 308 … … 331 315 332 316 /* 333 * udp_del_cep -- UDP é信端ç¹ã®åé¤ãæ¡å¼µæ©è½ã317 * udp_del_cep -- UDP 通信端点の削除【拡張機能】 334 318 */ 335 319 … … 344 328 ER error; 345 329 346 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/330 /* UDP 通信端点 ID をチェックする。*/ 347 331 if (!VALID_UDP_CEPID(cepid)) 348 332 return E_ID; 349 333 350 /* UDP é信端ç¹ãå¾ãã*/334 /* UDP 通信端点を得る。*/ 351 335 cep = GET_UDP_CEP(cepid); 352 336 353 /* UDP é信端ç¹ããã§ãã¯ããã*/337 /* UDP 通信端点をチェックする。*/ 354 338 if (!VALID_UDP_CEP(cep)) 355 339 return E_NOEXS; 356 340 357 /* UDP é信端ç¹ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/341 /* UDP 通信端点が、動的生成用でなければエラー */ 358 342 if (!DYNAMIC_UDP_CEP(cep)) 359 343 return E_ID; 360 344 361 /* é信端ç¹ãããã¯ããã*/345 /* 通信端点をロックする。*/ 362 346 syscall(wai_sem(cep->semid_lock)); 363 347 364 348 /* 365 * UDP é信端ç¹ããã§ãã¯ãããæªçæã®å ´åã¯ã¨ã©ã¼366 * ã»æªçæã349 * UDP 通信端点をチェックする。未生成の場合はエラー 350 * ・未生成。 367 351 */ 368 352 if (!VALID_UDP_CEP(cep)) … … 372 356 udp_can_rcv(cep, E_DLT); 373 357 374 /* UDP é信端ç¹ãæªçæã«ããã*/358 /* UDP 通信端点を未生成にする。*/ 375 359 cep->flags &= ~UDP_CEP_FLG_VALID; 376 360 error = E_OK; 377 361 } 378 362 379 /* é信端ç¹ã®ããã¯ã解é¤ããã*/363 /* 通信端点のロックを解除する。*/ 380 364 syscall(sig_sem(cep->semid_lock)); 381 365 … … 390 374 391 375 /* 392 * udp_can_cep -- ãã³ãã£ã³ã°ãã¦ããå¦çã®ãã£ã³ã»ã«ãæ¨æºæ©è½ã376 * udp_can_cep -- ペンディングしている処理のキャンセル【標準機能】 393 377 */ 394 378 … … 399 383 ER error = E_OK, snd_err, rcv_err; 400 384 401 /* API æ©è½ã³ã¼ãããã§ãã¯ããã*/385 /* API 機能コードをチェックする。*/ 402 386 if (!VALID_TFN_UDP_CAN(fncd)) 403 387 return E_PAR; 404 388 405 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/389 /* UDP 通信端点 ID をチェックする。*/ 406 390 if (!VALID_UDP_CEPID(cepid)) 407 391 return E_ID; 408 392 409 /* UDP é信端ç¹ãå¾ãã*/393 /* UDP 通信端点を得る。*/ 410 394 cep = GET_UDP_CEP(cepid); 411 395 412 /* UDP é信端ç¹ããã§ãã¯ããã*/396 /* UDP 通信端点をチェックする。*/ 413 397 if (!VALID_UDP_CEP(cep)) 414 398 return E_NOEXS; 415 399 416 /* é信端ç¹ãããã¯ããã*/400 /* 通信端点をロックする。*/ 417 401 syscall(wai_sem(cep->semid_lock)); 418 402 419 if (fncd == TFN_UDP_ALL) { /* TFN_UDP_ALL ã®å¦ç*/403 if (fncd == TFN_UDP_ALL) { /* TFN_UDP_ALL の処理 */ 420 404 421 405 snd_err = udp_can_snd(cep, E_RLWAI); … … 423 407 424 408 /* 425 * snd_err 㨠rcv_err ã®ã©ã¡ããEV_NOPND426 * ãªãããã³ãã£ã³ã°ãã¦ããªãã®ã§ã¨ã©ã¼409 * snd_err と rcv_err のどちらも EV_NOPND 410 * なら、ペンディングしていないのでエラー 427 411 */ 428 412 if (snd_err == EV_NOPND && rcv_err == EV_NOPND) … … 440 424 } 441 425 } 442 else if (fncd == TFN_UDP_SND_DAT) { /* éä¿¡å¦çã®ãã£ã³ã»ã«*/426 else if (fncd == TFN_UDP_SND_DAT) { /* 送信処理のキャンセル */ 443 427 if ((error = udp_can_snd(cep, E_RLWAI)) == EV_NOPND) 444 428 error = E_OBJ; 445 429 } 446 else if (fncd == TFN_UDP_RCV_DAT) { /* åä¿¡å¦çã®ãã£ã³ã»ã«*/430 else if (fncd == TFN_UDP_RCV_DAT) { /* 受信処理のキャンセル */ 447 431 if ((error = udp_can_rcv(cep, E_RLWAI)) == EV_NOPND) 448 432 error = E_OBJ; … … 451 435 error = E_PAR; 452 436 453 /* é信端ç¹ãããã¯ã解é¤ããã*/437 /* 通信端点をロックを解除する。*/ 454 438 syscall(sig_sem(cep->semid_lock)); 455 439 … … 460 444 461 445 /* 462 * udp_set_opt -- UDP é信端ç¹ãªãã·ã§ã³ã®è¨å®ãæ¡å¼µæ©è½ã446 * udp_set_opt -- UDP 通信端点オプションの設定【拡張機能】 463 447 * 464 * 注æ: è¨å®å¯è½ãª UDP é信端ç¹ãªãã·ã§ã³ã¯ç¡ããããE_PAR ãè¿ãããã448 * 注意: 設定可能な UDP 通信端点オプションは無いため、E_PAR が返される。 465 449 */ 466 450 … … 474 458 T_UDP_CEP *cep; 475 459 476 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/460 /* UDP 通信端点 ID をチェックする。*/ 477 461 if (!VALID_UDP_CEPID(cepid)) 478 462 return E_ID; 479 463 480 /* UDP é信端ç¹ãå¾ãã*/464 /* UDP 通信端点を得る。*/ 481 465 cep = GET_UDP_CEP(cepid); 482 466 483 /* UDP é信端ç¹ããã§ãã¯ããã*/467 /* UDP 通信端点をチェックする。*/ 484 468 if (!VALID_UDP_CEP(cep)) 485 469 return E_NOEXS; … … 493 477 494 478 /* 495 * udp_get_opt -- UDP é信端ç¹ãªãã·ã§ã³ã®è¨å®ãæ¡å¼µæ©è½ã479 * udp_get_opt -- UDP 通信端点オプションの設定【拡張機能】 496 480 * 497 * 注æ: è¨å®å¯è½ãª UDP é信端ç¹ãªãã·ã§ã³ã¯ç¡ããããE_PAR ãè¿ãããã481 * 注意: 設定可能な UDP 通信端点オプションは無いため、E_PAR が返される。 498 482 */ 499 483 … … 507 491 T_UDP_CEP *cep; 508 492 509 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/493 /* UDP 通信端点 ID をチェックする。*/ 510 494 if (!VALID_UDP_CEPID(cepid)) 511 495 return E_ID; 512 496 513 /* UDP é信端ç¹ãå¾ãã*/497 /* UDP 通信端点を得る。*/ 514 498 cep = GET_UDP_CEP(cepid); 515 499 516 /* UDP é信端ç¹ããã§ãã¯ããã*/500 /* UDP 通信端点をチェックする。*/ 517 501 if (!VALID_UDP_CEP(cep)) 518 502 return E_NOEXS; … … 534 518 535 519 /* 536 * udp_can_snd -- ãã³ãã£ã³ã°ãã¦ããéä¿¡ã®ãã£ã³ã»ã«520 * udp_can_snd -- ペンディングしている送信のキャンセル 537 521 */ 538 522 … … 540 524 udp_can_snd (T_UDP_CEP *cep, ER error) 541 525 { 542 if (cep->snd_tskid != TA_NULL) { /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸ */ 543 544 #ifdef UDP_CFG_EXTENTIONS 545 546 /* å¾ 547 ã¡ä¸ã«çºçããã¨ã©ã¼æ 548 å ±ãè¨å®ããã*/ 526 if (cep->snd_tskid != TA_NULL) { /* 非ノンブロッキングコールでペンディング中 */ 527 528 #ifdef UDP_CFG_EXTENTIONS 529 530 /* 待ち中に発生したエラー情報を設定する。*/ 549 531 cep->error = error; 550 532 … … 554 536 cep->snd_tskid = TA_NULL; 555 537 } 556 else /* ã©ã¡ãã§ããªããªããã³ãã£ã³ã°ãã¦ããªã*/538 else /* どちらでもないならペンディングしていない */ 557 539 error = EV_NOPND; 558 540 … … 565 547 566 548 /* 567 * udp_can_rcv -- ãã³ãã£ã³ã°ãã¦ããåä¿¡ã®ãã£ã³ã»ã«549 * udp_can_rcv -- ペンディングしている受信のキャンセル 568 550 */ 569 551 … … 571 553 udp_can_rcv (T_UDP_CEP *cep, ER error) 572 554 { 573 if (cep->rcv_tskid != TA_NULL) { /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸ */ 574 575 #ifdef UDP_CFG_EXTENTIONS 576 577 /* å¾ 578 ã¡ä¸ã«çºçããã¨ã©ã¼æ 579 å ±ãè¨å®ããã*/ 555 if (cep->rcv_tskid != TA_NULL) { /* 非ノンブロッキングコールでペンディング中 */ 556 557 #ifdef UDP_CFG_EXTENTIONS 558 559 /* 待ち中に発生したエラー情報を設定する。*/ 580 560 cep->error = error; 581 561 … … 585 565 cep->rcv_tskid = TA_NULL; 586 566 } 587 else /* ã©ã¡ãã§ããªããªããã³ãã£ã³ã°ãã¦ããªã*/567 else /* どちらでもないならペンディングしていない */ 588 568 error = EV_NOPND; 589 569 … … 596 576 597 577 /* 598 * udp_snd_dat -- ãã±ããã®éä¿¡ãæ¨æºæ©è½ã578 * udp_snd_dat -- パケットの送信【標準機能】 599 579 */ 600 580 … … 605 585 ER error; 606 586 607 /* p_dstaddr ã¾ã㯠data ã NULL ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/587 /* p_dstaddr または data が NULL か、tmout が TMO_NBLK ならエラー */ 608 588 if (p_dstaddr == NULL || data == NULL || tmout == TMO_NBLK) 609 589 return E_PAR; 610 590 611 /* ãã¼ã¿é·ããã§ãã¯ããã*/591 /* データ長をチェックする。*/ 612 592 if (len < 0 || len + IP_HDR_SIZE + UDP_HDR_SIZE > IF_MTU) 613 593 return E_PAR; 614 594 615 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/595 /* UDP 通信端点 ID をチェックする。*/ 616 596 if (!VALID_UDP_CEPID(cepid)) 617 597 return E_ID; 618 598 619 /* UDP é信端ç¹ãå¾ãã*/599 /* UDP 通信端点を得る。*/ 620 600 cep = GET_UDP_CEP(cepid); 621 601 622 /* UDP é信端ç¹ããã§ãã¯ããã*/602 /* UDP 通信端点をチェックする。*/ 623 603 if (!VALID_UDP_CEP(cep)) 624 604 return E_NOEXS; 625 605 626 606 /* 627 * èªãã¼ãçªå·ã UDP_PORTANY ãªããèªåã§å²ãå½ã¦ãã607 * 自ポート番号が UDP_PORTANY なら、自動で割り当てる。 628 608 */ 629 609 if (cep->myaddr.portno == UDP_PORTANY) { … … 632 612 } 633 613 634 /* é信端ç¹ãããã¯ããã*/614 /* 通信端点をロックする。*/ 635 615 syscall(wai_sem(cep->semid_lock)); 636 616 637 617 if (cep->snd_tskid != TA_NULL) { 638 618 639 /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/619 /* 非ノンブロッキングコールでペンディング中 */ 640 620 error = E_QOVR; 641 621 642 /* é信端ç¹ãããã¯ã解é¤ããã*/622 /* 通信端点をロックを解除する。*/ 643 623 syscall(sig_sem(cep->semid_lock)); 644 624 } 645 625 else { 646 /* ç¾å¨ã®ã¿ã¹ã¯èå¥åãè¨é²ããã*/626 /* 現在のタスク識別子を記録する。*/ 647 627 get_tid(&(cep->snd_tskid)); 648 628 649 629 #ifdef UDP_CFG_EXTENTIONS 650 630 651 /* å¾ 652 ã¡ä¸ã«çºçããã¨ã©ã¼æ 653 å ±ããªã»ããããã*/ 631 /* 待ち中に発生したエラー情報をリセットする。*/ 654 632 cep->error = E_OK; 655 633 656 634 #endif /* of #ifdef UDP_CFG_EXTENTIONS */ 657 635 658 /* é信端ç¹ãããã¯ã解é¤ããã*/636 /* 通信端点をロックを解除する。*/ 659 637 syscall(sig_sem(cep->semid_lock)); 660 638 661 /* ãã±ãããéä¿¡ããã*/639 /* パケットを送信する。*/ 662 640 error = udp_send_data(cep, p_dstaddr, data, len, tmout); 663 641 664 642 #ifdef UDP_CFG_EXTENTIONS 665 643 666 /* å¾ 667 ã¡ä¸ã«çºçããã¨ã©ã¼æ 668 å ±ãè¿ãã*/ 644 /* 待ち中に発生したエラー情報を返す。*/ 669 645 if (error == E_RLWAI) 670 646 error = cep->error; … … 681 657 682 658 /* 683 * udp_rcv_dat -- ãã±ããã®åä¿¡ãæ¨æºæ©è½ã659 * udp_rcv_dat -- パケットの受信【標準機能】 684 660 */ 685 661 … … 693 669 uint_t ulen, uhoff; 694 670 695 /* p_dstaddr ã¾ã㯠data ã NULL ãlen < 0 ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/671 /* p_dstaddr または data が NULL 、len < 0 か、tmout が TMO_NBLK ならエラー */ 696 672 if (p_dstaddr == NULL || data == NULL || len < 0 || tmout == TMO_NBLK) 697 673 return E_PAR; 698 674 699 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/675 /* UDP 通信端点 ID をチェックする。*/ 700 676 if (!VALID_UDP_CEPID(cepid)) 701 677 return E_ID; 702 678 703 /* UDP é信端ç¹ãå¾ãã*/679 /* UDP 通信端点を得る。*/ 704 680 cep = GET_UDP_CEP(cepid); 705 681 706 /* UDP é信端ç¹ããã§ãã¯ããã*/682 /* UDP 通信端点をチェックする。*/ 707 683 if (!VALID_UDP_CEP(cep)) 708 684 return E_NOEXS; 709 685 710 /* é信端ç¹ãããã¯ããã*/686 /* 通信端点をロックする。*/ 711 687 syscall(wai_sem(cep->semid_lock)); 712 688 713 689 if (cep->rcv_tskid != TA_NULL) { 714 690 715 /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/691 /* 非ノンブロッキングコールでペンディング中 */ 716 692 error = E_QOVR; 717 693 718 /* é信端ç¹ãããã¯ã解é¤ããã*/694 /* 通信端点をロックを解除する。*/ 719 695 syscall(sig_sem(cep->semid_lock)); 720 696 } 721 697 else { 722 698 723 /* ç¾å¨ã®ã¿ã¹ã¯èå¥åãè¨é²ããã*/699 /* 現在のタスク識別子を記録する。*/ 724 700 get_tid(&(cep->rcv_tskid)); 725 701 726 702 #ifdef UDP_CFG_EXTENTIONS 727 703 728 /* å¾ 729 ã¡ä¸ã«çºçããã¨ã©ã¼æ 730 å ±ããªã»ããããã*/ 704 /* 待ち中に発生したエラー情報をリセットする。*/ 731 705 cep->error = E_OK; 732 706 733 707 #endif /* of #ifdef UDP_CFG_EXTENTIONS */ 734 708 735 /* é信端ç¹ãããã¯ã解é¤ããã*/709 /* 通信端点をロックを解除する。*/ 736 710 syscall(sig_sem(cep->semid_lock)); 737 711 738 /* å 739 ¥åãããã¾ã§å¾ 740 ã¤ã*/ 712 /* 入力があるまで待つ。*/ 741 713 if (cep->cb_netbuf != NULL) { 742 714 743 715 /* 744 * ããã«ããå ´åã¯ãã³ã¼ã«ããã¯é¢æ°ã®ä¸ãã 745 * udp_rcv_dat ãå¼ã³åºãã¦ãããã¨ã«ãªãã 746 * ãã§ã«å 747 ¥åæ¸ã¿ã§ããã 716 * ここにくる場合は、コールバック関数の中から 717 * udp_rcv_dat を呼び出していることになり、 718 * すでに入力済みである。 748 719 */ 749 720 input = cep->cb_netbuf; … … 754 725 #ifdef UDP_CFG_EXTENTIONS 755 726 756 /* å¾ 757 ã¡ä¸ã«çºçããã¨ã©ã¼æ 758 å ±ãè¿ãã*/ 727 /* 待ち中に発生したエラー情報を返す。*/ 759 728 if (error == E_RLWAI) 760 729 error = cep->error; … … 766 735 } 767 736 768 /* p_dstaddr ãè¨å®ããã*/737 /* p_dstaddr を設定する。*/ 769 738 uhoff = (uint_t)GET_UDP_HDR_OFFSET(input); 770 739 udph = GET_UDP_HDR(input, uhoff); … … 772 741 IN_COPY_TO_HOST(&p_dstaddr->ipaddr, &GET_IP_HDR(input)->src); 773 742 774 /* ãã¼ã¿ããããã¡ã«ç§»ãã*/743 /* データをバッファに移す。*/ 775 744 ulen = ntohs(udph->ulen); 776 745 if (ulen - UDP_HDR_SIZE > len)
Note:
See TracChangeset
for help on using the changeset viewer.