Deleted Added
full compact
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 ---