Changeset 107 for uKadecot/trunk/ecnl_ssp/echonet_uip_task.c
- Timestamp:
- Jun 10, 2015, 8:40:31 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uKadecot/trunk/ecnl_ssp/echonet_uip_task.c
-
Property svn:mime-type
changed from
text/plain
totext/plain; charset=SHIFT_JIS
r101 r107 4 4 * Copyright (C) 2014 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_UIP … … 95 91 96 92 /* 97 * óMµ½UDPf[^ðMAILBOXÉé93 * 受信したUDPデータをMAILBOXに送る 98 94 */ 99 95 ER _ecn_udp2mbx(const uint8_t *buffer, size_t fa_len, const T_IPV4EP *dst); … … 110 106 111 107 a_rcv_pkt.buffer = buffer; 112 if ( a_rcv_pkt.t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite Ki*/113 || a_rcv_pkt.t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* d¶`®1 */) {108 if ( a_rcv_pkt.t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite規格 */ 109 || a_rcv_pkt.t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* 電文形式1 */) { 114 110 ECN_DBG_PUT "[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 ECN_DBG_END; 115 111 return E_PAR; … … 134 130 a_fbs_id.ptr->hdr.sender = ENOD_NOT_MATCH_ID; 135 131 136 /* IP AhX©ç[gECHONETm[hÖÏ·*/132 /* IPアドレスからリモートECHONETノードへ変換 */ 137 133 a_enod_id = udp_get_id((T_EDATA *)a_fbs_id.ptr, dst->ipaddr, dst->portno); 138 134 if (a_enod_id < 0 || tnum_enodadr <= a_enod_id) { … … 140 136 ip2str(NULL, dst->ipaddr) ECN_DBG_END; 141 137 } else { 142 /* M³ECHONETm[hðL^*/138 /* 送信元ECHONETノードを記録 */ 143 139 a_fbs_id.ptr->hdr.sender = a_enod_id; 144 140 } 145 141 a_fbs_id.ptr->hdr.reply = a_fbs_id.ptr->hdr.sender; 146 142 147 /* echonet_task Éé*/143 /* echonet_taskに送る */ 148 144 a_ret = psnd_dtq(ecn_svc_mailboxid, (intptr_t)a_fbs_id.ptr); 149 145 if (a_ret != E_OK) { … … 158 154 159 155 /* 160 * ECHONET UDP ÊM^XN156 * ECHONET UDP通信処理タスク 161 157 */ 162 158 static 163 159 PT_THREAD(echonet_udp_task_pt(void)) 164 160 { 165 /* UDP oÍÌæibèj*/161 /* UDP出力領域(暫定) */ 166 162 static uint_t buffer[(UIP_BUFSIZE) / sizeof(uint_t) + 1]; 167 163 … … 201 197 } 202 198 203 /* üúnhÌN®*/199 /* 周期ハンドラの起動 */ 204 200 a_ret = sta_cyc(ecn_udp_cychdrid); 205 201 if (a_ret != E_OK) { … … 220 216 } 221 217 222 /* bZ[W[v*/218 /* メッセージループ */ 223 219 for (;;) { 224 220 a_prev = a_now; … … 244 240 245 241 if (a_ret == E_OK) { 246 /* Mf[^·ðæ¾*/242 /* 送信データ長を取得 */ 247 243 a_snd_len = _ecn_fbs_get_datalen(a_mdt.fbs_id); 248 244 … … 270 266 271 267 /* 272 * ECHONET UDP ÊMvgXbhN®^XN268 * ECHONET UDP通信処理プロトスレッド起動タスク 273 269 */ 274 270 void echonet_udp_task(intptr_t exinf) … … 278 274 279 275 /* 280 * ECHONET UDP ÊM^XNN®püúnh[276 * ECHONET UDP通信処理タスク起動用周期ハンドラー 281 277 */ 282 278 void echonet_udp_cychdr(intptr_t exinf) … … 285 281 } 286 282 287 /* d¶pfbsÝè(sender/targetÌÝè) */283 /* 応答電文用fbs設定(sender/targetの設定) */ 288 284 static ER _ecn_udp_cre_req_fbs(ID sender, uint8_t cmd, ECN_FBS_ID *pk_req) 289 285 { … … 314 310 } 315 311 316 /* d¶pfbsÝè(sender/targetÌÝè) */312 /* 応答電文用fbs設定(sender/targetの設定) */ 317 313 static ER _ecn_udp_cre_res_fbs(ECN_FBS_ID req, uint8_t cmd, ECN_FBS_ID *pk_res) 318 314 { … … 344 340 345 341 /* 346 * àbZ[WóM342 * 内部メッセージ受信処理 347 343 */ 348 344 void _ecn_int_msg(ECN_FBS_ID fbs_id, ECN_FBS_SSIZE_T a_snd_len) … … 362 358 363 359 switch(cmd){ 364 // IP AhXðÔM360 // IPアドレスを返信 365 361 case ECN_UDP_MSG_GET_IPADDR_REQ: 366 362 if (a_snd_len < sizeof(msg)) { … … 431 427 432 428 /* 433 * ECHONET d¶óM429 * ECHONET 電文受信処理 434 430 */ 435 431 void _ecn_esv_msg(ECN_FBS_ID fbs_id) 436 432 { 437 /* UDP oÍÌæibèj*/433 /* UDP出力領域(暫定) */ 438 434 static uint_t buffer[(UIP_BUFSIZE) / sizeof(uint_t) + 1]; 439 435 T_IPV4EP a_dst; … … 444 440 uip_ipaddr(a_dst.ipaddr, 0,0,0,0); 445 441 a_dst.portno = 0; 446 /* MæIPAhX*/442 /* 送信先IPアドレス */ 447 443 a_ret = udp_get_ip(&a_dst, fbs_id.ptr->hdr.target); 448 444 if (!a_ret) { 449 ECN_DBG_PUT "[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X ¨udp dest(%s)",445 ECN_DBG_PUT "[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X → udp dest(%s)", 450 446 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx1, 451 447 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx2, … … 453 449 ip2str(NULL, a_dst.ipaddr) ECN_DBG_END; 454 450 455 /* fbs ©çoÍÌæÉf[^ðo*/451 /* fbsから出力領域にデータを抽出 */ 456 452 a_snd_len = 0; 457 453 a_ret = _ecn_fbs_get_data(fbs_id, buffer, sizeof(buffer), &a_snd_len); … … 460 456 } 461 457 else if(uip_ipaddr_cmp(a_dst.ipaddr, localhost)) { 462 /* Mæª127.0.0.1 ¨ mbxÉ]*/463 ECN_DBG_PUT "redirect ecn_udp_mailboxid ¨ecn_svc_mailboxid (esv:0x%02X)",458 /* 送信先が127.0.0.1 → mbxに転送 */ 459 ECN_DBG_PUT "redirect ecn_udp_mailboxid → ecn_svc_mailboxid (esv:0x%02X)", 464 460 ((T_EDATA *)fbs_id.ptr)->hdr.edata.esv ECN_DBG_END; 465 461 … … 475 471 _ecn_dbg_bindmp((const uint8_t *)buffer, a_snd_len); 476 472 #endif 477 /* UDP M*/473 /* UDP送信 */ 478 474 a_ret = udp_snd_dat(UDP_CEPID, &a_dst, buffer, a_snd_len); 479 475 if (a_ret < 0) { … … 482 478 } 483 479 484 /* f[^ª··¬Ä1pPbgÉûÜçÈ©Á½ê*/480 /* データが長すぎて1パケットに収まらなかった場合 */ 485 481 if (_ecn_fbs_exist_data(fbs_id)) { 486 482 ECN_DBG_PUT "[UDP TSK] send, data so long: %dbyte(s)", _ecn_fbs_get_datalen(fbs_id) ECN_DBG_END; … … 497 493 498 494 /* 499 * mubLOR[ÌR[obNÖ495 * ノンブロッキングコールのコールバック関数 500 496 */ 501 497 static … … 518 514 } 519 515 #ifdef _MSC_VER 520 /* ( Jp) ECHONETppPbgÈOÍÇÝÌÄé*/516 /* (開発用) ECHONET用パケット以外は読み捨てる */ 521 517 if (buffer[0] != 0x10 || buffer[1] != 0x81) { 522 518 PT_EXIT(&s.pt); … … 548 544 549 545 /* 550 * [gECHONETm[hÌKmF546 * リモートECHONETノードの適合確認 551 547 */ 552 548 bool_t is_match(const EOBJCB *enodcb, T_EDATA *edata, const void *_ipaddr, uint16_t portno) … … 566 562 return false; 567 563 568 /* m[hX^[gCX^XXgÊmÈOÍO*/564 /* ノードスタート時インスタンスリスト通知以外は除外 */ 569 565 if ( edata->hdr.edata.esv != ESV_INF 570 566 || edata->hdr.edata.deoj.eojx1 != EOJ_X1_PROFILE … … 588 584 } 589 585 ECN_DBG_PUT "is_match(): ecn_itr_nxt() result: epc=0x%02X, pdc=%d", epc, pdc ECN_DBG_END; 590 /* CX^XXgÊmܽͩm[hCX^XXgrÈOÍO*/586 /* インスタンスリスト通知または自ノードインスタンスリストS以外は除外 */ 591 587 if ((epc != 0xD5) && (epc != 0xD6)) { 592 588 continue; 593 589 } 594 590 595 /* QoCgÚÈ~Éeojªñ³êÄ¢é*/591 /* 2バイト目以降にeojが列挙されている */ 596 592 count = (pdc - 1) / sizeof(T_ECN_EOJ); 597 593 598 /* m[hàÌ@íIuWFNgðõ*/594 /* ノード内の機器オブジェクトを検索 */ 599 595 for (k = 0; k < enodcb->eobjcnt; k++) { 600 596 p_eobj = enodcb->eobjs[k]; 601 597 602 /* CX^XXgðmF*/598 /* インスタンスリストを確認 */ 603 599 match = false; 604 600 for (i = 0, j = 1; i < count; i++, j += sizeof(T_ECN_EOJ)) { … … 618 614 } 619 615 620 /* ·×ĵÁÄ¢½çKiCX^XXgÌûª½Äࢢ±ÆÆ·éj*/616 /* すべて揃っていたら適合(インスタンスリストの方が多くてもいいこととする) */ 621 617 return true; 622 618 } … … 626 622 627 623 /* 628 * IP AhX©ç[gECHONETm[hÖÏ·624 * IPアドレスからリモートECHONETノードへ変換 629 625 */ 630 626 ECN_ENOD_ID udp_get_id(T_EDATA *edata, const T_IN4_ADDR ipaddr, uint16_t portno) … … 638 634 return ENOD_MULTICAST_ID; 639 635 640 /* IP AhX̯¶àÌðõ*/636 /* IPアドレスの同じものを検索 */ 641 637 for (i = 0, ea = enodadrb_table; i < tnum_enodadr; i++, ea++) { 642 638 if (!ea->inuse) … … 650 646 } 651 647 652 /* ηé[gm[hðõ*/648 /* 対応するリモートノードを検索 */ 653 649 for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) { 654 650 if (!ea->inuse) … … 661 657 continue; 662 658 663 /* ηé[gm[hª êÎIPAhXðÝè*/659 /* 対応するリモートノードがあればIPアドレスを設定 */ 664 660 uip_ipaddr_copy(ea->ipaddr, ipaddr); 665 661 … … 669 665 } 670 666 671 /* ó«ÌæðTµÄ©®o^*/667 /* 空き領域を探して自動登録 */ 672 668 for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) { 673 669 if (ea->inuse) … … 686 682 687 683 /* 688 * [gECHONETm[h©çIPAhXÖÏ·684 * リモートECHONETノードからIPアドレスへ変換 689 685 */ 690 686 int udp_get_ip(T_IPV4EP *fp_ipep, ECN_ENOD_ID fa_enodid) … … 698 694 699 695 if (fa_enodid == ENOD_MULTICAST_ID) { 700 /* target ªENOD_MULTICAST_IDÌêA}`LXgðs¤*/696 /* targetがENOD_MULTICAST_IDの場合、マルチキャストを行う */ 701 697 uip_ipaddr_copy(fp_ipep->ipaddr, multicast); 702 698 return 0; /* ok */ … … 704 700 705 701 if (fa_enodid < ENOD_REMOTE_ID) { 706 /* target ª¢è`ELOCALEAPIÌêA[Jzðs¤*/702 /* targetが未定義・LOCAL・APIの場合、ローカル配送を行う */ 707 703 uip_ipaddr_copy(fp_ipep->ipaddr, localhost); 708 704 return 0; /* ok */ -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.