Changeset 167 for UsbWattMeter/trunk/ecnl_lwip/echonet_udp_task.c
- Timestamp:
- Mar 8, 2016, 8:37:45 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
UsbWattMeter/trunk/ecnl_lwip/echonet_udp_task.c
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=SHIFT_JIS
r164 r167 4 4 * Copyright (C) 2014-2016 Cores Co., Ltd. Japan 5 5 * 6 * ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 7 * Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 8 * ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 9 * (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 10 * \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[ 11 * XR[hÉÜÜêĢ鱯D 12 * (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 13 * pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 14 gip 15 * Ò}j 16 AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL 17 * Ì³ÛØKèðfÚ·é±ÆD 18 * (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 19 * pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 20 * ÆD 21 * (a) Äzzɺ¤hL 22 gipÒ}j 23 AÈÇjÉCãLÌ 24 * ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD 25 * (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 26 * ñ·é±ÆD 27 * (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 28 * Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 29 * ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 30 * RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 31 * ÆÓ·é±ÆD 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 * 免責すること. 32 28 * 33 * {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨34 * æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI35 * ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF36 * AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»37 * ÌÓCðíÈ¢D29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 33 * の責任を負わない. 38 34 * 39 35 * @(#) $Id$ … … 41 37 42 38 /* 43 * ECHONET Lite UDP ÊM^XN39 * ECHONET Lite UDP通信処理タスク 44 40 */ 45 41 #ifdef SUPPORT_INET4 … … 107 103 108 104 /* 109 * óMµ½UDPf[^ðMAILBOXÉé105 * 受信したUDPデータをMAILBOXに送る 110 106 */ 111 107 ER _ecn_udp2mbx(ECN_FBS_ID fbs_id, const T_IPV4EP *dst); … … 117 113 118 114 t_esv = (const T_ECN_EDT_HDR *)fbs_id.ptr->payload; 119 if (t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite Ki*/120 || t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* d¶`®1 */) {115 if (t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite規格 */ 116 || t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* 電文形式1 */) { 121 117 ECN_DBG_PUT("[UDP ECHO SRV] illegal type (0x%02X,0x%02X)", t_esv->ecn_hdr.ehd1, t_esv->ecn_hdr.ehd2); 122 118 return E_PAR; … … 131 127 fbs_id.ptr->hdr.sender.id = ENOD_NOT_MATCH_ID; 132 128 133 /* IP AhX©ç[gECHONETm[hÖÏ·*/129 /* IPアドレスからリモートECHONETノードへ変換 */ 134 130 a_enod_id = udp_get_id((T_EDATA *)fbs_id.ptr, &dst->ipaddr, dst->portno); 135 131 if (a_enod_id < 0 || tnum_enodadr <= a_enod_id) { … … 138 134 } 139 135 else { 140 /* M³ECHONETm[hðL^*/136 /* 送信元ECHONETノードを記録 */ 141 137 fbs_id.ptr->hdr.sender.id = a_enod_id; 142 138 } 143 139 fbs_id.ptr->hdr.reply.id = fbs_id.ptr->hdr.sender.id; 144 140 145 /* echonet_task Éé*/141 /* echonet_taskに送る */ 146 142 a_ret = snd_mbx(ecn_svc_mailboxid, (T_MSG *)fbs_id.ptr); 147 143 if (a_ret != E_OK) { … … 156 152 157 153 /* 158 * ECHONET UDP ÊM^XN154 * ECHONET UDP通信処理タスク 159 155 */ 160 156 void echonet_udp_task(intptr_t exinf) … … 215 211 } 216 212 217 /* bZ[W[v*/213 /* メッセージループ */ 218 214 for (;;) { 219 215 a_prev = a_now; … … 237 233 238 234 if (a_ret == E_OK) { 239 /* Mf[^·ðæ¾*/235 /* 送信データ長を取得 */ 240 236 a_snd_len = _ecn_fbs_get_datalen(a_mdt.fbs_id); 241 237 … … 260 256 } 261 257 262 /* d¶pfbsÝè(sender/targetÌÝè) */258 /* 応答電文用fbs設定(sender/targetの設定) */ 263 259 static ER _ecn_udp_cre_req_fbs(ID sender, uint8_t cmd, ECN_FBS_ID *pk_req) 264 260 { … … 289 285 } 290 286 291 /* d¶pfbsÝè(sender/targetÌÝè) */287 /* 応答電文用fbs設定(sender/targetの設定) */ 292 288 static ER _ecn_udp_cre_res_fbs(ECN_FBS_ID req, uint8_t cmd, ECN_FBS_ID *pk_res) 293 289 { … … 319 315 320 316 /* 321 * àbZ[WóM317 * 内部メッセージ受信処理 322 318 */ 323 319 void _ecn_int_msg(ECN_FBS_ID fbs_id, ECN_FBS_SSIZE_T a_snd_len) … … 338 334 339 335 switch (cmd) { 340 // IP AhXðÔM336 // IPアドレスを返信 341 337 case ECN_UDP_MSG_GET_IPADDR_REQ: 342 338 if (a_snd_len < sizeof(msg)) { … … 418 414 419 415 /* 420 * ECHONET d¶óM416 * ECHONET 電文受信処理 421 417 */ 422 418 void _ecn_esv_msg(ECN_FBS_ID fbs_id) … … 429 425 IP4_ADDR(&a_dst.ipaddr, 0, 0, 0, 0); 430 426 a_dst.portno = 0; 431 /* MæIPAhX*/427 /* 送信先IPアドレス */ 432 428 a_ret = udp_get_ip(&a_dst, fbs_id.ptr->hdr.target.id); 433 429 if (!a_ret) { 434 ECN_DBG_PUT("[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X ¨udp dest(%s)",430 ECN_DBG_PUT("[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X → udp dest(%s)", 435 431 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx1, 436 432 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx2, … … 439 435 440 436 if (ip_addr_cmp(&a_dst.ipaddr, &localhost)) { 441 /* Mæª127.0.0.1 ¨ mbxÉ]*/442 ECN_DBG_PUT("redirect ecn_udp_mailboxid ¨ecn_svc_mailboxid (esv:0x%02X)",437 /* 送信先が127.0.0.1 → mbxに転送 */ 438 ECN_DBG_PUT("redirect ecn_udp_mailboxid → ecn_svc_mailboxid (esv:0x%02X)", 443 439 ((T_EDATA *)fbs_id.ptr)->hdr.edata.esv); 444 440 … … 460 456 } 461 457 462 /* fbs ©çoÍÌæÉf[^ðo*/458 /* fbsから出力領域にデータを抽出 */ 463 459 a_snd_len = 0; 464 460 for (q = p; q != NULL; q = q->next) { … … 473 469 } 474 470 475 /* UDP M*/471 /* UDP送信 */ 476 472 a_ret = udp_sendto(UDP_CEPID, p, &a_dst.ipaddr, 3610); 477 473 if (a_ret < 0) { … … 481 477 } 482 478 483 /* f[^ª··¬Ä1pPbgÉûÜçÈ©Á½ê*/479 /* データが長すぎて1パケットに収まらなかった場合 */ 484 480 if (_ecn_fbs_exist_data(fbs_id)) { 485 481 ECN_DBG_PUT("[UDP TSK] send, data so long: %dbyte(s)", _ecn_fbs_get_datalen(fbs_id)); … … 495 491 496 492 /* 497 * mubLOR[ÌR[obNÖ493 * ノンブロッキングコールのコールバック関数 498 494 */ 499 495 static void … … 525 521 526 522 t_esv = (const T_ECN_EDT_HDR *)a_fbs_id.ptr->payload; 527 if (t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite Ki*/528 || t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* d¶`®1 */) {523 if (t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite規格 */ 524 || t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* 電文形式1 */) { 529 525 ECN_DBG_PUT("[UDP ECHO SRV] illegal type (0x%02X,0x%02X)", t_esv->ecn_hdr.ehd1, t_esv->ecn_hdr.ehd2); 530 526 goto lb_except; … … 539 535 a_fbs_id.ptr->hdr.sender.id = ENOD_NOT_MATCH_ID; 540 536 541 /* IP AhX©ç[gECHONETm[hÖÏ·*/537 /* IPアドレスからリモートECHONETノードへ変換 */ 542 538 a_enod_id = udp_get_id((T_EDATA *)a_fbs_id.ptr, addr, port); 543 539 if (a_enod_id < 0 || tnum_enodadr <= a_enod_id) { … … 546 542 } 547 543 else { 548 /* M³ECHONETm[hðL^*/544 /* 送信元ECHONETノードを記録 */ 549 545 a_fbs_id.ptr->hdr.sender.id = a_enod_id; 550 546 } 551 547 a_fbs_id.ptr->hdr.reply.id = a_fbs_id.ptr->hdr.sender.id; 552 548 553 /* echonet_task Éé*/549 /* echonet_taskに送る */ 554 550 a_ret = snd_mbx(ecn_svc_mailboxid, (T_MSG *)a_fbs_id.ptr); 555 551 if (a_ret != E_OK) { … … 564 560 565 561 /* 566 * [gECHONETm[hÌKmF562 * リモートECHONETノードの適合確認 567 563 */ 568 564 bool_t is_match(const EOBJCB *enodcb, T_EDATA *edata, const void *_ipaddr, uint16_t portno) … … 582 578 return false; 583 579 584 /* m[hX^[gCX^XXgÊmÈOÍO*/580 /* ノードスタート時インスタンスリスト通知以外は除外 */ 585 581 if (edata->hdr.edata.esv != ESV_INF 586 582 || edata->hdr.edata.deoj.eojx1 != EOJ_X1_PROFILE … … 604 600 } 605 601 ECN_DBG_PUT("is_match(): ecn_itr_nxt() result: epc=0x%02X, pdc=%d", epc, pdc); 606 /* CX^XXgÊmܽͩm[hCX^XXgrÈOÍO*/602 /* インスタンスリスト通知または自ノードインスタンスリストS以外は除外 */ 607 603 if ((epc != 0xD5) && (epc != 0xD6)) { 608 604 continue; 609 605 } 610 606 611 /* QoCgÚÈ~Éeojªñ³êÄ¢é*/607 /* 2バイト目以降にeojが列挙されている */ 612 608 count = (pdc - 1) / sizeof(T_ECN_EOJ); 613 609 614 /* m[hàÌ@íIuWFNgðõ*/610 /* ノード内の機器オブジェクトを検索 */ 615 611 for (k = 0; k < enodcb->eobjcnt; k++) { 616 612 p_eobj = enodcb->eobjs[k]; 617 613 618 /* CX^XXgðmF*/614 /* インスタンスリストを確認 */ 619 615 match = false; 620 616 for (i = 0, j = 1; i < count; i++, j += sizeof(T_ECN_EOJ)) { … … 634 630 } 635 631 636 /* ·×ĵÁÄ¢½çKiCX^XXgÌûª½Äࢢ±ÆÆ·éj*/632 /* すべて揃っていたら適合(インスタンスリストの方が多くてもいいこととする) */ 637 633 return true; 638 634 } … … 642 638 643 639 /* 644 * IP AhX©ç[gECHONETm[hÖÏ·640 * IPアドレスからリモートECHONETノードへ変換 645 641 */ 646 642 ECN_ENOD_ID udp_get_id(T_EDATA *edata, const ip_addr_t *ipaddr, uint16_t portno) … … 654 650 return ENOD_MULTICAST_ID; 655 651 656 /* IP AhX̯¶àÌðõ*/652 /* IPアドレスの同じものを検索 */ 657 653 for (i = 0, ea = enodadrb_table; i < tnum_enodadr; i++, ea++) { 658 654 if (!ea->inuse) … … 666 662 } 667 663 668 /* ηé[gm[hðõ*/664 /* 対応するリモートノードを検索 */ 669 665 for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) { 670 666 if (!ea->inuse) … … 677 673 continue; 678 674 679 /* ηé[gm[hª êÎIPAhXðÝè*/675 /* 対応するリモートノードがあればIPアドレスを設定 */ 680 676 *((ip_addr_t *)ea->ipaddr) = *ipaddr; 681 677 … … 685 681 } 686 682 687 /* ó«ÌæðTµÄ©®o^*/683 /* 空き領域を探して自動登録 */ 688 684 for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) { 689 685 if (ea->inuse) … … 702 698 703 699 /* 704 * [gECHONETm[h©çIPAhXÖÏ·700 * リモートECHONETノードからIPアドレスへ変換 705 701 */ 706 702 int udp_get_ip(T_IPV4EP *fp_ipep, ECN_ENOD_ID fa_enodid) … … 714 710 715 711 if (fa_enodid == ENOD_MULTICAST_ID) { 716 /* target ªENOD_MULTICAST_IDÌêA}`LXgðs¤*/712 /* targetがENOD_MULTICAST_IDの場合、マルチキャストを行う */ 717 713 ip_addr_copy(fp_ipep->ipaddr, multicast); 718 714 return 0; /* ok */ … … 720 716 721 717 if (fa_enodid < ENOD_REMOTE_ID) { 722 /* target ª¢è`ELOCALEAPIÌêA[Jzðs¤*/718 /* targetが未定義・LOCAL・APIの場合、ローカル配送を行う */ 723 719 ip_addr_copy(fp_ipep->ipaddr, localhost); 724 720 return 0; /* ok */ -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.