Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_igmp.c

    r331 r429  
    55*                   Tomakomai National College of Technology, JAPAN
    66*
    7 *  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì (1)`(4) ‚ÌðŒ‚©CFree Software Foundation
    8 *  ‚É‚æ‚Á‚ÄŒö•\‚³‚ê‚Ä‚¢‚é GNU General Public License ‚Ì Version 2 ‚É‹L
    9 *  q‚³‚ê‚Ä‚¢‚éðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒFƒAi–{ƒ\ƒtƒgƒEƒFƒA
    10 *  ‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü•ÏEÄ”z•ziˆÈ‰ºC
    11 *  —˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    12 *  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    13 *      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    14 *      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    15 *  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    16 *      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    17 ƒƒ“ƒgi—˜—p
    18 *      ŽÒƒ}ƒjƒ
    19 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    20 *      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    21 *  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    22 *      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚ÌðŒ‚ð–ž‚½‚·‚±‚ƁD
    23 *    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    24 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    25 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    26 *        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    27 *  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    28 *      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
     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è²¬ã™ã‚‹ã“と.
    2936*
    30 *  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    31 *  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC‚»‚Ì“K—p‰Â”\«‚à
    32 *  ŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼
    33 *  Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»‚̐ӔC‚𕉂í‚È‚¢D
     37*  本ソフトウェアは,無保証で提供されているものである.上記著作権è€
     38お
     39*  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
     40*  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
     41*  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
    3442*
    3543*  @(#) $Id$
     
    8896
    8997static bool_t igmp_send_report_v2(T_IN4_ADDR dst);
    90 static uint16_t igmp_get_timer(T_IGMP_ENTRY *entry);
     98static int16_t igmp_get_timer(T_IGMP_ENTRY *entry);
    9199
    92100ER igmp_set_loop(T_UDP_CEP *cep, uint8_t optval)
     
    155163        T_IGMP_ENTRY *entry = NULL;
    156164        int             i;
    157         uint16_t        min;
    158165        T_IFNET *ifp = IF_GET_IFNET();
    159166        ER ret = E_NOMEM;
     
    168175                entry = &igmp_groups[i];
    169176                if (entry->timer == -1) {
    170                         entry->timer = igmp_get_timer(entry);
     177                        entry->timer = 0;
    171178                        entry->ip_addr = optval->imr_multiaddr;
    172179                        ret = E_OK;
     
    184191        T_IGMP_ENTRY *entry = NULL;
    185192        int             i;
    186         uint16_t        min;
    187193        ER ret = E_PAR;
    188194        T_IFNET *ifp = IF_GET_IFNET();
     
    223229        T_NET_BUF       *input = *inputp;
    224230        T_IGMPV2_HDR    *igmph;
    225         T_IN4_ADDR      addr;
    226231        uint_t          len, align;
    227232        T_IP4_HDR       *ip4h;
     
    234239        NET_COUNT_IGMP(net_count_igmp.in_packets, 1);
    235240
    236         /* ICMP ƒwƒbƒ_‚Ì’·‚³‚ðƒ`ƒFƒbƒN‚·‚éB*/
     241        /* ICMP ヘッダの長さをチェックする。*/
    237242        if (input->len < IF_IP4_IGMP_HDR_SIZE) {
    238243                NET_COUNT_IGMP(net_count_igmp.in_err_packets, 1);
     
    243248        igmph = (T_IGMPV2_HDR *)(input->buf + *offp);
    244249
    245         /* 4 ƒIƒNƒeƒbƒg‹«ŠE‚̃f[ƒ^’· */
     250        /* 4 オクテット境界のデータ長 */
    246251        len = input->len - *offp;
    247252        align = (len + 3) >> 2 << 2;
    248253
    249         /* 4 ƒIƒNƒeƒbƒg‹«ŠE‚܂ŃpƒfƒBƒ“ƒO‚Å–„‚ß‚éB*/
     254        /* 4 オクテット境界までパディングで埋める。*/
    250255        if (align > len)
    251256                memset((uint8_t*)input->buf + input->len, 0, (size_t)(align - len));
    252257
    253         /* ƒ`ƒFƒbƒNƒTƒ€‚ðŒvŽZ‚·‚éB*/
     258        /* チェックサムを計算する。*/
    254259        if (in_cksum(igmph, align) != 0) {
    255260                NET_COUNT_IGMP(net_count_igmp.in_err_packets, 1);
     
    257262        }
    258263
    259         /* ƒƒbƒZ[ƒW‚ÌŒ^‚É‚æ‚蕪Šò‚·‚éB*/
     264        /* メッセージの型により分岐する。*/
    260265        switch (igmph->type) {
    261266        case IGMP_MEMBERSHIP_QUERY:
     
    263268                ret = false;
    264269
    265                 /* ŽQ‰Á’†‚̃Oƒ‹[ƒvƒAƒhƒŒƒX‚©‚ç‚̃NƒGƒŠ[‚̏ꍇ */
     270                /* 参加中のグループアドレスからのクエリーの場合 */
    266271                syscall(wai_sem(SEM_IGMP_GROUP_LOCK));
    267272
    268273                for (i = 0; i < NUM_IGMP_ENTRY; i++) {
    269274                        entry = &igmp_groups[i];
    270                         if ((entry->timer >= 0) && (entry->ip_addr == addr)) {
     275                        if ((entry->timer >= 0) && (entry->ip_addr == igmph->addr)) {
    271276                                entry->resptime = igmph->time;
    272277                                ret = true;
     
    278283
    279284                if (ret) {
    280                         /* ƒƒ“ƒo[ƒVƒbƒvƒŠƒ|[ƒg‚𑗐M */
     285                        /* メンバーシップリポートを送信 */
    281286                        igmp_send_report_v2(ip4h->src);
    282287                }
     
    293298        T_IGMPV2_HDR    *igmph;
    294299        T_NET_BUF               *output;
    295         uint_t                  len, align;
     300        uint_t                  len = 0, align;
    296301
    297302        if (in4_get_datagram(&output, (uint_t)(IF_IP4_IGMP_HDR_SIZE + len), 0,
     
    300305                return false;
    301306
    302         /* IGMP ƒwƒbƒ_‚ðÝ’è‚·‚éB*/
     307        /* IGMP ヘッダを設定する。*/
    303308        igmph = GET_IGMPV2_HDR(output, IF_IP4_IGMP_HDR_OFFSET);
    304309        igmph->type = IGMP_MEMBERSHIP_REPORT_V2;
    305310        igmph->time = 0;
    306         igmph->addr = dst;
    307 
    308         /* 4 ƒIƒNƒeƒbƒg‹«ŠE‚̃f[ƒ^’· */
     311        igmph->addr = htonl(dst);
     312
     313        /* 4 オクテット境界のデータ長 */
    309314        align = (len + 3) >> 2 << 2;
    310315
    311         /* 4 ƒIƒNƒeƒbƒg‹«ŠE‚܂ŃpƒfƒBƒ“ƒO‚Å–„‚ß‚éB*/
     316        /* 4 オクテット境界までパディングで埋める。*/
    312317        if (align > len)
    313                 memset((uint8_t*)GET_IGMP_SDU(output, IF_IP4_IGMP_HDR_OFFSET) + IP4_HDR_SIZE + len,
     318                memset((uint8_t*)GET_IGMP_SDU(output, IF_IP4_IGMP_HDR_OFFSET) + len,
    314319                        0, (size_t)(align - len));
    315320
    316         /* ƒ`ƒFƒbƒNƒTƒ€‚ðŒvŽZ‚·‚éB*/
     321        /* チェックサムを計算する。*/
    317322        igmph->sum = 0;
    318         igmph->sum = in_cksum(igmph, (uint_t)(IF_IP4_IGMP_HDR_SIZE + align));
    319 
    320         /* ‘—M‚·‚éB*/
     323        igmph->sum = in_cksum(igmph, (uint_t)(IGMP_HDR_SIZE + align));
     324
     325        /* 送信する。*/
    321326        NET_COUNT_IGMP(net_count_igmp.out_octets,
    322327                output->len - GET_IF_IP4_HDR_SIZE(output));
     
    330335
    331336/*
    332 *  igmp_timer -- IGMP ‹¤’ʃ^ƒCƒ}[
     337*  igmp_timer -- IGMP å
     338±é€šã‚¿ã‚¤ãƒžãƒ¼
    333339*/
    334340static void igmp_timer(void *ignore)
     
    361367
    362368/*
    363 *  igmp_init -- IGMP ‹@”\‚ð‰Šú‰»‚·‚éB
     369*  igmp_init -- IGMP 機能を初期化する。
    364370*/
    365371
    366372void igmp_init(void)
    367373{
    368         T_IGMP_ENTRY *entry = NULL;
    369374        int i;
    370375
     
    397402}
    398403
    399 uint16_t igmp_get_timer(T_IGMP_ENTRY *entry)
    400 {
    401         uint16_t time = entry->resptime;
     404int16_t igmp_get_timer(T_IGMP_ENTRY *entry)
     405{
     406        int16_t time = entry->resptime;
    402407
    403408        if (time == 0)
    404                 time = 10;
    405 
    406         return net_rand() / (0x7fffffff / time);
     409                time = 590;
     410
     411        return (int16_t)(net_rand() % time) + 10;
    407412}
    408413
Note: See TracChangeset for help on using the changeset viewer.