Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

File:
1 edited

Legend:

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

    • Property svn:keywords deleted
    • Property svn:mime-type changed from text/x-csrc to text/x-csrc;charset=UTF-8
    r270 r321  
    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$
     
    121109
    122110/*
    123  *  ARP キャッシュエントリ
     111 *  ARP キャッシュエントリ
    124112 */
    125113
     
    127115
    128116/*
    129  *  関数
     117 *  関数
    130118 */
    131119
     
    135123
    136124/*
    137  *  arp_lookup -- ARP キャッシュの探索と登録
    138  *
    139  *    注意: SEM_ARP_CACHE_LOCK を獲得した状æ
    140 ‹ã§å‘¼å‡ºã™ã“と
     125 *  arp_lookup -- ARP キャッシュの探索と登録
     126 *
     127 *    注意: SEM_ARP_CACHE_LOCK を獲得した状態で呼出すこと
    141128 */
    142129
     
    152139                }
    153140
    154         /* create が真なら、新たなエントリを登録する。*/
     141        /* create が真なら、新たなエントリを登録する。*/
    155142        if (create) {
    156143
    157                 /* まず、空きがあれば、その空きを利用する。*/
     144                /* まず、空きがあれば、その空きを利用する。*/
    158145                for (ix = NUM_ARP_ENTRY; ix -- > 0; ) {
    159146                        if (arp_cache[ix].expire == 0) {
     
    164151
    165152                /*
    166                  *  空きがなければ、タイムアウトまで時間が最短の
    167                  *  エントリーを破棄して利用する。
     153                 *  空きがなければ、タイムアウトまで時間が最短の
     154                 *  エントリーを破棄して利用する。
    168155                 */
    169156                syslog(LOG_NOTICE, "[ARP] cache busy, size=%d", NUM_ARP_ENTRY);
     
    183170
    184171/*
    185  *  in_arpinput -- TCP/IP 用 ARP のå
    186 ¥åŠ›é–¢æ•°
     172 *  in_arpinput -- TCP/IP 用 ARP の入力関数
    187173 */
    188174
     
    200186        et_arph = GET_ETHER_ARP_HDR(input);
    201187
    202         ntoahl(saddr, et_arph->sproto);         /* 送信å
    203 ƒ IP アドレス       */
    204         ntoahl(taddr, et_arph->tproto);         /* 解決対象 IP アドレス */
    205 
    206         /*
    207          *  以下の場合はエラー
    208          *    ・送信ホストの物理アドレスが自分
    209          *    ・送信ホストの物理アドレスがブロードキャスト
     188        ntoahl(saddr, et_arph->sproto);         /* 送信元 IP アドレス  */
     189        ntoahl(taddr, et_arph->tproto);         /* 解決対象 IP アドレス */
     190
     191        /*
     192         *  以下の場合はエラー
     193         *    ・送信ホストの物理アドレスが自分
     194         *    ・送信ホストの物理アドレスがブロードキャスト
    210195         */
    211196        if (memcmp(et_arph->shost, ifaddr->lladdr,        ETHER_ADDR_LEN) == 0 ||
     
    214199
    215200        /*
    216          *  送信ホストの IP アドレスが自分の場合は、重複しているので
    217          *  相手にも知らせる。
     201         *  送信ホストの IP アドレスが自分の場合は、重複しているので
     202         *  相手にも知らせる。
    218203         */
    219204        if (saddr == ifp->in_ifaddr.addr) {
     
    240225
    241226        /*
    242          *  以下の場合は何もしない。
    243          *    ・解決対象 IP アドレスが自分ではない、注: å
    244 ƒã® FreeBSD の
    245          *      実è£
    246 ã§ã¯ã€ARP PROXY 等のため、自分以外の IP アドレスの
    247          *      解決も行っているが、本実è£
    248 ã§ã¯ã€è‡ªåˆ†ä»¥å¤–の IP
    249          *      アドレスの解決は行わない。
     227         *  以下の場合は何もしない。
     228         *    ・解決対象 IP アドレスが自分ではない、注: 元の FreeBSD の
     229         *      実装では、ARP PROXY 等のため、自分以外の IP アドレスの
     230         *      解決も行っているが、本実装では、自分以外の IP
     231         *      アドレスの解決は行わない。
    250232         */
    251233        if (taddr != ifp->in_ifaddr.addr)
     
    253235
    254236        /*
    255          *  送信å
    256 ƒ IP アドレスが ARP キャッシュにあるか調べる。
    257          *  キャッシュになければ、新たにエントリを登録する。
     237         *  送信元 IP アドレスが ARP キャッシュにあるか調べる。
     238         *  キャッシュになければ、新たにエントリを登録する。
    258239         */
    259240        syscall(wai_sem(SEM_ARP_CACHE_LOCK));
     
    264245
    265246        /*
    266          *  送信がペンデングされているフレームがあれば送信する。
     247         *  送信がペンデングされているフレームがあれば送信する。
    267248         */
    268249        if (ent->hold) {
    269250
    270                 /* フレームの Ethernet ヘッダを設定する。*/
     251                /* フレームの Ethernet ヘッダを設定する。*/
    271252                memcpy(GET_ETHER_HDR(ent->hold)->dhost, ent->mac_addr, ETHER_ADDR_LEN);
    272253
     
    275256                syscall(sig_sem(SEM_ARP_CACHE_LOCK));
    276257
    277                 /* ペンディングされているフレームを送信する。*/
     258                /* ペンディングされているフレームを送信する。*/
    278259                IF_RAW_OUTPUT(pending, TMO_FEVR);
    279260
     
    286267        arph = GET_ARP_HDR(input);
    287268
    288         /* アドレス解決要求でなければ終了 */
     269        /* アドレス解決要求でなければ終了 */
    289270        if (ntohs(arph->opcode) != ARPOP_REQUEST)
    290271                goto buf_rel;
    291272
    292         /* Ethernet ARP ヘッダを設定する。*/
     273        /* Ethernet ARP ヘッダを設定する。*/
    293274        memcpy(et_arph->thost, et_arph->shost, ETHER_ADDR_LEN);
    294275        memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
     
    296277        ahtonl(et_arph->sproto, taddr);
    297278
    298         /* Ethernet ARP ヘッダを設定する。*/
     279        /* Ethernet ARP ヘッダを設定する。*/
    299280        arph->opcode = htons(ARPOP_REPLY);
    300281
    301         /* Ethernet ヘッダを設定する。*/
     282        /* Ethernet ヘッダを設定する。*/
    302283        eth = GET_ETHER_HDR(input);
    303284        memcpy(eth->dhost, eth->shost,     ETHER_ADDR_LEN);
    304285        memcpy(eth->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
    305286
    306         /* ARP 応答を送信する。*/
     287        /* ARP 応答を送信する。*/
    307288        IF_RAW_OUTPUT(input, TMO_FEVR);
    308289        return;
     
    315296
    316297/*
    317  *  arp_timer -- ARP キャッシュの更新
     298 *  arp_timer -- ARP キャッシュの更新
    318299 */
    319300
     
    329310                        arp_cache[ix].expire -= ARP_TIMER_TMO;
    330311                        if (arp_cache[ix].expire == 0) {
    331                                 /* 送信がペンデングされているフレームがあれば捨てる。*/
     312                                /* 送信がペンデングされているフレームがあれば捨てる。*/
    332313                                if (arp_cache[ix].hold) {
    333314                                        NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
     
    344325
    345326/*
    346  *  arp_request -- MAC アドレス解決要求
     327 *  arp_request -- MAC アドレス解決要求
    347328 */
    348329
     
    362343        if ((error = tget_net_buf(&arp_req, IF_ARP_ETHER_HDR_SIZE, TMO_ARP_GET_NET_BUF)) == E_OK) {
    363344
    364                 /* イーサネットヘッダを設定する。*/
     345                /* イーサネットヘッダを設定する。*/
    365346                eth     = GET_ETHER_HDR(arp_req);
    366347                memcpy(eth->dhost, ether_broad_cast_addr, ETHER_ADDR_LEN);
     
    368349                eth->type = htons(ETHER_TYPE_ARP);
    369350
    370                 /* ARP ヘッダを設定する。*/
     351                /* ARP ヘッダを設定する。*/
    371352                arph    = GET_ARP_HDR(arp_req);
    372353                arph->hrd_addr  = htons(ARPHRD_ETHER);
     
    376357                arph->opcode    = htons(ARPOP_REQUEST);
    377358
    378                 /* イーサネット ARP ヘッダを設定する。*/
     359                /* イーサネット ARP ヘッダを設定する。*/
    379360                et_arph = GET_ETHER_ARP_HDR(arp_req);
    380361                src     = IF_GET_IFNET()->in_ifaddr.addr;
     
    384365                ahtonl(et_arph->tproto, dst);
    385366
    386                 /* 送信する。*/
     367                /* 送信する。*/
    387368                error = IF_RAW_OUTPUT(arp_req, TMO_ARP_OUTPUT);
    388369                }
     
    393374
    394375/*
    395  *  arp_get_cache -- ARP キャッシュを獲得する。
     376 *  arp_get_cache -- ARP キャッシュを獲得する。
    396377 */
    397378
     
    403384
    404385/*
    405  *  arp_input -- ARP のå
    406 ¥åŠ›é–¢æ•°
     386 *  arp_input -- ARP の入力関数
    407387 */
    408388
     
    415395        NET_COUNT_ARP(net_count_arp.in_packets, 1);
    416396
    417         /* ARP ヘッダの長さをチェックする。*/
     397        /* ARP ヘッダの長さをチェックする。*/
    418398        if (input->len < IF_ARP_HDR_SIZE)
    419399                goto buf_rel;
     
    422402
    423403        /*
    424          *  物理アドレスフォーマットが Ehternet 以外
    425          *  または、プロトコルが IP 以外はエラー。
     404         *  物理アドレスフォーマットが Ehternet 以外
     405         *  または、プロトコルが IP 以外はエラー。
    426406         */
    427407        if (ntohs(arph->hrd_addr) != ARPHRD_ETHER ||
     
    429409                goto buf_rel;
    430410
    431         /* ARP ヘッダ + Ether ARP ヘッダの長さをチェックする。*/
     411        /* ARP ヘッダ + Ether ARP ヘッダの長さをチェックする。*/
    432412        if (input->len < IF_ARP_ETHER_HDR_SIZE)
    433413                goto buf_rel;
     
    442422
    443423/*
    444  *  arp_resolve -- MAC アドレス解決
    445  *
    446  *    アドレス解決ができれば、戻り値は true を返し、できなければ
    447  *    送信をペンディングして、戻り値は false を返す。
     424 *  arp_resolve -- MAC アドレス解決
     425 *
     426 *    アドレス解決ができれば、戻り値は true を返し、できなければ
     427 *    送信をペンディングして、戻り値は false を返す。
    448428 */
    449429
     
    458438
    459439        /*
    460          *  次の場合は、イーサネットのブロードキャストアドレスを返す。
     440         *  次の場合は、イーサネットのブロードキャストアドレスを返す。
    461441         *
    462          *    ・å
    463 ¨ãƒ“ットが 1
    464          *    ・ホスト部のå
    465 ¨ãƒ“ットが 1 で、ネットワーク部がローカルアドレス
     442         *    ・全ビットが 1
     443         *    ・ホスト部の全ビットが 1 で、ネットワーク部がローカルアドレス
    466444         */
    467445        if (gw == IPV4_ADDR_BROADCAST ||
     
    471449                }
    472450
    473         /* 送信å
    474 ˆ GW の IP アドレスが ARP キャッシュにあるか調べる。*/
     451        /* 送信先 GW の IP アドレスが ARP キャッシュにあるか調べる。*/
    475452        syscall(wai_sem(SEM_ARP_CACHE_LOCK));
    476453        ent = arp_lookup(gw, true);
     
    481458                }
    482459        else {
    483                 /* 送信がペンデングされているフレームがあれば捨てる。*/
     460                /* 送信がペンデングされているフレームがあれば捨てる。*/
    484461                if (ent->hold) {
    485462                        NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
     
    488465
    489466                /*
    490                  *  送信をペンディングする。
    491                  *  IF でネットワークバッファを開放しないフラグが設定されているときは、
    492                  *  送信をペンディングしない。
     467                 *  送信をペンディングする。
     468                 *  IF でネットワークバッファを開放しないフラグが設定されているときは、
     469                 *  送信をペンディングしない。
    493470                 */
    494471                if ((output->flags & NB_FLG_NOREL_IFOUT) == 0)
     
    500477                syscall(sig_sem(SEM_ARP_CACHE_LOCK));
    501478
    502                 /* アドレス解決要求を送信する。*/
     479                /* アドレス解決要求を送信する。*/
    503480                arp_request(ifaddr, gw);
    504481                return false;
     
    507484
    508485/*
    509  *  arp_init -- ARP 初期化
     486 *  arp_init -- ARP 初期化
    510487 */
    511488
     
    518495#ifdef ETHER_CFG_MULTICAST
    519496/*
    520  *  ether_map_ipv4_multicast -- IPv4 マルチキャストアドレスからイーサネット・マルチキャストアドレスへの変換
     497 *  ether_map_ipv4_multicast -- IPv4 マルチキャストアドレスからイーサネット・マルチキャストアドレスへの変換
    521498 */
    522499
Note: See TracChangeset for help on using the changeset viewer.