Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 402621
Collapse All | Expand All

(-)a/dhcpcd.h (+3 lines)
Lines 92-97 struct ra_opt { Link Here
92
struct ra {
92
struct ra {
93
	struct in6_addr from;
93
	struct in6_addr from;
94
	char sfrom[INET6_ADDRSTRLEN];
94
	char sfrom[INET6_ADDRSTRLEN];
95
	unsigned char *data;
96
	ssize_t data_len;
95
	struct timeval received;
97
	struct timeval received;
96
	uint32_t lifetime;
98
	uint32_t lifetime;
97
	struct in6_addr prefix;
99
	struct in6_addr prefix;
Lines 100-105 struct ra { Link Here
100
	uint32_t prefix_pltime;
102
	uint32_t prefix_pltime;
101
	char sprefix[INET6_ADDRSTRLEN];
103
	char sprefix[INET6_ADDRSTRLEN];
102
	struct ra_opt *options;
104
	struct ra_opt *options;
105
	int expired;
103
	struct ra *next;
106
	struct ra *next;
104
};
107
};
105
108
(-)a/ipv6rs.c (-5 / +26 lines)
Lines 335-349 ipv6rs_handledata(_unused void *arg) Link Here
335
		    sfrom);
335
		    sfrom);
336
		return;
336
		return;
337
	}
337
	}
338
339
	syslog(LOG_INFO, "%s: Router Advertisement from %s", ifp->name, sfrom);
340
	delete_timeouts(ifp, NULL);
341
342
	for (rap = ifp->ras; rap; rap = rap->next) {
338
	for (rap = ifp->ras; rap; rap = rap->next) {
343
		if (memcmp(rap->from.s6_addr, from.sin6_addr.s6_addr,
339
		if (memcmp(rap->from.s6_addr, from.sin6_addr.s6_addr,
344
		    sizeof(rap->from.s6_addr)) == 0)
340
		    sizeof(rap->from.s6_addr)) == 0)
345
			break;
341
			break;
346
	}
342
	}
343
344
	/* We don't want to spam the log with the fact we got an RA every
345
	 * 30 seconds or so, so only spam the log if it's different. */
346
	if (options & DHCPCD_DEBUG || rap == NULL ||
347
	    (rap->expired || rap->data_len != len ||
348
	     memcmp(rap->data, (unsigned char *)icp, rap->data_len) != 0))
349
	{
350
		if (rap) {
351
			free(rap->data);
352
			rap->data_len = 0;
353
		}
354
		syslog(LOG_INFO, "%s: Router Advertisement from %s",
355
		    ifp->name, sfrom);
356
	}
357
	delete_timeouts(ifp, NULL);
358
347
	if (rap == NULL) {
359
	if (rap == NULL) {
348
		rap = xmalloc(sizeof(*rap));
360
		rap = xmalloc(sizeof(*rap));
349
		rap->next = ifp->ras;
361
		rap->next = ifp->ras;
Lines 352-362 ipv6rs_handledata(_unused void *arg) Link Here
352
		memcpy(rap->from.s6_addr, from.sin6_addr.s6_addr,
364
		memcpy(rap->from.s6_addr, from.sin6_addr.s6_addr,
353
		    sizeof(rap->from.s6_addr));
365
		    sizeof(rap->from.s6_addr));
354
		strlcpy(rap->sfrom, sfrom, sizeof(rap->sfrom));
366
		strlcpy(rap->sfrom, sfrom, sizeof(rap->sfrom));
367
		rap->data_len = 0;
368
	}
369
	if (rap->data_len == 0) {
370
		rap->data = xmalloc(len);
371
		memcpy(rap->data, icp, len);
372
		rap->data_len = len;
355
	}
373
	}
356
374
357
	get_monotonic(&rap->received);
375
	get_monotonic(&rap->received);
358
	nd_ra = (struct nd_router_advert *)icp;
376
	nd_ra = (struct nd_router_advert *)icp;
359
	rap->lifetime = ntohs(nd_ra->nd_ra_router_lifetime);
377
	rap->lifetime = ntohs(nd_ra->nd_ra_router_lifetime);
378
	rap->expired = 0;
360
379
361
	len -= sizeof(struct nd_router_advert);
380
	len -= sizeof(struct nd_router_advert);
362
	p = ((uint8_t *)icp) + sizeof(struct nd_router_advert);
381
	p = ((uint8_t *)icp) + sizeof(struct nd_router_advert);
Lines 622-627 ipv6rs_free(struct interface *ifp) Link Here
622
641
623
	for (rap = ifp->ras; rap && (ran = rap->next, 1); rap = ran) {
642
	for (rap = ifp->ras; rap && (ran = rap->next, 1); rap = ran) {
624
		ipv6rs_free_opts(rap);
643
		ipv6rs_free_opts(rap);
644
		free(rap->data);
625
		free(rap);
645
		free(rap);
626
	}
646
	}
627
}
647
}
Lines 652-658 ipv6rs_expire(void *arg) Link Here
652
		if (timercmp(&now, &expire, >)) {
672
		if (timercmp(&now, &expire, >)) {
653
			syslog(LOG_INFO, "%s: %s: expired Router Advertisement",
673
			syslog(LOG_INFO, "%s: %s: expired Router Advertisement",
654
			    ifp->name, rap->sfrom);
674
			    ifp->name, rap->sfrom);
655
			expired = 1;
675
			rap->expired = expired = 1;
656
			if (ral)
676
			if (ral)
657
				ral->next = ran;
677
				ral->next = ran;
658
			else
678
			else
Lines 675-680 ipv6rs_expire(void *arg) Link Here
675
				syslog(LOG_INFO,
695
				syslog(LOG_INFO,
676
				    "%s: %s: expired option %d",
696
				    "%s: %s: expired option %d",
677
				    ifp->name, rap->sfrom, rao->type);
697
				    ifp->name, rap->sfrom, rao->type);
698
				rap->expired = expired = 1;
678
				if (raol)
699
				if (raol)
679
					raol = raon;
700
					raol = raon;
680
				else
701
				else

Return to bug 402621