diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-12-18 17:19:46 -0800 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-12-18 17:19:46 -0800 |
commit | 3111ae93268b1af36e469b1f7744e821f27f0a30 (patch) | |
tree | 0c6282fe70d9f0df38ec5136a046ce14311c0d42 /lib/sockunion.c | |
parent | 0b49f5d475aa5503e60d8dbdc9b4dcc8f6a614ec (diff) | |
parent | 177fec0b82d18dc92fe40b51bf1a4a294fb9a7ff (diff) | |
download | quagga-3111ae93268b1af36e469b1f7744e821f27f0a30.tar.bz2 quagga-3111ae93268b1af36e469b1f7744e821f27f0a30.tar.xz |
Merge branch 'jenner' of suva.vyatta.com:/git/vyatta-quagga into jenner
Diffstat (limited to 'lib/sockunion.c')
-rw-r--r-- | lib/sockunion.c | 61 |
1 files changed, 21 insertions, 40 deletions
diff --git a/lib/sockunion.c b/lib/sockunion.c index 1ae092bd..75419b11 100644 --- a/lib/sockunion.c +++ b/lib/sockunion.c @@ -226,6 +226,24 @@ sockunion_su2str (union sockunion *su) return XSTRDUP (MTYPE_TMP, str); } +/* Convert IPv4 compatible IPv6 address to IPv4 address. */ +static void +sockunion_normalise_mapped (union sockunion *su) +{ + struct sockaddr_in sin; + +#ifdef HAVE_IPV6 + if (su->sa.sa_family == AF_INET6 + && IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) + { + memset (&sin, 0, sizeof (struct sockaddr_in)); + sin.sin_family = AF_INET; + memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); + memcpy (su, &sin, sizeof (struct sockaddr_in)); + } +#endif /* HAVE_IPV6 */ +} + /* Return socket of sockunion. */ int sockunion_socket (union sockunion *su) @@ -252,23 +270,7 @@ sockunion_accept (int sock, union sockunion *su) len = sizeof (union sockunion); client_sock = accept (sock, (struct sockaddr *) su, &len); - /* Convert IPv4 compatible IPv6 address to IPv4 address. */ -#if 0 -#ifdef HAVE_IPV6 - if (su->sa.sa_family == AF_INET6) - { - if (IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) - { - struct sockaddr_in sin; - - memset (&sin, 0, sizeof (struct sockaddr_in)); - sin.sin_family = AF_INET; - memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); - memcpy (su, &sin, sizeof (struct sockaddr_in)); - } - } -#endif /* HAVE_IPV6 */ -#endif + sockunion_normalise_mapped (su); return client_sock; } @@ -591,18 +593,7 @@ sockunion_getsockname (int fd) { su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion)); memcpy (su, &name, sizeof (struct sockaddr_in6)); - -#if 0 - if (IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) - { - struct sockaddr_in sin; - - sin.sin_family = AF_INET; - memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); - sin.sin_port = su->sin6.sin6_port; - memcpy (su, &sin, sizeof (struct sockaddr_in)); - } -#endif + sockunion_normalise_mapped (su); return su; } #endif /* HAVE_IPV6 */ @@ -647,17 +638,7 @@ sockunion_getpeername (int fd) { su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion)); memcpy (su, &name, sizeof (struct sockaddr_in6)); -#if 0 - if (IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) - { - struct sockaddr_in sin; - - sin.sin_family = AF_INET; - memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); - sin.sin_port = su->sin6.sin6_port; - memcpy (su, &sin, sizeof (struct sockaddr_in)); - } -#endif + sockunion_normalise_mapped (su); return su; } #endif /* HAVE_IPV6 */ |