Changeset 389 for azure_iot_hub/trunk/ntshell/echonet/echonet_udp6_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_udp6_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 #if 0 //def SUPPORT_INET6 … … 115 100 116 101 /* 117 * åä¿¡ããUDPãã¼ã¿ãMAILBOXã«éã102 * 受信したUDPデータをMAILBOXに送る 118 103 */ 119 104 ER _ecn_udp2dtq(const uint8_t *buffer, size_t fa_len, const T_IPV6EP *dst); … … 130 115 131 116 a_rcv_pkt.buffer = buffer; 132 if ( a_rcv_pkt.t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite è¦æ ¼*/133 || a_rcv_pkt.t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* é»æå½¢å¼1 */) {117 if ( a_rcv_pkt.t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite規格 */ 118 || a_rcv_pkt.t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* 電文形式1 */) { 134 119 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); 135 120 return E_PAR; … … 154 139 a_fbs_id.ptr->hdr.sender.id = ENOD_NOT_MATCH_ID; 155 140 156 /* IP ã¢ãã¬ã¹ãããªã¢ã¼ãECHONETãã¼ãã¸å¤æ*/141 /* IPアドレスからリモートECHONETノードへ変換 */ 157 142 a_enod_id = udp_get_id((T_EDATA *)a_fbs_id.ptr, dst->ipaddr, dst->portno); 158 143 if (a_enod_id < 0 || tnum_enodadr <= a_enod_id) { … … 160 145 ipv62str(NULL, &dst->ipaddr)); 161 146 } else { 162 /* éä¿¡å 163 ECHONETãã¼ããè¨é² */ 147 /* 送信元ECHONETノードを記録 */ 164 148 a_fbs_id.ptr->hdr.sender.id = a_enod_id; 165 149 } 166 150 a_fbs_id.ptr->hdr.reply.id = a_fbs_id.ptr->hdr.sender.id; 167 151 168 /* echonet_task ã«éã*/152 /* echonet_taskに送る */ 169 153 a_ret = snd_dtq(ecn_svc_dataqueueid, (intptr_t)a_fbs_id.ptr); 170 154 if (a_ret != E_OK) { … … 179 163 180 164 /* 181 * ECHONET UDP éä¿¡å¦çã¿ã¹ã¯165 * ECHONET UDP通信処理タスク 182 166 */ 183 167 void echonet_udp_task(intptr_t exinf) … … 211 195 } 212 196 213 /* ã¡ãã»ã¼ã¸ã«ã¼ã*/197 /* メッセージループ */ 214 198 for (;;) { 215 199 a_prev = a_now; … … 233 217 234 218 if (a_ret == E_OK) { 235 /* éä¿¡ãã¼ã¿é·ãåå¾*/219 /* 送信データ長を取得 */ 236 220 a_snd_len = _ecn_fbs_get_datalen(a_mdt.fbs_id); 237 221 … … 256 240 } 257 241 258 /* å¿çé»æç¨fbsè¨å®(sender/targetã®è¨å®) */242 /* 応答電文用fbs設定(sender/targetの設定) */ 259 243 static ER _ecn_udp_cre_req_fbs(ID sender, uint8_t cmd, ECN_FBS_ID *pk_req) 260 244 { … … 285 269 } 286 270 287 /* å¿çé»æç¨fbsè¨å®(sender/targetã®è¨å®) */271 /* 応答電文用fbs設定(sender/targetの設定) */ 288 272 static ER _ecn_udp_cre_res_fbs(ECN_FBS_ID req, uint8_t cmd, ECN_FBS_ID *pk_res) 289 273 { … … 315 299 316 300 /* 317 * å 318 é¨ã¡ãã»ã¼ã¸åä¿¡å¦ç 301 * 内部メッセージ受信処理 319 302 */ 320 303 void _ecn_int_msg(ECN_FBS_ID fbs_id, ECN_FBS_SSIZE_T a_snd_len) … … 334 317 335 318 switch(cmd){ 336 // IP ã¢ãã¬ã¹ãè¿ä¿¡319 // IPアドレスを返信 337 320 case ECN_UDP_MSG_GET_IPADDR_REQ: 338 321 if (a_snd_len < sizeof(msg)) { … … 403 386 404 387 /* 405 * ECHONET é»æåä¿¡å¦ç388 * ECHONET 電文受信処理 406 389 */ 407 390 void _ecn_esv_msg(ECN_FBS_ID fbs_id) 408 391 { 409 392 const static T_IN6_ADDR locl = IPV6_ADDR_LOCAL_LOOPBACK_INIT; 410 /* UDP åºåé åï¼æ«å®ï¼*/393 /* UDP出力領域(暫定) */ 411 394 static uint_t buffer[(ETHER_MAX_LEN) / sizeof(uint_t) + 1]; 412 395 T_IPV6EP a_dst; … … 416 399 memset(&a_dst.ipaddr, 0, sizeof(a_dst.ipaddr)); 417 400 a_dst.portno = 0; 418 /* éä¿¡å 419 IPã¢ãã¬ã¹ */ 401 /* 送信先IPアドレス */ 420 402 a_ret = udp_get_ip(&a_dst, fbs_id.ptr->hdr.target.id); 421 403 if (!a_ret) { 422 ECN_DBG_PUT_4("[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X âudp dest(%s)",404 ECN_DBG_PUT_4("[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X → udp dest(%s)", 423 405 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx1, 424 406 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx2, … … 426 408 ipv62str(NULL, &a_dst.ipaddr)); 427 409 428 /* fbs ããåºåé åã«ãã¼ã¿ãæ½åº*/410 /* fbsから出力領域にデータを抽出 */ 429 411 a_snd_len = 0; 430 412 a_ret = _ecn_fbs_get_data(fbs_id, buffer, sizeof(buffer), &a_snd_len); … … 433 415 } 434 416 else if (memcmp(&a_dst.ipaddr, &locl, sizeof(a_dst.ipaddr)) == 0) { 435 /* éä¿¡å 436 ã127.0.0.1 â dtqã«è»¢é */ 437 ECN_DBG_PUT_1("redirect ecn_udp_dataqueueid â ecn_svc_dataqueueid (esv:0x%02X)", 417 /* 送信先が127.0.0.1 → dtqに転送 */ 418 ECN_DBG_PUT_1("redirect ecn_udp_dataqueueid → ecn_svc_dataqueueid (esv:0x%02X)", 438 419 ((T_EDATA *)fbs_id.ptr)->hdr.edata.esv); 439 420 … … 449 430 _ecn_dbg_bindmp((const uint8_t *)buffer, a_snd_len); 450 431 #endif 451 /* UDP éä¿¡*/432 /* UDP送信 */ 452 433 a_ret = udp6_snd_dat(ecn_udp_cepid, &a_dst, buffer, a_snd_len, TMO_FEVR); 453 434 if (a_ret < 0) { … … 456 437 } 457 438 458 /* ãã¼ã¿ãé·ããã¦1ãã±ããã«åã¾ããªãã£ãå ´å*/439 /* データが長すぎて1パケットに収まらなかった場合 */ 459 440 if (_ecn_fbs_exist_data(fbs_id)) { 460 441 ECN_DBG_PUT_1("[UDP TSK] send, data so long: %dbyte(s)", _ecn_fbs_get_datalen(fbs_id)); … … 469 450 470 451 /* 471 * ãã³ããããã³ã°ã³ã¼ã«ã®ã³ã¼ã«ããã¯é¢æ°452 * ノンブロッキングコールのコールバック関数 472 453 */ 473 454 ER callback_nblk_udp(ID cepid, FN fncd, void *p_parblk) … … 490 471 } 491 472 #ifdef _MSC_VER 492 /* ( éçºç¨) ECHONETç¨ãã±ãã以å¤ã¯èªã¿æ¨ã¦ã*/473 /* (開発用) ECHONET用パケット以外は読み捨てる */ 493 474 if (buffer[0] != 0x10 || buffer[1] != 0x81) { 494 475 return E_OK; … … 524 505 525 506 /* 526 * ãªã¢ã¼ãECHONETãã¼ãã®é©å確èª507 * リモートECHONETノードの適合確認 527 508 */ 528 509 bool_t is_match(const EOBJCB *enodcb, T_EDATA *edata, const void *_ipaddr, uint16_t portno) … … 542 523 return false; 543 524 544 /* ãã¼ãã¹ã¿ã¼ãæã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ä»¥å¤ã¯é¤å¤*/525 /* ノードスタート時インスタンスリスト通知以外は除外 */ 545 526 if ( edata->hdr.edata.esv != ESV_INF 546 527 || edata->hdr.edata.deoj.eojx1 != EOJ_X1_PROFILE … … 564 545 } 565 546 ECN_DBG_PUT_2("is_match(): ecn_itr_nxt() result: epc=0x%02X, pdc=%d", epc, pdc); 566 /* ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ã¾ãã¯èªãã¼ãã¤ã³ã¹ã¿ã³ã¹ãªã¹ãS以å¤ã¯é¤å¤*/547 /* インスタンスリスト通知または自ノードインスタンスリストS以外は除外 */ 567 548 if ((epc != 0xD5) && (epc != 0xD6)) { 568 549 continue; 569 550 } 570 551 571 /* ï¼ãã¤ãç®ä»¥éã«eojãåæããã¦ãã*/552 /* 2バイト目以降にeojが列挙されている */ 572 553 count = (pdc - 1) / sizeof(T_ECN_EOJ); 573 554 574 /* ãã¼ãå 575 ã®æ©å¨ãªãã¸ã§ã¯ããæ¤ç´¢ */ 555 /* ノード内の機器オブジェクトを検索 */ 576 556 for (k = 0; k < enodcb->eobjcnt; k++) { 577 557 p_eobj = enodcb->eobjs[k]; 578 558 579 /* ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãã確èª*/559 /* インスタンスリストを確認 */ 580 560 match = false; 581 561 for (i = 0, j = 1; i < count; i++, j += sizeof(T_ECN_EOJ)) { … … 595 575 } 596 576 597 /* ãã¹ã¦æã£ã¦ãããé©åï¼ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãã®æ¹ãå¤ãã¦ããããã¨ã¨ããï¼*/577 /* すべて揃っていたら適合(インスタンスリストの方が多くてもいいこととする) */ 598 578 return true; 599 579 } … … 603 583 604 584 /* 605 * IP ã¢ãã¬ã¹ãããªã¢ã¼ãECHONETãã¼ãã¸å¤æ585 * IPアドレスからリモートECHONETノードへ変換 606 586 */ 607 587 ECN_ENOD_ID udp_get_id(T_EDATA *edata, const T_IN6_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) … … 645 625 continue; 646 626 647 /* 対å¿ãããªã¢ã¼ããã¼ããããã°IPã¢ãã¬ã¹ãè¨å®*/627 /* 対応するリモートノードがあればIPアドレスを設定 */ 648 628 memcpy(&ea->ipaddr, &ipaddr, sizeof(T_IN6_ADDR)); 649 629 … … 653 633 } 654 634 655 /* 空ãé åãæ¢ãã¦èªåç»é²*/635 /* 空き領域を探して自動登録 */ 656 636 for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) { 657 637 if (ea->inuse) … … 670 650 671 651 /* 672 * ãªã¢ã¼ãECHONETãã¼ãããIPã¢ãã¬ã¹ã¸å¤æ652 * リモートECHONETノードからIPアドレスへ変換 673 653 */ 674 654 int udp_get_ip(T_IPV6EP *fp_ipep, ECN_ENOD_ID fa_enodid) … … 684 664 685 665 if (fa_enodid == ENOD_MULTICAST_ID) { 686 /* target ãENOD_MULTICAST_IDã®å ´åããã«ããã£ã¹ããè¡ã*/666 /* targetがENOD_MULTICAST_IDの場合、マルチキャストを行う */ 687 667 memcpy(&fp_ipep->ipaddr, &mcst, sizeof(T_IN6_ADDR)); 688 668 return 0; /* ok */ … … 690 670 691 671 if (fa_enodid < ENOD_REMOTE_ID) { 692 /* targetãæªå®ç¾©ã»LOCALã»APIã®å ´åããã¼ã«ã«é 693 éãè¡ã */ 672 /* targetが未定義・LOCAL・APIの場合、ローカル配送を行う */ 694 673 memcpy(&fp_ipep->ipaddr, &locl, sizeof(T_IN6_ADDR)); 695 674 return 0; /* ok */
Note:
See TracChangeset
for help on using the changeset viewer.