t_ip_reass.c revision 1.2 1 1.2 ozaki /* $NetBSD: t_ip_reass.c,v 1.2 2022/11/30 06:06:36 ozaki-r Exp $ */
2 1.2 ozaki
3 1.1 ozaki /*-
4 1.1 ozaki * Copyright (c) 2018 The FreeBSD Foundation
5 1.1 ozaki *
6 1.1 ozaki * This software was developed by Mark Johnston under sponsorship from
7 1.1 ozaki * the FreeBSD Foundation.
8 1.1 ozaki *
9 1.1 ozaki * Redistribution and use in source and binary forms, with or without
10 1.1 ozaki * modification, are permitted provided that the following conditions are
11 1.1 ozaki * met:
12 1.1 ozaki * 1. Redistributions of source code must retain the above copyright
13 1.1 ozaki * notice, this list of conditions and the following disclaimer.
14 1.1 ozaki * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 ozaki * notice, this list of conditions and the following disclaimer in
16 1.1 ozaki * the documentation and/or other materials provided with the
17 1.1 ozaki * distribution.
18 1.1 ozaki *
19 1.1 ozaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 1.1 ozaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 1.1 ozaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 1.1 ozaki * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 1.1 ozaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 1.1 ozaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 1.1 ozaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 1.1 ozaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 1.1 ozaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 1.1 ozaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 1.1 ozaki * SUCH DAMAGE.
30 1.1 ozaki */
31 1.1 ozaki
32 1.1 ozaki #include <sys/cdefs.h>
33 1.2 ozaki
34 1.2 ozaki #ifdef __NetBSD__
35 1.2 ozaki __RCSID("$NetBSD: t_ip_reass.c,v 1.2 2022/11/30 06:06:36 ozaki-r Exp $");
36 1.2 ozaki #define USE_RUMPKERNEL 1
37 1.2 ozaki #else
38 1.1 ozaki __FBSDID("$FreeBSD$");
39 1.2 ozaki #endif
40 1.1 ozaki
41 1.1 ozaki #include <sys/param.h>
42 1.1 ozaki #include <sys/ioctl.h>
43 1.1 ozaki #include <sys/socket.h>
44 1.1 ozaki #include <sys/sysctl.h>
45 1.1 ozaki
46 1.1 ozaki #include <net/bpf.h>
47 1.1 ozaki #include <net/if.h>
48 1.1 ozaki #include <netinet/in.h>
49 1.1 ozaki #include <netinet/ip.h>
50 1.1 ozaki #include <netinet/ip_var.h>
51 1.1 ozaki
52 1.1 ozaki #include <err.h>
53 1.1 ozaki #include <errno.h>
54 1.1 ozaki #include <fcntl.h>
55 1.1 ozaki #include <ifaddrs.h>
56 1.1 ozaki #include <stdint.h>
57 1.1 ozaki #include <stdlib.h>
58 1.1 ozaki #include <time.h>
59 1.1 ozaki #include <unistd.h>
60 1.1 ozaki
61 1.2 ozaki #ifdef USE_RUMPKERNEL
62 1.2 ozaki #include <netinet/if_ether.h>
63 1.2 ozaki #include <rump/rump.h>
64 1.2 ozaki #include <rump/rump_syscalls.h>
65 1.2 ozaki #include "h_macros.h"
66 1.2 ozaki
67 1.2 ozaki #define ioctl rump_sys_ioctl
68 1.2 ozaki #define close rump_sys_close
69 1.2 ozaki #define write rump_sys_write
70 1.2 ozaki #endif
71 1.2 ozaki
72 1.1 ozaki #include <atf-c.h>
73 1.1 ozaki
74 1.2 ozaki #ifdef __NetBSD__
75 1.2 ozaki struct ipstat {
76 1.2 ozaki uint64_t ips_ipstat[IP_NSTATS];
77 1.2 ozaki };
78 1.2 ozaki #endif
79 1.2 ozaki
80 1.1 ozaki struct lopacket {
81 1.1 ozaki u_int family;
82 1.1 ozaki struct ip hdr;
83 1.1 ozaki char payload[];
84 1.1 ozaki };
85 1.1 ozaki
86 1.1 ozaki static void
87 1.1 ozaki update_cksum(struct ip *ip)
88 1.1 ozaki {
89 1.1 ozaki size_t i;
90 1.1 ozaki uint32_t cksum;
91 1.1 ozaki uint16_t *cksump;
92 1.1 ozaki
93 1.1 ozaki ip->ip_sum = 0;
94 1.1 ozaki cksump = (uint16_t *)ip;
95 1.1 ozaki for (cksum = 0, i = 0; i < sizeof(*ip) / sizeof(*cksump); cksump++, i++)
96 1.1 ozaki cksum += ntohs(*cksump);
97 1.1 ozaki cksum = (cksum >> 16) + (cksum & 0xffff);
98 1.1 ozaki cksum = ~(cksum + (cksum >> 16));
99 1.1 ozaki ip->ip_sum = htons((uint16_t)cksum);
100 1.1 ozaki }
101 1.1 ozaki
102 1.1 ozaki static struct lopacket *
103 1.1 ozaki alloc_lopacket(in_addr_t dstaddr, size_t payloadlen)
104 1.1 ozaki {
105 1.1 ozaki struct ip *ip;
106 1.1 ozaki struct lopacket *packet;
107 1.1 ozaki size_t pktlen;
108 1.1 ozaki
109 1.1 ozaki pktlen = sizeof(*packet) + payloadlen;
110 1.1 ozaki packet = malloc(pktlen);
111 1.1 ozaki ATF_REQUIRE(packet != NULL);
112 1.1 ozaki
113 1.1 ozaki memset(packet, 0, pktlen);
114 1.1 ozaki packet->family = AF_INET;
115 1.1 ozaki
116 1.1 ozaki ip = &packet->hdr;
117 1.1 ozaki ip->ip_hl = sizeof(struct ip) >> 2;
118 1.1 ozaki ip->ip_v = 4;
119 1.1 ozaki ip->ip_tos = 0;
120 1.1 ozaki ip->ip_len = htons(sizeof(*ip) + payloadlen);
121 1.1 ozaki ip->ip_id = 0;
122 1.1 ozaki ip->ip_off = 0;
123 1.1 ozaki ip->ip_ttl = 1;
124 1.1 ozaki ip->ip_p = IPPROTO_IP;
125 1.1 ozaki ip->ip_sum = 0;
126 1.1 ozaki ip->ip_src.s_addr = dstaddr;
127 1.1 ozaki ip->ip_dst.s_addr = dstaddr;
128 1.1 ozaki update_cksum(ip);
129 1.1 ozaki
130 1.1 ozaki return (packet);
131 1.1 ozaki }
132 1.1 ozaki
133 1.1 ozaki static void
134 1.1 ozaki free_lopacket(struct lopacket *packet)
135 1.1 ozaki {
136 1.1 ozaki
137 1.1 ozaki free(packet);
138 1.1 ozaki }
139 1.1 ozaki
140 1.1 ozaki static void
141 1.1 ozaki write_lopacket(int bpffd, struct lopacket *packet)
142 1.1 ozaki {
143 1.1 ozaki struct timespec ts;
144 1.1 ozaki ssize_t n;
145 1.1 ozaki size_t len;
146 1.1 ozaki
147 1.1 ozaki len = sizeof(packet->family) + ntohs(packet->hdr.ip_len);
148 1.1 ozaki n = write(bpffd, packet, len);
149 1.1 ozaki ATF_REQUIRE_MSG(n >= 0, "packet write failed: %s", strerror(errno));
150 1.1 ozaki ATF_REQUIRE_MSG((size_t)n == len, "wrote %zd bytes instead of %zu",
151 1.1 ozaki n, len);
152 1.1 ozaki
153 1.1 ozaki /*
154 1.1 ozaki * Loopback packets are dispatched asynchronously, give netisr some
155 1.1 ozaki * time.
156 1.1 ozaki */
157 1.1 ozaki ts.tv_sec = 0;
158 1.1 ozaki ts.tv_nsec = 5000000; /* 5ms */
159 1.1 ozaki (void)nanosleep(&ts, NULL);
160 1.1 ozaki }
161 1.1 ozaki
162 1.1 ozaki static int
163 1.1 ozaki open_lobpf(in_addr_t *addrp)
164 1.1 ozaki {
165 1.1 ozaki struct ifreq ifr;
166 1.1 ozaki struct ifaddrs *ifa, *ifap;
167 1.1 ozaki int error, fd;
168 1.1 ozaki
169 1.2 ozaki #ifdef USE_RUMPKERNEL
170 1.2 ozaki rump_init();
171 1.2 ozaki RL(fd = rump_sys_open("/dev/bpf", O_RDWR));
172 1.2 ozaki #else
173 1.1 ozaki fd = open("/dev/bpf0", O_RDWR);
174 1.1 ozaki if (fd < 0 && errno == ENOENT)
175 1.1 ozaki atf_tc_skip("no BPF device available");
176 1.1 ozaki ATF_REQUIRE_MSG(fd >= 0, "open(/dev/bpf0): %s", strerror(errno));
177 1.2 ozaki #endif
178 1.1 ozaki
179 1.1 ozaki error = getifaddrs(&ifap);
180 1.1 ozaki ATF_REQUIRE(error == 0);
181 1.1 ozaki for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next)
182 1.1 ozaki if ((ifa->ifa_flags & IFF_LOOPBACK) != 0 &&
183 1.1 ozaki ifa->ifa_addr->sa_family == AF_INET)
184 1.1 ozaki break;
185 1.1 ozaki if (ifa == NULL)
186 1.1 ozaki atf_tc_skip("no loopback address found");
187 1.1 ozaki
188 1.1 ozaki memset(&ifr, 0, sizeof(ifr));
189 1.1 ozaki strlcpy(ifr.ifr_name, ifa->ifa_name, IFNAMSIZ);
190 1.1 ozaki error = ioctl(fd, BIOCSETIF, &ifr);
191 1.1 ozaki ATF_REQUIRE_MSG(error == 0, "ioctl(BIOCSETIF): %s", strerror(errno));
192 1.1 ozaki
193 1.1 ozaki *addrp = ((struct sockaddr_in *)(void *)ifa->ifa_addr)->sin_addr.s_addr;
194 1.1 ozaki
195 1.1 ozaki freeifaddrs(ifap);
196 1.1 ozaki
197 1.1 ozaki return (fd);
198 1.1 ozaki }
199 1.1 ozaki
200 1.1 ozaki static void
201 1.1 ozaki get_ipstat(struct ipstat *stat)
202 1.1 ozaki {
203 1.1 ozaki size_t len;
204 1.1 ozaki int error;
205 1.1 ozaki
206 1.1 ozaki memset(stat, 0, sizeof(*stat));
207 1.1 ozaki len = sizeof(*stat);
208 1.1 ozaki error = sysctlbyname("net.inet.ip.stats", stat, &len, NULL, 0);
209 1.1 ozaki ATF_REQUIRE_MSG(error == 0, "sysctl(net.inet.ip.stats) failed: %s",
210 1.1 ozaki strerror(errno));
211 1.1 ozaki ATF_REQUIRE(len == sizeof(*stat));
212 1.1 ozaki }
213 1.1 ozaki
214 1.2 ozaki #ifdef __NetBSD__
215 1.2 ozaki #define CHECK_IP_COUNTER(oldp, newp, counter) \
216 1.2 ozaki ATF_REQUIRE_MSG((oldp)->ips_ipstat[counter] < (newp)->ips_ipstat[counter], \
217 1.2 ozaki "ips_" #counter " wasn't incremented (%ju vs. %ju)", \
218 1.2 ozaki (uintmax_t)old.ips_ipstat[counter], (uintmax_t)new.ips_ipstat[counter]);
219 1.2 ozaki #define fragdropped IP_STAT_FRAGDROPPED
220 1.2 ozaki #define toosmall IP_STAT_TOOSMALL
221 1.2 ozaki #define toolong IP_STAT_TOOLONG
222 1.2 ozaki #define badfrags IP_STAT_BADFRAGS
223 1.2 ozaki #else
224 1.1 ozaki #define CHECK_IP_COUNTER(oldp, newp, counter) \
225 1.1 ozaki ATF_REQUIRE_MSG((oldp)->ips_ ## counter < (newp)->ips_ ## counter, \
226 1.2 ozaki #counter " wasn't incremented (%ju vs. %ju)", \
227 1.1 ozaki (uintmax_t)old.ips_ ## counter, (uintmax_t)new.ips_## counter);
228 1.2 ozaki #endif
229 1.1 ozaki
230 1.1 ozaki /*
231 1.1 ozaki * Make sure a fragment with MF set doesn't come after the last fragment of a
232 1.1 ozaki * packet. Make sure that multiple fragments with MF clear have the same offset
233 1.1 ozaki * and length.
234 1.1 ozaki */
235 1.1 ozaki ATF_TC(ip_reass__multiple_last_fragments);
236 1.1 ozaki ATF_TC_HEAD(ip_reass__multiple_last_fragments, tc)
237 1.1 ozaki {
238 1.1 ozaki atf_tc_set_md_var(tc, "require.user", "root");
239 1.1 ozaki }
240 1.1 ozaki ATF_TC_BODY(ip_reass__multiple_last_fragments, tc)
241 1.1 ozaki {
242 1.1 ozaki struct ipstat old, new;
243 1.1 ozaki struct ip *ip;
244 1.1 ozaki struct lopacket *packet1, *packet2, *packet3, *packet4;
245 1.1 ozaki in_addr_t addr;
246 1.1 ozaki int error, fd;
247 1.1 ozaki uint16_t ipid;
248 1.1 ozaki
249 1.1 ozaki fd = open_lobpf(&addr);
250 1.1 ozaki ipid = arc4random_uniform(UINT16_MAX + 1);
251 1.1 ozaki
252 1.1 ozaki packet1 = alloc_lopacket(addr, 16);
253 1.1 ozaki ip = &packet1->hdr;
254 1.1 ozaki ip->ip_id = ipid;
255 1.1 ozaki ip->ip_off = htons(0x10);
256 1.1 ozaki update_cksum(ip);
257 1.1 ozaki
258 1.1 ozaki packet2 = alloc_lopacket(addr, 16);
259 1.1 ozaki ip = &packet2->hdr;
260 1.1 ozaki ip->ip_id = ipid;
261 1.1 ozaki ip->ip_off = htons(0x20);
262 1.1 ozaki update_cksum(ip);
263 1.1 ozaki
264 1.1 ozaki packet3 = alloc_lopacket(addr, 16);
265 1.1 ozaki ip = &packet3->hdr;
266 1.1 ozaki ip->ip_id = ipid;
267 1.1 ozaki ip->ip_off = htons(0x8);
268 1.1 ozaki update_cksum(ip);
269 1.1 ozaki
270 1.1 ozaki packet4 = alloc_lopacket(addr, 32);
271 1.1 ozaki ip = &packet4->hdr;
272 1.1 ozaki ip->ip_id = ipid;
273 1.1 ozaki ip->ip_off = htons(0x10);
274 1.1 ozaki update_cksum(ip);
275 1.1 ozaki
276 1.1 ozaki write_lopacket(fd, packet1);
277 1.1 ozaki
278 1.1 ozaki /* packet2 comes after packet1. */
279 1.1 ozaki get_ipstat(&old);
280 1.1 ozaki write_lopacket(fd, packet2);
281 1.1 ozaki get_ipstat(&new);
282 1.1 ozaki CHECK_IP_COUNTER(&old, &new, fragdropped);
283 1.1 ozaki
284 1.1 ozaki /* packet2 comes after packet1 and has MF set. */
285 1.1 ozaki packet2->hdr.ip_off = htons(IP_MF | 0x20);
286 1.1 ozaki update_cksum(&packet2->hdr);
287 1.1 ozaki get_ipstat(&old);
288 1.1 ozaki write_lopacket(fd, packet2);
289 1.1 ozaki get_ipstat(&new);
290 1.1 ozaki CHECK_IP_COUNTER(&old, &new, fragdropped);
291 1.1 ozaki
292 1.1 ozaki /* packet3 comes before packet1 but overlaps. */
293 1.1 ozaki get_ipstat(&old);
294 1.1 ozaki write_lopacket(fd, packet3);
295 1.1 ozaki get_ipstat(&new);
296 1.1 ozaki CHECK_IP_COUNTER(&old, &new, fragdropped);
297 1.1 ozaki
298 1.1 ozaki /* packet4 has the same offset as packet1 but is longer. */
299 1.1 ozaki get_ipstat(&old);
300 1.1 ozaki write_lopacket(fd, packet4);
301 1.1 ozaki get_ipstat(&new);
302 1.1 ozaki CHECK_IP_COUNTER(&old, &new, fragdropped);
303 1.1 ozaki
304 1.1 ozaki error = close(fd);
305 1.1 ozaki ATF_REQUIRE(error == 0);
306 1.1 ozaki free_lopacket(packet1);
307 1.1 ozaki free_lopacket(packet2);
308 1.1 ozaki free_lopacket(packet3);
309 1.1 ozaki free_lopacket(packet4);
310 1.1 ozaki }
311 1.1 ozaki
312 1.1 ozaki /*
313 1.1 ozaki * Make sure that we reject zero-length fragments.
314 1.1 ozaki */
315 1.1 ozaki ATF_TC(ip_reass__zero_length_fragment);
316 1.1 ozaki ATF_TC_HEAD(ip_reass__zero_length_fragment, tc)
317 1.1 ozaki {
318 1.1 ozaki atf_tc_set_md_var(tc, "require.user", "root");
319 1.1 ozaki }
320 1.1 ozaki ATF_TC_BODY(ip_reass__zero_length_fragment, tc)
321 1.1 ozaki {
322 1.1 ozaki struct ipstat old, new;
323 1.1 ozaki struct ip *ip;
324 1.1 ozaki struct lopacket *packet1, *packet2;
325 1.1 ozaki in_addr_t addr;
326 1.1 ozaki int error, fd;
327 1.1 ozaki uint16_t ipid;
328 1.1 ozaki
329 1.1 ozaki fd = open_lobpf(&addr);
330 1.1 ozaki ipid = arc4random_uniform(UINT16_MAX + 1);
331 1.1 ozaki
332 1.1 ozaki /*
333 1.1 ozaki * Create two packets, one with MF set, one without.
334 1.1 ozaki */
335 1.1 ozaki packet1 = alloc_lopacket(addr, 0);
336 1.1 ozaki ip = &packet1->hdr;
337 1.1 ozaki ip->ip_id = ipid;
338 1.1 ozaki ip->ip_off = htons(IP_MF | 0x10);
339 1.1 ozaki update_cksum(ip);
340 1.1 ozaki
341 1.1 ozaki packet2 = alloc_lopacket(addr, 0);
342 1.1 ozaki ip = &packet2->hdr;
343 1.1 ozaki ip->ip_id = ~ipid;
344 1.1 ozaki ip->ip_off = htons(0x10);
345 1.1 ozaki update_cksum(ip);
346 1.1 ozaki
347 1.1 ozaki get_ipstat(&old);
348 1.1 ozaki write_lopacket(fd, packet1);
349 1.1 ozaki get_ipstat(&new);
350 1.2 ozaki #ifdef __NetBSD__
351 1.2 ozaki CHECK_IP_COUNTER(&old, &new, badfrags);
352 1.2 ozaki #else
353 1.1 ozaki CHECK_IP_COUNTER(&old, &new, toosmall);
354 1.1 ozaki CHECK_IP_COUNTER(&old, &new, fragdropped);
355 1.2 ozaki #endif
356 1.1 ozaki
357 1.1 ozaki get_ipstat(&old);
358 1.1 ozaki write_lopacket(fd, packet2);
359 1.1 ozaki get_ipstat(&new);
360 1.2 ozaki /* NetBSD doesn't reject a packet of zero length w/o MF */
361 1.2 ozaki #ifndef __NetBSD__
362 1.1 ozaki CHECK_IP_COUNTER(&old, &new, toosmall);
363 1.1 ozaki CHECK_IP_COUNTER(&old, &new, fragdropped);
364 1.2 ozaki #endif
365 1.1 ozaki
366 1.1 ozaki error = close(fd);
367 1.1 ozaki ATF_REQUIRE(error == 0);
368 1.1 ozaki free_lopacket(packet1);
369 1.1 ozaki free_lopacket(packet2);
370 1.1 ozaki }
371 1.1 ozaki
372 1.1 ozaki ATF_TC(ip_reass__large_fragment);
373 1.1 ozaki ATF_TC_HEAD(ip_reass__large_fragment, tc)
374 1.1 ozaki {
375 1.1 ozaki atf_tc_set_md_var(tc, "require.user", "root");
376 1.1 ozaki }
377 1.1 ozaki ATF_TC_BODY(ip_reass__large_fragment, tc)
378 1.1 ozaki {
379 1.1 ozaki struct ipstat old, new;
380 1.1 ozaki struct ip *ip;
381 1.1 ozaki struct lopacket *packet1, *packet2;
382 1.1 ozaki in_addr_t addr;
383 1.1 ozaki int error, fd;
384 1.1 ozaki uint16_t ipid;
385 1.1 ozaki
386 1.1 ozaki fd = open_lobpf(&addr);
387 1.1 ozaki ipid = arc4random_uniform(UINT16_MAX + 1);
388 1.1 ozaki
389 1.1 ozaki /*
390 1.1 ozaki * Create two packets, one with MF set, one without.
391 1.1 ozaki *
392 1.1 ozaki * 16 + (0x1fff << 3) > IP_MAXPACKET, so these should fail the check.
393 1.1 ozaki */
394 1.1 ozaki packet1 = alloc_lopacket(addr, 16);
395 1.1 ozaki ip = &packet1->hdr;
396 1.1 ozaki ip->ip_id = ipid;
397 1.1 ozaki ip->ip_off = htons(IP_MF | 0x1fff);
398 1.1 ozaki update_cksum(ip);
399 1.1 ozaki
400 1.1 ozaki packet2 = alloc_lopacket(addr, 16);
401 1.1 ozaki ip = &packet2->hdr;
402 1.1 ozaki ip->ip_id = ipid;
403 1.1 ozaki ip->ip_off = htons(0x1fff);
404 1.1 ozaki update_cksum(ip);
405 1.1 ozaki
406 1.1 ozaki get_ipstat(&old);
407 1.1 ozaki write_lopacket(fd, packet1);
408 1.1 ozaki get_ipstat(&new);
409 1.1 ozaki CHECK_IP_COUNTER(&old, &new, toolong);
410 1.2 ozaki #ifndef __NetBSD__
411 1.1 ozaki CHECK_IP_COUNTER(&old, &new, fragdropped);
412 1.2 ozaki #endif
413 1.1 ozaki
414 1.1 ozaki get_ipstat(&old);
415 1.1 ozaki write_lopacket(fd, packet2);
416 1.1 ozaki get_ipstat(&new);
417 1.1 ozaki CHECK_IP_COUNTER(&old, &new, toolong);
418 1.2 ozaki #ifndef __NetBSD__
419 1.1 ozaki CHECK_IP_COUNTER(&old, &new, fragdropped);
420 1.2 ozaki #endif
421 1.1 ozaki
422 1.1 ozaki error = close(fd);
423 1.1 ozaki ATF_REQUIRE(error == 0);
424 1.1 ozaki free_lopacket(packet1);
425 1.1 ozaki free_lopacket(packet2);
426 1.1 ozaki }
427 1.1 ozaki
428 1.1 ozaki ATF_TP_ADD_TCS(tp)
429 1.1 ozaki {
430 1.1 ozaki ATF_TP_ADD_TC(tp, ip_reass__multiple_last_fragments);
431 1.1 ozaki ATF_TP_ADD_TC(tp, ip_reass__zero_length_fragment);
432 1.1 ozaki ATF_TP_ADD_TC(tp, ip_reass__large_fragment);
433 1.1 ozaki
434 1.1 ozaki return (atf_no_error());
435 1.1 ozaki }
436