Last fixes from 6Wind patch.
diff --git a/lib/command.c b/lib/command.c
index f57cf5c..5d42933 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -718,6 +718,8 @@
   int state = STATE_START;
   int colons = 0, nums = 0, double_colon = 0;
   char *sp = NULL;
+  struct sockaddr_in6 sin6_dummy;
+  int ret;
 
   if (str == NULL)
     return partly_match;
@@ -725,6 +727,15 @@
   if (strspn (str, IPV6_ADDR_STR) != strlen (str))
     return no_match;
 
+  /* use inet_pton that has a better support,
+   * for example inet_pton can support the automatic addresses:
+   *  ::1.2.3.4
+   */
+  ret = inet_pton(AF_INET6, str, &sin6_dummy.sin6_addr);
+   
+  if (ret == 1)
+    return exact_match;
+
   while (*str != '\0')
     {
       switch (state)
diff --git a/lib/sockunion.c b/lib/sockunion.c
index 13b0be6..e4b311c 100644
--- a/lib/sockunion.c
+++ b/lib/sockunion.c
@@ -344,8 +344,13 @@
 	{
 #ifdef HAVE_SIN6_SCOPE_ID
 	  /* su.sin6.sin6_scope_id = ifindex; */
+#ifdef MUSICA
+	  su.sin6.sin6_scope_id = ifindex; 
+#endif
 #endif /* HAVE_SIN6_SCOPE_ID */
+#ifndef MUSICA
 	  SET_IN6_LINKLOCAL_IFINDEX (su.sin6.sin6_addr, ifindex);
+#endif
 	}
 #endif /* KAME */
       break;
diff --git a/lib/zebra.h b/lib/zebra.h
index 175eb6e..baad6d6 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -143,6 +143,10 @@
 #include <netinet/in_var.h>
 #endif /* HAVE_NETINET_IN_VAR_H */
 
+#ifdef HAVE_NETINET6_IN6_VAR_H
+#include <netinet6/in6_var.h>
+#endif /* HAVE_NETINET6_IN6_VAR_H */
+
 #ifdef HAVE_NETINET_IN6_VAR_H
 #include <netinet/in6_var.h>
 #endif /* HAVE_NETINET_IN6_VAR_H */