Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/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
    r388 r389  
    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$
     
    161149
    162150/*
    163  *  関数
     151 *  関数
    164152 */
    165153
     
    167155
    168156/*
    169  *  上位プロトコル選択構造体
     157 *  上位プロトコル選択構造体
    170158 */
    171159
    172160typedef struct t_proto_switch {
    173         uint_t (*func)(T_NET_BUF **, uint_t *, uint_t *);       /* å
    174 ¥åŠ›é–¢æ•°              */
    175         uint_t proto;                                           /* プロトコル番号        */
     161        uint_t (*func)(T_NET_BUF **, uint_t *, uint_t *);       /* 入力関数         */
     162        uint_t proto;                                           /* プロトコル番号      */
    176163        } T_PROTO_SWITCH;
    177164
    178165static const T_PROTO_SWITCH proto_switch[] = {
    179         { esp6_input,   IPPROTO_ESP             },      /* IPv6 暗号化ヘッダ      */
    180         { ah6_input,    IPPROTO_AH              },      /* IPv6 認証ヘッダ */
    181         { frag6_input,  IPPROTO_FRAGMENT        },      /* 断片ヘッダ              */
    182         { route6_input, IPPROTO_ROUTING         },      /* 経路制御ヘッダ        */
    183         { dest6_input,  IPPROTO_DSTOPTS         },      /* IPv6 終点オプション   */
     166        { esp6_input,   IPPROTO_ESP             },      /* IPv6 暗号化ヘッダ  */
     167        { ah6_input,    IPPROTO_AH              },      /* IPv6 認証ヘッダ   */
     168        { frag6_input,  IPPROTO_FRAGMENT        },      /* 断片ヘッダ                */
     169        { route6_input, IPPROTO_ROUTING         },      /* 経路制御ヘッダ      */
     170        { dest6_input,  IPPROTO_DSTOPTS         },      /* IPv6 終点オプション */
    184171        { ip6_no_header_input,
    185                         IPPROTO_NONE            },      /* 次ヘッダ無し           */
     172                        IPPROTO_NONE            },      /* 次ヘッダ無し               */
    186173        { icmp6_input,  IPPROTO_ICMPV6          },
    187174
     
    207194
    208195/*
    209  *  get_upper_proto -- 上位プロトコル処理関数を返す。
     196 *  get_upper_proto -- 上位プロトコル処理関数を返す。
    210197 */
    211198
     
    222209
    223210/*
    224  *  ip6_no_header_input -- 次ヘッダが無しの場合のå
    225 ¥åŠ›å‡¦ç†
     211 *  ip6_no_header_input -- 次ヘッダが無しの場合の入力処理
    226212 */
    227213
     
    234220
    235221/*
    236  *  ip6_hopopts_input -- 中継点オプションå
    237 ¥åŠ›å‡¦ç†
    238  *
    239  *    本実è£
    240 ã§ã¯ã€ãƒ‘ディング以外のオプションをå
    241 ¨ã¦æœªçŸ¥ã‚ªãƒ—ションとして処理する。
    242  *
    243  *    戻り値:
    244  *
    245  *      0 以上                正常
    246  *      IP6_OPT_RET_ERR (-1)    エラー、呼出側でネットワークバッファを開放する。
    247  *      IP6_OPT_RET_REL (-2)    エラー、ネットワークバッファは開放されている。
     222 *  ip6_hopopts_input -- 中継点オプション入力処理
     223 *
     224 *    本実装では、パディング以外のオプションを全て未知オプションとして処理する。
     225 *
     226 *    戻り値:
     227 *
     228 *      0 以上            正常
     229 *      IP6_OPT_RET_ERR (-1)    エラー、呼出側でネットワークバッファを開放する。
     230 *      IP6_OPT_RET_REL (-2)    エラー、ネットワークバッファは開放されている。
    248231 */
    249232
     
    293276
    294277/*
    295  *  ip6_get_prev_hdr -- 直前の拡張ヘッダの next フィールドのアドレスを返す。
    296  *
    297  *    注意: off には IF_HDR_SIZE も含まれている。
     278 *  ip6_get_prev_hdr -- 直前の拡張ヘッダの next フィールドのアドレスを返す。
     279 *
     280 *    注意: off には IF_HDR_SIZE も含まれている。
    298281 */
    299282
     
    339322
    340323/*
    341  *  ip6_init -- IPv6 の初期化関数
     324 *  ip6_init -- IPv6 の初期化関数
    342325 */
    343326
     
    350333
    351334/*
    352  *  ip6_input -- IPv6 のå
    353 ¥åŠ›é–¢æ•°
     335 *  ip6_input -- IPv6 の入力関数
    354336 */
    355337
     
    368350        NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInReceives, 1);
    369351
    370         /* IP ヘッダの長さをチェックする。*/
     352        /* IP ヘッダの長さをチェックする。*/
    371353        if (input->len < IF_IP6_HDR_SIZE) {
    372354                NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1);
     
    377359        ip6h = GET_IP6_HDR(input);
    378360
    379         /* バージョンをチェックする。*/
     361        /* バージョンをチェックする。*/
    380362        if (IP6_VCF_V(ntohl(ip6h->vcf)) != IPV6_VERSION) {
    381363                NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_VER], 1);
     
    385367
    386368        /*
    387          *  次のデータグラムは破棄する。
     369         *  次のデータグラムは破棄する。
    388370         *
    389          *    ・始点アドレスがマルチキャスト
    390          *    ・終点アドレスが未定義
     371         *    ・始点アドレスがマルチキャスト
     372         *    ・終点アドレスが未定義
    391373         *
    392          *  ネットワークインタフェースがループバックでないとき、
    393          *  次のデータグラムも破棄する。
     374         *  ネットワークインタフェースがループバックでないとき、
     375         *  次のデータグラムも破棄する。
    394376         *
    395          *    ・始点アドレスがループバック
    396          *    ・終点アドレスがループバック
     377         *    ・始点アドレスがループバック
     378         *    ・終点アドレスがループバック
    397379         *
    398          *  悪意のあるユーザが TCP/UDP スタックの混乱や
    399          *  セキュリティチェックをバイパスするため、IPv4
    400          *  マップアドレスを悪用することを防ぐため
    401          *  以下のデータグラムは破棄する。 
     380         *  悪意のあるユーザが TCP/UDP スタックの混乱や
     381         *  セキュリティチェックをバイパスするため、IPv4
     382         *  マップアドレスを悪用することを防ぐため
     383         *  以下のデータグラムは破棄する。 
    402384         *
    403          *    ・始点アドレスが ::ffff:127.0.0.1
    404          *    ・終点アドレスが ::ffff:127.0.0.1
     385         *    ・始点アドレスが ::ffff:127.0.0.1
     386         *    ・終点アドレスが ::ffff:127.0.0.1
    405387         */
    406388
     
    435417
    436418        if (IN6_IS_ADDR_MULTICAST(&ip6h->dst)) {
    437                 /* 宛å
    438 ˆãŒãƒžãƒ«ãƒã‚­ãƒ£ã‚¹ãƒˆã®å ´åˆã®å‡¦ç† */
     419                /* 宛先がマルチキャストの場合の処理 */
    439420                NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInMcastPkts, 1);
    440421                if (!in6_lookup_multi(ifp, &ip6h->dst)) {
     
    451432                        }
    452433
    453                 /*  アドレスが未解決の場合はデータグラムを破棄する。*/
     434                /*  アドレスが未解決の場合はデータグラムを破棄する。*/
    454435                if (IFA6_IS_NOTREADY(ia6)) {
    455436                        NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_ADDR], 1);
     
    459440                }
    460441
    461         /* オフセットを設定する。*/
     442        /* オフセットを設定する。*/
    462443        offp  = GET_IP6_NEXT_HDR(input) - input->buf;
    463444
    464         /* ペイロード長を取り出す。*/
     445        /* ペイロード長を取り出す。*/
    465446        plen = ntohs(ip6h->plen);
    466447
    467448
    468         /* 次ヘッダの位置を初期化する。*/
     449        /* 次ヘッダの位置を初期化する。*/
    469450        nextp = offsetof(T_IP6_HDR, next);
    470451
    471452        /*
    472          *  中継点 (Hop-by-Hop) オプションヘッダのチェック
     453         *  中継点 (Hop-by-Hop) オプションヘッダのチェック
    473454         */
    474455        if (ip6h->next == IPPROTO_HOPOPTS) {
    475456
    476                 /* 中継点ヘッダの長さをチェックする。*/
     457                /* 中継点ヘッダの長さをチェックする。*/
    477458                if (plen < sizeof(T_IP6_HBH_HDR)) {
    478459                        NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1);
     
    495476
    496477                /*
    497                  *  ペイロード長が 0 で、中継点オプションがあるときは、
    498                  *  巨大ペイロード・オプションが含まれなければならない。
    499                  *  このとき、巨大ペイロード・オプションにある
    500                  *  ペイロード長をチェックするå¿
    501 è¦ãŒã‚るが、本実è£
    502 ã§ã¯ã€
    503                  *  巨大ペイロード・オプションを未知のオプションとして
    504                  *  扱うので、何もしない。
     478                 *  ペイロード長が 0 で、中継点オプションがあるときは、
     479                 *  巨大ペイロード・オプションが含まれなければならない。
     480                 *  このとき、巨大ペイロード・オプションにある
     481                 *  ペイロード長をチェックする必要があるが、本実装では、
     482                 *  巨大ペイロード・オプションを未知のオプションとして
     483                 *  扱うので、何もしない。
    505484                 */
    506485                next = ((T_IP6_HBH_HDR *)(ip6h + 1))->next;
     
    509488                next = ip6h->next;
    510489
    511         /* IPv6 データグラム長をチェックする。*/
     490        /* IPv6 データグラム長をチェックする。*/
    512491        if (input->len - IF_IP6_HDR_SIZE < plen) {
    513492                NET_COUNT_IP6(net_count_ip6[NC_IP6_IN_ERR_SHORT], 1);
     
    518497                input->len = IF_IP6_HDR_SIZE + plen;
    519498
    520         /* 上位プロトコル処理関数を呼び出す。*/
     499        /* 上位プロトコル処理関数を呼び出す。*/
    521500        nest = 0;
    522501        while (next != IPPROTO_DONE) {
     
    531510                        NET_COUNT_MIB(in6_ifstat.ipv6IfStatsInUnknownProtos, 1);
    532511
    533                         /* icmp6_error でネットワークバッファを開放する。*/
     512                        /* icmp6_error でネットワークバッファを開放する。*/
    534513                        icmp6_error(input, ICMP6_PARAM_PROB,
    535514                                           ICMP6_PARAMPROB_NEXT_HEADER, nextp);
     
    548527
    549528/*
    550  *  ip6_nexthdr -- 次のヘッダのオフセットを返す。
    551  *
    552  *    戻り値 == -1 : 最後のヘッダ、またはエラー。
    553  *    戻り値 >   0 : さらにヘッダが続く。
     529 *  ip6_nexthdr -- 次のヘッダのオフセットを返す。
     530 *
     531 *    戻り値 == -1 : 最後のヘッダ、またはエラー。
     532 *    戻り値 >   0 : さらにヘッダが続く。
    554533 */
    555534
     
    569548                break;
    570549
    571         case IPPROTO_FRAGMENT:                  /* 断片ヘッダ */
     550        case IPPROTO_FRAGMENT:                  /* 断片ヘッダ */
    572551                if (nbuf->len < off + sizeof(T_IP6_FRAG_HDR))
    573552                        return (ER_UINT)-1;
    574553
    575                 /* 中間のフラグメントの場合は処理をやめる。*/
     554                /* 中間のフラグメントの場合は処理をやめる。*/
    576555                ip6fh = (T_IP6_FRAG_HDR *)(nbuf->buf + off);
    577556                if (ntohs(ip6fh->off_flag) & IP6F_MORE_FRAG)
     
    582561                break;
    583562
    584         case IPPROTO_AH:                /* IPv6 認証ヘッダ                 */
    585         case IPPROTO_HOPOPTS:           /* IPv6 中継点 (Hop-by-Hop) オプション  */
    586         case IPPROTO_ROUTING:           /* 経路制御ヘッダ                        */
    587         case IPPROTO_DSTOPTS:           /* IPv6 終点オプション                   */
     563        case IPPROTO_AH:                /* IPv6 認証ヘッダ                   */
     564        case IPPROTO_HOPOPTS:           /* IPv6 中継点 (Hop-by-Hop) オプション  */
     565        case IPPROTO_ROUTING:           /* 経路制御ヘッダ                      */
     566        case IPPROTO_DSTOPTS:           /* IPv6 終点オプション                 */
    588567                if (nbuf->len < off + sizeof(T_IP6_EXT_HDR))
    589568                        return (ER_UINT)-1;
     
    602581
    603582/*
    604  *  ip6_lasthdr -- 最後のヘッダのオフセットを返す。
     583 *  ip6_lasthdr -- 最後のヘッダのオフセットを返す。
    605584 */
    606585
     
    621600
    622601/*
    623  *  ip6_unknown_opt -- 未知のオプションの処理
    624  *
    625  *    戻り値:
    626  *
    627  *      0 以上                        正常、オプション長。
    628  *      IP6_OPT_RET_ERR (-1)    エラー、呼出側でネットワークバッファを開放する。
    629  *      IP6_OPT_RET_REL (-2)    エラー、ネットワークバッファは開放されている。
     602 *  ip6_unknown_opt -- 未知のオプションの処理
     603 *
     604 *    戻り値:
     605 *
     606 *      0 以上                    正常、オプション長。
     607 *      IP6_OPT_RET_ERR (-1)    エラー、呼出側でネットワークバッファを開放する。
     608 *      IP6_OPT_RET_REL (-2)    エラー、ネットワークバッファは開放されている。
    630609 */
    631610
     
    634613{
    635614        switch (IP6OPT_TYPE(*opt)) {
    636         case IP6OPT_TYPE_SKIP:          /* 無視する。                      */
     615        case IP6OPT_TYPE_SKIP:          /* 無視する。                        */
    637616                return *(opt + 1);
    638617                break;
    639         case IP6OPT_TYPE_ICMP:          /* 破棄して、マルチキャストでなければ ICMP を返送する。  */
     618        case IP6OPT_TYPE_ICMP:          /* 破棄して、マルチキャストでなければ ICMP を返送する。        */
    640619                if (IN6_IS_ADDR_MULTICAST(&GET_IP6_HDR(input)->dst))
    641620                        return IP6_OPT_RET_ERR;
    642621                /* no break; */
    643         case IP6OPT_TYPE_FORCEICMP:     /* 破棄して、ICMP を返送する。       */
     622        case IP6OPT_TYPE_FORCEICMP:     /* 破棄して、ICMP を返送する。     */
    644623                icmp6_error(input, ICMP6_PARAM_PROB,
    645624                                   ICMP6_PARAMPROB_OPTION,
     
    647626                return IP6_OPT_RET_REL;
    648627                break;
    649         /*case IP6OPT_TYPE_DISCARD:     ãƒ‡ãƒ¼ã‚¿ã‚°ãƒ©ãƒ ã‚’破棄する。    */
     628        /*case IP6OPT_TYPE_DISCARD:     データグラムを破棄する。    */
    650629                }
    651630
     
    654633
    655634/*
    656  *  ip6_remove_exthdrs -- IPv6 拡張ヘッダを削除し、以降を前に詰める。
     635 *  ip6_remove_exthdrs -- IPv6 拡張ヘッダを削除し、以降を前に詰める。
    657636 */
    658637
     
    663642        uint_t  next;
    664643
    665         /* 開始オフセットを IP ヘッダに設定する。*/
     644        /* 開始オフセットを IP ヘッダに設定する。*/
    666645        off = ((uint8_t *)GET_IP6_HDR(nbuf)) - nbuf->buf;
    667646
    668         /* 最終ヘッダを探索する。*/
     647        /* 最終ヘッダを探索する。*/
    669648        off = ip6_lasthdr(nbuf, off, IPPROTO_IPV6, &next);
    670649
Note: See TracChangeset for help on using the changeset viewer.