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/netinet6/ip6_input.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$
     
    158146
    159147/*
    160  *  関数
     148 *  関数
    161149 */
    162150
     
    164152
    165153/*
    166  *  上位プロトコル選択構造体
     154 *  上位プロトコル選択構造体
    167155 */
    168156
    169157typedef struct t_proto_switch {
    170         uint_t (*func)(T_NET_BUF **, uint_t *, uint_t *);       /* å
    171 ¥åŠ›é–¢æ•°              */
    172         uint_t proto;                                           /* プロトコル番号        */
     158        uint_t (*func)(T_NET_BUF **, uint_t *, uint_t *);       /* 入力関数         */
     159        uint_t proto;                                           /* プロトコル番号      */
    173160        } T_PROTO_SWITCH;
    174161
    175162static const T_PROTO_SWITCH proto_switch[] = {
    176         { esp6_input,   IPPROTO_ESP             },      /* IPv6 暗号化ヘッダ      */
    177         { ah6_input,    IPPROTO_AH              },      /* IPv6 認証ヘッダ */
    178         { frag6_input,  IPPROTO_FRAGMENT        },      /* 断片ヘッダ              */
    179         { route6_input, IPPROTO_ROUTING         },      /* 経路制御ヘッダ        */
    180         { dest6_input,  IPPROTO_DSTOPTS         },      /* IPv6 終点オプション   */
     163        { esp6_input,   IPPROTO_ESP             },      /* IPv6 暗号化ヘッダ  */
     164        { ah6_input,    IPPROTO_AH              },      /* IPv6 認証ヘッダ   */
     165        { frag6_input,  IPPROTO_FRAGMENT        },      /* 断片ヘッダ                */
     166        { route6_input, IPPROTO_ROUTING         },      /* 経路制御ヘッダ      */
     167        { dest6_input,  IPPROTO_DSTOPTS         },      /* IPv6 終点オプション */
    181168        { ip6_no_header_input,
    182                         IPPROTO_NONE            },      /* 次ヘッダ無し           */
     169                        IPPROTO_NONE            },      /* 次ヘッダ無し               */
    183170        { icmp6_input,  IPPROTO_ICMPV6          },
    184171
     
    204191
    205192/*
    206  *  get_upper_proto -- 上位プロトコル処理関数を返す。
     193 *  get_upper_proto -- 上位プロトコル処理関数を返す。
    207194 */
    208195
     
    219206
    220207/*
    221  *  ip6_no_header_input -- 次ヘッダが無しの場合のå
    222 ¥åŠ›å‡¦ç†
     208 *  ip6_no_header_input -- 次ヘッダが無しの場合の入力処理
    223209 */
    224210
     
    231217
    232218/*
    233  *  ip6_hopopts_input -- 中継点オプションå
    234 ¥åŠ›å‡¦ç†
    235  *
    236  *    本実è£
    237 ã§ã¯ã€ãƒ‘ディング以外のオプションをå
    238 ¨ã¦æœªçŸ¥ã‚ªãƒ—ションとして処理する。
    239  *
    240  *    戻り値:
    241  *
    242  *      0 以上                正常
    243  *      IP6_OPT_RET_ERR (-1)    エラー、呼出側でネットワークバッファを開放する。
    244  *      IP6_OPT_RET_REL (-2)    エラー、ネットワークバッファは開放されている。
     219 *  ip6_hopopts_input -- 中継点オプション入力処理
     220 *
     221 *    本実装では、パディング以外のオプションを全て未知オプションとして処理する。
     222 *
     223 *    戻り値:
     224 *
     225 *      0 以上            正常
     226 *      IP6_OPT_RET_ERR (-1)    エラー、呼出側でネットワークバッファを開放する。
     227 *      IP6_OPT_RET_REL (-2)    エラー、ネットワークバッファは開放されている。
    245228 */
    246229
     
    290273
    291274/*
    292  *  ip6_get_prev_hdr -- 直前の拡張ヘッダの next フィールドのアドレスを返す。
    293  *
    294  *    注意: off には IF_HDR_SIZE も含まれている。
     275 *  ip6_get_prev_hdr -- 直前の拡張ヘッダの next フィールドのアドレスを返す。
     276 *
     277 *    注意: off には IF_HDR_SIZE も含まれている。
    295278 */
    296279
     
    336319
    337320/*
    338  *  ip6_init -- IPv6 の初期化関数
     321 *  ip6_init -- IPv6 の初期化関数
    339322 */
    340323
     
    347330
    348331/*
    349  *  ip6_input -- IPv6 のå
    350 ¥åŠ›é–¢æ•°
     332 *  ip6_input -- IPv6 の入力関数
    351333 */
    352334
     
    365347        NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInReceives, 1);
    366348
    367         /* IP ヘッダの長さをチェックする。*/
     349        /* IP ヘッダの長さをチェックする。*/
    368350        if (input->len < IF_IP6_HDR_SIZE) {
    369351                NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1);
     
    374356        ip6h = GET_IP6_HDR(input);
    375357
    376         /* バージョンをチェックする。*/
     358        /* バージョンをチェックする。*/
    377359        if (IP6_VCF_V(ntohl(ip6h->vcf)) != IPV6_VERSION) {
    378360                NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_VER], 1);
     
    382364
    383365        /*
    384          *  次のデータグラムは破棄する。
     366         *  次のデータグラムは破棄する。
    385367         *
    386          *    ・始点アドレスがマルチキャスト
    387          *    ・終点アドレスが未定義
     368         *    ・始点アドレスがマルチキャスト
     369         *    ・終点アドレスが未定義
    388370         *
    389          *  ネットワークインタフェースがループバックでないとき、
    390          *  次のデータグラムも破棄する。
     371         *  ネットワークインタフェースがループバックでないとき、
     372         *  次のデータグラムも破棄する。
    391373         *
    392          *    ・始点アドレスがループバック
    393          *    ・終点アドレスがループバック
     374         *    ・始点アドレスがループバック
     375         *    ・終点アドレスがループバック
    394376         *
    395          *  悪意のあるユーザが TCP/UDP スタックの混乱や
    396          *  セキュリティチェックをバイパスするため、IPv4
    397          *  マップアドレスを悪用することを防ぐため
    398          *  以下のデータグラムは破棄する。 
     377         *  悪意のあるユーザが TCP/UDP スタックの混乱や
     378         *  セキュリティチェックをバイパスするため、IPv4
     379         *  マップアドレスを悪用することを防ぐため
     380         *  以下のデータグラムは破棄する。 
    399381         *
    400          *    ・始点アドレスが ::ffff:127.0.0.1
    401          *    ・終点アドレスが ::ffff:127.0.0.1
     382         *    ・始点アドレスが ::ffff:127.0.0.1
     383         *    ・終点アドレスが ::ffff:127.0.0.1
    402384         */
    403385
     
    432414
    433415        if (IN6_IS_ADDR_MULTICAST(&ip6h->dst)) {
    434                 /* 宛å
    435 ˆãŒãƒžãƒ«ãƒã‚­ãƒ£ã‚¹ãƒˆã®å ´åˆã®å‡¦ç† */
     416                /* 宛先がマルチキャストの場合の処理 */
    436417                NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInMcastPkts, 1);
    437418                if (!in6_lookup_multi(ifp, &ip6h->dst)) {
     
    448429                        }
    449430
    450                 /*  アドレスが未解決の場合はデータグラムを破棄する。*/
     431                /*  アドレスが未解決の場合はデータグラムを破棄する。*/
    451432                if (IFA6_IS_NOTREADY(ia6)) {
    452433                        NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_ADDR], 1);
     
    456437                }
    457438
    458         /* オフセットを設定する。*/
     439        /* オフセットを設定する。*/
    459440        offp  = GET_IP6_NEXT_HDR(input) - input->buf;
    460441
    461         /* ペイロード長を取り出す。*/
     442        /* ペイロード長を取り出す。*/
    462443        plen = ntohs(ip6h->plen);
    463444
    464445
    465         /* 次ヘッダの位置を初期化する。*/
     446        /* 次ヘッダの位置を初期化する。*/
    466447        nextp = offsetof(T_IP6_HDR, next);
    467448
    468449        /*
    469          *  中継点 (Hop-by-Hop) オプションヘッダのチェック
     450         *  中継点 (Hop-by-Hop) オプションヘッダのチェック
    470451         */
    471452        if (ip6h->next == IPPROTO_HOPOPTS) {
    472453
    473                 /* 中継点ヘッダの長さをチェックする。*/
     454                /* 中継点ヘッダの長さをチェックする。*/
    474455                if (plen < sizeof(T_IP6_HBH_HDR)) {
    475456                        NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1);
     
    492473
    493474                /*
    494                  *  ペイロード長が 0 で、中継点オプションがあるときは、
    495                  *  巨大ペイロード・オプションが含まれなければならない。
    496                  *  このとき、巨大ペイロード・オプションにある
    497                  *  ペイロード長をチェックするå¿
    498 è¦ãŒã‚るが、本実è£
    499 ã§ã¯ã€
    500                  *  巨大ペイロード・オプションを未知のオプションとして
    501                  *  扱うので、何もしない。
     475                 *  ペイロード長が 0 で、中継点オプションがあるときは、
     476                 *  巨大ペイロード・オプションが含まれなければならない。
     477                 *  このとき、巨大ペイロード・オプションにある
     478                 *  ペイロード長をチェックする必要があるが、本実装では、
     479                 *  巨大ペイロード・オプションを未知のオプションとして
     480                 *  扱うので、何もしない。
    502481                 */
    503482                next = ((T_IP6_HBH_HDR *)(ip6h + 1))->next;
     
    506485                next = ip6h->next;
    507486
    508         /* IPv6 データグラム長をチェックする。*/
     487        /* IPv6 データグラム長をチェックする。*/
    509488        if (input->len - IF_IP6_HDR_SIZE < plen) {
    510489                NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1);
     
    515494                input->len = IF_IP6_HDR_SIZE + plen;
    516495
    517         /* 上位プロトコル処理関数を呼び出す。*/
     496        /* 上位プロトコル処理関数を呼び出す。*/
    518497        nest = 0;
    519498        while (next != IPPROTO_DONE) {
     
    528507                        NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInUnknownProtos, 1);
    529508
    530                         /* icmp6_error でネットワークバッファを開放する。*/
     509                        /* icmp6_error でネットワークバッファを開放する。*/
    531510                        icmp6_error(input, ICMP6_PARAM_PROB,
    532511                                           ICMP6_PARAMPROB_NEXT_HEADER, nextp);
     
    545524
    546525/*
    547  *  ip6_nexthdr -- 次のヘッダのオフセットを返す。
    548  *
    549  *    戻り値 == -1 : 最後のヘッダ、またはエラー。
    550  *    戻り値 >   0 : さらにヘッダが続く。
     526 *  ip6_nexthdr -- 次のヘッダのオフセットを返す。
     527 *
     528 *    戻り値 == -1 : 最後のヘッダ、またはエラー。
     529 *    戻り値 >   0 : さらにヘッダが続く。
    551530 */
    552531
     
    566545                break;
    567546
    568         case IPPROTO_FRAGMENT:                  /* 断片ヘッダ */
     547        case IPPROTO_FRAGMENT:                  /* 断片ヘッダ */
    569548                if (nbuf->len < off + sizeof(T_IP6_FRAG_HDR))
    570549                        return (ER_UINT)-1;
    571550
    572                 /* 中間のフラグメントの場合は処理をやめる。*/
     551                /* 中間のフラグメントの場合は処理をやめる。*/
    573552                ip6fh = (T_IP6_FRAG_HDR *)(nbuf->buf + off);
    574553                if (ntohs(ip6fh->off_flag) & IP6F_MORE_FRAG)
     
    579558                break;
    580559
    581         case IPPROTO_AH:                /* IPv6 認証ヘッダ                 */
    582         case IPPROTO_HOPOPTS:           /* IPv6 中継点 (Hop-by-Hop) オプション  */
    583         case IPPROTO_ROUTING:           /* 経路制御ヘッダ                        */
    584         case IPPROTO_DSTOPTS:           /* IPv6 終点オプション                   */
     560        case IPPROTO_AH:                /* IPv6 認証ヘッダ                   */
     561        case IPPROTO_HOPOPTS:           /* IPv6 中継点 (Hop-by-Hop) オプション  */
     562        case IPPROTO_ROUTING:           /* 経路制御ヘッダ                      */
     563        case IPPROTO_DSTOPTS:           /* IPv6 終点オプション                 */
    585564                if (nbuf->len < off + sizeof(T_IP6_EXT_HDR))
    586565                        return (ER_UINT)-1;
     
    599578
    600579/*
    601  *  ip6_lasthdr -- 最後のヘッダのオフセットを返す。
     580 *  ip6_lasthdr -- 最後のヘッダのオフセットを返す。
    602581 */
    603582
     
    618597
    619598/*
    620  *  ip6_unknown_opt -- 未知のオプションの処理
    621  *
    622  *    戻り値:
    623  *
    624  *      0 以上                        正常、オプション長。
    625  *      IP6_OPT_RET_ERR (-1)    エラー、呼出側でネットワークバッファを開放する。
    626  *      IP6_OPT_RET_REL (-2)    エラー、ネットワークバッファは開放されている。
     599 *  ip6_unknown_opt -- 未知のオプションの処理
     600 *
     601 *    戻り値:
     602 *
     603 *      0 以上                    正常、オプション長。
     604 *      IP6_OPT_RET_ERR (-1)    エラー、呼出側でネットワークバッファを開放する。
     605 *      IP6_OPT_RET_REL (-2)    エラー、ネットワークバッファは開放されている。
    627606 */
    628607
     
    631610{
    632611        switch (IP6OPT_TYPE(*opt)) {
    633         case IP6OPT_TYPE_SKIP:          /* 無視する。                      */
     612        case IP6OPT_TYPE_SKIP:          /* 無視する。                        */
    634613                return *(opt + 1);
    635614                break;
    636         case IP6OPT_TYPE_ICMP:          /* 破棄して、マルチキャストでなければ ICMP を返送する。  */
     615        case IP6OPT_TYPE_ICMP:          /* 破棄して、マルチキャストでなければ ICMP を返送する。        */
    637616                if (IN6_IS_ADDR_MULTICAST(&GET_IP6_HDR(input)->dst))
    638617                        return IP6_OPT_RET_ERR;
    639618                /* no break; */
    640         case IP6OPT_TYPE_FORCEICMP:     /* 破棄して、ICMP を返送する。       */
     619        case IP6OPT_TYPE_FORCEICMP:     /* 破棄して、ICMP を返送する。     */
    641620                icmp6_error(input, ICMP6_PARAM_PROB,
    642621                                   ICMP6_PARAMPROB_OPTION,
     
    644623                return IP6_OPT_RET_REL;
    645624                break;
    646         /*case IP6OPT_TYPE_DISCARD:     ãƒ‡ãƒ¼ã‚¿ã‚°ãƒ©ãƒ ã‚’破棄する。    */
     625        /*case IP6OPT_TYPE_DISCARD:     データグラムを破棄する。    */
    647626                }
    648627
     
    651630
    652631/*
    653  *  ip6_remove_exthdrs -- IPv6 拡張ヘッダを削除し、以降を前に詰める。
     632 *  ip6_remove_exthdrs -- IPv6 拡張ヘッダを削除し、以降を前に詰める。
    654633 */
    655634
     
    660639        uint_t  next;
    661640
    662         /* 開始オフセットを IP ヘッダに設定する。*/
     641        /* 開始オフセットを IP ヘッダに設定する。*/
    663642        off = ((uint8_t *)GET_IP_HDR(nbuf)) - nbuf->buf;
    664643
    665         /* 最終ヘッダを探索する。*/
     644        /* 最終ヘッダを探索する。*/
    666645        off = ip6_lasthdr(nbuf, off, IPPROTO_IPV6, &next);
    667646
Note: See TracChangeset for help on using the changeset viewer.