summaryrefslogtreecommitdiff
path: root/zebra/rtadv.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2022-01-21 12:03:04 -0500
committerDonald Sharp <sharpd@nvidia.com>2022-01-28 11:07:01 -0500
commit637f95bf2d1d8dcf87c4a2cd82a680461961631d (patch)
tree94ae98848a74e5e2d6cbadabfab74f312c9de236 /zebra/rtadv.c
parent7a90d91586290d872c05960427df2d3f031cc5e5 (diff)
zebra: Make Router Advertisement warnings show up once every 6 hours
RA packets are pretty chatty and when there is a warning from a missconfiguration on the network, the log file gets filed up with warnings. Modify the code in rtadv.c to only spit out the warning in these cases at most every 6 hours. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'zebra/rtadv.c')
-rw-r--r--zebra/rtadv.c43
1 files changed, 32 insertions, 11 deletions
diff --git a/zebra/rtadv.c b/zebra/rtadv.c
index 350b97cc5d..d64d563771 100644
--- a/zebra/rtadv.c
+++ b/zebra/rtadv.c
@@ -632,45 +632,66 @@ static void rtadv_process_advert(uint8_t *msg, unsigned int len,
radvert = (struct nd_router_advert *)msg;
- if ((radvert->nd_ra_curhoplimit && zif->rtadv.AdvCurHopLimit)
- && (radvert->nd_ra_curhoplimit != zif->rtadv.AdvCurHopLimit)) {
+#define SIXHOUR2USEC (int64_t)6 * 60 * 60 * 1000000
+
+ if ((radvert->nd_ra_curhoplimit && zif->rtadv.AdvCurHopLimit) &&
+ (radvert->nd_ra_curhoplimit != zif->rtadv.AdvCurHopLimit) &&
+ (monotime_since(&zif->rtadv.lastadvcurhoplimit, NULL) >
+ SIXHOUR2USEC ||
+ zif->rtadv.lastadvcurhoplimit.tv_sec == 0)) {
flog_warn(
EC_ZEBRA_RA_PARAM_MISMATCH,
"%s(%u): Rx RA - our AdvCurHopLimit doesn't agree with %s",
ifp->name, ifp->ifindex, addr_str);
+ monotime(&zif->rtadv.lastadvcurhoplimit);
}
- if ((radvert->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED)
- && !zif->rtadv.AdvManagedFlag) {
+ if ((radvert->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED) &&
+ !zif->rtadv.AdvManagedFlag &&
+ (monotime_since(&zif->rtadv.lastadvmanagedflag, NULL) >
+ SIXHOUR2USEC ||
+ zif->rtadv.lastadvmanagedflag.tv_sec == 0)) {
flog_warn(
EC_ZEBRA_RA_PARAM_MISMATCH,
"%s(%u): Rx RA - our AdvManagedFlag doesn't agree with %s",
ifp->name, ifp->ifindex, addr_str);
+ monotime(&zif->rtadv.lastadvmanagedflag);
}
- if ((radvert->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
- && !zif->rtadv.AdvOtherConfigFlag) {
+ if ((radvert->nd_ra_flags_reserved & ND_RA_FLAG_OTHER) &&
+ !zif->rtadv.AdvOtherConfigFlag &&
+ (monotime_since(&zif->rtadv.lastadvotherconfigflag, NULL) >
+ SIXHOUR2USEC ||
+ zif->rtadv.lastadvotherconfigflag.tv_sec == 0)) {
flog_warn(
EC_ZEBRA_RA_PARAM_MISMATCH,
"%s(%u): Rx RA - our AdvOtherConfigFlag doesn't agree with %s",
ifp->name, ifp->ifindex, addr_str);
+ monotime(&zif->rtadv.lastadvotherconfigflag);
}
- if ((radvert->nd_ra_reachable && zif->rtadv.AdvReachableTime)
- && (ntohl(radvert->nd_ra_reachable)
- != zif->rtadv.AdvReachableTime)) {
+ if ((radvert->nd_ra_reachable && zif->rtadv.AdvReachableTime) &&
+ (ntohl(radvert->nd_ra_reachable) != zif->rtadv.AdvReachableTime) &&
+ (monotime_since(&zif->rtadv.lastadvreachabletime, NULL) >
+ SIXHOUR2USEC ||
+ zif->rtadv.lastadvreachabletime.tv_sec == 0)) {
flog_warn(
EC_ZEBRA_RA_PARAM_MISMATCH,
"%s(%u): Rx RA - our AdvReachableTime doesn't agree with %s",
ifp->name, ifp->ifindex, addr_str);
+ monotime(&zif->rtadv.lastadvreachabletime);
}
- if ((ntohl(radvert->nd_ra_retransmit)
- != (unsigned int)zif->rtadv.AdvRetransTimer)) {
+ if ((ntohl(radvert->nd_ra_retransmit) !=
+ (unsigned int)zif->rtadv.AdvRetransTimer) &&
+ (monotime_since(&zif->rtadv.lastadvretranstimer, NULL) >
+ SIXHOUR2USEC ||
+ zif->rtadv.lastadvretranstimer.tv_sec == 0)) {
flog_warn(
EC_ZEBRA_RA_PARAM_MISMATCH,
"%s(%u): Rx RA - our AdvRetransTimer doesn't agree with %s",
ifp->name, ifp->ifindex, addr_str);
+ monotime(&zif->rtadv.lastadvretranstimer);
}
/* Create entry for neighbor if not known. */