Ignore:
Timestamp:
Jul 23, 2017, 2:29:40 PM (7 years ago)
Author:
coas-nagasima
Message:

SVNプロパティを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rubycfg_asp/trunk/asp_dcre/tinet/netinet/if_ether.c

    • Property svn:mime-type changed from text/x-csrc to text/x-csrc; charset=UTF-8
    r313 r315  
    55 *                   Tomakomai National College of Technology, JAPAN
    66 *
    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 è²¬ã™ã‚‹ã“と.
    36  *
    37  *  本ソフトウェアは,無保証で提供されているものである.上記著作権è€
    38 ãŠ
    39  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
    40  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
    41  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
     7 *  上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
     8 *  によって公表されている GNU General Public License の Version 2 に記
     9 *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
     10 *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
     11 *  利用と呼ぶ)することを無償で許諾する.
     12 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     13 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     14 *      スコード中に含まれていること.
     15 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     16 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     17 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     18 *      の無保証規定を掲載すること.
     19 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     20 *      用できない形で再配布する場合には,次の条件を満たすこと.
     21 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     23 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     24 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     25 *
     26 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     27 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
     28 *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
     29 *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
    4230 *
    4331 *  @(#) $Id$
     
    122110
    123111/*
    124  *  ARP キャッシュエントリ
     112 *  ARP キャッシュエントリ
    125113 */
    126114
     
    128116
    129117/*
    130  *  関数
     118 *  関数
    131119 */
    132120
     
    135123
    136124/*
    137  *  in_arpinput -- TCP/IP 用 ARP のå
    138 ¥åŠ›é–¢æ•°
     125 *  in_arpinput -- TCP/IP 用 ARP の入力関数
    139126 */
    140127
     
    152139        et_arph = GET_ETHER_ARP_HDR(input);
    153140
    154         ntoahl(saddr, et_arph->sproto);         /* 送信å
    155 ƒ IP アドレス       */
    156         ntoahl(taddr, et_arph->tproto);         /* 解決対象 IP アドレス */
    157 
    158         /*
    159          *  以下の場合はエラー
    160          *    ・送信ホストの物理アドレスが自分
    161          *    ・送信ホストの物理アドレスがブロードキャスト
     141        ntoahl(saddr, et_arph->sproto);         /* 送信元 IP アドレス  */
     142        ntoahl(taddr, et_arph->tproto);         /* 解決対象 IP アドレス */
     143
     144        /*
     145         *  以下の場合はエラー
     146         *    ・送信ホストの物理アドレスが自分
     147         *    ・送信ホストの物理アドレスがブロードキャスト
    162148         */
    163149        if (memcmp(et_arph->shost, ifaddr->lladdr,        ETHER_ADDR_LEN) == 0 ||
     
    166152
    167153        /*
    168          *  送信ホストの IP アドレスが自分の場合は、重複しているので
    169          *  相手にも知らせる。
    170          *  ただし、自分と相手のアドレスが未定義(IPV4_ADDRANY)の時は何もしない。
     154         *  送信ホストの IP アドレスが自分の場合は、重複しているので
     155         *  相手にも知らせる。
     156         *  ただし、自分と相手のアドレスが未定義(IPV4_ADDRANY)の時は何もしない。
    171157         */
    172158        if ((saddr == ifp->in4_ifaddr.addr) && (saddr != IPV4_ADDRANY)) {
     
    197183
    198184        /*
    199          *  以下の場合は何もしない。
    200          *    ・解決対象 IP アドレスが自分ではない、注: å
    201 ƒã® FreeBSD の
    202          *      実è£
    203 ã§ã¯ã€ARP PROXY 等のため、自分以外の IP アドレスの
    204          *      解決も行っているが、本実è£
    205 ã§ã¯ã€è‡ªåˆ†ä»¥å¤–の IP
    206          *      アドレスの解決は行わない。
     185         *  以下の場合は何もしない。
     186         *    ・解決対象 IP アドレスが自分ではない、注: 元の FreeBSD の
     187         *      実装では、ARP PROXY 等のため、自分以外の IP アドレスの
     188         *      解決も行っているが、本実装では、自分以外の IP
     189         *      アドレスの解決は行わない。
    207190         */
    208191        if (taddr != ifp->in4_ifaddr.addr)
     
    210193
    211194        /*
    212          *  送信å
    213 ƒ IP アドレスが ARP キャッシュにあるか調べる。
    214          *  キャッシュになければ、新たにエントリを登録する。
     195         *  送信元 IP アドレスが ARP キャッシュにあるか調べる。
     196         *  キャッシュになければ、新たにエントリを登録する。
    215197         */
    216198        syscall(wai_sem(SEM_ARP_CACHE_LOCK));
     
    221203
    222204        /*
    223          *  送信がペンデングされているフレームがあれば送信する。
     205         *  送信がペンデングされているフレームがあれば送信する。
    224206         */
    225207        if (ent->hold) {
    226208
    227                 /* フレームの Ethernet ヘッダを設定する。*/
     209                /* フレームの Ethernet ヘッダを設定する。*/
    228210                memcpy(GET_ETHER_HDR(ent->hold)->dhost, ent->mac_addr, ETHER_ADDR_LEN);
    229211
     
    232214                syscall(sig_sem(SEM_ARP_CACHE_LOCK));
    233215
    234                 /* ペンディングされているフレームを送信する。*/
     216                /* ペンディングされているフレームを送信する。*/
    235217                IF_RAW_OUTPUT(pending, TMO_FEVR);
    236218
     
    243225        arph = GET_ARP_HDR(input);
    244226
    245         /* アドレス解決要求でなければ終了 */
     227        /* アドレス解決要求でなければ終了 */
    246228        if (ntohs(arph->opcode) != ARPOP_REQUEST)
    247229                goto buf_rel;
    248230
    249         /* Ethernet ARP ヘッダを設定する。*/
     231        /* Ethernet ARP ヘッダを設定する。*/
    250232        memcpy(et_arph->thost, et_arph->shost, ETHER_ADDR_LEN);
    251233        memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
     
    253235        ahtonl(et_arph->sproto, taddr);
    254236
    255         /* Ethernet ARP ヘッダを設定する。*/
     237        /* Ethernet ARP ヘッダを設定する。*/
    256238        arph->opcode = htons(ARPOP_REPLY);
    257239
    258         /* Ethernet ヘッダを設定する。*/
     240        /* Ethernet ヘッダを設定する。*/
    259241        eth = GET_ETHER_HDR(input);
    260242        memcpy(eth->dhost, eth->shost,     ETHER_ADDR_LEN);
    261243        memcpy(eth->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
    262244
    263         /* ARP 応答を送信する。*/
     245        /* ARP 応答を送信する。*/
    264246        IF_RAW_OUTPUT(input, TMO_FEVR);
    265247        return;
     
    272254
    273255/*
    274  *  arp_timer -- ARP キャッシュの更新
     256 *  arp_timer -- ARP キャッシュの更新
    275257 */
    276258
     
    286268                        arp_cache[ix].expire -= ARP_TIMER_TMO;
    287269                        if (arp_cache[ix].expire == 0) {
    288                                 /* 送信がペンデングされているフレームがあれば捨てる。*/
     270                                /* 送信がペンデングされているフレームがあれば捨てる。*/
    289271                                if (arp_cache[ix].hold) {
    290272                                        NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
     
    301283
    302284/*
    303  *  arp_lookup -- ARP キャッシュの探索と登録
    304  *
    305  *    注意: SEM_ARP_CACHE_LOCK を獲得した状æ
    306 ‹ã§å‘¼å‡ºã™ã“と
     285 *  arp_lookup -- ARP キャッシュの探索と登録
     286 *
     287 *    注意: SEM_ARP_CACHE_LOCK を獲得した状態で呼出すこと
    307288 */
    308289
     
    318299                }
    319300
    320         /* create が真なら、新たなエントリを登録する。*/
     301        /* create が真なら、新たなエントリを登録する。*/
    321302        if (create) {
    322303
    323                 /* まず、空きがあれば、その空きを利用する。*/
     304                /* まず、空きがあれば、その空きを利用する。*/
    324305                for (ix = NUM_ARP_ENTRY; ix -- > 0; ) {
    325306                        if (arp_cache[ix].expire == 0) {
     
    330311
    331312                /*
    332                  *  空きがなければ、タイムアウトまで時間が最短の
    333                  *  エントリーを破棄して利用する。
     313                 *  空きがなければ、タイムアウトまで時間が最短の
     314                 *  エントリーを破棄して利用する。
    334315                 */
    335316                syslog(LOG_NOTICE, "[ARP] cache busy, size=%d", NUM_ARP_ENTRY);
     
    349330
    350331/*
    351  *  arp_request -- MAC アドレス解決要求
     332 *  arp_request -- MAC アドレス解決要求
    352333 */
    353334
     
    367348        if ((error = tget_net_buf(&arp_req, IF_ARP_ETHER_HDR_SIZE, TMO_ARP_GET_NET_BUF)) == E_OK) {
    368349
    369                 /* イーサネットヘッダを設定する。*/
     350                /* イーサネットヘッダを設定する。*/
    370351                eth     = GET_ETHER_HDR(arp_req);
    371352                memcpy(eth->dhost, ether_broad_cast_addr, ETHER_ADDR_LEN);
     
    373354                eth->type = htons(ETHER_TYPE_ARP);
    374355
    375                 /* ARP ヘッダを設定する。*/
     356                /* ARP ヘッダを設定する。*/
    376357                arph    = GET_ARP_HDR(arp_req);
    377358                arph->hrd_addr  = htons(ARPHRD_ETHER);
     
    381362                arph->opcode    = htons(ARPOP_REQUEST);
    382363
    383                 /* イーサネット ARP ヘッダを設定する。*/
     364                /* イーサネット ARP ヘッダを設定する。*/
    384365                et_arph = GET_ETHER_ARP_HDR(arp_req);
    385366                src     = IF_GET_IFNET()->in4_ifaddr.addr;
     
    389370                ahtonl(et_arph->tproto, dst);
    390371
    391                 /* 送信する。*/
     372                /* 送信する。*/
    392373                error = IF_RAW_OUTPUT(arp_req, TMO_ARP_OUTPUT);
    393374                }
     
    398379
    399380/*
    400  *  arp_get_cache -- ARP キャッシュを獲得する。
     381 *  arp_get_cache -- ARP キャッシュを獲得する。
    401382 */
    402383
     
    408389
    409390/*
    410  *  arp_input -- ARP のå
    411 ¥åŠ›é–¢æ•°
     391 *  arp_input -- ARP の入力関数
    412392 */
    413393
     
    420400        NET_COUNT_ARP(net_count_arp.in_packets, 1);
    421401
    422         /* ARP ヘッダの長さをチェックする。*/
     402        /* ARP ヘッダの長さをチェックする。*/
    423403        if (input->len < IF_ARP_HDR_SIZE)
    424404                goto buf_rel;
     
    427407
    428408        /*
    429          *  物理アドレスフォーマットが Ehternet 以外
    430          *  または、プロトコルが IP 以外はエラー。
     409         *  物理アドレスフォーマットが Ehternet 以外
     410         *  または、プロトコルが IP 以外はエラー。
    431411         */
    432412        if (ntohs(arph->hrd_addr) != ARPHRD_ETHER ||
     
    434414                goto buf_rel;
    435415
    436         /* ARP ヘッダ + Ether ARP ヘッダの長さをチェックする。*/
     416        /* ARP ヘッダ + Ether ARP ヘッダの長さをチェックする。*/
    437417        if (input->len < IF_ARP_ETHER_HDR_SIZE)
    438418                goto buf_rel;
     
    447427
    448428/*
    449  *  arp_resolve -- MAC アドレス解決
    450  *
    451  *    アドレス解決ができれば、戻り値は true を返し、できなければ
    452  *    送信をペンディングして、戻り値は false を返す。
     429 *  arp_resolve -- MAC アドレス解決
     430 *
     431 *    アドレス解決ができれば、戻り値は true を返し、できなければ
     432 *    送信をペンディングして、戻り値は false を返す。
    453433 */
    454434
     
    463443
    464444        /*
    465          *  次の場合は、イーサネットのブロードキャストアドレスを返す。
     445         *  次の場合は、イーサネットのブロードキャストアドレスを返す。
    466446         *
    467          *    ・å
    468 ¨ãƒ“ットが 1
    469          *    ・ホスト部のå
    470 ¨ãƒ“ットが 1 で、ネットワーク部がローカルアドレス
     447         *    ・全ビットが 1
     448         *    ・ホスト部の全ビットが 1 で、ネットワーク部がローカルアドレス
    471449         */
    472450        if (gw == IPV4_ADDR_BROADCAST ||
     
    476454                }
    477455
    478         /* 送信å
    479 ˆ GW の IP アドレスが ARP キャッシュにあるか調べる。*/
     456        /* 送信先 GW の IP アドレスが ARP キャッシュにあるか調べる。*/
    480457        syscall(wai_sem(SEM_ARP_CACHE_LOCK));
    481458        ent = arp_lookup(gw, true);
     
    486463                }
    487464        else {
    488                 /* 送信がペンデングされているフレームがあれば捨てる。*/
     465                /* 送信がペンデングされているフレームがあれば捨てる。*/
    489466                if (ent->hold) {
    490467                        NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
     
    493470
    494471                /*
    495                  *  送信をペンディングする。
    496                  *  IF でネットワークバッファを開放しないフラグが設定されているときは、
    497                  *  送信をペンディングしない。
     472                 *  送信をペンディングする。
     473                 *  IF でネットワークバッファを開放しないフラグが設定されているときは、
     474                 *  送信をペンディングしない。
    498475                 */
    499476                if ((output->flags & NB_FLG_NOREL_IFOUT) == 0)
     
    505482                syscall(sig_sem(SEM_ARP_CACHE_LOCK));
    506483
    507                 /* アドレス解決要求を送信する。*/
     484                /* アドレス解決要求を送信する。*/
    508485                arp_request(ifaddr, gw);
    509486                return false;
     
    512489
    513490/*
    514  *  arp_init -- ARP 初期化
     491 *  arp_init -- ARP 初期化
    515492 */
    516493
Note: See TracChangeset for help on using the changeset viewer.