Lines 1153-1161
Link Here
|
1153 |
{ |
1153 |
{ |
1154 |
#ifdef ICMPV6CTL_ND6_PRLIST |
1154 |
#ifdef ICMPV6CTL_ND6_PRLIST |
1155 |
int mib[] = { CTL_NET, PF_INET6, IPPROTO_ICMPV6, ICMPV6CTL_ND6_PRLIST }; |
1155 |
int mib[] = { CTL_NET, PF_INET6, IPPROTO_ICMPV6, ICMPV6CTL_ND6_PRLIST }; |
1156 |
char *buf; |
1156 |
char *buf, *p, *ep; |
1157 |
struct in6_prefix *p, *ep, *n; |
1157 |
struct in6_prefix pfx; |
1158 |
struct sockaddr_in6 *advrtr; |
|
|
1159 |
size_t l; |
1158 |
size_t l; |
1160 |
struct timeval now; |
1159 |
struct timeval now; |
1161 |
const int niflags = NI_NUMERICHOST; |
1160 |
const int niflags = NI_NUMERICHOST; |
Lines 1176-1192
Link Here
|
1176 |
/*NOTREACHED*/ |
1175 |
/*NOTREACHED*/ |
1177 |
} |
1176 |
} |
1178 |
|
1177 |
|
1179 |
ep = (struct in6_prefix *)(buf + l); |
1178 |
ep = buf + l; |
1180 |
for (p = (struct in6_prefix *)buf; p < ep; p = n) { |
1179 |
for (p = buf; p < ep; ) { |
1181 |
advrtr = (struct sockaddr_in6 *)(p + 1); |
1180 |
memcpy(&pfx, p, sizeof(pfx)); |
1182 |
n = (struct in6_prefix *)&advrtr[p->advrtrs]; |
1181 |
p += sizeof(pfx); |
1183 |
|
1182 |
|
1184 |
if (getnameinfo((struct sockaddr *)&p->prefix, |
1183 |
if (getnameinfo((struct sockaddr *)&pfx.prefix, |
1185 |
p->prefix.sin6_len, namebuf, sizeof(namebuf), |
1184 |
pfx.prefix.sin6_len, namebuf, sizeof(namebuf), |
1186 |
NULL, 0, niflags) != 0) |
1185 |
NULL, 0, niflags) != 0) |
1187 |
strlcpy(namebuf, "?", sizeof(namebuf)); |
1186 |
strlcpy(namebuf, "?", sizeof(namebuf)); |
1188 |
printf("%s/%d if=%s\n", namebuf, p->prefixlen, |
1187 |
printf("%s/%d if=%s\n", namebuf, pfx.prefixlen, |
1189 |
if_indextoname(p->if_index, ifix_buf)); |
1188 |
if_indextoname(pfx.if_index, ifix_buf)); |
1190 |
|
1189 |
|
1191 |
gettimeofday(&now, 0); |
1190 |
gettimeofday(&now, 0); |
1192 |
/* |
1191 |
/* |
Lines 1194-1247
Link Here
|
1194 |
* by origin. notify the difference to the users. |
1193 |
* by origin. notify the difference to the users. |
1195 |
*/ |
1194 |
*/ |
1196 |
printf("flags=%s%s%s%s%s", |
1195 |
printf("flags=%s%s%s%s%s", |
1197 |
p->raflags.onlink ? "L" : "", |
1196 |
pfx.raflags.onlink ? "L" : "", |
1198 |
p->raflags.autonomous ? "A" : "", |
1197 |
pfx.raflags.autonomous ? "A" : "", |
1199 |
(p->flags & NDPRF_ONLINK) != 0 ? "O" : "", |
1198 |
(pfx.flags & NDPRF_ONLINK) != 0 ? "O" : "", |
1200 |
(p->flags & NDPRF_DETACHED) != 0 ? "D" : "", |
1199 |
(pfx.flags & NDPRF_DETACHED) != 0 ? "D" : "", |
1201 |
#ifdef NDPRF_HOME |
1200 |
#ifdef NDPRF_HOME |
1202 |
(p->flags & NDPRF_HOME) != 0 ? "H" : "" |
1201 |
(pfx.flags & NDPRF_HOME) != 0 ? "H" : "" |
1203 |
#else |
1202 |
#else |
1204 |
"" |
1203 |
"" |
1205 |
#endif |
1204 |
#endif |
1206 |
); |
1205 |
); |
1207 |
if (p->vltime == ND6_INFINITE_LIFETIME) |
1206 |
if (pfx.vltime == ND6_INFINITE_LIFETIME) |
1208 |
printf(" vltime=infinity"); |
1207 |
printf(" vltime=infinity"); |
1209 |
else |
1208 |
else |
1210 |
printf(" vltime=%lu", (unsigned long)p->vltime); |
1209 |
printf(" vltime=%lu", (unsigned long)pfx.vltime); |
1211 |
if (p->pltime == ND6_INFINITE_LIFETIME) |
1210 |
if (pfx.pltime == ND6_INFINITE_LIFETIME) |
1212 |
printf(", pltime=infinity"); |
1211 |
printf(", pltime=infinity"); |
1213 |
else |
1212 |
else |
1214 |
printf(", pltime=%lu", (unsigned long)p->pltime); |
1213 |
printf(", pltime=%lu", (unsigned long)pfx.pltime); |
1215 |
if (p->expire == 0) |
1214 |
if (pfx.expire == 0) |
1216 |
printf(", expire=Never"); |
1215 |
printf(", expire=Never"); |
1217 |
else if (p->expire >= now.tv_sec) |
1216 |
else if (pfx.expire >= now.tv_sec) |
1218 |
printf(", expire=%s", |
1217 |
printf(", expire=%s", |
1219 |
sec2str(p->expire - now.tv_sec)); |
1218 |
sec2str(pfx.expire - now.tv_sec)); |
1220 |
else |
1219 |
else |
1221 |
printf(", expired"); |
1220 |
printf(", expired"); |
1222 |
printf(", ref=%d", p->refcnt); |
1221 |
printf(", ref=%d", pfx.refcnt); |
1223 |
printf("\n"); |
1222 |
printf("\n"); |
1224 |
/* |
1223 |
/* |
1225 |
* "advertising router" list is meaningful only if the prefix |
1224 |
* "advertising router" list is meaningful only if the prefix |
1226 |
* information is from RA. |
1225 |
* information is from RA. |
1227 |
*/ |
1226 |
*/ |
1228 |
if (p->advrtrs) { |
1227 |
if (pfx.advrtrs) { |
1229 |
int j; |
1228 |
int j; |
1230 |
struct sockaddr_in6 *sin6; |
1229 |
struct sockaddr_in6 sin6; |
1231 |
|
1230 |
|
1232 |
sin6 = advrtr; |
|
|
1233 |
printf(" advertised by\n"); |
1231 |
printf(" advertised by\n"); |
1234 |
for (j = 0; j < p->advrtrs; j++) { |
1232 |
for (j = 0; j < pfx.advrtrs && p <= ep; j++) { |
1235 |
struct in6_nbrinfo *nbi; |
1233 |
struct in6_nbrinfo *nbi; |
1236 |
|
1234 |
|
1237 |
if (getnameinfo((struct sockaddr *)sin6, |
1235 |
memcpy(&sin6, p, sizeof(sin6)); |
1238 |
sin6->sin6_len, namebuf, sizeof(namebuf), |
1236 |
p += sizeof(sin6); |
|
|
1237 |
|
1238 |
if (getnameinfo((struct sockaddr *)&sin6, |
1239 |
sin6.sin6_len, namebuf, sizeof(namebuf), |
1239 |
NULL, 0, ninflags) != 0) |
1240 |
NULL, 0, ninflags) != 0) |
1240 |
strlcpy(namebuf, "?", sizeof(namebuf)); |
1241 |
strlcpy(namebuf, "?", sizeof(namebuf)); |
1241 |
printf(" %s", namebuf); |
1242 |
printf(" %s", namebuf); |
1242 |
|
1243 |
|
1243 |
nbi = getnbrinfo(&sin6->sin6_addr, |
1244 |
nbi = getnbrinfo(&sin6.sin6_addr, |
1244 |
p->if_index, 0); |
1245 |
pfx.if_index, 0); |
1245 |
if (nbi) { |
1246 |
if (nbi) { |
1246 |
switch (nbi->state) { |
1247 |
switch (nbi->state) { |
1247 |
case ND6_LLINFO_REACHABLE: |
1248 |
case ND6_LLINFO_REACHABLE: |
Lines 1255-1261
Link Here
|
1255 |
} |
1256 |
} |
1256 |
} else |
1257 |
} else |
1257 |
printf(" (no neighbor state)\n"); |
1258 |
printf(" (no neighbor state)\n"); |
1258 |
sin6++; |
|
|
1259 |
} |
1259 |
} |
1260 |
} else |
1260 |
} else |
1261 |
printf(" No advertising router\n"); |
1261 |
printf(" No advertising router\n"); |