diff --git a/external/bsd/ipf/dist/ipsend/44arp.c b/external/bsd/ipf/dist/ipsend/44arp.c index fc5f2be..9ba20a0 100644 --- a/external/bsd/ipf/dist/ipsend/44arp.c +++ b/external/bsd/ipf/dist/ipsend/44arp.c @@ -85,7 +85,11 @@ int arp(addr, eaddr) mib[2] = 0; mib[3] = AF_INET; mib[4] = NET_RT_FLAGS; +#ifdef RTF_LLINFO mib[5] = RTF_LLINFO; +#else + mib[5] = 0; +#endif if (sysctl(mib, 6, NULL, &needed, NULL, 0) == -1) { perror("route-sysctl-estimate"); diff --git a/sbin/route/route.c b/sbin/route/route.c index 6973df4..03ff8fb 100644 --- a/sbin/route/route.c +++ b/sbin/route/route.c @@ -332,8 +332,7 @@ flushroutes(int argc, char * const argv[], int doall) print_rtmsg(rtm, rtm->rtm_msglen); if ((rtm->rtm_flags & flags) != flags) continue; - if (!(rtm->rtm_flags & (RTF_GATEWAY | RTF_STATIC | - RTF_LLINFO)) && !doall) + if (!(rtm->rtm_flags & (RTF_GATEWAY | RTF_STATIC)) && !doall) continue; if (af != AF_UNSPEC && sa->sa_family != af) continue; @@ -492,9 +491,6 @@ newroute(int argc, char *const *argv) case K_NOSTATIC: flags &= ~RTF_STATIC; break; - case K_LLINFO: - flags |= RTF_LLINFO; - break; case K_LOCK: locking = 1; break; @@ -1268,7 +1264,6 @@ const char * const msgtypes[] = { [RTM_LOCK] = "RTM_LOCK: fix specified metrics", [RTM_OLDADD] = "RTM_OLDADD: caused by SIOCADDRT", [RTM_OLDDEL] = "RTM_OLDDEL: caused by SIOCDELRT", - [RTM_RESOLVE] = "RTM_RESOLVE: Route created by cloning", [RTM_NEWADDR] = "RTM_NEWADDR: address being added to iface", [RTM_DELADDR] = "RTM_DELADDR: address being removed from iface", [RTM_OOIFINFO] = "RTM_OOIFINFO: iface status change (pre-1.5)", diff --git a/sbin/route/rtutil.c b/sbin/route/rtutil.c index c2a7c6d..a31a368 100644 --- a/sbin/route/rtutil.c +++ b/sbin/route/rtutil.c @@ -83,7 +83,7 @@ static const struct bits bits[] = { { RTF_MASK, 'm' }, /* Mask Present -- for routing messages only */ /* { RTF_CLONING, 'C' }, */ { RTF_CONNECTED, 'C' }, - { RTF_XRESOLVE, 'X' }, + /* { RTF_XRESOLVE, 'X' }, */ /* { RTF_LLINFO, 'L' }, */ { RTF_STATIC, 'S' }, { RTF_PROTO1, '1' }, @@ -263,9 +263,6 @@ p_rtentry(struct rt_msghdr *rtm, int flags, int interesting) char ifbuf[IF_NAMESIZE]; #endif - if ((flags & RT_LFLAG) && (rtm->rtm_flags & RTF_LLINFO)) - return; - if (old_af != sa->sa_family) { old_af = sa->sa_family; p_family(sa->sa_family); diff --git a/sbin/route/show.c b/sbin/route/show.c index 4cdca25..62723ea 100644 --- a/sbin/route/show.c +++ b/sbin/route/show.c @@ -81,9 +81,6 @@ parse_show_opts(int argc, char * const *argv, int *afp, int *flagsp, case K_HOST: flags |= RTF_HOST; break; - case K_LLINFO: - flags |= RTF_LLINFO; - break; case K_INET: af = AF_INET; afname = argv[argc - 1] + 1; @@ -136,7 +133,7 @@ show(int argc, char *const *argv, int flags) { int af, rflags; static int interesting = RTF_UP | RTF_GATEWAY | RTF_HOST | - RTF_REJECT | RTF_LLINFO | RTF_LOCAL | RTF_BROADCAST; + RTF_REJECT | RTF_LOCAL | RTF_BROADCAST; parse_show_opts(argc, argv, &af, &rflags, NULL, true); p_rttables(af, flags, rflags, interesting); diff --git a/sbin/routed/table.c b/sbin/routed/table.c index 6f135d7..4414f14 100644 --- a/sbin/routed/table.c +++ b/sbin/routed/table.c @@ -1106,12 +1106,6 @@ flush_kern(void) || INFO_DST(&info)->sa_family != AF_INET) continue; - /* ignore ARP table entries on systems with a merged route - * and ARP table. - */ - if (rtm->rtm_flags & RTF_LLINFO) - continue; - /* ignore cloned routes */ #if defined(RTF_CLONED) && defined(__bsdi__) @@ -1273,11 +1267,6 @@ read_rt(void) continue; } - if (m.r.rtm.rtm_flags & RTF_LLINFO) { - trace_act("ignore ARP %s", str); - continue; - } - #if defined(RTF_CLONED) && defined(__bsdi__) if (m.r.rtm.rtm_flags & RTF_CLONED) { trace_act("ignore cloned %s", str); diff --git a/sys/net/route.c b/sys/net/route.c index 5ecce06..858a35c 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -973,8 +973,6 @@ rtinit(struct ifaddr *ifa, int cmd, int flags) struct rtentry *nrt = NULL; int error; struct rt_addrinfo info; - struct sockaddr_dl *sdl; - const struct sockaddr_dl *ifsdl; dst = flags & RTF_HOST ? ifa->ifa_dstaddr : ifa->ifa_addr; if (cmd == RTM_DELETE) { @@ -1018,20 +1016,6 @@ rtinit(struct ifaddr *ifa, int cmd, int flags) rt_newmsg(cmd, rt); break; case RTM_LLINFO_UPD: - RT_DPRINTF("%s: updating%s\n", __func__, - ((rt->rt_flags & RTF_LLINFO) == 0) ? " (no llinfo)" : ""); - - ifsdl = ifa->ifa_ifp->if_sadl; - - if ((rt->rt_flags & RTF_LLINFO) != 0 && - (sdl = satosdl(rt->rt_gateway)) != NULL && - sdl->sdl_family == AF_LINK && - sockaddr_dl_setaddr(sdl, sdl->sdl_len, CLLADDR(ifsdl), - ifa->ifa_ifp->if_addrlen) == NULL) { - error = EINVAL; - break; - } - if (cmd == RTM_LLINFO_UPD && ifa->ifa_rtrequest != NULL) ifa->ifa_rtrequest(RTM_LLINFO_UPD, rt, &info); rt_newmsg(RTM_CHANGE, rt); diff --git a/sys/net/route.h b/sys/net/route.h index 7c9f95f..8313c5a 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -145,18 +145,14 @@ struct ortentry { #define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ #define RTF_DONE 0x40 /* message confirmed */ #define RTF_MASK 0x80 /* subnet mask present */ -#define RTF_CLONING 0x100 /* DEPRECATED - exists ONLY for backward - compatibility */ -#define RTF_CONNECTED 0x100 /* host address route */ -#define RTF_XRESOLVE 0x200 /* DEPRECATED - exists ONLY for backward - compatibility */ -#define RTF_LLINFO 0x400 /* DEPRECATED - exists ONLY for backward - compatibility */ +/* #define RTF_CLONING 0x100 generate new routes on use */ +#define RTF_CONNECTED 0x100 /* hosts on this route are neighbours */ +/* #define RTF_XRESOLVE 0x200 external daemon resolves name */ +/* #define RTF_LLINFO 0x400 generated by ARP or NDP */ #define RTF_LLDATA 0x400 /* used by apps to add/del L2 entries */ #define RTF_STATIC 0x800 /* manually added */ #define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ -#define RTF_CLONED 0x2000 /* DEPRECATED - exists ONLY for backward - compatibility */ +/* #define RTF_CLONED 0x2000 this is a cloned route */ #define RTF_PROTO2 0x4000 /* protocol specific routing flag */ #define RTF_PROTO1 0x8000 /* protocol specific routing flag */ #define RTF_SRC 0x10000 /* route has fixed source address */ @@ -222,8 +218,7 @@ struct rt_msghdr { #define RTM_LOCK 0x8 /* fix specified metrics */ #define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ #define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ -#define RTM_RESOLVE 0xb /* DEPRECATED - exists ONLY for backward - compatibility */ +/* #define RTM_RESOLVE 0xb req to resolve dst to LL addr */ #define RTM_NEWADDR 0xc /* address being added to iface */ #define RTM_DELADDR 0xd /* address being removed from iface */ #define RTM_OOIFINFO 0xe /* Old (pre-1.5) RTM_IFINFO message */ diff --git a/sys/netinet/if_atm.c b/sys/netinet/if_atm.c index 9c60887..af8d5b8 100644 --- a/sys/netinet/if_atm.c +++ b/sys/netinet/if_atm.c @@ -92,10 +92,6 @@ atm_rtrequest(int req, struct rtentry *rt, const struct rt_addrinfo *info) switch (req) { - case RTM_RESOLVE: /* resolve: only happens when cloning */ - printf("atm_rtrequest: RTM_RESOLVE request detected?\n"); - break; - case RTM_ADD: /* diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 20bb898..59a3213 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1767,17 +1767,15 @@ in_lltable_delete(struct lltable *llt, u_int flags, return (ENOENT); } - if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) { - LLE_WLOCK(lle); - lle->la_flags |= LLE_DELETED; + LLE_WLOCK(lle); + lle->la_flags |= LLE_DELETED; #ifdef DIAGNOSTIC - log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); + log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); #endif - if ((lle->la_flags & (LLE_STATIC | LLE_IFADDR)) == LLE_STATIC) - llentry_free(lle); - else - LLE_WUNLOCK(lle); - } + if ((lle->la_flags & (LLE_STATIC | LLE_IFADDR)) == LLE_STATIC) + llentry_free(lle); + else + LLE_WUNLOCK(lle); return (0); } diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 77243ed..782bed0 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -2413,17 +2413,15 @@ in6_lltable_delete(struct lltable *llt, u_int flags, if (lle == NULL) return ENOENT; - if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) { - LLE_WLOCK(lle); - lle->la_flags |= LLE_DELETED; + LLE_WLOCK(lle); + lle->la_flags |= LLE_DELETED; #ifdef DIAGNOSTIC - log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); + log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); #endif - if ((lle->la_flags & (LLE_STATIC | LLE_IFADDR)) == LLE_STATIC) - llentry_free(lle); - else - LLE_WUNLOCK(lle); - } + if ((lle->la_flags & (LLE_STATIC | LLE_IFADDR)) == LLE_STATIC) + llentry_free(lle); + else + LLE_WUNLOCK(lle); return 0; } diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 2891d5a..bc22d12 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1013,6 +1013,7 @@ nd6_is_addr_neighbor(const struct sockaddr_in6 *addr, struct ifnet *ifp) { struct nd_prefix *pr; struct llentry *ln; + struct rtentry *rt; /* * A link-local address is always a neighbor. @@ -1072,6 +1073,26 @@ nd6_is_addr_neighbor(const struct sockaddr_in6 *addr, struct ifnet *ifp) * Even if the address matches none of our addresses, it might match * a cloning route or be in the neighbor cache. */ + rt = rtalloc1(sin6tocsa(addr), 0); + if (rt == NULL) + goto neighbor; + + if ((rt->rt_flags & RTF_CONNECTED) && (rt->rt_ifp == ifp +#if NBRIDGE > 0 + || rt->rt_ifp->if_bridge == ifp->if_bridge +#endif +#if NCARP > 0 + || (ifp->if_type == IFT_CARP && rt->rt_ifp == ifp->if_carpdev) || + (rt->rt_ifp->if_type == IFT_CARP && rt->rt_ifp->if_carpdev == ifp)|| + (ifp->if_type == IFT_CARP && rt->rt_ifp->if_type == IFT_CARP && + rt->rt_ifp->if_carpdev == ifp->if_carpdev) +#endif + )) { + rtfree(rt); + return 1; + } + rtfree(rt); +neighbor: ln = nd6_lookup(&addr->sin6_addr, ifp, false); if (ln != NULL) { LLE_RUNLOCK(ln); diff --git a/tests/net/arp/t_arp.sh b/tests/net/arp/t_arp.sh index 519130a..c712eed 100644 --- a/tests/net/arp/t_arp.sh +++ b/tests/net/arp/t_arp.sh @@ -185,6 +185,9 @@ command_body() export RUMP_SERVER=$SOCKSRC + # We can delete the entry for the interface's IP address + atf_check -s exit:0 -o ignore rump.arp -d $IP4SRC + # Add and delete a static entry $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 @@ -232,8 +235,7 @@ command_body() atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.13 atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.14 atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.15 - # arp cache of the interface address isn't deleted - atf_check -s exit:0 -o match:'10.0.1.1' rump.arp -n 10.0.1.1 + atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.1 # Test temp option $DEBUG && rump.arp -n -a diff --git a/tests/net/ndp/t_ndp.sh b/tests/net/ndp/t_ndp.sh index b9a102b..32490a4 100644 --- a/tests/net/ndp/t_ndp.sh +++ b/tests/net/ndp/t_ndp.sh @@ -162,6 +162,9 @@ command_body() export RUMP_SERVER=$SOCKSRC + # We can delete the entry for the interface's IP address + atf_check -s exit:0 -o match:"$IP6SRC" rump.ndp -d $IP6SRC + # Add and delete a static entry $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 @@ -201,6 +204,7 @@ command_body() # Flush all entries (-c) $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o ignore rump.ndp -c + atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6SRC atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6DST # Only the static caches are not deleted atf_check -s exit:0 -o ignore -e ignore rump.ndp -n fc00::11 diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c index ffa99ee..8f0392e 100644 --- a/usr.bin/netstat/route.c +++ b/usr.bin/netstat/route.c @@ -242,9 +242,6 @@ p_krtentry(struct rtentry *rt) union sockaddr_union addr_un, mask_un; struct sockaddr *addr, *mask; - if (Lflag && (rt->rt_flags & RTF_LLINFO)) - return; - memset(&addr_un, 0, sizeof(addr_un)); memset(&mask_un, 0, sizeof(mask_un)); addr = sockcopy(kgetsa(rt_getkey(rt)), &addr_un); diff --git a/usr.sbin/arp/arp.c b/usr.sbin/arp/arp.c index ecb4b83..6d750ec 100644 --- a/usr.sbin/arp/arp.c +++ b/usr.sbin/arp/arp.c @@ -458,7 +458,7 @@ dump(uint32_t addr) mib[2] = 0; mib[3] = AF_INET; mib[4] = NET_RT_FLAGS; - mib[5] = RTF_LLINFO; + mib[5] = 0; if (prog_sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) err(1, "route-sysctl-estimate"); if (needed == 0) @@ -533,7 +533,7 @@ delete_all(void) mib[2] = 0; mib[3] = AF_INET; mib[4] = NET_RT_FLAGS; - mib[5] = RTF_LLINFO; + mib[5] = 0; if (prog_sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) err(1, "route-sysctl-estimate"); if (needed == 0) diff --git a/usr.sbin/ldpd/mpls_routes.c b/usr.sbin/ldpd/mpls_routes.c index d2bf9b1..5dd31a9 100644 --- a/usr.sbin/ldpd/mpls_routes.c +++ b/usr.sbin/ldpd/mpls_routes.c @@ -853,8 +853,6 @@ bind_current_routes() rlen = rtmes->rtm_msglen; size_cp = sizeof(struct rt_msghdr); so_gate = so_pref = NULL; - if (rtmes->rtm_flags & RTF_LLINFO) /* No need for arps */ - continue; if (!(rtmes->rtm_addrs & RTA_DST)) { debugp("No dst\n"); continue; @@ -969,8 +967,6 @@ flush_mpls_routes() rlen = rtm->rtm_msglen; so_pref = NULL; so_gate = NULL; - if (rtm->rtm_flags & RTF_LLINFO) /* No need for arps */ - continue; if (!(rtm->rtm_addrs & RTA_DST)) { debugp("No dst\n"); continue; diff --git a/usr.sbin/ndp/ndp.c b/usr.sbin/ndp/ndp.c index a34a0e8..ba6dd0e 100644 --- a/usr.sbin/ndp/ndp.c +++ b/usr.sbin/ndp/ndp.c @@ -543,7 +543,7 @@ again:; mib[2] = 0; mib[3] = AF_INET6; mib[4] = NET_RT_FLAGS; - mib[5] = RTF_LLINFO; + mib[5] = 0; if (prog_sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) err(1, "sysctl(PF_ROUTE estimate)"); if (needed > 0) { diff --git a/usr.sbin/rarpd/mkarp.c b/usr.sbin/rarpd/mkarp.c index 1150cbb..143f2ec 100644 --- a/usr.sbin/rarpd/mkarp.c +++ b/usr.sbin/rarpd/mkarp.c @@ -87,6 +87,26 @@ static struct { char m_space[512]; } m_rtmsg; +static int +is_llinfo(const struct sockaddr_dl *sdl, int rtflags) +{ + if (sdl->sdl_family != AF_LINK || + (rtflags & (RTF_LLDATA|RTF_GATEWAY)) != RTF_LLDATA) + return 0; + + switch (sdl->sdl_type) { + case IFT_ETHER: + case IFT_FDDI: + case IFT_ISO88023: + case IFT_ISO88024: + case IFT_ISO88025: + case IFT_ARCNET: + return 1; + default: + return 0; + } +} + /* * Set an individual arp entry */ @@ -151,13 +171,8 @@ mkarp(u_char *haddr, u_int32_t ipaddr) sin = (struct sockaddr_inarp *)(rtm + 1); sdl = (struct sockaddr_dl *)(sin->sin_len + (char *)sin); if (sin->sin_addr.s_addr == sin_m.sin_addr.s_addr) { - if (sdl->sdl_family == AF_LINK && - (rtm->rtm_flags & RTF_LLINFO) && - !(rtm->rtm_flags & RTF_GATEWAY)) switch (sdl->sdl_type) { - case IFT_ETHER: case IFT_FDDI: case IFT_ISO88023: - case IFT_ISO88024: case IFT_ISO88025: case IFT_ARCNET: + if (is_llinfo(sdl, rtm->rtm_flags)) goto overwrite; - } #if 0 (void)printf("set: can only proxy for %s\n", host); #endif @@ -209,7 +224,7 @@ rtmsg(int cmd, int s, struct rt_msghdr *rtm, struct sockaddr_inarp *sin_m, (void)gettimeofday(&tv, 0); rtm->rtm_rmx.rmx_expire = tv.tv_sec + 20 * 60; rtm->rtm_inits = RTV_EXPIRE; - rtm->rtm_flags |= (RTF_HOST | RTF_STATIC); + rtm->rtm_flags |= (RTF_HOST | RTF_STATIC | RTF_LLDATA); sin_m->sin_other = 0; /* FALLTHROUGH */ diff --git a/usr.sbin/route6d/route6d.c b/usr.sbin/route6d/route6d.c index c109360..eaab7d4 100644 --- a/usr.sbin/route6d/route6d.c +++ b/usr.sbin/route6d/route6d.c @@ -1597,7 +1597,6 @@ rtrecv(void) continue; case RTM_LOSING: case RTM_MISS: - case RTM_RESOLVE: case RTM_GET: case RTM_LOCK: /* nothing to be done here */ @@ -1635,7 +1634,6 @@ rtrecv(void) case RTM_ADD: case RTM_LOSING: case RTM_MISS: - case RTM_RESOLVE: case RTM_GET: case RTM_LOCK: /* should already be handled */ @@ -2271,7 +2269,6 @@ do { \ RTTYPE("LOCK", RTM_LOCK); RTTYPE("OLDADD", RTM_OLDADD); RTTYPE("OLDDEL", RTM_OLDDEL); - RTTYPE("RESOLVE", RTM_RESOLVE); RTTYPE("NEWADDR", RTM_NEWADDR); RTTYPE("DELADDR", RTM_DELADDR); RTTYPE("IFINFO", RTM_IFINFO); @@ -2321,7 +2318,7 @@ do { \ #ifdef RTF_MASK RTFLAG("m", RTF_MASK); #endif - RTFLAG("C", RTF_CLONING); + RTFLAG("C", RTF_CONNECTED); #ifdef RTF_CLONED RTFLAG("c", RTF_CLONED); #endif @@ -2331,8 +2328,6 @@ do { \ #ifdef RTF_WASCLONED RTFLAG("W", RTF_WASCLONED); #endif - RTFLAG("X", RTF_XRESOLVE); - RTFLAG("L", RTF_LLINFO); RTFLAG("S", RTF_STATIC); RTFLAG("B", RTF_BLACKHOLE); #ifdef RTF_PROTO3 @@ -2466,7 +2461,7 @@ rt_entry(struct rt_msghdr *rtm, int again) sin6_dst = sin6_gw = sin6_mask = sin6_genmask = sin6_ifp = 0; if ((rtm->rtm_flags & RTF_UP) == 0 || rtm->rtm_flags & - (RTF_CLONING|RTF_XRESOLVE|RTF_LLINFO|RTF_BLACKHOLE)) { + (RTF_CONNECTED|RTF_BLACKHOLE)) { return; /* not interested in the link route */ } /* do not look at cloned routes */