Changeset 389 for azure_iot_hub/trunk/ntshell/echonet/echonet_udp_task.c
- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/ntshell/echonet/echonet_udp_task.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r388 r389 4 4 * Copyright (C) 2014 Cores Co., Ltd. Japan 5 5 * 6 * ä¸è¨èä½æ¨©è 7 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 8 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 9 * å¤ã»åé 10 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 11 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 12 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 13 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 14 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 15 * ç¨ã§ããå½¢ã§åé 16 å¸ããå ´åã«ã¯ï¼åé 17 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 18 * è 19 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 20 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 21 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 22 * ç¨ã§ããªãå½¢ã§åé 23 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 24 * ã¨ï¼ 25 * (a) åé 26 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 27 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 28 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 29 * (b) åé 30 å¸ã®å½¢æ 31 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 32 * å ±åãããã¨ï¼ 33 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 34 * 害ãããï¼ä¸è¨èä½æ¨©è 35 ããã³TOPPERSããã¸ã§ã¯ããå 36 責ãããã¨ï¼ 37 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 38 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 39 ããã³TOPPERSããã¸ã§ã¯ãã 40 * å 41 責ãããã¨ï¼ 6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 11 * スコード中に含まれていること. 12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 15 * の無保証規定を掲載すること. 16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 18 * と. 19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 20 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 22 * 報告すること. 23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 27 * 免責すること. 42 28 * 43 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 44 ã 45 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 46 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 47 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 48 * ã®è²¬ä»»ãè² ããªãï¼ 29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 33 * の責任を負わない. 49 34 * 50 35 * @(#) $Id$ … … 52 37 53 38 /* 54 * ECHONET Lite UDP éä¿¡å¦çã¿ã¹ã¯39 * ECHONET Lite UDP通信処理タスク 55 40 */ 56 41 #ifdef SUPPORT_INET4 … … 110 95 111 96 /* 112 * åä¿¡ããUDPãã¼ã¿ãMAILBOXã«éã97 * 受信したUDPデータをMAILBOXに送る 113 98 */ 114 99 ER _ecn_udp2dtq(const uint8_t *buffer, size_t fa_len, const T_IPV4EP *dst); … … 125 110 126 111 a_rcv_pkt.buffer = buffer; 127 if ( a_rcv_pkt.t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite è¦æ ¼*/128 || a_rcv_pkt.t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* é»æå½¢å¼1 */) {112 if ( a_rcv_pkt.t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite規格 */ 113 || a_rcv_pkt.t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* 電文形式1 */) { 129 114 ECN_DBG_PUT_2("[UDP ECHO SRV] illegal type (0x%02X,0x%02X)", a_rcv_pkt.t_esv->ecn_hdr.ehd1, a_rcv_pkt.t_esv->ecn_hdr.ehd2); 130 115 return E_PAR; … … 149 134 a_fbs_id.ptr->hdr.sender.id = ENOD_NOT_MATCH_ID; 150 135 151 /* IP ã¢ãã¬ã¹ãããªã¢ã¼ãECHONETãã¼ãã¸å¤æ*/136 /* IPアドレスからリモートECHONETノードへ変換 */ 152 137 a_enod_id = udp_get_id((T_EDATA *)a_fbs_id.ptr, dst->ipaddr, dst->portno); 153 138 if (a_enod_id < 0 || tnum_enodadr <= a_enod_id) { … … 155 140 ip2str(NULL, &dst->ipaddr)); 156 141 } else { 157 /* éä¿¡å 158 ECHONETãã¼ããè¨é² */ 142 /* 送信元ECHONETノードを記録 */ 159 143 a_fbs_id.ptr->hdr.sender.id = a_enod_id; 160 144 } 161 145 a_fbs_id.ptr->hdr.reply.id = a_fbs_id.ptr->hdr.sender.id; 162 146 163 /* echonet_task ã«éã*/147 /* echonet_taskに送る */ 164 148 a_ret = snd_dtq(ecn_svc_dataqueueid, (intptr_t)a_fbs_id.ptr); 165 149 if (a_ret != E_OK) { … … 174 158 175 159 /* 176 * ECHONET UDP éä¿¡å¦çã¿ã¹ã¯160 * ECHONET UDP通信処理タスク 177 161 */ 178 162 void echonet_udp_task(intptr_t exinf) … … 216 200 } 217 201 218 /* ã¡ãã»ã¼ã¸ã«ã¼ã*/202 /* メッセージループ */ 219 203 for (;;) { 220 204 a_prev = a_now; … … 238 222 239 223 if (a_ret == E_OK) { 240 /* éä¿¡ãã¼ã¿é·ãåå¾*/224 /* 送信データ長を取得 */ 241 225 a_snd_len = _ecn_fbs_get_datalen(a_mdt.fbs_id); 242 226 … … 261 245 } 262 246 263 /* å¿çé»æç¨fbsè¨å®(sender/targetã®è¨å®) */247 /* 応答電文用fbs設定(sender/targetの設定) */ 264 248 static ER _ecn_udp_cre_req_fbs(ID sender, uint8_t cmd, ECN_FBS_ID *pk_req) 265 249 { … … 290 274 } 291 275 292 /* å¿çé»æç¨fbsè¨å®(sender/targetã®è¨å®) */276 /* 応答電文用fbs設定(sender/targetの設定) */ 293 277 static ER _ecn_udp_cre_res_fbs(ECN_FBS_ID req, uint8_t cmd, ECN_FBS_ID *pk_res) 294 278 { … … 320 304 321 305 /* 322 * å 323 é¨ã¡ãã»ã¼ã¸åä¿¡å¦ç 306 * 内部メッセージ受信処理 324 307 */ 325 308 void _ecn_int_msg(ECN_FBS_ID fbs_id, ECN_FBS_SSIZE_T a_snd_len) … … 339 322 340 323 switch(cmd){ 341 // IP ã¢ãã¬ã¹ãè¿ä¿¡324 // IPアドレスを返信 342 325 case ECN_UDP_MSG_GET_IPADDR_REQ: 343 326 if (a_snd_len < sizeof(msg)) { … … 408 391 409 392 /* 410 * ECHONET é»æåä¿¡å¦ç393 * ECHONET 電文受信処理 411 394 */ 412 395 void _ecn_esv_msg(ECN_FBS_ID fbs_id) 413 396 { 414 /* UDP åºåé åï¼æ«å®ï¼*/397 /* UDP出力領域(暫定) */ 415 398 static uint_t buffer[(ETHER_MAX_LEN) / sizeof(uint_t) + 1]; 416 399 T_IPV4EP a_dst; … … 420 403 a_dst.ipaddr = 0; 421 404 a_dst.portno = 0; 422 /* éä¿¡å 423 IPã¢ãã¬ã¹ */ 405 /* 送信先IPアドレス */ 424 406 a_ret = udp_get_ip(&a_dst, fbs_id.ptr->hdr.target.id); 425 407 if (!a_ret) { 426 ECN_DBG_PUT_4("[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X âudp dest(%s)",408 ECN_DBG_PUT_4("[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X → udp dest(%s)", 427 409 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx1, 428 410 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx2, … … 430 412 ip2str(NULL, &a_dst.ipaddr)); 431 413 432 /* fbs ããåºåé åã«ãã¼ã¿ãæ½åº*/414 /* fbsから出力領域にデータを抽出 */ 433 415 a_snd_len = 0; 434 416 a_ret = _ecn_fbs_get_data(fbs_id, buffer, sizeof(buffer), &a_snd_len); … … 437 419 } 438 420 else if (a_dst.ipaddr == MAKE_IPV4_ADDR(127,0,0,1)) { 439 /* éä¿¡å 440 ã127.0.0.1 â dtqã«è»¢é */ 441 ECN_DBG_PUT_1("redirect ecn_udp_dataqueueid â ecn_svc_dataqueueid (esv:0x%02X)", 421 /* 送信先が127.0.0.1 → dtqに転送 */ 422 ECN_DBG_PUT_1("redirect ecn_udp_dataqueueid → ecn_svc_dataqueueid (esv:0x%02X)", 442 423 ((T_EDATA *)fbs_id.ptr)->hdr.edata.esv); 443 424 … … 453 434 _ecn_dbg_bindmp((const uint8_t *)buffer, a_snd_len); 454 435 #endif 455 /* UDP éä¿¡*/436 /* UDP送信 */ 456 437 a_ret = udp_snd_dat(ecn_udp_cepid, &a_dst, buffer, a_snd_len, TMO_FEVR); 457 438 if (a_ret < 0) { … … 460 441 } 461 442 462 /* ãã¼ã¿ãé·ããã¦1ãã±ããã«åã¾ããªãã£ãå ´å*/443 /* データが長すぎて1パケットに収まらなかった場合 */ 463 444 if (_ecn_fbs_exist_data(fbs_id)) { 464 445 ECN_DBG_PUT_1("[UDP TSK] send, data so long: %dbyte(s)", _ecn_fbs_get_datalen(fbs_id)); … … 473 454 474 455 /* 475 * ãã³ããããã³ã°ã³ã¼ã«ã®ã³ã¼ã«ããã¯é¢æ°456 * ノンブロッキングコールのコールバック関数 476 457 */ 477 458 ER callback_nblk_udp(ID cepid, FN fncd, void *p_parblk) … … 494 475 } 495 476 #ifdef _MSC_VER 496 /* ( éçºç¨) ECHONETç¨ãã±ãã以å¤ã¯èªã¿æ¨ã¦ã*/477 /* (開発用) ECHONET用パケット以外は読み捨てる */ 497 478 if (buffer[0] != 0x10 || buffer[1] != 0x81) { 498 479 return E_OK; … … 528 509 529 510 /* 530 * ãªã¢ã¼ãECHONETãã¼ãã®é©å確èª511 * リモートECHONETノードの適合確認 531 512 */ 532 513 bool_t is_match(const EOBJCB *enodcb, T_EDATA *edata, const void *_ipaddr, uint16_t portno) … … 546 527 return false; 547 528 548 /* ãã¼ãã¹ã¿ã¼ãæã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ä»¥å¤ã¯é¤å¤*/529 /* ノードスタート時インスタンスリスト通知以外は除外 */ 549 530 if ( edata->hdr.edata.esv != ESV_INF 550 531 || edata->hdr.edata.deoj.eojx1 != EOJ_X1_PROFILE … … 568 549 } 569 550 ECN_DBG_PUT_2("is_match(): ecn_itr_nxt() result: epc=0x%02X, pdc=%d", epc, pdc); 570 /* ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ã¾ãã¯èªãã¼ãã¤ã³ã¹ã¿ã³ã¹ãªã¹ãS以å¤ã¯é¤å¤*/551 /* インスタンスリスト通知または自ノードインスタンスリストS以外は除外 */ 571 552 if ((epc != 0xD5) && (epc != 0xD6)) { 572 553 continue; 573 554 } 574 555 575 /* ï¼ãã¤ãç®ä»¥éã«eojãåæããã¦ãã*/556 /* 2バイト目以降にeojが列挙されている */ 576 557 count = (pdc - 1) / sizeof(T_ECN_EOJ); 577 558 578 /* ãã¼ãå 579 ã®æ©å¨ãªãã¸ã§ã¯ããæ¤ç´¢ */ 559 /* ノード内の機器オブジェクトを検索 */ 580 560 for (k = 0; k < enodcb->eobjcnt; k++) { 581 561 p_eobj = enodcb->eobjs[k]; 582 562 583 /* ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãã確èª*/563 /* インスタンスリストを確認 */ 584 564 match = false; 585 565 for (i = 0, j = 1; i < count; i++, j += sizeof(T_ECN_EOJ)) { … … 599 579 } 600 580 601 /* ãã¹ã¦æã£ã¦ãããé©åï¼ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãã®æ¹ãå¤ãã¦ããããã¨ã¨ããï¼*/581 /* すべて揃っていたら適合(インスタンスリストの方が多くてもいいこととする) */ 602 582 return true; 603 583 } … … 607 587 608 588 /* 609 * IP ã¢ãã¬ã¹ãããªã¢ã¼ãECHONETãã¼ãã¸å¤æ589 * IPアドレスからリモートECHONETノードへ変換 610 590 */ 611 591 ECN_ENOD_ID udp_get_id(T_EDATA *edata, const T_IN4_ADDR ipaddr, uint16_t portno) … … 619 599 return ENOD_MULTICAST_ID; 620 600 621 /* IP ã¢ãã¬ã¹ã®åããã®ãæ¤ç´¢*/601 /* IPアドレスの同じものを検索 */ 622 602 for (i = 0, ea = enodadrb_table; i < tnum_enodadr; i++, ea++) { 623 603 if (!ea->inuse) … … 631 611 } 632 612 633 /* 対å¿ãããªã¢ã¼ããã¼ããæ¤ç´¢*/613 /* 対応するリモートノードを検索 */ 634 614 for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) { 635 615 if (!ea->inuse) … … 642 622 continue; 643 623 644 /* 対å¿ãããªã¢ã¼ããã¼ããããã°IPã¢ãã¬ã¹ãè¨å®*/624 /* 対応するリモートノードがあればIPアドレスを設定 */ 645 625 *((T_IN4_ADDR *)ea->ipaddr) = ipaddr; 646 626 … … 650 630 } 651 631 652 /* 空ãé åãæ¢ãã¦èªåç»é²*/632 /* 空き領域を探して自動登録 */ 653 633 for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) { 654 634 if (ea->inuse) … … 667 647 668 648 /* 669 * ãªã¢ã¼ãECHONETãã¼ãããIPã¢ãã¬ã¹ã¸å¤æ649 * リモートECHONETノードからIPアドレスへ変換 670 650 */ 671 651 int udp_get_ip(T_IPV4EP *fp_ipep, ECN_ENOD_ID fa_enodid) … … 679 659 680 660 if (fa_enodid == ENOD_MULTICAST_ID) { 681 /* target ãENOD_MULTICAST_IDã®å ´åããã«ããã£ã¹ããè¡ã*/661 /* targetがENOD_MULTICAST_IDの場合、マルチキャストを行う */ 682 662 fp_ipep->ipaddr = MAKE_IPV4_ADDR(224,0,23,0); 683 663 return 0; /* ok */ … … 685 665 686 666 if (fa_enodid < ENOD_REMOTE_ID) { 687 /* targetãæªå®ç¾©ã»LOCALã»APIã®å ´åããã¼ã«ã«é 688 éãè¡ã */ 667 /* targetが未定義・LOCAL・APIの場合、ローカル配送を行う */ 689 668 fp_ipep->ipaddr = MAKE_IPV4_ADDR(127,0,0,1); 690 669 return 0; /* ok */
Note:
See TracChangeset
for help on using the changeset viewer.