X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..d41d1dae2cd00cc08c7982087d1c445180cad9f5:/bsd/netinet6/dest6.c diff --git a/bsd/netinet6/dest6.c b/bsd/netinet6/dest6.c index eca5f3ca9..ae7a18b8a 100644 --- a/bsd/netinet6/dest6.c +++ b/bsd/netinet6/dest6.c @@ -1,4 +1,5 @@ -/* $KAME: dest6.c,v 1.10 2000/02/28 16:18:11 itojun Exp $ */ +/* $FreeBSD: src/sys/netinet6/dest6.c,v 1.1.2.3 2001/07/03 11:01:49 ume Exp $ */ +/* $KAME: dest6.c,v 1.27 2001/03/29 05:34:30 itojun Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -47,33 +48,27 @@ #include #include #include -#if !(defined(__APPLE__)) -#include -#endif #include -#if MIP6 -int (*mip6_store_dstopt_pre_hook)(struct mbuf *m, u_int8_t *opt, - u_int8_t off, u_int8_t dstlen) = NULL; -int (*mip6_rec_ctrl_sig_hook)(struct mbuf *m, int off) = NULL; -#endif /* MIP6 */ - /* * Destination options header processing. */ int -dest6_input(mp, offp, proto) +dest6_input(mp, offp) struct mbuf **mp; - int *offp, proto; + int *offp; { - register struct mbuf *m = *mp; + struct mbuf *m = *mp; int off = *offp, dstoptlen, optlen; struct ip6_dest *dstopts; u_int8_t *opt; + struct ip6_hdr *ip6; + + ip6 = mtod(m, struct ip6_hdr *); /* validation of the length of the header */ #ifndef PULLDOWN_TEST - IP6_EXTHDR_CHECK(m, off, sizeof(*dstopts), IPPROTO_DONE); + IP6_EXTHDR_CHECK(m, off, sizeof(*dstopts), return IPPROTO_DONE); dstopts = (struct ip6_dest *)(mtod(m, caddr_t) + off); #else IP6_EXTHDR_GET(dstopts, struct ip6_dest *, m, off, sizeof(*dstopts)); @@ -83,7 +78,7 @@ dest6_input(mp, offp, proto) dstoptlen = (dstopts->ip6d_len + 1) << 3; #ifndef PULLDOWN_TEST - IP6_EXTHDR_CHECK(m, off, dstoptlen, IPPROTO_DONE); + IP6_EXTHDR_CHECK(m, off, dstoptlen, return IPPROTO_DONE); dstopts = (struct ip6_dest *)(mtod(m, caddr_t) + off); #else IP6_EXTHDR_GET(dstopts, struct ip6_dest *, m, off, dstoptlen); @@ -96,59 +91,34 @@ dest6_input(mp, offp, proto) /* search header for all options. */ for (optlen = 0; dstoptlen > 0; dstoptlen -= optlen, opt += optlen) { - switch(*opt) { - case IP6OPT_PAD1: - optlen = 1; - break; - case IP6OPT_PADN: - if (dstoptlen < IP6OPT_MINLEN) { - ip6stat.ip6s_toosmall++; - goto bad; - } - optlen = *(opt + 1) + 2; - break; + if (*opt != IP6OPT_PAD1 && + (dstoptlen < IP6OPT_MINLEN || *(opt + 1) + 2 > dstoptlen)) { + ip6stat.ip6s_toosmall++; + goto bad; + } -#if MIP6 - case IP6OPT_BINDING_UPDATE: - case IP6OPT_BINDING_ACK: - case IP6OPT_BINDING_REQ: - case IP6OPT_HOME_ADDRESS: - if (mip6_store_dstopt_pre_hook) { - if ((*mip6_store_dstopt_pre_hook)(m, opt, off, dstoptlen) != 0) - goto bad; - } + switch (*opt) { + case IP6OPT_PAD1: + optlen = 1; + break; + case IP6OPT_PADN: optlen = *(opt + 1) + 2; break; -#endif /* MIP6 */ - default: /* unknown option */ - if (dstoptlen < IP6OPT_MINLEN) { - ip6stat.ip6s_toosmall++; - goto bad; - } - if ((optlen = ip6_unknown_opt(opt, m, - opt-mtod(m, u_int8_t *))) == -1) - return(IPPROTO_DONE); - optlen += 2; - break; + default: /* unknown option */ + optlen = ip6_unknown_opt(opt, m, + opt - mtod(m, u_int8_t *), 0); + if (optlen == -1) + return (IPPROTO_DONE); + optlen += 2; + break; } } -#if MIP6 - if (mip6_rec_ctrl_sig_hook) { - /* - * All Destinations options have been processed. Call MIPv6 to - * process stored options. - */ - if ((*mip6_rec_ctrl_sig_hook)(m, *offp) != 0) - return(IPPROTO_DONE); - } -#endif /* MIP6 */ - *offp = off; - return(dstopts->ip6d_nxt); + return (dstopts->ip6d_nxt); bad: m_freem(m); - return(IPPROTO_DONE); + return (IPPROTO_DONE); }