Add functions to do mapped address conversions from FreeBSD.

This commit is contained in:
christos 2007-06-28 21:03:47 +00:00
parent 5cd016ef40
commit 681a7e5524
2 changed files with 66 additions and 3 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: in6.c,v 1.129 2007/05/27 16:58:17 cube Exp $ */ /* $NetBSD: in6.c,v 1.130 2007/06/28 21:03:47 christos Exp $ */
/* $KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $ */ /* $KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $ */
/* /*
@ -62,7 +62,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.129 2007/05/27 16:58:17 cube Exp $"); __KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.130 2007/06/28 21:03:47 christos Exp $");
#include "opt_inet.h" #include "opt_inet.h"
#include "opt_pfil_hooks.h" #include "opt_pfil_hooks.h"
@ -2249,3 +2249,61 @@ in6_domifdetach(struct ifnet *ifp, void *aux)
scope6_ifdetach(ext->scope6_id); scope6_ifdetach(ext->scope6_id);
free(ext, M_IFADDR); free(ext, M_IFADDR);
} }
/*
* Convert sockaddr_in6 to sockaddr_in. Original sockaddr_in6 must be
* v4 mapped addr or v4 compat addr
*/
void
in6_sin6_2_sin(struct sockaddr_in *sin, struct sockaddr_in6 *sin6)
{
bzero(sin, sizeof(*sin));
sin->sin_len = sizeof(struct sockaddr_in);
sin->sin_family = AF_INET;
sin->sin_port = sin6->sin6_port;
sin->sin_addr.s_addr = sin6->sin6_addr.s6_addr32[3];
}
/* Convert sockaddr_in to sockaddr_in6 in v4 mapped addr format. */
void
in6_sin_2_v4mapsin6(struct sockaddr_in *sin, struct sockaddr_in6 *sin6)
{
bzero(sin6, sizeof(*sin6));
sin6->sin6_len = sizeof(struct sockaddr_in6);
sin6->sin6_family = AF_INET6;
sin6->sin6_port = sin->sin_port;
sin6->sin6_addr.s6_addr32[0] = 0;
sin6->sin6_addr.s6_addr32[1] = 0;
sin6->sin6_addr.s6_addr32[2] = IPV6_ADDR_INT32_SMP;
sin6->sin6_addr.s6_addr32[3] = sin->sin_addr.s_addr;
}
/* Convert sockaddr_in6 into sockaddr_in. */
void
in6_sin6_2_sin_in_sock(struct sockaddr *nam)
{
struct sockaddr_in *sin_p;
struct sockaddr_in6 sin6;
/*
* Save original sockaddr_in6 addr and convert it
* to sockaddr_in.
*/
sin6 = *(struct sockaddr_in6 *)nam;
sin_p = (struct sockaddr_in *)nam;
in6_sin6_2_sin(sin_p, &sin6);
}
/* Convert sockaddr_in into sockaddr_in6 in v4 mapped addr format. */
void
in6_sin_2_v4mapsin6_in_sock(struct sockaddr **nam)
{
struct sockaddr_in *sin_p;
struct sockaddr_in6 *sin6_p;
sin6_p = malloc(sizeof(*sin6_p), M_SONAME, M_WAITOK);
sin_p = (struct sockaddr_in *)*nam;
in6_sin_2_v4mapsin6(sin_p, sin6_p);
free(*nam, M_SONAME);
*nam = (struct sockaddr *)sin6_p;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: in6.h,v 1.60 2007/05/02 20:40:26 dyoung Exp $ */ /* $NetBSD: in6.h,v 1.61 2007/06/28 21:03:47 christos Exp $ */
/* $KAME: in6.h,v 1.83 2001/03/29 02:55:07 jinmei Exp $ */ /* $KAME: in6.h,v 1.83 2001/03/29 02:55:07 jinmei Exp $ */
/* /*
@ -762,6 +762,11 @@ typedef _BSD_SIZE_T_ size_t;
__BEGIN_DECLS __BEGIN_DECLS
struct cmsghdr; struct cmsghdr;
void in6_sin6_2_sin __P((struct sockaddr_in *, struct sockaddr_in6 *));
void in6_sin_2_v4mapsin6 __P((struct sockaddr_in *, struct sockaddr_in6 *));
void in6_sin6_2_sin_in_sock __P((struct sockaddr *));
void in6_sin_2_v4mapsin6_in_sock __P((struct sockaddr **));
extern int inet6_option_space __P((int)); extern int inet6_option_space __P((int));
extern int inet6_option_init __P((void *, struct cmsghdr **, int)); extern int inet6_option_init __P((void *, struct cmsghdr **, int));
extern int inet6_option_append __P((struct cmsghdr *, const uint8_t *, extern int inet6_option_append __P((struct cmsghdr *, const uint8_t *,