This source file includes following definitions.
- dest6_input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/malloc.h>
36 #include <sys/mbuf.h>
37 #include <sys/domain.h>
38 #include <sys/protosw.h>
39 #include <sys/socket.h>
40 #include <sys/errno.h>
41 #include <sys/time.h>
42 #include <sys/kernel.h>
43
44 #include <net/if.h>
45 #include <net/route.h>
46
47 #include <netinet/in.h>
48 #include <netinet/in_var.h>
49 #include <netinet/ip6.h>
50 #include <netinet6/ip6_var.h>
51 #include <netinet/icmp6.h>
52
53
54
55
56 int
57 dest6_input(mp, offp, proto)
58 struct mbuf **mp;
59 int *offp, proto;
60 {
61 struct mbuf *m = *mp;
62 int off = *offp, dstoptlen, optlen;
63 struct ip6_dest *dstopts;
64 u_int8_t *opt;
65
66
67 IP6_EXTHDR_GET(dstopts, struct ip6_dest *, m, off, sizeof(*dstopts));
68 if (dstopts == NULL)
69 return IPPROTO_DONE;
70 dstoptlen = (dstopts->ip6d_len + 1) << 3;
71
72 IP6_EXTHDR_GET(dstopts, struct ip6_dest *, m, off, dstoptlen);
73 if (dstopts == NULL)
74 return IPPROTO_DONE;
75 off += dstoptlen;
76 dstoptlen -= sizeof(struct ip6_dest);
77 opt = (u_int8_t *)dstopts + sizeof(struct ip6_dest);
78
79
80 for (optlen = 0; dstoptlen > 0; dstoptlen -= optlen, opt += optlen) {
81 if (*opt != IP6OPT_PAD1 &&
82 (dstoptlen < IP6OPT_MINLEN || *(opt + 1) + 2 > dstoptlen)) {
83 ip6stat.ip6s_toosmall++;
84 goto bad;
85 }
86
87 switch (*opt) {
88 case IP6OPT_PAD1:
89 optlen = 1;
90 break;
91 case IP6OPT_PADN:
92 optlen = *(opt + 1) + 2;
93 break;
94 default:
95 optlen = ip6_unknown_opt(opt, m,
96 opt - mtod(m, u_int8_t *));
97 if (optlen == -1)
98 return (IPPROTO_DONE);
99 optlen += 2;
100 break;
101 }
102 }
103
104 *offp = off;
105 return (dstopts->ip6d_nxt);
106
107 bad:
108 m_freem(m);
109 return (IPPROTO_DONE);
110 }