diff -Nur ipmitool.sav/include/ipmitool/ipmi_intf.h ipmitool/include/ipmitool/ipmi_intf.h
--- ipmitool.sav/include/ipmitool/ipmi_intf.h	2010-05-02 14:44:50.000000000 +0200
+++ ipmitool/include/ipmitool/ipmi_intf.h	2011-01-18 16:47:49.844165332 +0100
@@ -89,7 +89,7 @@
 	uint32_t out_seq;
 	uint32_t timeout;
 
-	struct sockaddr_in addr;
+	struct sockaddr_storage addr;
 	socklen_t addrlen;
 
 	/*
diff -Nur ipmitool.sav/src/plugins/lan/lan.c ipmitool/src/plugins/lan/lan.c
--- ipmitool.sav/src/plugins/lan/lan.c	2010-05-02 14:44:52.000000000 +0200
+++ ipmitool/src/plugins/lan/lan.c	2011-01-18 16:49:23.494923793 +0100
@@ -1944,6 +1944,9 @@
 {
 	int rc;
 	struct ipmi_session *s;
+	struct addrinfo hints;
+	struct addrinfo *result, *rp;
+	char service[NI_MAXSERV];
 
 	if (intf == NULL || intf->session == NULL)
 		return -1;
@@ -1968,36 +1971,49 @@
 	intf->session->sol_data.sequence_number = 1;
 	
 	/* open port to BMC */
-	memset(&s->addr, 0, sizeof(struct sockaddr_in));
-	s->addr.sin_family = AF_INET;
-	s->addr.sin_port = htons(s->port);
-
-	rc = inet_pton(AF_INET, (const char *)s->hostname, &s->addr.sin_addr);
-	if (rc <= 0) {
-		struct hostent *host = gethostbyname((const char *)s->hostname);
-		if (host == NULL) {
-			lprintf(LOG_ERR, "Address lookup for %s failed",
-				s->hostname);
-			return -1;
-		}
-		s->addr.sin_family = host->h_addrtype;
-		memcpy(&s->addr.sin_addr, host->h_addr, host->h_length);
-	}
 
-	lprintf(LOG_DEBUG, "IPMI LAN host %s port %d",
-		s->hostname, ntohs(s->addr.sin_port));
+	memset(&s->addr, 0, sizeof(s->addr));
 
