+#if CONFIG_FEATURE_IPV6
+static void INET6_displayroutes(int noresolve)
+{
+ char buff[256];
+ char iface[16], flags[16];
+ char addr6[128], naddr6[128];
+ struct sockaddr_in6 saddr6, snaddr6;
+ int iflags, metric, refcnt, use, prefix_len, slen;
+ int numeric;
+
+ char addr6p[8][5], saddr6p[8][5], naddr6p[8][5];
+
+ FILE *fp = xfopen("/proc/net/ipv6_route", "r");
+
+ flags[0] = 'U';
+
+ if (noresolve)
+ noresolve = 0x0fff;
+ numeric = noresolve | 0x8000; /* default instead of * */
+
+ printf("Kernel IPv6 routing table\n"
+ "Destination "
+ "Next Hop "
+ "Flags Metric Ref Use Iface\n");
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ int ifl;
+
+ if (sscanf(buff, "%4s%4s%4s%4s%4s%4s%4s%4s %02x "
+ "%4s%4s%4s%4s%4s%4s%4s%4s %02x "
+ "%4s%4s%4s%4s%4s%4s%4s%4s %08x %08x %08x %08x %s\n",
+ addr6p[0], addr6p[1], addr6p[2], addr6p[3],
+ addr6p[4], addr6p[5], addr6p[6], addr6p[7],
+ &prefix_len,
+ saddr6p[0], saddr6p[1], saddr6p[2], saddr6p[3],
+ saddr6p[4], saddr6p[5], saddr6p[6], saddr6p[7],
+ &slen,
+ naddr6p[0], naddr6p[1], naddr6p[2], naddr6p[3],
+ naddr6p[4], naddr6p[5], naddr6p[6], naddr6p[7],
+ &metric, &use, &refcnt, &iflags, iface) != 31) {
+ error_msg_and_die("Unsuported kernel route format\n");
+ }
+
+ ifl = 1; /* parse flags */
+ if (!(iflags & RTF_UP))
+ continue;
+ if (iflags & RTF_GATEWAY)
+ flags[ifl++] = 'G';
+ if (iflags & RTF_HOST)
+ flags[ifl++] = 'H';
+ if (iflags & RTF_DEFAULT)
+ flags[ifl++] = 'D';
+ if (iflags & RTF_ADDRCONF)
+ flags[ifl++] = 'A';
+ if (iflags & RTF_CACHE)
+ flags[ifl++] = 'C';
+ flags[ifl] = 0;
+
+ /* Fetch and resolve the target address. */
+ snprintf(addr6, sizeof(addr6), "%s:%s:%s:%s:%s:%s:%s:%s",
+ addr6p[0], addr6p[1], addr6p[2], addr6p[3],
+ addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
+ inet_pton(AF_INET6, addr6, (struct sockaddr *) &saddr6.sin6_addr);
+ saddr6.sin6_family = AF_INET6;
+
+ INET6_rresolve(addr6, sizeof(addr6), (struct sockaddr_in6 *) &saddr6,
+ numeric);
+ snprintf(addr6, sizeof(addr6), "%s/%d", addr6, prefix_len);
+
+ /* Fetch and resolve the nexthop address. */
+ snprintf(naddr6, sizeof(naddr6), "%s:%s:%s:%s:%s:%s:%s:%s",
+ naddr6p[0], naddr6p[1], naddr6p[2], naddr6p[3],
+ naddr6p[4], naddr6p[5], naddr6p[6], naddr6p[7]);
+ inet_pton(AF_INET6, naddr6, (struct sockaddr *) &snaddr6.sin6_addr);
+ snaddr6.sin6_family = AF_INET6;
+
+ INET6_rresolve(naddr6, sizeof(naddr6),
+ (struct sockaddr_in6 *) &snaddr6, numeric);
+
+ /* Print the info. */
+ printf("%-43s %-39s %-5s %-6d %-2d %7d %-8s\n",
+ addr6, naddr6, flags, metric, refcnt, use, iface);
+ }
+}
+#endif
+