Annotation of sys/netinet6/dest6.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: dest6.c,v 1.10 2003/05/14 14:24:44 itojun Exp $ */
! 2: /* $KAME: dest6.c,v 1.25 2001/02/22 01:39:16 itojun Exp $ */
! 3:
! 4: /*
! 5: * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. Neither the name of the project nor the names of its contributors
! 17: * may be used to endorse or promote products derived from this software
! 18: * without specific prior written permission.
! 19: *
! 20: * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
! 21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 23: * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
! 24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 30: * SUCH DAMAGE.
! 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: * Destination options header processing.
! 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: /* validation of the length of the header */
! 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: /* search header for all options. */
! 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: /* unknown option */
! 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: }
CVSweb