Transition from rtrequest1_fib() to rib_action().
Remove all variations of rtrequest <rtrequest1_fib, rtrequest_fib, in6_rtrequest, rtrequest_fib> and their uses and switch to to rib_action(). This is part of the new routing KPI. Submitted by: Neel Chauhan <neel AT neelc DOT org> Differential Revision: https://reviews.freebsd.org/D25546
This commit is contained in:
parent
97dd57e66c
commit
8cee15d9e4
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=363319
@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <net/route.h>
|
#include <net/route.h>
|
||||||
|
#include <net/route/route_ctl.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
#include <fs/nfs/nfsport.h>
|
#include <fs/nfs/nfsport.h>
|
||||||
@ -466,6 +467,8 @@ nfs_mountroot(struct mount *mp)
|
|||||||
nd->mygateway.sin_addr.s_addr != 0) {
|
nd->mygateway.sin_addr.s_addr != 0) {
|
||||||
struct sockaddr_in mask, sin;
|
struct sockaddr_in mask, sin;
|
||||||
struct epoch_tracker et;
|
struct epoch_tracker et;
|
||||||
|
struct rt_addrinfo info;
|
||||||
|
struct rib_cmd_info rc;
|
||||||
|
|
||||||
bzero((caddr_t)&mask, sizeof(mask));
|
bzero((caddr_t)&mask, sizeof(mask));
|
||||||
sin = mask;
|
sin = mask;
|
||||||
@ -474,10 +477,14 @@ nfs_mountroot(struct mount *mp)
|
|||||||
/* XXX MRT use table 0 for this sort of thing */
|
/* XXX MRT use table 0 for this sort of thing */
|
||||||
NET_EPOCH_ENTER(et);
|
NET_EPOCH_ENTER(et);
|
||||||
CURVNET_SET(TD_TO_VNET(td));
|
CURVNET_SET(TD_TO_VNET(td));
|
||||||
error = rtrequest_fib(RTM_ADD, (struct sockaddr *)&sin,
|
|
||||||
(struct sockaddr *)&nd->mygateway,
|
bzero((caddr_t)&info, sizeof(info));
|
||||||
(struct sockaddr *)&mask,
|
info.rti_flags = RTF_UP | RTF_GATEWAY;
|
||||||
RTF_UP | RTF_GATEWAY, NULL, RT_DEFAULT_FIB);
|
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, &rc);
|
||||||
CURVNET_RESTORE();
|
CURVNET_RESTORE();
|
||||||
NET_EPOCH_EXIT(et);
|
NET_EPOCH_EXIT(et);
|
||||||
if (error)
|
if (error)
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
#include <net/if_vlan_var.h>
|
#include <net/if_vlan_var.h>
|
||||||
#include <net/radix.h>
|
#include <net/radix.h>
|
||||||
#include <net/route.h>
|
#include <net/route.h>
|
||||||
|
#include <net/route/route_ctl.h>
|
||||||
#include <net/vnet.h>
|
#include <net/vnet.h>
|
||||||
|
|
||||||
#if defined(INET) || defined(INET6)
|
#if defined(INET) || defined(INET6)
|
||||||
@ -1845,6 +1846,7 @@ static int
|
|||||||
ifa_maintain_loopback_route(int cmd, const char *otype, struct ifaddr *ifa,
|
ifa_maintain_loopback_route(int cmd, const char *otype, struct ifaddr *ifa,
|
||||||
struct sockaddr *ia)
|
struct sockaddr *ia)
|
||||||
{
|
{
|
||||||
|
struct rib_cmd_info rc;
|
||||||
struct epoch_tracker et;
|
struct epoch_tracker et;
|
||||||
int error;
|
int error;
|
||||||
struct rt_addrinfo info;
|
struct rt_addrinfo info;
|
||||||
@ -1872,7 +1874,7 @@ ifa_maintain_loopback_route(int cmd, const char *otype, struct ifaddr *ifa,
|
|||||||
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
|
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
|
||||||
link_init_sdl(ifp, (struct sockaddr *)&null_sdl, ifp->if_type);
|
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);
|
NET_EPOCH_EXIT(et);
|
||||||
|
|
||||||
if (rti_ifa != NULL)
|
if (rti_ifa != NULL)
|
||||||
|
113
sys/net/route.c
113
sys/net/route.c
@ -470,7 +470,7 @@ int
|
|||||||
rib_add_redirect(u_int fibnum, struct sockaddr *dst, struct sockaddr *gateway,
|
rib_add_redirect(u_int fibnum, struct sockaddr *dst, struct sockaddr *gateway,
|
||||||
struct sockaddr *author, struct ifnet *ifp, int flags, int lifetime_sec)
|
struct sockaddr *author, struct ifnet *ifp, int flags, int lifetime_sec)
|
||||||
{
|
{
|
||||||
struct rtentry *rt;
|
struct rib_cmd_info rc;
|
||||||
int error;
|
int error;
|
||||||
struct rt_addrinfo info;
|
struct rt_addrinfo info;
|
||||||
struct rt_metrics rti_rmx;
|
struct rt_metrics rti_rmx;
|
||||||
@ -504,7 +504,7 @@ rib_add_redirect(u_int fibnum, struct sockaddr *dst, struct sockaddr *gateway,
|
|||||||
info.rti_mflags |= RTV_EXPIRE;
|
info.rti_mflags |= RTV_EXPIRE;
|
||||||
info.rti_rmx = &rti_rmx;
|
info.rti_rmx = &rti_rmx;
|
||||||
|
|
||||||
error = rtrequest1_fib(RTM_ADD, &info, &rt, fibnum);
|
error = rib_action(fibnum, RTM_ADD, &info, &rc);
|
||||||
ifa_free(ifa);
|
ifa_free(ifa);
|
||||||
|
|
||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
@ -512,9 +512,9 @@ rib_add_redirect(u_int fibnum, struct sockaddr *dst, struct sockaddr *gateway,
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
RT_LOCK(rt);
|
RT_LOCK(rc.rc_rt);
|
||||||
flags = rt->rt_flags;
|
flags = rc.rc_rt->rt_flags;
|
||||||
RT_UNLOCK(rt);
|
RT_UNLOCK(rc.rc_rt);
|
||||||
|
|
||||||
RTSTAT_INC(rts_dynamic);
|
RTSTAT_INC(rts_dynamic);
|
||||||
|
|
||||||
@ -602,32 +602,6 @@ ifa_ifwithroute(int flags, const struct sockaddr *dst,
|
|||||||
return (ifa);
|
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.
|
||||||
@ -1148,73 +1122,6 @@ rt_mpath_unlink(struct rib_head *rnh, struct rt_addrinfo *info,
|
|||||||
}
|
}
|
||||||
#endif
|
#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
|
void
|
||||||
rt_setmetrics(const struct rt_addrinfo *info, struct rtentry *rt)
|
rt_setmetrics(const struct rt_addrinfo *info, struct rtentry *rt)
|
||||||
{
|
{
|
||||||
@ -1258,7 +1165,7 @@ rtinit1(struct ifaddr *ifa, int cmd, int flags, int fibnum)
|
|||||||
struct epoch_tracker et;
|
struct epoch_tracker et;
|
||||||
struct sockaddr *dst;
|
struct sockaddr *dst;
|
||||||
struct sockaddr *netmask;
|
struct sockaddr *netmask;
|
||||||
struct rtentry *rt = NULL;
|
struct rib_cmd_info rc;
|
||||||
struct rt_addrinfo info;
|
struct rt_addrinfo info;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
int startfib, endfib;
|
int startfib, endfib;
|
||||||
@ -1349,7 +1256,7 @@ rtinit1(struct ifaddr *ifa, int cmd, int flags, int fibnum)
|
|||||||
if (rn == NULL)
|
if (rn == NULL)
|
||||||
error = ESRCH;
|
error = ESRCH;
|
||||||
else {
|
else {
|
||||||
rt = RNTORT(rn);
|
struct rtentry *rt = RNTORT(rn);
|
||||||
/*
|
/*
|
||||||
* for interface route the gateway
|
* for interface route the gateway
|
||||||
* gateway is sockaddr_dl, so
|
* gateway is sockaddr_dl, so
|
||||||
@ -1389,14 +1296,14 @@ rtinit1(struct ifaddr *ifa, int cmd, int flags, int fibnum)
|
|||||||
info.rti_info[RTAX_GATEWAY] = ifa->ifa_addr;
|
info.rti_info[RTAX_GATEWAY] = ifa->ifa_addr;
|
||||||
info.rti_info[RTAX_NETMASK] = netmask;
|
info.rti_info[RTAX_NETMASK] = netmask;
|
||||||
NET_EPOCH_ENTER(et);
|
NET_EPOCH_ENTER(et);
|
||||||
error = rtrequest1_fib(cmd, &info, &rt, fibnum);
|
error = rib_action(fibnum, cmd, &info, &rc);
|
||||||
if (error == 0 && rt != NULL) {
|
if (error == 0 && rc.rc_rt != NULL) {
|
||||||
/*
|
/*
|
||||||
* notify any listening routing agents of the change
|
* notify any listening routing agents of the change
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* TODO: interface routes/aliases */
|
/* TODO: interface routes/aliases */
|
||||||
rt_newaddrmsg_fib(cmd, ifa, rt, fibnum);
|
rt_newaddrmsg_fib(cmd, ifa, rc.rc_rt, fibnum);
|
||||||
didwork = 1;
|
didwork = 1;
|
||||||
}
|
}
|
||||||
NET_EPOCH_EXIT(et);
|
NET_EPOCH_EXIT(et);
|
||||||
|
@ -411,9 +411,6 @@ int rtinit(struct ifaddr *, int, int);
|
|||||||
* but this will change..
|
* but this will change..
|
||||||
*/
|
*/
|
||||||
int rtioctl_fib(u_long, caddr_t, u_int);
|
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,
|
int rib_lookup_info(uint32_t, const struct sockaddr *, uint32_t, uint32_t,
|
||||||
struct rt_addrinfo *);
|
struct rt_addrinfo *);
|
||||||
void rib_free_info(struct rt_addrinfo *info);
|
void rib_free_info(struct rt_addrinfo *info);
|
||||||
|
@ -185,14 +185,3 @@ in6_detachhead(void **head, int off)
|
|||||||
}
|
}
|
||||||
#endif
|
#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));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -915,8 +915,6 @@ void in6_newaddrmsg(struct in6_ifaddr *, int);
|
|||||||
* Extended API for IPv6 FIB support.
|
* Extended API for IPv6 FIB support.
|
||||||
*/
|
*/
|
||||||
struct mbuf *ip6_tryforward(struct mbuf *);
|
struct mbuf *ip6_tryforward(struct mbuf *);
|
||||||
int in6_rtrequest(int, struct sockaddr *, struct sockaddr *,
|
|
||||||
struct sockaddr *, int, struct rtentry **, u_int);
|
|
||||||
#endif /* _KERNEL */
|
#endif /* _KERNEL */
|
||||||
|
|
||||||
#endif /* _NETINET6_IN6_VAR_H_ */
|
#endif /* _NETINET6_IN6_VAR_H_ */
|
||||||
|
@ -1564,6 +1564,7 @@ nd6_free_redirect(const struct llentry *ln)
|
|||||||
int fibnum;
|
int fibnum;
|
||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_in6 sin6;
|
||||||
struct rt_addrinfo info;
|
struct rt_addrinfo info;
|
||||||
|
struct rib_cmd_info rc;
|
||||||
struct epoch_tracker et;
|
struct epoch_tracker et;
|
||||||
|
|
||||||
lltable_fill_sa_entry(ln, (struct sockaddr *)&sin6);
|
lltable_fill_sa_entry(ln, (struct sockaddr *)&sin6);
|
||||||
@ -1573,7 +1574,7 @@ nd6_free_redirect(const struct llentry *ln)
|
|||||||
|
|
||||||
NET_EPOCH_ENTER(et);
|
NET_EPOCH_ENTER(et);
|
||||||
for (fibnum = 0; fibnum < rt_numfibs; fibnum++)
|
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);
|
NET_EPOCH_EXIT(et);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -674,7 +674,8 @@ static void
|
|||||||
defrouter_addreq(struct nd_defrouter *new)
|
defrouter_addreq(struct nd_defrouter *new)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 def, mask, gate;
|
struct sockaddr_in6 def, mask, gate;
|
||||||
struct rtentry *newrt = NULL;
|
struct rt_addrinfo info;
|
||||||
|
struct rib_cmd_info rc;
|
||||||
unsigned int fibnum;
|
unsigned int fibnum;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
@ -688,11 +689,16 @@ defrouter_addreq(struct nd_defrouter *new)
|
|||||||
gate.sin6_addr = new->rtaddr;
|
gate.sin6_addr = new->rtaddr;
|
||||||
fibnum = new->ifp->if_fib;
|
fibnum = new->ifp->if_fib;
|
||||||
|
|
||||||
error = in6_rtrequest(RTM_ADD, (struct sockaddr *)&def,
|
bzero((caddr_t)&info, sizeof(info));
|
||||||
(struct sockaddr *)&gate, (struct sockaddr *)&mask,
|
info.rti_flags = RTF_GATEWAY;
|
||||||
RTF_GATEWAY, &newrt, fibnum);
|
info.rti_info[RTAX_DST] = (struct sockaddr *)&def;
|
||||||
if (newrt != NULL)
|
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&gate;
|
||||||
rt_routemsg(RTM_ADD, newrt, new->ifp, 0, fibnum);
|
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)
|
if (error == 0)
|
||||||
new->installed = 1;
|
new->installed = 1;
|
||||||
}
|
}
|
||||||
@ -706,7 +712,8 @@ static void
|
|||||||
defrouter_delreq(struct nd_defrouter *dr)
|
defrouter_delreq(struct nd_defrouter *dr)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 def, mask, gate;
|
struct sockaddr_in6 def, mask, gate;
|
||||||
struct rtentry *oldrt = NULL;
|
struct rt_addrinfo info;
|
||||||
|
struct rib_cmd_info rc;
|
||||||
struct epoch_tracker et;
|
struct epoch_tracker et;
|
||||||
unsigned int fibnum;
|
unsigned int fibnum;
|
||||||
|
|
||||||
@ -720,12 +727,16 @@ defrouter_delreq(struct nd_defrouter *dr)
|
|||||||
gate.sin6_addr = dr->rtaddr;
|
gate.sin6_addr = dr->rtaddr;
|
||||||
fibnum = dr->ifp->if_fib;
|
fibnum = dr->ifp->if_fib;
|
||||||
|
|
||||||
|
bzero((caddr_t)&info, sizeof(info));
|
||||||
|
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);
|
NET_EPOCH_ENTER(et);
|
||||||
in6_rtrequest(RTM_DELETE, (struct sockaddr *)&def,
|
rib_action(fibnum, RTM_DELETE, &info, &rc);
|
||||||
(struct sockaddr *)&gate,
|
if (rc.rc_rt != NULL)
|
||||||
(struct sockaddr *)&mask, RTF_GATEWAY, &oldrt, fibnum);
|
rt_routemsg(RTM_DELETE, rc.rc_rt, dr->ifp, 0, fibnum);
|
||||||
if (oldrt != NULL)
|
|
||||||
rt_routemsg(RTM_DELETE, oldrt, dr->ifp, 0, fibnum);
|
|
||||||
NET_EPOCH_EXIT(et);
|
NET_EPOCH_EXIT(et);
|
||||||
|
|
||||||
dr->installed = 0;
|
dr->installed = 0;
|
||||||
@ -2009,7 +2020,6 @@ static int
|
|||||||
nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa)
|
nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa)
|
||||||
{
|
{
|
||||||
struct sockaddr_dl_short sdl;
|
struct sockaddr_dl_short sdl;
|
||||||
struct rtentry *rt;
|
|
||||||
struct sockaddr_in6 mask6;
|
struct sockaddr_in6 mask6;
|
||||||
u_long rtflags;
|
u_long rtflags;
|
||||||
int error, a_failure, fibnum, maxfib;
|
int error, a_failure, fibnum, maxfib;
|
||||||
@ -2034,11 +2044,17 @@ nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa)
|
|||||||
}
|
}
|
||||||
a_failure = 0;
|
a_failure = 0;
|
||||||
for (; fibnum < maxfib; fibnum++) {
|
for (; fibnum < maxfib; fibnum++) {
|
||||||
|
struct rt_addrinfo info;
|
||||||
|
struct rib_cmd_info rc;
|
||||||
|
|
||||||
rt = NULL;
|
bzero((caddr_t)&info, sizeof(info));
|
||||||
error = in6_rtrequest(RTM_ADD,
|
info.rti_flags = rtflags;
|
||||||
(struct sockaddr *)&pr->ndpr_prefix, (struct sockaddr *)&sdl,
|
info.rti_info[RTAX_DST] = (struct sockaddr *)&pr->ndpr_prefix;
|
||||||
(struct sockaddr *)&mask6, rtflags, &rt, fibnum);
|
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) {
|
if (error != 0) {
|
||||||
char ip6buf[INET6_ADDRSTRLEN];
|
char ip6buf[INET6_ADDRSTRLEN];
|
||||||
char ip6bufg[INET6_ADDRSTRLEN];
|
char ip6bufg[INET6_ADDRSTRLEN];
|
||||||
@ -2061,7 +2077,7 @@ nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pr->ndpr_stateflags |= NDPRF_ONLINK;
|
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. */
|
/* Return the last error we got. */
|
||||||
@ -2158,7 +2174,6 @@ nd6_prefix_offlink(struct nd_prefix *pr)
|
|||||||
struct ifnet *ifp = pr->ndpr_ifp;
|
struct ifnet *ifp = pr->ndpr_ifp;
|
||||||
struct nd_prefix *opr;
|
struct nd_prefix *opr;
|
||||||
struct sockaddr_in6 sa6, mask6;
|
struct sockaddr_in6 sa6, mask6;
|
||||||
struct rtentry *rt;
|
|
||||||
char ip6buf[INET6_ADDRSTRLEN];
|
char ip6buf[INET6_ADDRSTRLEN];
|
||||||
uint64_t genid;
|
uint64_t genid;
|
||||||
int fibnum, maxfib, a_failure;
|
int fibnum, maxfib, a_failure;
|
||||||
@ -2191,9 +2206,17 @@ nd6_prefix_offlink(struct nd_prefix *pr)
|
|||||||
a_failure = 0;
|
a_failure = 0;
|
||||||
NET_EPOCH_ENTER(et);
|
NET_EPOCH_ENTER(et);
|
||||||
for (; fibnum < maxfib; fibnum++) {
|
for (; fibnum < maxfib; fibnum++) {
|
||||||
rt = NULL;
|
struct rt_addrinfo info;
|
||||||
error = in6_rtrequest(RTM_DELETE, (struct sockaddr *)&sa6, NULL,
|
struct rib_cmd_info rc;
|
||||||
(struct sockaddr *)&mask6, 0, &rt, fibnum);
|
|
||||||
|
bzero((caddr_t)&info, sizeof(info));
|
||||||
|
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) {
|
if (error != 0) {
|
||||||
/* Save last error to return, see rtinit(). */
|
/* Save last error to return, see rtinit(). */
|
||||||
a_failure = error;
|
a_failure = error;
|
||||||
@ -2201,7 +2224,7 @@ nd6_prefix_offlink(struct nd_prefix *pr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* report route deletion to the routing socket. */
|
/* 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);
|
NET_EPOCH_EXIT(et);
|
||||||
error = a_failure;
|
error = a_failure;
|
||||||
|
Loading…
Reference in New Issue
Block a user