Signed-off-by: Sven Eckelmann <[email protected]>
---
 functions.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/functions.c b/functions.c
index e56479d..45c2120 100644
--- a/functions.c
+++ b/functions.c
@@ -426,6 +426,7 @@ static int resolve_l3addr(int ai_family, const char *asc, 
void *l3addr)
        struct addrinfo hints;
        struct addrinfo *res;
        struct sockaddr_in *inet4;
+       struct sockaddr_in6 *inet6;
 
        memset(&hints, 0, sizeof(hints));
        hints.ai_family = ai_family;
@@ -440,6 +441,11 @@ static int resolve_l3addr(int ai_family, const char *asc, 
void *l3addr)
                        memcpy(l3addr, &inet4->sin_addr.s_addr,
                               sizeof(inet4->sin_addr.s_addr));
                        break;
+               case AF_INET6:
+                       inet6 = (struct sockaddr_in6 *)res->ai_addr;
+                       memcpy(l3addr, &inet6->sin6_addr.s6_addr,
+                              sizeof(inet6->sin6_addr.s6_addr));
+                       break;
                default:
                        ret = -EINVAL;
                }
@@ -453,6 +459,7 @@ static void request_mac_resolve(int ai_family, const void 
*l3addr)
 {
        const struct sockaddr *sockaddr;
        struct sockaddr_in inet4;
+       struct sockaddr_in6 inet6;
        size_t sockaddr_len;
        int sock;
        char t = 0;
@@ -471,6 +478,15 @@ static void request_mac_resolve(int ai_family, const void 
*l3addr)
                sockaddr = (const struct sockaddr *)&inet4;
                sockaddr_len = sizeof(inet4);
                break;
+       case AF_INET6:
+               memset(&inet6, 0, sizeof(inet6));
+               inet6.sin6_family = ai_family;
+               inet6.sin6_port = htons(9);
+               memcpy(&inet6.sin6_addr.s6_addr, l3addr,
+                      sizeof(inet6.sin6_addr.s6_addr));
+               sockaddr = (const struct sockaddr *)&inet6;
+               sockaddr_len = sizeof(inet6);
+               break;
        default:
                close(sock);
                return;
@@ -597,6 +613,9 @@ static struct ether_addr *resolve_mac_from_cache(int 
ai_family,
        case AF_INET:
                l3_len = 4;
                break;
+       case AF_INET6:
+               l3_len = 16;
+               break;
        default:
                l3_len = 0;
        }
@@ -649,6 +668,7 @@ out:
 static struct ether_addr *resolve_mac_from_addr(int ai_family, const char *asc)
 {
        uint8_t ipv4_addr[4];
+       uint8_t ipv6_addr[16];
        void *l3addr;
        int ret;
        int retries = 5;
@@ -658,6 +678,9 @@ static struct ether_addr *resolve_mac_from_addr(int 
ai_family, const char *asc)
        case AF_INET:
                l3addr = ipv4_addr;
                break;
+       case AF_INET6:
+               l3addr = ipv6_addr;
+               break;
        default:
                return NULL;
        }
@@ -680,7 +703,7 @@ static struct ether_addr *resolve_mac_from_addr(int 
ai_family, const char *asc)
 struct ether_addr *resolve_mac(const char *asc)
 {
        struct ether_addr *mac_result = NULL;
-       static const int ai_families[] = {AF_INET};
+       static const int ai_families[] = {AF_INET, AF_INET6};
        size_t i;
 
        mac_result = ether_aton(asc);
-- 
1.8.4.rc3

Reply via email to