Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F136942242
D25546.id74556.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
12 KB
Referenced Files
None
Subscribers
None
D25546.id74556.diff
View Options
Index: fs/nfsclient/nfs_clvfsops.c
===================================================================
--- fs/nfsclient/nfs_clvfsops.c
+++ fs/nfsclient/nfs_clvfsops.c
@@ -68,6 +68,7 @@
#include <net/if.h>
#include <net/route.h>
+#include <net/route/route_ctl.h>
#include <netinet/in.h>
#include <fs/nfs/nfsport.h>
@@ -466,6 +467,7 @@
nd->mygateway.sin_addr.s_addr != 0) {
struct sockaddr_in mask, sin;
struct epoch_tracker et;
+ struct rt_addrinfo info;
bzero((caddr_t)&mask, sizeof(mask));
sin = mask;
@@ -474,10 +476,13 @@
/* XXX MRT use table 0 for this sort of thing */
NET_EPOCH_ENTER(et);
CURVNET_SET(TD_TO_VNET(td));
- error = rtrequest_fib(RTM_ADD, (struct sockaddr *)&sin,
- (struct sockaddr *)&nd->mygateway,
- (struct sockaddr *)&mask,
- RTF_UP | RTF_GATEWAY, NULL, RT_DEFAULT_FIB);
+
+ info.rti_flags = RTF_UP | RTF_GATEWAY;
+ info.rti_info[RTAX_DST] = (struct sockaddr *)&sin;
+ info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&nd->mygateway;
+ info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&mask;
+
+ error = rib_action(RT_DEFAULT_FIB, RTM_ADD, &info, NULL);
CURVNET_RESTORE();
NET_EPOCH_EXIT(et);
if (error)
Index: net/if.c
===================================================================
--- net/if.c
+++ net/if.c
@@ -80,6 +80,7 @@
#include <net/if_vlan_var.h>
#include <net/radix.h>
#include <net/route.h>
+#include <net/route/route_ctl.h>
#include <net/vnet.h>
#if defined(INET) || defined(INET6)
@@ -1845,6 +1846,7 @@
ifa_maintain_loopback_route(int cmd, const char *otype, struct ifaddr *ifa,
struct sockaddr *ia)
{
+ struct rib_cmd_info rc;
struct epoch_tracker et;
int error;
struct rt_addrinfo info;
@@ -1872,7 +1874,7 @@
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
link_init_sdl(ifp, (struct sockaddr *)&null_sdl, ifp->if_type);
- error = rtrequest1_fib(cmd, &info, NULL, ifp->if_fib);
+ error = rib_action(ifp->if_fib, cmd, &info, &rc);
NET_EPOCH_EXIT(et);
if (rti_ifa != NULL)
Index: net/route.h
===================================================================
--- net/route.h
+++ net/route.h
@@ -411,9 +411,6 @@
* but this will change..
*/
int rtioctl_fib(u_long, caddr_t, u_int);
-int rtrequest_fib(int, struct sockaddr *,
- struct sockaddr *, struct sockaddr *, int, struct rtentry **, u_int);
-int rtrequest1_fib(int, struct rt_addrinfo *, struct rtentry **, u_int);
int rib_lookup_info(uint32_t, const struct sockaddr *, uint32_t, uint32_t,
struct rt_addrinfo *);
void rib_free_info(struct rt_addrinfo *info);
Index: net/route.c
===================================================================
--- net/route.c
+++ net/route.c
@@ -470,7 +470,7 @@
rib_add_redirect(u_int fibnum, struct sockaddr *dst, struct sockaddr *gateway,
struct sockaddr *author, struct ifnet *ifp, int flags, int lifetime_sec)
{
- struct rtentry *rt;
+ struct rib_cmd_info rc;
int error;
struct rt_addrinfo info;
struct rt_metrics rti_rmx;
@@ -504,7 +504,7 @@
info.rti_mflags |= RTV_EXPIRE;
info.rti_rmx = &rti_rmx;
- error = rtrequest1_fib(RTM_ADD, &info, &rt, fibnum);
+ error = rib_action(fibnum, RTM_ADD, &info, &rc);
ifa_free(ifa);
if (error != 0) {
@@ -512,9 +512,9 @@
return (error);
}
- RT_LOCK(rt);
- flags = rt->rt_flags;
- RT_UNLOCK(rt);
+ RT_LOCK(rc.rc_rt);
+ flags = rc.rc_rt->rt_flags;
+ RT_UNLOCK(rc.rc_rt);
RTSTAT_INC(rts_dynamic);
@@ -602,35 +602,9 @@
return (ifa);
}
-/*
- * Do appropriate manipulations of a routing tree given
- * all the bits of info needed
- */
-int
-rtrequest_fib(int req,
- struct sockaddr *dst,
- struct sockaddr *gateway,
- struct sockaddr *netmask,
- int flags,
- struct rtentry **ret_nrt,
- u_int fibnum)
-{
- struct rt_addrinfo info;
- if (dst->sa_len == 0)
- return(EINVAL);
-
- bzero((caddr_t)&info, sizeof(info));
- info.rti_flags = flags;
- info.rti_info[RTAX_DST] = dst;
- info.rti_info[RTAX_GATEWAY] = gateway;
- info.rti_info[RTAX_NETMASK] = netmask;
- return rtrequest1_fib(req, &info, ret_nrt, fibnum);
-}
-
-
/*
- * Copy most of @rt data into @info.
+ * - * Copy most of @rt data into @info.
*
* If @flags contains NHR_COPY, copies dst,netmask and gw to the
* pointers specified by @info structure. Assume such pointers
@@ -1148,73 +1122,6 @@
}
#endif
-int
-rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt,
- u_int fibnum)
-{
- const struct sockaddr *dst;
- struct rib_head *rnh;
- struct rib_cmd_info rc;
- int error;
-
- KASSERT((fibnum < rt_numfibs), ("rtrequest1_fib: bad fibnum"));
- KASSERT((info->rti_flags & RTF_RNH_LOCKED) == 0, ("rtrequest1_fib: locked"));
- NET_EPOCH_ASSERT();
-
- dst = info->rti_info[RTAX_DST];
-
- switch (dst->sa_family) {
- case AF_INET6:
- case AF_INET:
- /* We support multiple FIBs. */
- break;
- default:
- fibnum = RT_DEFAULT_FIB;
- break;
- }
-
- /*
- * Find the correct routing tree to use for this Address Family
- */
- rnh = rt_tables_get_rnh(fibnum, dst->sa_family);
- if (rnh == NULL)
- return (EAFNOSUPPORT);
-
- /*
- * If we are adding a host route then we don't want to put
- * a netmask in the tree, nor do we want to clone it.
- */
- if (info->rti_flags & RTF_HOST)
- info->rti_info[RTAX_NETMASK] = NULL;
-
- bzero(&rc, sizeof(struct rib_cmd_info));
- error = 0;
- switch (req) {
- case RTM_DELETE:
- error = del_route(rnh, info, &rc);
- break;
- case RTM_RESOLVE:
- /*
- * resolve was only used for route cloning
- * here for compat
- */
- break;
- case RTM_ADD:
- error = add_route(rnh, info, &rc);
- break;
- case RTM_CHANGE:
- error = change_route(rnh, info, &rc);
- break;
- default:
- error = EOPNOTSUPP;
- }
-
- if (ret_nrt != NULL)
- *ret_nrt = rc.rc_rt;
-
- return (error);
-}
-
void
rt_setmetrics(const struct rt_addrinfo *info, struct rtentry *rt)
{
@@ -1258,7 +1165,7 @@
struct epoch_tracker et;
struct sockaddr *dst;
struct sockaddr *netmask;
- struct rtentry *rt = NULL;
+ struct rib_cmd_info rc;
struct rt_addrinfo info;
int error = 0;
int startfib, endfib;
@@ -1389,14 +1296,14 @@
info.rti_info[RTAX_GATEWAY] = ifa->ifa_addr;
info.rti_info[RTAX_NETMASK] = netmask;
NET_EPOCH_ENTER(et);
- error = rtrequest1_fib(cmd, &info, &rt, fibnum);
- if (error == 0 && rt != NULL) {
+ error = rib_action(fibnum, cmd, &info, &rc);
+ if (error == 0 && rc.rc_rt != NULL) {
/*
* notify any listening routing agents of the change
*/
/* TODO: interface routes/aliases */
- rt_newaddrmsg_fib(cmd, ifa, rt, fibnum);
+ rt_newaddrmsg_fib(cmd, ifa, rc.rc_rt, fibnum);
didwork = 1;
}
NET_EPOCH_EXIT(et);
Index: netinet6/in6_rmx.c
===================================================================
--- netinet6/in6_rmx.c
+++ netinet6/in6_rmx.c
@@ -185,14 +185,3 @@
}
#endif
-/*
- * Extended API for IPv6 FIB support.
- */
-int
-in6_rtrequest(int req, struct sockaddr *dst, struct sockaddr *gw,
- struct sockaddr *mask, int flags, struct rtentry **ret_nrt, u_int fibnum)
-{
-
- return (rtrequest_fib(req, dst, gw, mask, flags, ret_nrt, fibnum));
-}
-
Index: netinet6/in6_var.h
===================================================================
--- netinet6/in6_var.h
+++ netinet6/in6_var.h
@@ -915,8 +915,6 @@
* Extended API for IPv6 FIB support.
*/
struct mbuf *ip6_tryforward(struct mbuf *);
-int in6_rtrequest(int, struct sockaddr *, struct sockaddr *,
- struct sockaddr *, int, struct rtentry **, u_int);
#endif /* _KERNEL */
#endif /* _NETINET6_IN6_VAR_H_ */
Index: netinet6/nd6.c
===================================================================
--- netinet6/nd6.c
+++ netinet6/nd6.c
@@ -1564,6 +1564,7 @@
int fibnum;
struct sockaddr_in6 sin6;
struct rt_addrinfo info;
+ struct rib_cmd_info rc;
struct epoch_tracker et;
lltable_fill_sa_entry(ln, (struct sockaddr *)&sin6);
@@ -1573,7 +1574,7 @@
NET_EPOCH_ENTER(et);
for (fibnum = 0; fibnum < rt_numfibs; fibnum++)
- rtrequest1_fib(RTM_DELETE, &info, NULL, fibnum);
+ rib_action(fibnum, RTM_DELETE, &info, &rc);
NET_EPOCH_EXIT(et);
}
Index: netinet6/nd6_rtr.c
===================================================================
--- netinet6/nd6_rtr.c
+++ netinet6/nd6_rtr.c
@@ -674,7 +674,8 @@
defrouter_addreq(struct nd_defrouter *new)
{
struct sockaddr_in6 def, mask, gate;
- struct rtentry *newrt = NULL;
+ struct rt_addrinfo info;
+ struct rib_cmd_info rc;
unsigned int fibnum;
int error;
@@ -688,11 +689,15 @@
gate.sin6_addr = new->rtaddr;
fibnum = new->ifp->if_fib;
- error = in6_rtrequest(RTM_ADD, (struct sockaddr *)&def,
- (struct sockaddr *)&gate, (struct sockaddr *)&mask,
- RTF_GATEWAY, &newrt, fibnum);
- if (newrt != NULL)
- rt_routemsg(RTM_ADD, newrt, new->ifp, 0, fibnum);
+ info.rti_flags = RTF_GATEWAY;
+ info.rti_info[RTAX_DST] = (struct sockaddr *)&def;
+ info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&gate;
+ info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&mask;
+
+ NET_EPOCH_ASSERT();
+ error = rib_action(fibnum, RTM_ADD, &info, &rc);
+ if (rc.rc_rt != NULL)
+ rt_routemsg(RTM_ADD, rc.rc_rt, new->ifp, 0, fibnum);
if (error == 0)
new->installed = 1;
}
@@ -706,7 +711,8 @@
defrouter_delreq(struct nd_defrouter *dr)
{
struct sockaddr_in6 def, mask, gate;
- struct rtentry *oldrt = NULL;
+ struct rt_addrinfo info;
+ struct rib_cmd_info rc;
struct epoch_tracker et;
unsigned int fibnum;
@@ -720,12 +726,15 @@
gate.sin6_addr = dr->rtaddr;
fibnum = dr->ifp->if_fib;
+ info.rti_flags = RTF_GATEWAY;
+ info.rti_info[RTAX_DST] = (struct sockaddr *)&def;
+ info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&gate;
+ info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&mask;
+
NET_EPOCH_ENTER(et);
- in6_rtrequest(RTM_DELETE, (struct sockaddr *)&def,
- (struct sockaddr *)&gate,
- (struct sockaddr *)&mask, RTF_GATEWAY, &oldrt, fibnum);
- if (oldrt != NULL)
- rt_routemsg(RTM_DELETE, oldrt, dr->ifp, 0, fibnum);
+ rib_action(fibnum, RTM_DELETE, &info, &rc);
+ if (rc.rc_rt != NULL)
+ rt_routemsg(RTM_DELETE, rc.rc_rt, dr->ifp, 0, fibnum);
NET_EPOCH_EXIT(et);
dr->installed = 0;
@@ -2009,7 +2018,8 @@
nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa)
{
struct sockaddr_dl_short sdl;
- struct rtentry *rt;
+ struct rt_addrinfo info;
+ struct rib_cmd_info rc;
struct sockaddr_in6 mask6;
u_long rtflags;
int error, a_failure, fibnum, maxfib;
@@ -2035,10 +2045,13 @@
a_failure = 0;
for (; fibnum < maxfib; fibnum++) {
- rt = NULL;
- error = in6_rtrequest(RTM_ADD,
- (struct sockaddr *)&pr->ndpr_prefix, (struct sockaddr *)&sdl,
- (struct sockaddr *)&mask6, rtflags, &rt, fibnum);
+ info.rti_flags = rtflags;
+ info.rti_info[RTAX_DST] = (struct sockaddr *)&pr->ndpr_prefix;
+ info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&sdl;
+ info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&mask6;
+
+ NET_EPOCH_ASSERT();
+ error = rib_action(fibnum, RTM_ADD, &info, &rc);
if (error != 0) {
char ip6buf[INET6_ADDRSTRLEN];
char ip6bufg[INET6_ADDRSTRLEN];
@@ -2061,7 +2074,7 @@
}
pr->ndpr_stateflags |= NDPRF_ONLINK;
- rt_routemsg(RTM_ADD, rt, pr->ndpr_ifp, 0, fibnum);
+ rt_routemsg(RTM_ADD, rc.rc_rt, pr->ndpr_ifp, 0, fibnum);
}
/* Return the last error we got. */
@@ -2158,7 +2171,8 @@
struct ifnet *ifp = pr->ndpr_ifp;
struct nd_prefix *opr;
struct sockaddr_in6 sa6, mask6;
- struct rtentry *rt;
+ struct rt_addrinfo info;
+ struct rib_cmd_info rc;
char ip6buf[INET6_ADDRSTRLEN];
uint64_t genid;
int fibnum, maxfib, a_failure;
@@ -2191,9 +2205,13 @@
a_failure = 0;
NET_EPOCH_ENTER(et);
for (; fibnum < maxfib; fibnum++) {
- rt = NULL;
- error = in6_rtrequest(RTM_DELETE, (struct sockaddr *)&sa6, NULL,
- (struct sockaddr *)&mask6, 0, &rt, fibnum);
+ info.rti_flags = RTF_GATEWAY;
+ info.rti_info[RTAX_DST] = (struct sockaddr *)&sa6;
+ info.rti_info[RTAX_GATEWAY] = NULL;
+ info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&mask6;
+
+ NET_EPOCH_ASSERT();
+ error = rib_action(fibnum, RTM_DELETE, &info, &rc);
if (error != 0) {
/* Save last error to return, see rtinit(). */
a_failure = error;
@@ -2201,7 +2219,7 @@
}
/* report route deletion to the routing socket. */
- rt_routemsg(RTM_DELETE, rt, ifp, 0, fibnum);
+ rt_routemsg(RTM_DELETE, rc.rc_rt, ifp, 0, fibnum);
}
NET_EPOCH_EXIT(et);
error = a_failure;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 21, 6:50 PM (15 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25788493
Default Alt Text
D25546.id74556.diff (12 KB)
Attached To
Mode
D25546: Transition from rtrequest1_fib() to rib_action()
Attached
Detach File
Event Timeline
Log In to Comment