rtsol.c (253376) | rtsol.c (253970) |
---|---|
1/* $KAME: rtsol.c,v 1.27 2003/10/05 00:09:36 itojun Exp $ */ 2 3/* 4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 * Copyright (C) 2011 Hiroki Sato 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 15 unchanged lines hidden (view full) --- 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * | 1/* $KAME: rtsol.c,v 1.27 2003/10/05 00:09:36 itojun Exp $ */ 2 3/* 4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 * Copyright (C) 2011 Hiroki Sato 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 15 unchanged lines hidden (view full) --- 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * |
32 * $FreeBSD: head/usr.sbin/rtsold/rtsol.c 253376 2013-07-16 03:12:31Z kevlo $ | 32 * $FreeBSD: head/usr.sbin/rtsold/rtsol.c 253970 2013-08-05 20:13:02Z hrs $ |
33 */ 34 35#include <sys/param.h> 36#include <sys/socket.h> 37#include <sys/uio.h> | 33 */ 34 35#include <sys/param.h> 36#include <sys/socket.h> 37#include <sys/uio.h> |
38#include <sys/time.h> | |
39#include <sys/queue.h> 40#include <sys/wait.h> 41#include <sys/stat.h> 42 43#include <net/if.h> 44#include <net/route.h> 45#include <net/if_dl.h> 46 --- 6 unchanged lines hidden (view full) --- 53 54#include <arpa/inet.h> 55 56#include <netdb.h> 57#include <time.h> 58#include <fcntl.h> 59#include <unistd.h> 60#include <stdio.h> | 38#include <sys/queue.h> 39#include <sys/wait.h> 40#include <sys/stat.h> 41 42#include <net/if.h> 43#include <net/route.h> 44#include <net/if_dl.h> 45 --- 6 unchanged lines hidden (view full) --- 52 53#include <arpa/inet.h> 54 55#include <netdb.h> 56#include <time.h> 57#include <fcntl.h> 58#include <unistd.h> 59#include <stdio.h> |
60#include <time.h> |
|
61#include <err.h> 62#include <errno.h> 63#include <string.h> 64#include <stdlib.h> 65#include <syslog.h> 66#include "rtsold.h" 67 68static struct msghdr rcvmhdr; --- 182 unchanged lines hidden (view full) --- 251 char *p; 252 struct in6_addr *addr; 253 struct nd_opt_hdr *ndo; 254 struct nd_opt_rdnss *rdnss; 255 struct nd_opt_dnssl *dnssl; 256 size_t len; 257 char nsbuf[INET6_ADDRSTRLEN + 1 + IFNAMSIZ + 1]; 258 char dname[NI_MAXHOST]; | 61#include <err.h> 62#include <errno.h> 63#include <string.h> 64#include <stdlib.h> 65#include <syslog.h> 66#include "rtsold.h" 67 68static struct msghdr rcvmhdr; --- 182 unchanged lines hidden (view full) --- 251 char *p; 252 struct in6_addr *addr; 253 struct nd_opt_hdr *ndo; 254 struct nd_opt_rdnss *rdnss; 255 struct nd_opt_dnssl *dnssl; 256 size_t len; 257 char nsbuf[INET6_ADDRSTRLEN + 1 + IFNAMSIZ + 1]; 258 char dname[NI_MAXHOST]; |
259 struct timeval now; 260 struct timeval lifetime; | 259 struct timespec now; 260 struct timespec lifetime; |
261 int newent_rai; 262 int newent_rao; 263 264 /* get message. namelen and controllen must always be initialized. */ 265 rcvmhdr.msg_namelen = sizeof(from); 266 rcvmhdr.msg_controllen = rcvcmsglen; 267 if ((msglen = recvmsg(s, &rcvmhdr, 0)) < 0) { 268 warnmsg(LOG_ERR, __func__, "recvmsg: %s", strerror(errno)); --- 102 unchanged lines hidden (view full) --- 371 */ 372 if (((nd_ra->nd_ra_flags_reserved) & ND_RA_FLAG_OTHER) && 373 !ifi->otherconfig) { 374 warnmsg(LOG_DEBUG, __func__, 375 "OtherConfigFlag on %s is turned on", ifi->ifname); 376 ifi->otherconfig = 1; 377 CALL_SCRIPT(OTHER, NULL); 378 } | 261 int newent_rai; 262 int newent_rao; 263 264 /* get message. namelen and controllen must always be initialized. */ 265 rcvmhdr.msg_namelen = sizeof(from); 266 rcvmhdr.msg_controllen = rcvcmsglen; 267 if ((msglen = recvmsg(s, &rcvmhdr, 0)) < 0) { 268 warnmsg(LOG_ERR, __func__, "recvmsg: %s", strerror(errno)); --- 102 unchanged lines hidden (view full) --- 371 */ 372 if (((nd_ra->nd_ra_flags_reserved) & ND_RA_FLAG_OTHER) && 373 !ifi->otherconfig) { 374 warnmsg(LOG_DEBUG, __func__, 375 "OtherConfigFlag on %s is turned on", ifi->ifname); 376 ifi->otherconfig = 1; 377 CALL_SCRIPT(OTHER, NULL); 378 } |
379 gettimeofday(&now, NULL); | 379 clock_gettime(CLOCK_MONOTONIC_FAST, &now); |
380 newent_rai = 0; 381 rai = find_rainfo(ifi, &from); 382 if (rai == NULL) { 383 ELM_MALLOC(rai, exit(1)); 384 rai->rai_ifinfo = ifi; 385 TAILQ_INIT(&rai->rai_ra_opt); 386 rai->rai_saddr.sin6_family = AF_INET6; 387 rai->rai_saddr.sin6_len = sizeof(rai->rai_saddr); --- 79 unchanged lines hidden (view full) --- 467 newent_rao = 1; 468 } 469 /* Set expiration timer */ 470 memset(&rao->rao_expire, 0, 471 sizeof(rao->rao_expire)); 472 memset(&lifetime, 0, sizeof(lifetime)); 473 lifetime.tv_sec = 474 ntohl(rdnss->nd_opt_rdnss_lifetime); | 380 newent_rai = 0; 381 rai = find_rainfo(ifi, &from); 382 if (rai == NULL) { 383 ELM_MALLOC(rai, exit(1)); 384 rai->rai_ifinfo = ifi; 385 TAILQ_INIT(&rai->rai_ra_opt); 386 rai->rai_saddr.sin6_family = AF_INET6; 387 rai->rai_saddr.sin6_len = sizeof(rai->rai_saddr); --- 79 unchanged lines hidden (view full) --- 467 newent_rao = 1; 468 } 469 /* Set expiration timer */ 470 memset(&rao->rao_expire, 0, 471 sizeof(rao->rao_expire)); 472 memset(&lifetime, 0, sizeof(lifetime)); 473 lifetime.tv_sec = 474 ntohl(rdnss->nd_opt_rdnss_lifetime); |
475 timeradd(&now, &lifetime, &rao->rao_expire); | 475 TS_ADD(&now, &lifetime, &rao->rao_expire); |
476 477 if (newent_rao) 478 TAILQ_INSERT_TAIL(&rai->rai_ra_opt, 479 rao, rao_next); 480 addr++; 481 } 482 break; 483 case ND_OPT_DNSSL: --- 42 unchanged lines hidden (view full) --- 526 newent_rao = 1; 527 } 528 /* Set expiration timer */ 529 memset(&rao->rao_expire, 0, 530 sizeof(rao->rao_expire)); 531 memset(&lifetime, 0, sizeof(lifetime)); 532 lifetime.tv_sec = 533 ntohl(dnssl->nd_opt_dnssl_lifetime); | 476 477 if (newent_rao) 478 TAILQ_INSERT_TAIL(&rai->rai_ra_opt, 479 rao, rao_next); 480 addr++; 481 } 482 break; 483 case ND_OPT_DNSSL: --- 42 unchanged lines hidden (view full) --- 526 newent_rao = 1; 527 } 528 /* Set expiration timer */ 529 memset(&rao->rao_expire, 0, 530 sizeof(rao->rao_expire)); 531 memset(&lifetime, 0, sizeof(lifetime)); 532 lifetime.tv_sec = 533 ntohl(dnssl->nd_opt_dnssl_lifetime); |
534 timeradd(&now, &lifetime, &rao->rao_expire); | 534 TS_ADD(&now, &lifetime, &rao->rao_expire); |
535 536 if (newent_rao) 537 TAILQ_INSERT_TAIL(&rai->rai_ra_opt, 538 rao, rao_next); 539 p += len; 540 } 541 break; 542 default: --- 26 unchanged lines hidden (view full) --- 569static char resstr_sp[] = " "; 570 571int 572ra_opt_handler(struct ifinfo *ifi) 573{ 574 struct ra_opt *rao; 575 struct rainfo *rai; 576 struct script_msg *smp1, *smp2, *smp3; | 535 536 if (newent_rao) 537 TAILQ_INSERT_TAIL(&rai->rai_ra_opt, 538 rao, rao_next); 539 p += len; 540 } 541 break; 542 default: --- 26 unchanged lines hidden (view full) --- 569static char resstr_sp[] = " "; 570 571int 572ra_opt_handler(struct ifinfo *ifi) 573{ 574 struct ra_opt *rao; 575 struct rainfo *rai; 576 struct script_msg *smp1, *smp2, *smp3; |
577 struct timeval now; | 577 struct timespec now; |
578 struct script_msg_head_t sm_rdnss_head = 579 TAILQ_HEAD_INITIALIZER(sm_rdnss_head); 580 struct script_msg_head_t sm_dnssl_head = 581 TAILQ_HEAD_INITIALIZER(sm_dnssl_head); 582 583 int dcount, dlen; 584 585 dcount = 0; 586 dlen = strlen(resstr_sh_prefix) + strlen(resstr_nl); | 578 struct script_msg_head_t sm_rdnss_head = 579 TAILQ_HEAD_INITIALIZER(sm_rdnss_head); 580 struct script_msg_head_t sm_dnssl_head = 581 TAILQ_HEAD_INITIALIZER(sm_dnssl_head); 582 583 int dcount, dlen; 584 585 dcount = 0; 586 dlen = strlen(resstr_sh_prefix) + strlen(resstr_nl); |
587 gettimeofday(&now, NULL); | 587 clock_gettime(CLOCK_MONOTONIC_FAST, &now); |
588 589 /* 590 * All options from multiple RAs with the same or different 591 * source addresses on a single interface will be gathered and 592 * handled, not overridden. [RFC 4861 6.3.4] 593 */ 594 TAILQ_FOREACH(rai, &ifi->ifi_rainfo, rai_next) { 595 TAILQ_FOREACH(rao, &rai->rai_ra_opt, rao_next) { 596 switch (rao->rao_type) { 597 case ND_OPT_RDNSS: | 588 589 /* 590 * All options from multiple RAs with the same or different 591 * source addresses on a single interface will be gathered and 592 * handled, not overridden. [RFC 4861 6.3.4] 593 */ 594 TAILQ_FOREACH(rai, &ifi->ifi_rainfo, rai_next) { 595 TAILQ_FOREACH(rao, &rai->rai_ra_opt, rao_next) { 596 switch (rao->rao_type) { 597 case ND_OPT_RDNSS: |
598 if (timercmp(&now, &rao->rao_expire, >)) { | 598 if (TS_CMP(&now, &rao->rao_expire, >)) { |
599 warnmsg(LOG_INFO, __func__, 600 "expired rdnss entry: %s", 601 (char *)rao->rao_msg); 602 break; 603 } 604 ELM_MALLOC(smp1, continue); 605 ELM_MALLOC(smp2, goto free1); 606 ELM_MALLOC(smp3, goto free2); --- 5 unchanged lines hidden (view full) --- 612 sm_next); 613 smp3->sm_msg = resstr_nl; 614 TAILQ_INSERT_TAIL(&sm_rdnss_head, smp3, 615 sm_next); 616 ifi->ifi_rdnss = IFI_DNSOPT_STATE_RECEIVED; 617 618 break; 619 case ND_OPT_DNSSL: | 599 warnmsg(LOG_INFO, __func__, 600 "expired rdnss entry: %s", 601 (char *)rao->rao_msg); 602 break; 603 } 604 ELM_MALLOC(smp1, continue); 605 ELM_MALLOC(smp2, goto free1); 606 ELM_MALLOC(smp3, goto free2); --- 5 unchanged lines hidden (view full) --- 612 sm_next); 613 smp3->sm_msg = resstr_nl; 614 TAILQ_INSERT_TAIL(&sm_rdnss_head, smp3, 615 sm_next); 616 ifi->ifi_rdnss = IFI_DNSOPT_STATE_RECEIVED; 617 618 break; 619 case ND_OPT_DNSSL: |
620 if (timercmp(&now, &rao->rao_expire, >)) { | 620 if (TS_CMP(&now, &rao->rao_expire, >)) { |
621 warnmsg(LOG_INFO, __func__, 622 "expired dnssl entry: %s", 623 (char *)rao->rao_msg); 624 break; 625 } 626 dcount++; 627 /* Check resolv.conf(5) restrictions. */ 628 if (dcount > 6) { --- 326 unchanged lines hidden --- | 621 warnmsg(LOG_INFO, __func__, 622 "expired dnssl entry: %s", 623 (char *)rao->rao_msg); 624 break; 625 } 626 dcount++; 627 /* Check resolv.conf(5) restrictions. */ 628 if (dcount > 6) { --- 326 unchanged lines hidden --- |