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 |