Page MenuHomeFreeBSD

D24519.id70904.diff
No OneTemporary

D24519.id70904.diff

Index: head/sys/net/radix_mpath.c
===================================================================
--- head/sys/net/radix_mpath.c
+++ head/sys/net/radix_mpath.c
@@ -56,6 +56,7 @@
#include <sys/rmlock.h>
#include <net/route.h>
#include <net/route_var.h>
+#include <net/route/nhop.h>
#include <net/if.h>
#include <net/if_var.h>
@@ -110,22 +111,24 @@
rt_mpath_matchgate(struct rtentry *rt, struct sockaddr *gate)
{
struct radix_node *rn;
+ struct nhop_object *nh;
- if (!gate || !rt->rt_gateway)
- return NULL;
+ if (gate == NULL)
+ return (NULL);
/* beyond here, we use rn as the master copy */
rn = (struct radix_node *)rt;
do {
rt = (struct rtentry *)rn;
+ nh = rt->rt_nhop;
/*
- * we are removing an address alias that has
+ * we are removing an address alias that has
* the same prefix as another address
* we need to compare the interface address because
- * rt_gateway is a special sockadd_dl structure
+ * gateway is a special sockaddr_dl structure
*/
- if (rt->rt_gateway->sa_family == AF_LINK) {
- if (!memcmp(rt->rt_ifa->ifa_addr, gate, gate->sa_len))
+ if (nh->gw_sa.sa_family == AF_LINK) {
+ if (!memcmp(nh->nh_ifa->ifa_addr, gate, gate->sa_len))
break;
}
@@ -134,8 +137,8 @@
* 1) Routes with 'real' IPv4/IPv6 gateway
* 2) Loopback host routes (another AF_LINK/sockadd_dl check)
* */
- if (rt->rt_gateway->sa_len == gate->sa_len &&
- !memcmp(rt->rt_gateway, gate, gate->sa_len))
+ if (nh->gw_sa.sa_len == gate->sa_len &&
+ !memcmp(&nh->gw_sa, gate, gate->sa_len))
break;
} while ((rn = rn_mpath_next(rn)) != NULL);
Index: head/sys/net/route.c
===================================================================
--- head/sys/net/route.c
+++ head/sys/net/route.c
@@ -827,6 +827,7 @@
{
struct rt_metrics *rmx;
struct sockaddr *src, *dst;
+ struct nhop_object *nh;
int sa_len;
if (flags & NHR_COPY) {
@@ -858,7 +859,7 @@
}
/* Copy gateway is set && dst is non-zero */
- src = rt->rt_gateway;
+ src = &rt->rt_nhop->gw_sa;
dst = info->rti_info[RTAX_GATEWAY];
if ((rt->rt_flags & RTF_GATEWAY) && src != NULL && dst != NULL){
if (src->sa_len > dst->sa_len)
@@ -874,20 +875,21 @@
info->rti_addrs |= RTA_NETMASK;
}
if (rt->rt_flags & RTF_GATEWAY) {
- info->rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+ info->rti_info[RTAX_GATEWAY] = &rt->rt_nhop->gw_sa;
info->rti_addrs |= RTA_GATEWAY;
}
}
+ nh = rt->rt_nhop;
rmx = info->rti_rmx;
if (rmx != NULL) {
info->rti_mflags |= RTV_MTU;
- rmx->rmx_mtu = rt->rt_mtu;
+ rmx->rmx_mtu = nh->nh_mtu;
}
- info->rti_flags = rt->rt_flags;
- info->rti_ifp = rt->rt_ifp;
- info->rti_ifa = rt->rt_ifa;
+ info->rti_flags = rt->rt_flags | nhop_get_rtflags(nh);
+ info->rti_ifp = nh->nh_ifp;
+ info->rti_ifa = nh->nh_ifa;
if (flags & NHR_REF) {
if_ref(info->rti_ifp);
ifa_ref(info->rti_ifa);
@@ -1021,7 +1023,7 @@
info->rti_info[RTAX_DST] = rt_key(rt);
info->rti_info[RTAX_NETMASK] = rt_mask(rt);
- info->rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+ info->rti_info[RTAX_GATEWAY] = &rt->rt_nhop->gw_sa;
rt = rt_unlinkrte(di->rnh, info, &error);
if (rt == NULL) {
@@ -1216,7 +1218,7 @@
* Ease the caller work by filling in remaining info
* from that particular entry.
*/
- info->rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+ info->rti_info[RTAX_GATEWAY] = &rt->rt_nhop->gw_sa;
}
/*
@@ -1471,7 +1473,7 @@
if (rt->rt_flags & RTF_GATEWAY) {
buf[i++] = '>';
- i += p_sockaddr(buf + i, buflen - i, rt->rt_gateway);
+ i += p_sockaddr(buf + i, buflen - i, &rt->rt_nhop->gw_sa);
}
return (i);
@@ -1528,8 +1530,8 @@
* one route in the chain.
*/
if (gw &&
- (rt->rt_gateway->sa_len != gw->sa_len ||
- memcmp(rt->rt_gateway, gw, gw->sa_len))) {
+ (rt->rt_nhop->gw_sa.sa_len != gw->sa_len ||
+ memcmp(&rt->rt_nhop->gw_sa, gw, gw->sa_len))) {
*perror = ESRCH;
return (NULL);
}
@@ -2078,7 +2080,7 @@
char tempbuf[_SOCKADDR_TMPSIZE];
int didwork = 0;
int a_failure = 0;
- struct sockaddr_dl *sdl = NULL;
+ struct sockaddr_dl_short *sdl = NULL;
struct rib_head *rnh;
if (flags & RTF_HOST) {
@@ -2130,10 +2132,10 @@
dst = (struct sockaddr *)tempbuf;
}
} else if (cmd == RTM_ADD) {
- sdl = (struct sockaddr_dl *)tempbuf;
- bzero(sdl, sizeof(struct sockaddr_dl));
+ sdl = (struct sockaddr_dl_short *)tempbuf;
+ bzero(sdl, sizeof(struct sockaddr_dl_short));
sdl->sdl_family = AF_LINK;
- sdl->sdl_len = sizeof(struct sockaddr_dl);
+ sdl->sdl_len = sizeof(struct sockaddr_dl_short);
sdl->sdl_type = ifa->ifa_ifp->if_type;
sdl->sdl_index = ifa->ifa_ifp->if_index;
}
@@ -2165,8 +2167,7 @@
rt = RNTORT(rn);
/*
* for interface route the
- * rt->rt_gateway is sockaddr_intf
- * for cloning ARP entries, so
+ * rt->rt_gateway is sockaddr_dl, so
* rt_mpath_matchgate must use the
* interface address
*/
Index: head/sys/net/rtsock.c
===================================================================
--- head/sys/net/rtsock.c
+++ head/sys/net/rtsock.c
@@ -457,15 +457,15 @@
static int
rtm_get_jailed(struct rt_addrinfo *info, struct ifnet *ifp,
- struct rtentry *rt, union sockaddr_union *saun, struct ucred *cred)
+ struct nhop_object *nh, union sockaddr_union *saun, struct ucred *cred)
{
#if defined(INET) || defined(INET6)
struct epoch_tracker et;
#endif
/* First, see if the returned address is part of the jail. */
- if (prison_if(cred, rt->rt_ifa->ifa_addr) == 0) {
- info->rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
+ if (prison_if(cred, nh->nh_ifa->ifa_addr) == 0) {
+ info->rti_info[RTAX_IFA] = nh->nh_ifa->ifa_addr;
return (0);
}
@@ -499,7 +499,7 @@
/*
* As a last resort return the 'default' jail address.
*/
- ia = ((struct sockaddr_in *)rt->rt_ifa->ifa_addr)->
+ ia = ((struct sockaddr_in *)nh->nh_ifa->ifa_addr)->
sin_addr;
if (prison_get_ip4(cred, &ia) != 0)
return (ESRCH);
@@ -542,7 +542,7 @@
/*
* As a last resort return the 'default' jail address.
*/
- ia6 = ((struct sockaddr_in6 *)rt->rt_ifa->ifa_addr)->
+ ia6 = ((struct sockaddr_in6 *)nh->nh_ifa->ifa_addr)->
sin6_addr;
if (prison_get_ip6(cred, &ia6) != 0)
return (ESRCH);
@@ -635,7 +635,7 @@
* is not reachable locally. This behavior is fixed as
* part of the new L2/L3 redesign and rewrite work. The
* signature of this interface address route is the
- * AF_LINK sa_family type of the rt_gateway, and the
+ * AF_LINK sa_family type of the gateway, and the
* rt_ifp has the IFF_LOOPBACK flag set.
*/
if (rib_lookup_info(fibnum, gdst, NHR_REF, 0, &ginfo) == 0) {
@@ -711,12 +711,15 @@
* the actual PPP host entry is found, perform
* another search to retrieve the prefix route of
* the local end point of the PPP link.
+ * TODO: move this logic to userland.
*/
if (rtm->rtm_flags & RTF_ANNOUNCE) {
struct sockaddr laddr;
+ struct nhop_object *nh;
- if (rt->rt_ifp != NULL &&
- rt->rt_ifp->if_type == IFT_PROPVIRTUAL) {
+ nh = rt->rt_nhop;
+ if (nh->nh_ifp != NULL &&
+ nh->nh_ifp->if_type == IFT_PROPVIRTUAL) {
struct epoch_tracker et;
struct ifaddr *ifa;
@@ -729,9 +732,9 @@
&laddr,
ifa->ifa_netmask);
} else
- rt_maskedcopy(rt->rt_ifa->ifa_addr,
+ rt_maskedcopy(nh->nh_ifa->ifa_addr,
&laddr,
- rt->rt_ifa->ifa_netmask);
+ nh->nh_ifa->ifa_netmask);
/*
* refactor rt and no lock operation necessary
*/
@@ -741,7 +744,7 @@
RIB_RUNLOCK(rnh);
return (ESRCH);
}
- }
+ }
RT_LOCK(rt);
RT_ADDREF(rt);
RIB_RUNLOCK(rnh);
@@ -768,6 +771,7 @@
struct walkarg w;
union sockaddr_union saun;
struct rt_msghdr *rtm, *orig_rtm = NULL;
+ struct nhop_object *nh;
struct ifnet *ifp;
int error, len;
@@ -775,23 +779,24 @@
rtm = *prtm;
+ nh = rt->rt_nhop;
info->rti_info[RTAX_DST] = rt_key(rt);
- info->rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+ info->rti_info[RTAX_GATEWAY] = &nh->gw_sa;
info->rti_info[RTAX_NETMASK] = rtsock_fix_netmask(rt_key(rt),
rt_mask(rt), &netmask_ss);
info->rti_info[RTAX_GENMASK] = 0;
- ifp = rt->rt_ifp;
+ ifp = nh->nh_ifp;
if (rtm->rtm_addrs & (RTA_IFP | RTA_IFA)) {
if (ifp) {
info->rti_info[RTAX_IFP] =
ifp->if_addr->ifa_addr;
- error = rtm_get_jailed(info, ifp, rt,
+ error = rtm_get_jailed(info, ifp, nh,
&saun, curthread->td_ucred);
if (error != 0)
return (error);
if (ifp->if_flags & IFF_POINTOPOINT)
info->rti_info[RTAX_BRD] =
- rt->rt_ifa->ifa_dstaddr;
+ nh->nh_ifa->ifa_dstaddr;
rtm->rtm_index = ifp->if_index;
} else {
info->rti_info[RTAX_IFP] = NULL;
@@ -1075,7 +1080,7 @@
{
bzero(out, sizeof(*out));
- out->rmx_mtu = rt->rt_mtu;
+ out->rmx_mtu = rt->rt_nhop->nh_mtu;
out->rmx_weight = rt->rt_weight;
out->rmx_pksent = counter_u64_fetch(rt->rt_pksent);
out->rmx_nhidx = nhop_get_idx(rt->rt_nhop);
@@ -1496,7 +1501,7 @@
bzero((caddr_t)&info, sizeof(info));
info.rti_info[RTAX_DST] = rt_key(rt);
info.rti_info[RTAX_NETMASK] = rtsock_fix_netmask(rt_key(rt), rt_mask(rt), &ss);
- info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+ info.rti_info[RTAX_GATEWAY] = &rt->rt_nhop->gw_sa;
info.rti_flags = rt->rt_flags;
info.rti_ifp = ifp;
@@ -1725,7 +1730,7 @@
return (0);
bzero((caddr_t)&info, sizeof(info));
info.rti_info[RTAX_DST] = rt_key(rt);
- info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+ info.rti_info[RTAX_GATEWAY] = &rt->rt_nhop->gw_sa;
info.rti_info[RTAX_NETMASK] = rtsock_fix_netmask(rt_key(rt),
rt_mask(rt), &ss);
info.rti_info[RTAX_GENMASK] = 0;
@@ -2244,7 +2249,7 @@
rt = (void *)rn;
rt_dumpaddr_ddb("dst", rt_key(rt));
- rt_dumpaddr_ddb("gateway", rt->rt_gateway);
+ rt_dumpaddr_ddb("gateway", &rt->rt_nhop->gw_sa);
rt_dumpaddr_ddb("netmask", rtsock_fix_netmask(rt_key(rt), rt_mask(rt),
&ss));
if (rt->rt_ifp != NULL && (rt->rt_ifp->if_flags & IFF_DYING) == 0) {
Index: head/sys/netinet6/nd6.h
===================================================================
--- head/sys/netinet6/nd6.h
+++ head/sys/netinet6/nd6.h
@@ -401,8 +401,9 @@
void nd6_rs_input(struct mbuf *, int, int);
void nd6_ra_input(struct mbuf *, int, int);
void nd6_ifnet_link_event(void *, struct ifnet *, int);
-struct nd_defrouter *defrouter_lookup(struct in6_addr *, struct ifnet *);
-struct nd_defrouter *defrouter_lookup_locked(struct in6_addr *, struct ifnet *);
+struct nd_defrouter *defrouter_lookup(const struct in6_addr *, struct ifnet *);
+struct nd_defrouter *defrouter_lookup_locked(const struct in6_addr *,
+ struct ifnet *);
void defrouter_reset(void);
void defrouter_select_fib(int fibnum);
void defrouter_rele(struct nd_defrouter *);
Index: head/sys/netinet6/nd6.c
===================================================================
--- head/sys/netinet6/nd6.c
+++ head/sys/netinet6/nd6.c
@@ -1565,29 +1565,26 @@
{
struct sockaddr_in6 *gateway;
struct nd_defrouter *dr;
- struct ifnet *ifp;
+ struct nhop_object *nh;
- gateway = (struct sockaddr_in6 *)rt->rt_gateway;
- ifp = rt->rt_ifp;
+ nh = rt->rt_nhop;
+ gateway = &nh->gw6_sa;
switch (req) {
case RTM_ADD:
break;
case RTM_DELETE:
- if (!ifp)
- return;
/*
* Only indirect routes are interesting.
*/
- if ((rt->rt_flags & RTF_GATEWAY) == 0)
+ if ((nh->nh_flags & NHF_GATEWAY) == 0)
return;
/*
* check for default route
*/
- if (IN6_ARE_ADDR_EQUAL(&in6addr_any,
- &SIN6(rt_key(rt))->sin6_addr)) {
- dr = defrouter_lookup(&gateway->sin6_addr, ifp);
+ if (nh->nh_flags & NHF_DEFAULT) {
+ dr = defrouter_lookup(&gateway->sin6_addr, nh->nh_ifp);
if (dr != NULL) {
dr->installed = 0;
defrouter_rele(dr);
Index: head/sys/netinet6/nd6_rtr.c
===================================================================
--- head/sys/netinet6/nd6_rtr.c
+++ head/sys/netinet6/nd6_rtr.c
@@ -784,7 +784,7 @@
struct nd_defrouter *
-defrouter_lookup_locked(struct in6_addr *addr, struct ifnet *ifp)
+defrouter_lookup_locked(const struct in6_addr *addr, struct ifnet *ifp)
{
struct nd_defrouter *dr;
@@ -798,7 +798,7 @@
}
struct nd_defrouter *
-defrouter_lookup(struct in6_addr *addr, struct ifnet *ifp)
+defrouter_lookup(const struct in6_addr *addr, struct ifnet *ifp)
{
struct nd_defrouter *dr;
@@ -2006,7 +2006,7 @@
static int
nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa)
{
- struct sockaddr_dl sdl;
+ struct sockaddr_dl_short sdl;
struct rtentry *rt;
struct sockaddr_in6 mask6;
u_long rtflags;
@@ -2021,8 +2021,8 @@
mask6.sin6_addr = pr->ndpr_mask;
rtflags = (ifa->ifa_flags & ~IFA_RTSELF) | RTF_UP;
- bzero(&sdl, sizeof(struct sockaddr_dl));
- sdl.sdl_len = sizeof(struct sockaddr_dl);
+ bzero(&sdl, sizeof(struct sockaddr_dl_short));
+ sdl.sdl_len = sizeof(struct sockaddr_dl_short);
sdl.sdl_family = AF_LINK;
sdl.sdl_type = ifa->ifa_ifp->if_type;
sdl.sdl_index = ifa->ifa_ifp->if_index;

File Metadata

Mime Type
text/plain
Expires
Mon, Jan 13, 7:56 AM (21 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15776086
Default Alt Text
D24519.id70904.diff (12 KB)

Event Timeline