View | Details | Raw Unified | Return to bug 202600
Collapse All | Expand All

(-)usr.sbin/ndp/ndp.c (-33 / +33 lines)
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");

Return to bug 202600