-	intf->fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-	if (intf->fd < 0) {
-		lperror(LOG_ERR, "Socket failed");
+	sprintf(service, "%d", s->port);
+	/* Obtain address(es) matching host/port */
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family   = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
+	hints.ai_socktype = SOCK_DGRAM;   /* Datagram socket */
+	hints.ai_flags    = AI_NUMERICSERV;
+	hints.ai_protocol = IPPROTO_UDP; /*  */
+
+	if (getaddrinfo(s->hostname, service, NULL, &result) != 0) {
+		lprintf(LOG_ERR, "Address lookup for %s failed",
+			s->hostname);
 		return -1;
 	}
 
-	/* connect to UDP socket so we get async errors */
-	rc = connect(intf->fd, (struct sockaddr *)&s->addr,
-		     sizeof(struct sockaddr_in));
-	if (rc < 0) {
-		lperror(LOG_ERR, "Connect failed");
+	/* getaddrinfo() returns a list of address structures.
+	 * Try each address until we successfully connect(2).
+	 * If socket(2) (or connect(2)) fails, we (close the socket
+	 * and) try the next address. 
+	 */
+	for (rp = result; rp != NULL; rp = rp->ai_next) {
+		intf->fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+		if (intf->fd == -1)
+			continue;
+
+		if (connect(intf->fd, rp->ai_addr, rp->ai_addrlen) != -1) {
+			memcpy(&s->addr, rp->ai_addr, rp->ai_addrlen);
+			s->addrlen = rp->ai_addrlen;
+			break;  /* Success */
+		}
+
+		close(intf->fd);
+		intf->fd = -1;
+	}
+
+	/* No longer needed */
+	freeaddrinfo(result);           
+
+	if (intf->fd < 0) {
+		lperror(LOG_ERR, "Connect to %s failed",
+			s->hostname);
 		intf->close(intf);
 		return -1;
 	}
diff -Nur ipmitool.sav/src/plugins/lanplus/lanplus.c ipmitool/src/plugins/lanplus/lanplus.c
--- ipmitool.sav/src/plugins/lanplus/lanplus.c	2010-07-27 17:36:56.000000000 +0200
+++ ipmitool/src/plugins/lanplus/lanplus.c	2011-01-18 16:50:15.692182967 +0100
@@ -3315,8 +3315,11 @@
 {
 	int rc;
 	struct get_channel_auth_cap_rsp auth_cap;
-	struct sockaddr_in addr;
+	struct sockaddr_storage addr;
 	struct ipmi_session *session;
+	struct addrinfo hints;
+	struct addrinfo *result, *rp;
+	char service[NI_MAXSERV];
 
 	if (!intf || !intf->session)
 		return -1;
@@ -3355,38 +3358,49 @@
 	//memset(session->v2_data.kg,  0, IPMI_KG_BUFFER_SIZE);
 
 
-	/* open port to BMC */
-	memset(&addr, 0, sizeof(struct sockaddr_in));
-	addr.sin_family = AF_INET;
-	addr.sin_port = htons(session->port);
-
-	rc = inet_pton(AF_INET, (const char *)session->hostname, &addr.sin_addr);
-	if (rc <= 0) {
-		struct hostent *host = gethostbyname((const char *)session->hostname);
-		if (host == NULL) {
-			lprintf(LOG_ERR, "Address lookup for %s failed",
-				session->hostname);
-			return -1;
-		}
-		addr.sin_family = host->h_addrtype;
-		memcpy(&addr.sin_addr, host->h_addr, host->h_length);
+	memset(&addr, 0, sizeof(addr));
+
+	sprintf(service, "%d", session->port);
+	/* Obtain address(es) matching host/port */
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family   = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
+	hints.ai_socktype = SOCK_DGRAM;   /* Datagram socket */
+	hints.ai_flags    = AI_NUMERICSERV;
+	hints.ai_protocol = IPPROTO_UDP; /*  */
+
+	if (getaddrinfo(session->hostname, service, &hints, &result) != 0) {
+		lprintf(LOG_ERR, "Address lookup for %s failed",
+			session->hostname);
+		return -1;
 	}
 
-	lprintf(LOG_DEBUG, "IPMI LAN host %s port %d",
-		session->hostname, ntohs(addr.sin_port));
+	/* getaddrinfo() returns a list of address structures.
+	 * Try each address until we successfully connect(2).
+	 * If socket(2) (or connect(2)) fails, we (close the socket
+	 * and) try the next address. 
+	 */
 
-	intf->fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-	if (intf->fd < 0) {
-		lperror(LOG_ERR, "Socket failed");
-		return -1;
+	for (rp = result; rp != NULL; rp = rp->ai_next) {
+		intf->fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+		if (intf->fd == -1)
+			continue;
+
+		if (connect(intf->fd, rp->ai_addr, rp->ai_addrlen) != -1) {
+			memcpy(&session->addr, rp->ai_addr, rp->ai_addrlen);
+			session->addrlen = rp->ai_addrlen;
+			break;  /* Success */
+		}
+
+		close(intf->fd);
+		intf->fd = -1;
 	}
 
+	/* No longer needed */
+	freeaddrinfo(result);           
 
-	/* connect to UDP socket so we get async errors */
-	rc = connect(intf->fd,
-				 (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
-	if (rc < 0) {
-		lperror(LOG_ERR, "Connect failed");
+	if (intf->fd < 0) {
+		lperror(LOG_ERR, "Connect to %s failed",
+			session->hostname);
 		intf->close(intf);
 		return -1;
 	}
