33
33
#include <stddef.h>
34
34
#include <stdlib.h>
35
35
#include <string.h>
36
+ #include <syslog.h>
36
37
#include <unistd.h>
37
38
38
39
#include "config.h"
@@ -255,7 +256,7 @@ rt_is_default(const struct rt *rt)
255
256
}
256
257
257
258
static void
258
- rt_desc (const char * cmd , const struct rt * rt )
259
+ rt_desc (int loglevel , const char * cmd , const struct rt * rt )
259
260
{
260
261
char dest [INET_MAX_ADDRSTRLEN ], gateway [INET_MAX_ADDRSTRLEN ];
261
262
int prefix ;
@@ -273,25 +274,25 @@ rt_desc(const char *cmd, const struct rt *rt)
273
274
274
275
if (rt -> rt_flags & RTF_HOST ) {
275
276
if (gateway_unspec )
276
- loginfox ( "%s: %s host route to %s" ,
277
+ logmessage ( loglevel , "%s: %s host route to %s" ,
277
278
ifname , cmd , dest );
278
279
else
279
- loginfox ( "%s: %s host route to %s via %s" ,
280
+ logmessage ( loglevel , "%s: %s host route to %s via %s" ,
280
281
ifname , cmd , dest , gateway );
281
282
} else if (rt_is_default (rt )) {
282
283
if (gateway_unspec )
283
- loginfox ( "%s: %s default route" ,
284
+ logmessage ( loglevel , "%s: %s default route" ,
284
285
ifname , cmd );
285
286
else
286
- loginfox ( "%s: %s default route via %s" ,
287
+ logmessage ( loglevel , "%s: %s default route via %s" ,
287
288
ifname , cmd , gateway );
288
289
} else if (gateway_unspec )
289
- loginfox ( "%s: %s%s route to %s/%d" ,
290
+ logmessage ( loglevel , "%s: %s%s route to %s/%d" ,
290
291
ifname , cmd ,
291
292
rt -> rt_flags & RTF_REJECT ? " reject" : "" ,
292
293
dest , prefix );
293
294
else
294
- loginfox ( "%s: %s%s route to %s/%d via %s" ,
295
+ logmessage ( loglevel , "%s: %s%s route to %s/%d via %s" ,
295
296
ifname , cmd ,
296
297
rt -> rt_flags & RTF_REJECT ? " reject" : "" ,
297
298
dest , prefix , gateway );
@@ -490,7 +491,7 @@ rt_recvrt(int cmd, const struct rt *rt, pid_t pid)
490
491
491
492
rb_tree_remove_node (& ctx -> routes , f );
492
493
snprintf (buf , sizeof (buf ), "pid %d deleted" , pid );
493
- rt_desc (buf , f );
494
+ rt_desc (LOG_WARNING , buf , f );
494
495
rt_free (f );
495
496
}
496
497
break ;
@@ -503,8 +504,8 @@ rt_recvrt(int cmd, const struct rt *rt, pid_t pid)
503
504
}
504
505
505
506
/* Compare miscellaneous route details */
506
- static bool
507
- rt_cmp_misc (struct rt * nrt , struct rt * ort )
507
+ static int
508
+ rt_cmp_mtu (struct rt * nrt , struct rt * ort )
508
509
{
509
510
#if defined(__FreeBSD__ ) || defined(__DragonFly__ )
510
511
/* FreeBSD puts the interface MTU into the route MTU
@@ -514,13 +515,19 @@ rt_cmp_misc(struct rt *nrt, struct rt *ort)
514
515
nmtu = nrt -> rt_mtu ? nrt -> rt_mtu : (unsigned int )nrt -> rt_ifp -> mtu ;
515
516
omtu = ort -> rt_mtu ? ort -> rt_mtu : (unsigned int )ort -> rt_ifp -> mtu ;
516
517
if (omtu != nmtu )
517
- return false ;
518
+ return 1 ;
518
519
#else
519
520
if (ort -> rt_mtu != nrt -> rt_mtu )
520
- return false ;
521
+ return 1 ;
521
522
#endif
522
523
524
+ return 0 ;
525
+ }
526
+
523
527
#ifdef HAVE_ROUTE_LIFETIME
528
+ static int
529
+ rt_cmp_lifetime (struct rt * nrt , struct rt * ort )
530
+ {
524
531
/* There might be a minor difference between kernel route
525
532
* lifetime and our lifetime due to processing times.
526
533
* We allow a small deviation to avoid needless route changes.
@@ -533,23 +540,25 @@ rt_cmp_misc(struct rt *nrt, struct rt *ort)
533
540
if (ts .tv_sec < 0 )
534
541
ts .tv_sec = - ts .tv_sec ;
535
542
if (ts .tv_sec > RTLIFETIME_DEV_MAX )
536
- return false ;
543
+ return 1 ;
537
544
if (nrt -> rt_lifetime > ort -> rt_lifetime )
538
545
deviation = nrt -> rt_lifetime - ort -> rt_lifetime ;
539
546
else
540
547
deviation = ort -> rt_lifetime - nrt -> rt_lifetime ;
541
548
if (deviation > RTLIFETIME_DEV_MAX )
542
- return false;
543
- #endif
549
+ return 1 ;
544
550
545
- return true ;
551
+ return 0 ;
546
552
}
553
+ #endif
547
554
548
555
static bool
549
556
rt_add (rb_tree_t * kroutes , struct rt * nrt , struct rt * ort )
550
557
{
551
558
struct dhcpcd_ctx * ctx ;
552
- bool change , kroute , result ;
559
+ struct rt * krt ;
560
+ int loglevel = LOG_INFO ;
561
+ bool change , result ;
553
562
554
563
assert (nrt != NULL );
555
564
ctx = nrt -> rt_ifp -> ctx ;
@@ -569,46 +578,40 @@ rt_add(rb_tree_t *kroutes, struct rt *nrt, struct rt *ort)
569
578
sa_is_unspecified (& nrt -> rt_netmask ))
570
579
return false;
571
580
572
- rt_desc (ort == NULL ? "adding" : "changing" , nrt );
573
-
574
- change = kroute = result = false;
575
- if (ort == NULL ) {
576
- ort = rb_tree_find_node (kroutes , nrt );
577
- if (ort != NULL &&
578
- ((ort -> rt_flags & RTF_REJECT &&
579
- nrt -> rt_flags & RTF_REJECT ) ||
580
- (ort -> rt_ifp == nrt -> rt_ifp &&
581
+ krt = rb_tree_find_node (kroutes , nrt );
582
+ if (krt != NULL &&
583
+ krt -> rt_ifp == nrt -> rt_ifp &&
584
+ /* Only test flags dhcpcd controls */
585
+ (krt -> rt_flags & (RTF_HOST | RTF_REJECT )) == nrt -> rt_flags &&
581
586
#ifdef HAVE_ROUTE_METRIC
582
- ort -> rt_metric == nrt -> rt_metric &&
587
+ krt -> rt_metric == nrt -> rt_metric &&
583
588
#endif
584
- sa_cmp (& ort -> rt_gateway , & nrt -> rt_gateway ) == 0 )))
585
- {
586
- if (rt_cmp_misc (nrt , ort ))
587
- return true;
588
- change = true;
589
- kroute = true;
590
- }
591
- } else if (ort -> rt_dflags & RTDF_FAKE &&
592
- !(nrt -> rt_dflags & RTDF_FAKE ) &&
593
- ort -> rt_ifp == nrt -> rt_ifp &&
594
- #ifdef HAVE_ROUTE_METRIC
595
- ort -> rt_metric == nrt -> rt_metric &&
596
- #endif
597
- sa_cmp (& ort -> rt_dest , & nrt -> rt_dest ) == 0 &&
598
- rt_cmp_netmask (ort , nrt ) == 0 &&
599
- sa_cmp (& ort -> rt_gateway , & nrt -> rt_gateway ) == 0 )
589
+ sa_cmp (& krt -> rt_dest , & nrt -> rt_dest ) == 0 &&
590
+ rt_cmp_netmask (krt , nrt ) == 0 &&
591
+ sa_cmp (& krt -> rt_gateway , & nrt -> rt_gateway ) == 0 &&
592
+ rt_cmp_mtu (krt , nrt ) == 0 )
600
593
{
601
- if (rt_cmp_misc (nrt , ort ))
594
+ #ifdef HAVE_ROUTE_LIFETIME
595
+ if (rt_cmp_lifetime (krt , nrt ) == 0 ) {
596
+ rt_desc (LOG_DEBUG , "keeping" , krt );
602
597
return true;
603
- change = true;
598
+ } else
599
+ loglevel = LOG_DEBUG ;
600
+ #else
601
+ rt_desc (LOG_DEBUG , "keeping" , krt );
602
+ return true;
603
+ #endif
604
604
}
605
605
606
+ rt_desc (loglevel , ort == NULL ? "adding" : "changing" , nrt );
607
+
608
+ change = krt != NULL ;
606
609
#ifdef RTF_CLONING
607
610
/* BSD can set routes to be cloning routes.
608
611
* Cloned routes inherit the parent flags.
609
612
* As such, we need to delete and re-add the route to flush children
610
613
* to correct the flags. */
611
- if (change && ort != NULL && ort -> rt_flags & RTF_CLONING )
614
+ if (change && krt != NULL && krt -> rt_flags & RTF_CLONING )
612
615
change = false;
613
616
#endif
614
617
@@ -625,8 +628,8 @@ rt_add(rb_tree_t *kroutes, struct rt *nrt, struct rt *ort)
625
628
/* With route metrics, we can safely add the new route before
626
629
* deleting the old route. */
627
630
if (if_route (RTM_ADD , nrt ) != -1 ) {
628
- if (ort != NULL ) {
629
- if (if_route (RTM_DELETE , ort ) == -1 && errno != ESRCH )
631
+ if (krt != NULL ) {
632
+ if (if_route (RTM_DELETE , krt ) == -1 && errno != ESRCH )
630
633
logerr ("if_route (DEL)" );
631
634
}
632
635
result = true;
@@ -644,19 +647,17 @@ rt_add(rb_tree_t *kroutes, struct rt *nrt, struct rt *ort)
644
647
#ifdef ROUTE_PER_GATEWAY
645
648
errno = 0 ;
646
649
#endif
647
- if (ort != NULL ) {
648
- if (if_route (RTM_DELETE , ort ) == -1 && errno != ESRCH )
650
+ if (krt != NULL ) {
651
+ if (if_route (RTM_DELETE , krt ) == -1 && errno != ESRCH )
649
652
logerr ("if_route (DEL)" );
650
- else
651
- kroute = false;
652
653
}
653
654
#ifdef ROUTE_PER_GATEWAY
654
655
/* The OS allows many routes to the same dest with different gateways.
655
656
* dhcpcd does not support this yet, so for the time being just keep on
656
657
* deleting the route until there is an error. */
657
- if (ort != NULL && errno == 0 ) {
658
+ if (krt != NULL && errno == 0 ) {
658
659
for (;;) {
659
- if (if_route (RTM_DELETE , ort ) == -1 )
660
+ if (if_route (RTM_DELETE , krt ) == -1 )
660
661
break ;
661
662
}
662
663
}
@@ -675,9 +676,9 @@ rt_add(rb_tree_t *kroutes, struct rt *nrt, struct rt *ort)
675
676
logerr ("if_route (ADD)" );
676
677
677
678
out :
678
- if (kroute ) {
679
- rb_tree_remove_node (kroutes , ort );
680
- rt_free (ort );
679
+ if (krt != NULL ) {
680
+ rb_tree_remove_node (kroutes , krt );
681
+ rt_free (krt );
681
682
}
682
683
return result ;
683
684
}
@@ -687,22 +688,24 @@ rt_delete(struct rt *rt)
687
688
{
688
689
int retval ;
689
690
690
- rt_desc ("deleting" , rt );
691
+ rt_desc (LOG_INFO , "deleting" , rt );
691
692
retval = if_route (RTM_DELETE , rt ) == -1 ? false : true;
692
693
if (!retval && errno != ENOENT && errno != ESRCH )
693
694
logerr (__func__ );
694
695
return retval ;
695
696
}
696
697
697
- static bool
698
+ static int
698
699
rt_cmp (const struct rt * r1 , const struct rt * r2 )
699
700
{
700
701
701
- return (r1 -> rt_ifp == r2 -> rt_ifp &&
702
+ if (r1 -> rt_ifp == r2 -> rt_ifp &&
702
703
#ifdef HAVE_ROUTE_METRIC
703
704
r1 -> rt_metric == r2 -> rt_metric &&
704
705
#endif
705
- sa_cmp (& r1 -> rt_gateway , & r2 -> rt_gateway ) == 0 );
706
+ sa_cmp (& r1 -> rt_gateway , & r2 -> rt_gateway ) == 0 )
707
+ return 0 ;
708
+ return 1 ;
706
709
}
707
710
708
711
static bool
@@ -718,10 +721,13 @@ rt_doroute(rb_tree_t *kroutes, struct rt *rt)
718
721
if (rt -> rt_dflags & RTDF_FAKE )
719
722
return true;
720
723
if (or -> rt_dflags & RTDF_FAKE ||
721
- ! rt_cmp (rt , or ) ||
724
+ rt_cmp (rt , or ) != 0 ||
722
725
(rt -> rt_ifa .sa_family != AF_UNSPEC &&
723
726
sa_cmp (& or -> rt_ifa , & rt -> rt_ifa ) != 0 ) ||
724
- !rt_cmp_misc (rt , or ))
727
+ #ifdef HAVE_ROUTE_LIFETIME
728
+ rt_cmp_lifetime (rt , or ) != 0 ||
729
+ #endif
730
+ rt_cmp_mtu (rt , or ) != 0 )
725
731
{
726
732
if (!rt_add (kroutes , rt , or ))
727
733
return false;
@@ -733,7 +739,7 @@ rt_doroute(rb_tree_t *kroutes, struct rt *rt)
733
739
or = rb_tree_find_node (kroutes , rt );
734
740
if (or == NULL )
735
741
return false;
736
- if (! rt_cmp (rt , or ))
742
+ if (rt_cmp (rt , or ) == 0 )
737
743
return false;
738
744
} else {
739
745
if (!rt_add (kroutes , rt , NULL ))
0 commit comments