Mercurial > hg > dhcpcd
changeset 5058:607d2d75b835 draft
BSD: Fix processing RTM_MISS for non NetBSD BSDs
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Sun, 09 Feb 2020 16:57:27 +0000 |
| parents | a5fd2097d40f |
| children | bd0bfd64aa0e |
| files | src/if-bsd.c |
| diffstat | 1 files changed, 26 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/src/if-bsd.c Sat Feb 08 17:29:03 2020 +0000 +++ b/src/if-bsd.c Sun Feb 09 16:57:27 2020 +0000 @@ -768,6 +768,29 @@ return 0; } +static bool +if_realroute(const struct rt_msghdr *rtm) +{ + +#ifdef RTF_CLONED + if (rtm->rtm_flags & RTF_CLONED) + return false; +#endif +#ifdef RTF_WASCLONED + if (rtm->rtm_flags & RTF_WASCLONED) + return false; +#endif +#ifdef RTF_LOCAL + if (rtm->rtm_flags & RTF_LOCAL) + return false; +#endif +#ifdef RTF_BROADCAST + if (rtm->rtm_flags & RTF_BROADCAST) + return false; +#endif + return true; +} + static int if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, const struct rt_msghdr *rtm) { @@ -781,30 +804,6 @@ errno = EINVAL; return -1; } -#ifdef RTF_CLONED - if (rtm->rtm_flags & RTF_CLONED) { - errno = ENOTSUP; - return -1; - } -#endif -#ifdef RTF_WASCLONED - if (rtm->rtm_flags & RTF_WASCLONED) { - errno = ENOTSUP; - return -1; - } -#endif -#ifdef RTF_LOCAL - if (rtm->rtm_flags & RTF_LOCAL) { - errno = ENOTSUP; - return -1; - } -#endif -#ifdef RTF_BROADCAST - if (rtm->rtm_flags & RTF_BROADCAST) { - errno = ENOTSUP; - return -1; - } -#endif if (get_addrs(rtm->rtm_addrs, (const char *)rtm + sizeof(*rtm), rtm->rtm_msglen - sizeof(*rtm), rti_info) == -1) @@ -891,6 +890,8 @@ errno = EINVAL; break; } + if (!if_realroute(rtm)) + continue; if (if_copyrt(ctx, &rt, rtm) != 0) continue; if ((rtn = rt_new(rt.rt_ifp)) == NULL) { @@ -1252,12 +1253,6 @@ } #endif -#if 0 - /* Not needed because we turn off SO_USELOOPBACK. */ - if (rtm->rtm_pid == getpid()) - return 0; -#endif - if (if_copyrt(ctx, &rt, rtm) == -1) return errno == ENOTSUP ? 0 : -1; @@ -1281,7 +1276,7 @@ } #endif - if (rtm->rtm_type != RTM_MISS) + if (rtm->rtm_type != RTM_MISS && if_realroute(rtm)) rt_recvrt(rtm->rtm_type, &rt, rtm->rtm_pid); return 0; }
