1*84d9c625SLionel Sambuc /*-
2*84d9c625SLionel Sambuc * Copyright (c) 2003 The NetBSD Foundation, Inc.
3*84d9c625SLionel Sambuc * All rights reserved.
4*84d9c625SLionel Sambuc *
5*84d9c625SLionel Sambuc * This code is derived from software contributed to The NetBSD Foundation
6*84d9c625SLionel Sambuc * by Christos Zoulas.
7*84d9c625SLionel Sambuc *
8*84d9c625SLionel Sambuc * Redistribution and use in source and binary forms, with or without
9*84d9c625SLionel Sambuc * modification, are permitted provided that the following conditions
10*84d9c625SLionel Sambuc * are met:
11*84d9c625SLionel Sambuc * 1. Redistributions of source code must retain the above copyright
12*84d9c625SLionel Sambuc * notice, this list of conditions and the following disclaimer.
13*84d9c625SLionel Sambuc * 2. Redistributions in binary form must reproduce the above copyright
14*84d9c625SLionel Sambuc * notice, this list of conditions and the following disclaimer in the
15*84d9c625SLionel Sambuc * documentation and/or other materials provided with the distribution.
16*84d9c625SLionel Sambuc * 3. All advertising materials mentioning features or use of this software
17*84d9c625SLionel Sambuc * must display the following acknowledgement:
18*84d9c625SLionel Sambuc * This product includes software developed by the NetBSD
19*84d9c625SLionel Sambuc * Foundation, Inc. and its contributors.
20*84d9c625SLionel Sambuc * 4. Neither the name of The NetBSD Foundation nor the names of its
21*84d9c625SLionel Sambuc * contributors may be used to endorse or promote products derived
22*84d9c625SLionel Sambuc * from this software without specific prior written permission.
23*84d9c625SLionel Sambuc *
24*84d9c625SLionel Sambuc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
25*84d9c625SLionel Sambuc * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26*84d9c625SLionel Sambuc * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27*84d9c625SLionel Sambuc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
28*84d9c625SLionel Sambuc * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29*84d9c625SLionel Sambuc * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30*84d9c625SLionel Sambuc * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31*84d9c625SLionel Sambuc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32*84d9c625SLionel Sambuc * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33*84d9c625SLionel Sambuc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34*84d9c625SLionel Sambuc * POSSIBILITY OF SUCH DAMAGE.
35*84d9c625SLionel Sambuc */
36*84d9c625SLionel Sambuc #include <sys/cdefs.h>
37*84d9c625SLionel Sambuc __RCSID("$NetBSD: inet6_scopeid.c,v 1.2 2013/10/19 15:47:02 christos Exp $");
38*84d9c625SLionel Sambuc
39*84d9c625SLionel Sambuc #include <sys/endian.h>
40*84d9c625SLionel Sambuc #include <string.h>
41*84d9c625SLionel Sambuc #include <stdint.h>
42*84d9c625SLionel Sambuc #include <netinet/in.h>
43*84d9c625SLionel Sambuc #include <netinet6/in6.h>
44*84d9c625SLionel Sambuc
45*84d9c625SLionel Sambuc /* KAME idiosyncrasy */
46*84d9c625SLionel Sambuc void
inet6_getscopeid(struct sockaddr_in6 * sin6,int flags)47*84d9c625SLionel Sambuc inet6_getscopeid(struct sockaddr_in6 *sin6, int flags)
48*84d9c625SLionel Sambuc {
49*84d9c625SLionel Sambuc #if defined(__KAME__)
50*84d9c625SLionel Sambuc if ((IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) &&
51*84d9c625SLionel Sambuc (flags & INET6_IS_ADDR_LINKLOCAL)) ||
52*84d9c625SLionel Sambuc (IN6_IS_ADDR_MC_LINKLOCAL(&sin6->sin6_addr) &&
53*84d9c625SLionel Sambuc (flags & INET6_IS_ADDR_MC_LINKLOCAL)) ||
54*84d9c625SLionel Sambuc (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr) &&
55*84d9c625SLionel Sambuc (flags & INET6_IS_ADDR_SITELOCAL))) {
56*84d9c625SLionel Sambuc uint16_t scope;
57*84d9c625SLionel Sambuc memcpy(&scope, &sin6->sin6_addr.s6_addr[2], sizeof(scope));
58*84d9c625SLionel Sambuc sin6->sin6_scope_id = ntohs(scope);
59*84d9c625SLionel Sambuc sin6->sin6_addr.s6_addr[2] = sin6->sin6_addr.s6_addr[3] = 0;
60*84d9c625SLionel Sambuc }
61*84d9c625SLionel Sambuc #endif
62*84d9c625SLionel Sambuc }
63*84d9c625SLionel Sambuc
64*84d9c625SLionel Sambuc void
inet6_putscopeid(struct sockaddr_in6 * sin6,int flags)65*84d9c625SLionel Sambuc inet6_putscopeid(struct sockaddr_in6 *sin6, int flags)
66*84d9c625SLionel Sambuc {
67*84d9c625SLionel Sambuc #if defined(__KAME__)
68*84d9c625SLionel Sambuc if ((IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) &&
69*84d9c625SLionel Sambuc (flags & INET6_IS_ADDR_LINKLOCAL)) ||
70*84d9c625SLionel Sambuc (IN6_IS_ADDR_MC_LINKLOCAL(&sin6->sin6_addr) &&
71*84d9c625SLionel Sambuc (flags & INET6_IS_ADDR_MC_LINKLOCAL)) ||
72*84d9c625SLionel Sambuc (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr) &&
73*84d9c625SLionel Sambuc (flags & INET6_IS_ADDR_SITELOCAL))) {
74*84d9c625SLionel Sambuc uint16_t scope = htons(sin6->sin6_scope_id);
75*84d9c625SLionel Sambuc memcpy(&sin6->sin6_addr.s6_addr[2], &scope, sizeof(scope));
76*84d9c625SLionel Sambuc sin6->sin6_scope_id = 0;
77*84d9c625SLionel Sambuc }
78*84d9c625SLionel Sambuc #endif
79*84d9c625SLionel Sambuc }
80