Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144802212
D31451.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D31451.diff
View Options
diff --git a/sys/net/route/route_ctl.c b/sys/net/route/route_ctl.c
--- a/sys/net/route/route_ctl.c
+++ b/sys/net/route/route_ctl.c
@@ -567,6 +567,24 @@
return (error);
}
+/*
+ * Checks if @dst and @gateway is valid combination.
+ *
+ * Returns true if is valid, false otherwise.
+ */
+static bool
+check_gateway(struct rib_head *rnh, struct sockaddr *dst,
+ struct sockaddr *gateway)
+{
+ if (dst->sa_family == gateway->sa_family)
+ return (true);
+ else if (gateway->sa_family == AF_UNSPEC)
+ return (true);
+ else if (gateway->sa_family == AF_LINK)
+ return (true);
+ return (false);
+}
+
/*
* Creates rtentry and nexthop based on @info data.
* Return 0 and fills in rtentry into @prt on success,
@@ -589,8 +607,7 @@
if ((flags & RTF_GATEWAY) && !gateway)
return (EINVAL);
- if (dst && gateway && (dst->sa_family != gateway->sa_family) &&
- (gateway->sa_family != AF_UNSPEC) && (gateway->sa_family != AF_LINK))
+ if (dst && gateway && !check_gateway(rnh, dst, gateway))
return (EINVAL);
if (dst->sa_len > sizeof(((struct rtentry *)NULL)->rt_dstb))
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -293,9 +293,9 @@
/* rte<>ro_flags translation */
static inline void
-rt_update_ro_flags(struct route *ro)
+rt_update_ro_flags(struct route *ro, const struct nhop_object *nh)
{
- int nh_flags = ro->ro_nh->nh_flags;
+ int nh_flags = nh->nh_flags;
ro->ro_flags &= ~ (RT_REJECT|RT_BLACKHOLE|RT_HAS_GW);
@@ -495,22 +495,21 @@
goto bad;
}
}
- ia = ifatoia(ro->ro_nh->nh_ifa);
- ifp = ro->ro_nh->nh_ifp;
- counter_u64_add(ro->ro_nh->nh_pksent, 1);
- rt_update_ro_flags(ro);
- if (ro->ro_nh->nh_flags & NHF_GATEWAY)
- gw = &ro->ro_nh->gw4_sa;
- if (ro->ro_nh->nh_flags & NHF_HOST)
- isbroadcast = (ro->ro_nh->nh_flags & NHF_BROADCAST);
+ struct nhop_object *nh = ro->ro_nh;
+
+ ia = ifatoia(nh->nh_ifa);
+ ifp = nh->nh_ifp;
+ counter_u64_add(nh->nh_pksent, 1);
+ rt_update_ro_flags(ro, nh);
+ if (nh->nh_flags & NHF_GATEWAY)
+ gw = &nh->gw4_sa;
+ if (nh->nh_flags & NHF_HOST)
+ isbroadcast = (nh->nh_flags & NHF_BROADCAST);
else if (ifp->if_flags & IFF_BROADCAST)
isbroadcast = in_ifaddr_broadcast(gw->sin_addr, ia);
else
isbroadcast = 0;
- if (ro->ro_nh->nh_flags & NHF_HOST)
- mtu = ro->ro_nh->nh_mtu;
- else
- mtu = ifp->if_mtu;
+ mtu = nh->nh_mtu;
src = IA_SIN(ia)->sin_addr;
} else {
struct nhop_object *nh;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Feb 13, 7:30 PM (3 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28680190
Default Alt Text
D31451.diff (2 KB)
Attached To
Mode
D31451: Simplify nhop operations in ip_output().
Attached
Detach File
Event Timeline
Log In to Comment