source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tinet/netinet6/route6.c@ 352

Last change on this file since 352 was 352, checked in by coas-nagasima, 6 years ago

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.2 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering
5 * Tomakomai National College of Technology, JAPAN
6 *
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 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
30 *
31 * @(#) $Id$
32 */
33
34/* $FreeBSD: src/sys/netinet6/route6.c,v 1.6 2002/10/16 01:54:45 sam Exp $ */
35/* $KAME: route6.c,v 1.24 2001/03/14 03:07:05 itojun Exp $ */
36
37/*
38 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
39 * All rights reserved.
40 *
41 * Redistribution and use in source and binary forms, with or without
42 * modification, are permitted provided that the following conditions
43 * are met:
44 * 1. Redistributions of source code must retain the above copyright
45 * notice, this list of conditions and the following disclaimer.
46 * 2. Redistributions in binary form must reproduce the above copyright
47 * notice, this list of conditions and the following disclaimer in the
48 * documentation and/or other materials provided with the distribution.
49 * 3. Neither the name of the project nor the names of its contributors
50 * may be used to endorse or promote products derived from this software
51 * without specific prior written permission.
52 *
53 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
54 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
57 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
58 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
59 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
60 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
61 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
62 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
63 * SUCH DAMAGE.
64 */
65
66#ifdef TARGET_KERNEL_ASP
67
68#include <kernel.h>
69#include <sil.h>
70
71#endif /* of #ifdef TARGET_KERNEL_ASP */
72
73#ifdef TARGET_KERNEL_JSP
74
75#include <s_services.h>
76#include <t_services.h>
77
78#endif /* of #ifdef TARGET_KERNEL_JSP */
79
80#include <tinet_defs.h>
81#include <tinet_config.h>
82
83#include <net/net.h>
84#include <net/net_endian.h>
85#include <net/if.h>
86#include <net/if_loop.h>
87#include <net/if_ppp.h>
88#include <net/ethernet.h>
89#include <net/if_arp.h>
90#include <net/ppp_ipcp.h>
91#include <net/net_buf.h>
92#include <net/net_count.h>
93
94#include <netinet/in.h>
95#include <netinet/in_var.h>
96#include <netinet/ip.h>
97#include <netinet/ip_var.h>
98#include <netinet/ip_icmp.h>
99#include <netinet6/nd6.h>
100
101#ifdef _IP6_CFG
102
103#if 0
104/*
105 * 通信帯域を食いつぶす攻撃への対応のため、
106 * タイプ 0 経路制御ヘッダの処理を行わない。
107 */
108
109/*
110 * ip6_rthdr0 -- タイプ 0 経路制御ヘッダの入力関数
111 */
112
113static ER
114ip6_rthdr0 (T_NET_BUF *input, T_IP6_RT0_HDR *rt0h)
115{
116 if (rt0h->segleft == 0) {
117 /* 中継ノード数は 0 なので、終点ノード */
118 return E_OK;
119 }
120
121 /* len と segleft の正当性チェック */
122#ifdef IP6_CFG_COMPAT_RFC1883
123 if ((rt0h->len % 2) || (rt0h->len > 46)) {
124#else
125 if (rt0h->len % 2) {
126#endif
127 /*
128 * len は偶数で、(23 * 2) まで。
129 * ただし、(23 * 2) の制限は RFC 2462 で削除されている。
130 */
131 icmp6_error(input, ICMP6_PARAM_PROB,
132 ICMP6_PARAMPROB_HEADER,
133 ((uint8_t*)&rt0h->len - input->buf) - IF_HDR_SIZE);
134 return E_PAR;
135 }
136
137 /* len が中継ノード数と矛盾していないかチェックする。*/
138 if ((rt0h->len / 2) < rt0h->segleft) {
139 /*
140 * len は 8オクテット単位、segleft は 16オクテット単位なので、
141 * len / 2 == segleft となるはず。
142 * len / 2 < segleft はエラー。
143 */
144 icmp6_error(input, ICMP6_PARAM_PROB,
145 ICMP6_PARAMPROB_HEADER,
146 ((uint8_t*)&rt0h->segleft - input->buf) - IF_HDR_SIZE);
147 return E_PAR;
148 }
149
150 /*
151 * 残りの中継ノード数が 1 以上であれば、このノードは最終的な
152 * 終点ノードではない。本実装では、中継をしないので、
153 * 入力データグラムの処理を終了する。
154 */
155 syscall(rel_net_buf(input));
156 return E_PAR;
157 }
158
159#endif
160
161/*
162 * route6_input -- 経路制御ヘッダの入力関数
163 */
164
165uint_t
166route6_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp)
167{
168 T_NET_BUF *input = *inputp;
169 T_IP6_RT_HDR *rth;
170 uint_t len, off = *offp;
171
172 /* ネットワークバッファの残りの長さをチェックする。*/
173 if (input->len - off < sizeof(T_IP6_RT_HDR))
174 goto buf_rel;
175
176 rth = (T_IP6_RT_HDR *)(input->buf + off);
177 len = (rth->len + 1) << 3;
178
179 /* 経路制御ヘッダの長さをチェックする。*/
180 if (input->len < off + len)
181 goto buf_rel;
182
183#if 0
184 /*
185 * 通信帯域を食いつぶす攻撃への対応のため、
186 * タイプ 0 経路制御ヘッダの処理を行わない。
187 */
188 if (rth->type == IPV6_RTHDR_TYPE_0) {
189 if (ip6_rthdr0(input, (T_IP6_RT0_HDR*)rth) != E_OK) {
190
191 /* エラーの場合は、ip6_rthdr0 でバッファを開放している。*/
192 return IPPROTO_DONE;
193 }
194 }
195 else if (rth->segleft != 0) {
196
197 /*
198 * 残りの中継ノード数が 1 以上であれば、このノードは最終的な
199 * 終点ノードではない。本実装では、中継をしないので、
200 * ICMP6 エラーを返送して処理を終了する。
201 */
202 icmp6_error(input, ICMP6_PARAM_PROB,
203 ICMP6_PARAMPROB_HEADER,
204 ((uint8_t*)&rth->type - input->buf) - IF_HDR_SIZE);
205 return IPPROTO_DONE;
206 }
207#else
208 if (rth->segleft != 0) {
209
210 /*
211 * 残りの中継ノード数が 1 以上であれば、このノードは最終的な
212 * 終点ノードではない。本実装では、中継をしないので、
213 * ICMP6 エラーを返送して処理を終了する。
214 */
215 icmp6_error(input, ICMP6_PARAM_PROB,
216 ICMP6_PARAMPROB_HEADER,
217 ((uint8_t*)&rth->type - input->buf) - IF_HDR_SIZE);
218 return IPPROTO_DONE;
219 }
220#endif
221
222 *nextp = *offp - IF_HDR_SIZE + offsetof(T_IP6_RT_HDR, next);
223 *offp += len;
224 return rth->next;
225
226buf_rel:
227 syscall(rel_net_buf(input));
228 return IPPROTO_DONE;
229 }
230
231#endif /* of #ifdef _IP6_CFG */
Note: See TracBrowser for help on using the repository browser.