Add functions to do mapped address conversions from FreeBSD.
This commit is contained in:
parent
5cd016ef40
commit
681a7e5524
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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 *,
|
||||||
|
|
Loading…
Reference in New Issue