Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet/udpn_usrreq.c
- 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.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 責ãããã¨ï¼ 36 * 37 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 38 ã 39 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã 40 * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´ 41 * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼ 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プロジェクトを免責すること. 25 * 26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 42 30 * 43 31 * @(#) $Id$ … … 83 71 84 72 /* 85 * udp_send_data -- ãã±ããéä¿¡ã®ä¸»è¦é¨73 * udp_send_data -- パケット送信の主要部 86 74 */ 87 75 … … 101 89 NET_COUNT_UDP(net_count_udp.out_packets, 1); 102 90 103 /* IP ãã¼ã¿ã°ã©ã å²ãå½ã¦ã®æéã tmout ããæ¸ããã*/91 /* IP データグラム割り当ての時間を tmout から減ずる。*/ 104 92 if (!(tmout == TMO_POL || tmout == TMO_FEVR)) 105 93 syscall(get_tim(&before)); 106 94 107 /* IP ãã¼ã¿ã°ã©ã ãå²ãå½ã¦ãã*/95 /* IP データグラムを割り当てる。*/ 108 96 if ((error = IN_GET_DATAGRAM(&output, (uint_t)(UDP_HDR_SIZE + len), 0, 109 97 &p_dstaddr->ipaddr, … … 113 101 goto err_ret; 114 102 115 /* IP ãã¼ã¿ã°ã©ã å²ãå½ã¦ã®æéã tmout ããæ¸ããã*/103 /* IP データグラム割り当ての時間を tmout から減ずる。*/ 116 104 if (!(tmout == TMO_POL || tmout == TMO_FEVR)) { 117 105 syscall(get_tim(&after)); … … 124 112 } 125 113 126 /* UDP ãããã«æ 127 å ±ãè¨å®ããã*/ 114 /* UDP ヘッダに情報を設定する。*/ 128 115 udph = GET_UDP_HDR(output, IF_IP_UDP_HDR_OFFSET(output)); 129 116 udph->sport = htons(cep->myaddr.portno); … … 132 119 udph->sum = 0; 133 120 134 /* ãã¼ã¿ãã³ãã¼ããã*/121 /* データをコピーする。*/ 135 122 memcpy((void*)GET_UDP_SDU(output, IF_IP_UDP_HDR_OFFSET(output)), data, (size_t)len); 136 123 … … 139 126 sum = IN_CKSUM(output, IPPROTO_UDP, IF_IP_UDP_HDR_OFFSET(output), (uint_t)(UDP_HDR_SIZE + len)); 140 127 141 /* è¨ç®ãããã§ãã¯ãµã ã®å¤ã 0 ãªã 0xffff ãå 142 ¥ããã*/ 128 /* 計算したチェックサムの値が 0 なら 0xffff を入れる。*/ 143 129 if (sum == 0) 144 130 sum = 0xffff; … … 147 133 #endif /* of #ifdef UDP_CFG_OUT_CHECKSUM */ 148 134 149 /* ãããã¯ã¼ã¯ãããã¡é·ã調æ´ããã*/135 /* ネットワークバッファ長を調整する。*/ 150 136 output->len = (uint16_t)(IF_IP_UDP_HDR_SIZE(output) + len); 151 137 152 /* ãããã¯ã¼ã¯å±¤ (IP) ã®åºåé¢æ°ãå¼ã³åºãã*/138 /* ネットワーク層 (IP) の出力関数を呼び出す。*/ 153 139 if ((error = IP_OUTPUT(output, tmout)) == E_OK) { 154 140 NET_COUNT_MIB(udp_stats.udpOutDatagrams, 1); … … 166 152 167 153 /* 168 * udp_cancel_cep -- ãã³ãã£ã³ã°ãã¦ããå¦çããã£ã³ã»ã«ããã169 * 170 * udp_can_cep ããå¼åºãããã¡ã¤ã³é¢æ°154 * udp_cancel_cep -- ペンディングしている処理をキャンセルする。 155 * 156 * udp_can_cep から呼出されるメイン関数 171 157 */ 172 158 … … 178 164 ER error = E_OK, snd_err, rcv_err; 179 165 180 /* UDP é信端ç¹ããã§ãã¯ããã*/166 /* UDP 通信端点をチェックする。*/ 181 167 if (!VALID_UDP_CEP(cep)) 182 168 return E_NOEXS; 183 169 184 /* API æ©è½ã³ã¼ãããã§ãã¯ããã*/170 /* API 機能コードをチェックする。*/ 185 171 if (!VALID_TFN_UDP_CAN(fncd)) 186 172 return E_PAR; 187 173 188 /* é信端ç¹ãããã¯ããã*/174 /* 通信端点をロックする。*/ 189 175 syscall(wai_sem(cep->semid_lock)); 190 176 191 if (fncd == TFN_UDP_ALL) { /* TFN_UDP_ALL ã®å¦ç*/177 if (fncd == TFN_UDP_ALL) { /* TFN_UDP_ALL の処理 */ 192 178 193 179 snd_err = UDP_CAN_SND(cep, E_RLWAI); … … 195 181 196 182 /* 197 * snd_err 㨠rcv_err ã®ã©ã¡ããEV_NOPND198 * ãªãããã³ãã£ã³ã°ãã¦ããªãã®ã§ã¨ã©ã¼183 * snd_err と rcv_err のどちらも EV_NOPND 184 * なら、ペンディングしていないのでエラー 199 185 */ 200 186 if (snd_err == EV_NOPND && rcv_err == EV_NOPND) … … 212 198 } 213 199 } 214 else if (fncd == TFN_UDP_SND_DAT) { /* éä¿¡å¦çã®ãã£ã³ã»ã«*/200 else if (fncd == TFN_UDP_SND_DAT) { /* 送信処理のキャンセル */ 215 201 if ((error = UDP_CAN_SND(cep, E_RLWAI)) == EV_NOPND) 216 202 error = E_OBJ; 217 203 } 218 else if (fncd == TFN_UDP_RCV_DAT) { /* åä¿¡å¦çã®ãã£ã³ã»ã«*/204 else if (fncd == TFN_UDP_RCV_DAT) { /* 受信処理のキャンセル */ 219 205 if ((error = UDP_CAN_RCV(cep, E_RLWAI)) == EV_NOPND) 220 206 error = E_OBJ; … … 223 209 error = E_PAR; 224 210 225 /* é信端ç¹ãããã¯ã解é¤ããã*/211 /* 通信端点をロックを解除する。*/ 226 212 syscall(sig_sem(cep->semid_lock)); 227 213 … … 236 222 237 223 /* 238 * udp_can_cep -- ãã³ãã£ã³ã°ãã¦ããå¦çã®ãã£ã³ã»ã«ãæ¨æºæ©è½ã224 * udp_can_cep -- ペンディングしている処理のキャンセル【標準機能】 239 225 */ 240 226 … … 246 232 T_UDP_CEP *cep; 247 233 248 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/234 /* UDP 通信端点 ID をチェックする。*/ 249 235 if (!VALID_UDP_CEPID(cepid)) 250 236 return E_ID; 251 237 252 /* UDP é信端ç¹ãå¾ãã*/238 /* UDP 通信端点を得る。*/ 253 239 cep = GET_UDP_CEP(cepid); 254 240 255 /* ã¡ã¤ã³é¢æ°ãå¼ã³åºãã*/241 /* メイン関数を呼び出す。*/ 256 242 return UDP_CANCEL_CEP(cep, fncd); 257 243 } … … 264 250 265 251 /* 266 * udp_cre_cep -- UDP é信端ç¹ã®çæãæ¡å¼µæ©è½ã252 * udp_cre_cep -- UDP 通信端点の生成【拡張機能】 267 253 */ 268 254 … … 275 261 ER error; 276 262 277 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/263 /* UDP 通信端点 ID をチェックする。*/ 278 264 if (!VALID_UDP_CEPID(cepid)) 279 265 return E_ID; 280 266 281 /* pk_ccep ã NULL ãªãã¨ã©ã¼*/267 /* pk_ccep が NULL ならエラー */ 282 268 if (pk_ccep == NULL) 283 269 return E_PAR; … … 286 272 287 273 /* 288 * API ã IPv6 㧠IPv4 å°å½±ã¢ãã¬ã¹ãèªãããã¦ããªãã®ã«ããããããã289 * IPv4 å°å½±ã¢ãã¬ã¹ãæå®ããããã¨ã©ã¼274 * API が IPv6 で IPv4 射影アドレスが認められていないのにもかかわらず、 275 * IPv4 射影アドレスが指定されたらエラー 290 276 */ 291 277 if (in6_is_addr_ipv4mapped(&pk_ccep->myaddr.ipaddr)) … … 294 280 #endif /* of #if (API_PROTO == API_PROTO_IPV6) && !defined(DAPI_CFG_IP4MAPPED_ADDR) */ 295 281 296 /* UDP é信端ç¹ãå¾ãã*/282 /* UDP 通信端点を得る。*/ 297 283 cep = GET_UDP_CEP(cepid); 298 284 299 /* UDP é信端ç¹ããã§ãã¯ããã*/285 /* UDP 通信端点をチェックする。*/ 300 286 if (VALID_UDP_CEP(cep)) 301 287 return E_OBJ; 302 288 303 /* UDP é信端ç¹ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/289 /* UDP 通信端点が、動的生成用でなければエラー */ 304 290 if (!DYNAMIC_UDP_CEP(cep)) 305 291 return E_ID; 306 292 307 /* é信端ç¹ãããã¯ããã*/293 /* 通信端点をロックする。*/ 308 294 syscall(wai_sem(cep->semid_lock)); 309 295 310 296 /* 311 * UDP é信端ç¹ããã§ãã¯ãããçææ¸ã¿ã§ããã°ã¨ã©ã¼297 * UDP 通信端点をチェックする。生成済みであればエラー 312 298 */ 313 299 if (VALID_UDP_CEP(cep)) … … 316 302 317 303 /* 318 * èªãã¼ãçªå·ã UDP_PORTANY ãªããèªåã§å²ãå½ã¦ãã304 * 自ポート番号が UDP_PORTANY なら、自動で割り当てる。 319 305 */ 320 306 if (pk_ccep->myaddr.portno == UDP_PORTANY) … … 324 310 325 311 if (error == E_OK) { 326 /* UDP é信端ç¹çææ 327 å ±ãã³ãã¼ããã*/ 328 cep->cepatr = pk_ccep->cepatr; /* é信端ç¹å±æ§ */ 329 cep->myaddr.ipaddr = pk_ccep->myaddr.ipaddr; /* èªåã®ã¢ãã¬ã¹ */ 330 cep->callback = (void*)pk_ccep->callback; /* ã³ã¼ã«ãã㯠*/ 331 332 /* UDP é信端ç¹ãçææ¸ã¿ã«ããã*/ 312 /* UDP 通信端点生成情報をコピーする。*/ 313 cep->cepatr = pk_ccep->cepatr; /* 通信端点属性 */ 314 cep->myaddr.ipaddr = pk_ccep->myaddr.ipaddr; /* 自分のアドレス */ 315 cep->callback = (void*)pk_ccep->callback; /* コールバック */ 316 317 /* UDP 通信端点を生成済みにする。*/ 333 318 cep->flags |= UDP_CEP_FLG_VALID; 334 319 } 335 320 } 336 321 337 /* é信端ç¹ã®ããã¯ã解é¤ããã*/322 /* 通信端点のロックを解除する。*/ 338 323 syscall(sig_sem(cep->semid_lock)); 339 324 … … 346 331 347 332 /* 348 * udp_delete_cep -- UDP é信端ç¹ãåé¤ããã349 * 350 * udp_del_cep ããå¼åºãããã¡ã¤ã³é¢æ°333 * udp_delete_cep -- UDP 通信端点を削除する。 334 * 335 * udp_del_cep から呼出されるメイン関数 351 336 */ 352 337 … … 356 341 ER error; 357 342 358 /* UDP é信端ç¹ããã§ãã¯ããã*/343 /* UDP 通信端点をチェックする。*/ 359 344 if (!VALID_UDP_CEP(cep)) 360 345 return E_NOEXS; 361 346 362 /* UDP é信端ç¹ããåççæç¨ã§ãªããã°ã¨ã©ã¼*/347 /* UDP 通信端点が、動的生成用でなければエラー */ 363 348 if (!DYNAMIC_UDP_CEP(cep)) 364 349 return E_ID; 365 350 366 /* é信端ç¹ãããã¯ããã*/351 /* 通信端点をロックする。*/ 367 352 syscall(wai_sem(cep->semid_lock)); 368 353 369 354 /* 370 * UDP é信端ç¹ããã§ãã¯ãããæªçæã®å ´åã¯ã¨ã©ã¼371 * ã»æªçæã355 * UDP 通信端点をチェックする。未生成の場合はエラー 356 * ・未生成。 372 357 */ 373 358 if (!VALID_UDP_CEP(cep)) … … 377 362 UDP_CAN_RCV(cep, E_DLT); 378 363 379 /* UDP é信端ç¹ãæªçæã«ããã*/364 /* UDP 通信端点を未生成にする。*/ 380 365 cep->flags &= ~UDP_CEP_FLG_VALID; 381 366 error = E_OK; 382 367 } 383 368 384 /* é信端ç¹ã®ããã¯ã解é¤ããã*/369 /* 通信端点のロックを解除する。*/ 385 370 syscall(sig_sem(cep->semid_lock)); 386 371 … … 389 374 390 375 /* 391 * udp_del_cep -- UDP é信端ç¹ã®åé¤ãæ¡å¼µæ©è½ã376 * udp_del_cep -- UDP 通信端点の削除【拡張機能】 392 377 */ 393 378 … … 397 382 T_UDP_CEP *cep; 398 383 399 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/384 /* UDP 通信端点 ID をチェックする。*/ 400 385 if (!VALID_UDP_CEPID(cepid)) 401 386 return E_ID; 402 387 403 /* UDP é信端ç¹ãå¾ãã*/388 /* UDP 通信端点を得る。*/ 404 389 cep = GET_UDP_CEP(cepid); 405 390 406 /* ã¡ã¤ã³é¢æ°ãå¼ã³åºãã*/391 /* メイン関数を呼び出す。*/ 407 392 return UDP_DELETE_CEP(cep); 408 393 } … … 413 398 414 399 /* 415 * udp_set_option -- UDP é信端ç¹ãªãã·ã§ã³ãè¨å®ããã416 * 417 * udp_set_opt ããå¼åºãããã¡ã¤ã³é¢æ°400 * udp_set_option -- UDP 通信端点オプションを設定する。 401 * 402 * udp_set_opt から呼出されるメイン関数 418 403 */ 419 404 … … 421 406 UDP_SET_OPTION (T_UDP_CEP *cep, int_t optname, void *optval, int_t optlen) 422 407 { 423 /* UDP é信端ç¹ããã§ãã¯ããã*/408 /* UDP 通信端点をチェックする。*/ 424 409 if (!VALID_UDP_CEP(cep)) 425 410 return E_NOEXS; … … 463 448 464 449 /* 465 * udp_set_opt -- UDP é信端ç¹ãªãã·ã§ã³ã®è¨å®ãæ¡å¼µæ©è½ã466 * 467 * 注æ: è¨å®å¯è½ãª UDP é信端ç¹ãªãã·ã§ã³ã¯ç¡ããããE_PAR ãè¿ãããã450 * udp_set_opt -- UDP 通信端点オプションの設定【拡張機能】 451 * 452 * 注意: 設定可能な UDP 通信端点オプションは無いため、E_PAR が返される。 468 453 */ 469 454 … … 473 458 T_UDP_CEP *cep; 474 459 475 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/460 /* UDP 通信端点 ID をチェックする。*/ 476 461 if (!VALID_UDP_CEPID(cepid)) 477 462 return E_ID; 478 463 479 /* UDP é信端ç¹ãå¾ãã*/464 /* UDP 通信端点を得る。*/ 480 465 cep = GET_UDP_CEP(cepid); 481 466 482 /* ã¡ã¤ã³é¢æ°ãå¼ã³åºãã*/467 /* メイン関数を呼び出す。*/ 483 468 return UDP_SET_OPTION(cep, optname, optval, optlen); 484 469 } … … 489 474 490 475 /* 491 * udp_get_option -- UDP é信端ç¹ãªãã·ã§ã³ãç²å¾ããã492 * 493 * udp_get_opt ããå¼åºãããã¡ã¤ã³é¢æ°476 * udp_get_option -- UDP 通信端点オプションを獲得する。 477 * 478 * udp_get_opt から呼出されるメイン関数 494 479 */ 495 480 … … 497 482 UDP_GET_OPTION (T_UDP_CEP *cep, int_t optname, void *optval, int_t optlen) 498 483 { 499 /* UDP é信端ç¹ããã§ãã¯ããã*/484 /* UDP 通信端点をチェックする。*/ 500 485 if (!VALID_UDP_CEP(cep)) 501 486 return E_NOEXS; … … 529 514 530 515 /* 531 * udp_get_opt -- UDP é信端ç¹ãªãã·ã§ã³ã®ç²å¾ãæ¡å¼µæ©è½ã532 * 533 * 注æ: è¨å®å¯è½ãª UDP é信端ç¹ãªãã·ã§ã³ã¯ç¡ããããE_PAR ãè¿ãããã516 * udp_get_opt -- UDP 通信端点オプションの獲得【拡張機能】 517 * 518 * 注意: 設定可能な UDP 通信端点オプションは無いため、E_PAR が返される。 534 519 */ 535 520 … … 539 524 T_UDP_CEP *cep; 540 525 541 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/526 /* UDP 通信端点 ID をチェックする。*/ 542 527 if (!VALID_UDP_CEPID(cepid)) 543 528 return E_ID; 544 529 545 /* UDP é信端ç¹ãå¾ãã*/530 /* UDP 通信端点を得る。*/ 546 531 cep = GET_UDP_CEP(cepid); 547 532 548 /* ã¡ã¤ã³é¢æ°ãå¼ã³åºãã*/533 /* メイン関数を呼び出す。*/ 549 534 return UDP_GET_OPTION(cep, optname, optval, optlen); 550 535 } … … 561 546 562 547 /* 563 * udp_can_snd -- ãã³ãã£ã³ã°ãã¦ããéä¿¡ã®ãã£ã³ã»ã«548 * udp_can_snd -- ペンディングしている送信のキャンセル 564 549 */ 565 550 … … 567 552 UDP_CAN_SND (T_UDP_CEP *cep, ER error) 568 553 { 569 if (cep->snd_tskid != TA_NULL) { /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/554 if (cep->snd_tskid != TA_NULL) { /* 非ノンブロッキングコールでペンディング中 */ 570 555 571 556 #ifdef UDP_CFG_EXTENTIONS 572 557 573 /* å¾ 574 ã¡ä¸ã«çºçããã¨ã©ã¼æ 575 å ±ãè¨å®ããã*/ 558 /* 待ち中に発生したエラー情報を設定する。*/ 576 559 cep->error = error; 577 560 … … 581 564 cep->snd_tskid = TA_NULL; 582 565 } 583 else /* ã©ã¡ãã§ããªããªããã³ãã£ã³ã°ãã¦ããªã*/566 else /* どちらでもないならペンディングしていない */ 584 567 error = EV_NOPND; 585 568 … … 592 575 593 576 /* 594 * udp_can_rcv -- ãã³ãã£ã³ã°ãã¦ããåä¿¡ã®ãã£ã³ã»ã«577 * udp_can_rcv -- ペンディングしている受信のキャンセル 595 578 */ 596 579 … … 598 581 UDP_CAN_RCV (T_UDP_CEP *cep, ER error) 599 582 { 600 if (cep->rcv_tskid != TA_NULL) { /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/583 if (cep->rcv_tskid != TA_NULL) { /* 非ノンブロッキングコールでペンディング中 */ 601 584 602 585 #ifdef UDP_CFG_EXTENTIONS 603 586 604 /* å¾ 605 ã¡ä¸ã«çºçããã¨ã©ã¼æ 606 å ±ãè¨å®ããã*/ 587 /* 待ち中に発生したエラー情報を設定する。*/ 607 588 cep->error = error; 608 589 … … 612 593 cep->rcv_tskid = TA_NULL; 613 594 } 614 else /* ã©ã¡ãã§ããªããªããã³ãã£ã³ã°ãã¦ããªã*/595 else /* どちらでもないならペンディングしていない */ 615 596 error = EV_NOPND; 616 597 … … 623 604 624 605 /* 625 * udp_snd_dat -- ãã±ããã®éä¿¡ãæ¨æºæ©è½ã606 * udp_snd_dat -- パケットの送信【標準機能】 626 607 */ 627 608 … … 632 613 ER error; 633 614 634 /* p_dstaddr ã¾ã㯠data ã NULL ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/615 /* p_dstaddr または data が NULL か、tmout が TMO_NBLK ならエラー */ 635 616 if (p_dstaddr == NULL || data == NULL || tmout == TMO_NBLK) 636 617 return E_PAR; 637 618 638 /* ãã¼ã¿é·ããã§ãã¯ããã*/619 /* データ長をチェックする。*/ 639 620 if (len < 0 || len + IP_HDR_SIZE + UDP_HDR_SIZE > IF_MTU) 640 621 return E_PAR; … … 643 624 644 625 /* 645 * API ã IPv6 㧠IPv4 å°å½±ã¢ãã¬ã¹ãèªãããã¦ããªãã®ã«ããããããã646 * IPv4 å°å½±ã¢ãã¬ã¹ãæå®ããããã¨ã©ã¼626 * API が IPv6 で IPv4 射影アドレスが認められていないのにもかかわらず、 627 * IPv4 射影アドレスが指定されたらエラー 647 628 */ 648 629 if (in6_is_addr_ipv4mapped(&p_dstaddr->ipaddr)) … … 651 632 #endif /* of #if (API_PROTO == API_PROTO_IPV6) && !defined(DAPI_CFG_IP4MAPPED_ADDR) */ 652 633 653 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/634 /* UDP 通信端点 ID をチェックする。*/ 654 635 if (!VALID_UDP_CEPID(cepid)) 655 636 return E_ID; 656 637 657 /* UDP é信端ç¹ãå¾ãã*/638 /* UDP 通信端点を得る。*/ 658 639 cep = GET_UDP_CEP(cepid); 659 640 660 /* UDP é信端ç¹ããã§ãã¯ããã*/641 /* UDP 通信端点をチェックする。*/ 661 642 if (!VALID_UDP_CEP(cep)) 662 643 return E_NOEXS; 663 644 664 645 /* 665 * èªãã¼ãçªå·ã UDP_PORTANY ãªããèªåã§å²ãå½ã¦ãã646 * 自ポート番号が UDP_PORTANY なら、自動で割り当てる。 666 647 */ 667 648 if (cep->myaddr.portno == UDP_PORTANY) { … … 670 651 } 671 652 672 /* é信端ç¹ãããã¯ããã*/653 /* 通信端点をロックする。*/ 673 654 syscall(wai_sem(cep->semid_lock)); 674 655 675 656 if (cep->snd_tskid != TA_NULL) { 676 657 677 /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/658 /* 非ノンブロッキングコールでペンディング中 */ 678 659 error = E_QOVR; 679 660 680 /* é信端ç¹ãããã¯ã解é¤ããã*/661 /* 通信端点をロックを解除する。*/ 681 662 syscall(sig_sem(cep->semid_lock)); 682 663 } 683 664 else { 684 /* ç¾å¨ã®ã¿ã¹ã¯èå¥åãè¨é²ããã*/665 /* 現在のタスク識別子を記録する。*/ 685 666 get_tid(&(cep->snd_tskid)); 686 667 687 668 #ifdef UDP_CFG_EXTENTIONS 688 669 689 /* å¾ 690 ã¡ä¸ã«çºçããã¨ã©ã¼æ 691 å ±ããªã»ããããã*/ 670 /* 待ち中に発生したエラー情報をリセットする。*/ 692 671 cep->error = E_OK; 693 672 694 673 #endif /* of #ifdef UDP_CFG_EXTENTIONS */ 695 674 696 /* é信端ç¹ãããã¯ã解é¤ããã*/675 /* 通信端点をロックを解除する。*/ 697 676 syscall(sig_sem(cep->semid_lock)); 698 677 699 /* ãã±ãããéä¿¡ããã*/678 /* パケットを送信する。*/ 700 679 error = UDP_SEND_DATA(cep, p_dstaddr, data, len, tmout); 701 680 702 681 #ifdef UDP_CFG_EXTENTIONS 703 682 704 /* å¾ 705 ã¡ä¸ã«çºçããã¨ã©ã¼æ 706 å ±ãè¿ãã*/ 683 /* 待ち中に発生したエラー情報を返す。*/ 707 684 if (error == E_RLWAI) 708 685 error = cep->error; … … 719 696 720 697 /* 721 * udp_rcv_dat -- ãã±ããã®åä¿¡ãæ¨æºæ©è½ã698 * udp_rcv_dat -- パケットの受信【標準機能】 722 699 */ 723 700 … … 731 708 uint_t ulen, uhoff; 732 709 733 /* p_dstaddr ã¾ã㯠data ã NULL ãlen < 0 ããtmout ã TMO_NBLK ãªãã¨ã©ã¼*/710 /* p_dstaddr または data が NULL 、len < 0 か、tmout が TMO_NBLK ならエラー */ 734 711 if (p_dstaddr == NULL || data == NULL || len < 0 || tmout == TMO_NBLK) 735 712 return E_PAR; 736 713 737 /* UDP éä¿¡ç«¯ç¹ ID ããã§ãã¯ããã*/714 /* UDP 通信端点 ID をチェックする。*/ 738 715 if (!VALID_UDP_CEPID(cepid)) 739 716 return E_ID; 740 717 741 /* UDP é信端ç¹ãå¾ãã*/718 /* UDP 通信端点を得る。*/ 742 719 cep = GET_UDP_CEP(cepid); 743 720 744 /* UDP é信端ç¹ããã§ãã¯ããã*/721 /* UDP 通信端点をチェックする。*/ 745 722 if (!VALID_UDP_CEP(cep)) 746 723 return E_NOEXS; 747 724 748 /* é信端ç¹ãããã¯ããã*/725 /* 通信端点をロックする。*/ 749 726 syscall(wai_sem(cep->semid_lock)); 750 727 751 728 if (cep->rcv_tskid != TA_NULL) { 752 729 753 /* éãã³ããããã³ã°ã³ã¼ã«ã§ãã³ãã£ã³ã°ä¸*/730 /* 非ノンブロッキングコールでペンディング中 */ 754 731 error = E_QOVR; 755 732 756 /* é信端ç¹ãããã¯ã解é¤ããã*/733 /* 通信端点をロックを解除する。*/ 757 734 syscall(sig_sem(cep->semid_lock)); 758 735 } 759 736 else { 760 737 761 /* ç¾å¨ã®ã¿ã¹ã¯èå¥åãè¨é²ããã*/738 /* 現在のタスク識別子を記録する。*/ 762 739 get_tid(&(cep->rcv_tskid)); 763 740 764 741 #ifdef UDP_CFG_EXTENTIONS 765 742 766 /* å¾ 767 ã¡ä¸ã«çºçããã¨ã©ã¼æ 768 å ±ããªã»ããããã*/ 743 /* 待ち中に発生したエラー情報をリセットする。*/ 769 744 cep->error = E_OK; 770 745 771 746 #endif /* of #ifdef UDP_CFG_EXTENTIONS */ 772 747 773 /* é信端ç¹ãããã¯ã解é¤ããã*/748 /* 通信端点をロックを解除する。*/ 774 749 syscall(sig_sem(cep->semid_lock)); 775 750 776 /* å 777 ¥åãããã¾ã§å¾ 778 ã¤ã*/ 751 /* 入力があるまで待つ。*/ 779 752 if (cep->cb_netbuf != NULL) { 780 753 781 754 /* 782 * ããã«ããå ´åã¯ãã³ã¼ã«ããã¯é¢æ°ã®ä¸ãã 783 * udp_rcv_dat ãå¼ã³åºãã¦ãããã¨ã«ãªãã 784 * ãã§ã«å 785 ¥åæ¸ã¿ã§ããã 755 * ここにくる場合は、コールバック関数の中から 756 * udp_rcv_dat を呼び出していることになり、 757 * すでに入力済みである。 786 758 */ 787 759 input = cep->cb_netbuf; … … 792 764 #ifdef UDP_CFG_EXTENTIONS 793 765 794 /* å¾ 795 ã¡ä¸ã«çºçããã¨ã©ã¼æ 796 å ±ãè¿ãã*/ 766 /* 待ち中に発生したエラー情報を返す。*/ 797 767 if (error == E_RLWAI) 798 768 error = cep->error; … … 804 774 } 805 775 806 /* p_dstaddr ãè¨å®ããã*/776 /* p_dstaddr を設定する。*/ 807 777 uhoff = (uint_t)GET_UDP_HDR_OFFSET(input); 808 778 udph = GET_UDP_HDR(input, uhoff); … … 810 780 IN_COPY_TO_HOST(&p_dstaddr->ipaddr, input); 811 781 812 /* ãã¼ã¿ããããã¡ã«ç§»ãã*/782 /* データをバッファに移す。*/ 813 783 ulen = ntohs(udph->ulen); 814 784 if (ulen - UDP_HDR_SIZE > len)
Note:
See TracChangeset
for help on using the changeset viewer.