Revert r361704, it accidentally committed merged D25067 and D25070.

This commit is contained in:
Alexander V. Chernikov 2020-06-01 20:40:40 +00:00
parent 79674562b8
commit e7403d0230
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=361705
15 changed files with 37 additions and 318 deletions

View File

@ -58,7 +58,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_dl.h>
#include <net/if_var.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/vnet.h>
#include <netinet/if_ether.h>
#include <netinet6/in6_var.h>

View File

@ -61,7 +61,6 @@
#include <net/if_var.h>
#include <net/if_dl.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
#include <net/route/nhop.h>
#include <net/route/shared.h>
@ -347,9 +346,6 @@ rt_table_init(int offset, int family, u_int fibnum)
nhops_init_rib(rh);
/* Init subscription system */
CK_STAILQ_INIT(&rh->rnh_subscribers);
/* Finally, set base callbacks */
rh->rnh_addaddr = rn_addroute;
rh->rnh_deladdr = rn_delete;
@ -1152,7 +1148,6 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt,
{
const struct sockaddr *dst;
struct rib_head *rnh;
struct rib_cmd_info rc;
int error;
KASSERT((fibnum < rt_numfibs), ("rtrequest1_fib: bad fibnum"));
@ -1185,11 +1180,10 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt,
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);
error = del_route(rnh, info, ret_nrt);
break;
case RTM_RESOLVE:
/*
@ -1198,18 +1192,15 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt,
*/
break;
case RTM_ADD:
error = add_route(rnh, info, &rc);
error = add_route(rnh, info, ret_nrt);
break;
case RTM_CHANGE:
error = change_route(rnh, info, &rc);
error = change_route(rnh, info, ret_nrt);
break;
default:
error = EOPNOTSUPP;
}
if (ret_nrt != NULL)
*ret_nrt = rc.rc_rt;
return (error);
}

View File

@ -399,6 +399,12 @@ void rtfree(struct rtentry *);
void rtfree_func(struct rtentry *);
void rt_updatemtu(struct ifnet *);
typedef int rt_walktree_f_t(struct rtentry *, void *);
typedef void rt_setwarg_t(struct rib_head *, uint32_t, int, void *);
void rib_walk_del(u_int fibnum, int family, rt_filter_f_t *filter_f,
void *arg, bool report);
void rt_foreach_fib_walk(int af, rt_setwarg_t *, rt_walktree_f_t *, void *);
void rt_foreach_fib_walk_del(int af, rt_filter_f_t *filter_f, void *arg);
void rt_flushifroutes_af(struct ifnet *, int);
void rt_flushifroutes(struct ifnet *ifp);
@ -417,8 +423,12 @@ 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);
int rib_add_redirect(u_int fibnum, struct sockaddr *dst,
struct sockaddr *gateway, struct sockaddr *author, struct ifnet *ifp,
int flags, int expire_sec);
/* New API */
void rib_walk(int af, u_int fibnum, rt_walktree_f_t *wa_f, void *arg);
struct nhop_object *rib_lookup(uint32_t fibnum, const struct sockaddr *dst,
uint32_t flags, uint32_t flowid);
#endif

View File

@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_var.h>
#include <net/if_dl.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
#include <net/route/nhop_utils.h>
#include <net/route/nhop.h>

View File

@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_dl.h>
#include <net/vnet.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
#include <net/route/nhop_utils.h>
#include <net/route/nhop.h>
@ -68,61 +67,11 @@ __FBSDID("$FreeBSD$");
* All functions assumes they are called in net epoch.
*/
static void rib_notify(struct rib_head *rnh, enum rib_subscription_type type,
struct rib_cmd_info *rc);
static void rt_notifydelete(struct rtentry *rt, struct rt_addrinfo *info);
static struct rib_head *
get_rnh(uint32_t fibnum, const struct rt_addrinfo *info)
{
struct rib_head *rnh;
struct sockaddr *dst;
KASSERT((fibnum < rt_numfibs), ("rib_add_route: bad fibnum"));
dst = info->rti_info[RTAX_DST];
rnh = rt_tables_get_rnh(fibnum, dst->sa_family);
return (rnh);
}
/*
* Adds route defined by @info into the kernel table specified by @fibnum and
* sa_family in @info->rti_info[RTAX_DST].
*
* Returns 0 on success and fills in operation metadata into @rc.
*/
int
rib_add_route(uint32_t fibnum, struct rt_addrinfo *info,
struct rib_cmd_info *rc)
{
struct rib_head *rnh;
NET_EPOCH_ASSERT();
rnh = get_rnh(fibnum, info);
if (rnh == NULL)
return (EAFNOSUPPORT);
/*
* Check consistency between RTF_HOST flag and netmask
* existence.
*/
if (info->rti_flags & RTF_HOST)
info->rti_info[RTAX_NETMASK] = NULL;
else if (info->rti_info[RTAX_NETMASK] == NULL)
return (EINVAL);
bzero(rc, sizeof(struct rib_cmd_info));
rc->rc_cmd = RTM_ADD;
return (add_route(rnh, info, rc));
}
int
add_route(struct rib_head *rnh, struct rt_addrinfo *info,
struct rib_cmd_info *rc)
struct rtentry **ret_nrt)
{
struct sockaddr *dst, *ndst, *gateway, *netmask;
struct rtentry *rt, *rt_old;
@ -197,7 +146,6 @@ add_route(struct rib_head *rnh, struct rt_addrinfo *info,
rt->rt_weight = 1;
rt_setmetrics(info, rt);
rt_old = NULL;
RIB_WLOCK(rnh);
RT_LOCK(rt);
@ -215,19 +163,11 @@ add_route(struct rib_head *rnh, struct rt_addrinfo *info,
rn = rnh->rnh_addaddr(ndst, netmask, &rnh->head, rt->rt_nodes);
if (rn != NULL) {
/* Most common usecase */
if (rt->rt_expire > 0)
tmproutes_update(rnh, rt);
if (rn != NULL && rt->rt_expire > 0)
tmproutes_update(rnh, rt);
/* Finalize notification */
rnh->rnh_gen++;
rc->rc_rt = RNTORT(rn);
rc->rc_nh_new = nh;
rib_notify(rnh, RIB_NOTIFY_IMMEDIATE, rc);
} else if ((info->rti_flags & RTF_PINNED) != 0) {
rt_old = NULL;
if (rn == NULL && (info->rti_flags & RTF_PINNED) != 0) {
/*
* Force removal and re-try addition
@ -240,26 +180,9 @@ add_route(struct rib_head *rnh, struct rt_addrinfo *info,
rt_old = rt_unlinkrte(rnh, info, &error);
info->rti_flags |= RTF_PINNED;
info->rti_info[RTAX_DST] = info_dst;
if (rt_old != NULL) {
if (rt_old != NULL)
rn = rnh->rnh_addaddr(ndst, netmask, &rnh->head,
rt->rt_nodes);
/* Finalize notification */
rnh->rnh_gen++;
if (rn != NULL) {
rc->rc_cmd = RTM_CHANGE;
rc->rc_rt = RNTORT(rn);
rc->rc_nh_old = rt_old->rt_nhop;
rc->rc_nh_new = nh;
} else {
rc->rc_cmd = RTM_DELETE;
rc->rc_rt = RNTORT(rn);
rc->rc_nh_old = rt_old->rt_nhop;
rc->rc_nh_new = nh;
}
rib_notify(rnh, RIB_NOTIFY_IMMEDIATE, rc);
}
}
RIB_WUNLOCK(rnh);
@ -285,35 +208,18 @@ add_route(struct rib_head *rnh, struct rt_addrinfo *info,
if (ifa->ifa_rtrequest)
ifa->ifa_rtrequest(RTM_ADD, rt, rt->rt_nhop, info);
/*
* actually return a resultant rtentry
*/
if (ret_nrt)
*ret_nrt = rt;
rnh->rnh_gen++; /* Routing table updated */
RT_UNLOCK(rt);
return (0);
}
/*
* Removes route defined by @info from the kernel table specified by @fibnum and
* sa_family in @info->rti_info[RTAX_DST].
*
* Returns 0 on success and fills in operation metadata into @rc.
*/
int
rib_del_route(uint32_t fibnum, struct rt_addrinfo *info, struct rib_cmd_info *rc)
{
struct rib_head *rnh;
NET_EPOCH_ASSERT();
rnh = get_rnh(fibnum, info);
if (rnh == NULL)
return (EAFNOSUPPORT);
bzero(rc, sizeof(struct rib_cmd_info));
rc->rc_cmd = RTM_DELETE;
return (del_route(rnh, info, rc));
}
/*
* Conditionally unlinks rtentry matching data inside @info from @rnh.
* Returns unlinked, locked and referenced @rtentry on success,
@ -389,7 +295,7 @@ rt_unlinkrte(struct rib_head *rnh, struct rt_addrinfo *info, int *perror)
int
del_route(struct rib_head *rnh, struct rt_addrinfo *info,
struct rib_cmd_info *rc)
struct rtentry **ret_nrt)
{
struct sockaddr *dst, *netmask;
struct sockaddr_storage mdst;
@ -408,13 +314,6 @@ del_route(struct rib_head *rnh, struct rt_addrinfo *info,
RIB_WLOCK(rnh);
rt = rt_unlinkrte(rnh, info, &error);
if (rt != NULL) {
/* Finalize notification */
rnh->rnh_gen++;
rc->rc_rt = rt;
rc->rc_nh_old = rt->rt_nhop;
rib_notify(rnh, RIB_NOTIFY_IMMEDIATE, rc);
}
RIB_WUNLOCK(rnh);
if (error != 0)
return (error);
@ -425,32 +324,17 @@ del_route(struct rib_head *rnh, struct rt_addrinfo *info,
* If the caller wants it, then it can have it,
* the entry will be deleted after the end of the current epoch.
*/
if (ret_nrt)
*ret_nrt = rt;
rtfree(rt);
return (0);
}
int
rib_change_route(uint32_t fibnum, struct rt_addrinfo *info,
struct rib_cmd_info *rc)
{
struct rib_head *rnh;
NET_EPOCH_ASSERT();
rnh = get_rnh(fibnum, info);
if (rnh == NULL)
return (EAFNOSUPPORT);
bzero(rc, sizeof(struct rib_cmd_info));
rc->rc_cmd = RTM_CHANGE;
return (change_route(rnh, info, rc));
}
static int
change_route_one(struct rib_head *rnh, struct rt_addrinfo *info,
struct rib_cmd_info *rc)
struct rtentry **ret_nrt)
{
RIB_RLOCK_TRACKER;
struct rtentry *rt = NULL;
@ -550,18 +434,14 @@ change_route_one(struct rib_head *rnh, struct rt_addrinfo *info,
if ((nh_orig->nh_ifa != nh->nh_ifa) && nh_orig->nh_ifa->ifa_rtrequest)
nh_orig->nh_ifa->ifa_rtrequest(RTM_DELETE, rt, nh_orig, info);
/* Finalize notification */
rc->rc_rt = rt;
rc->rc_nh_old = nh_orig;
rc->rc_nh_new = rt->rt_nhop;
if (ret_nrt != NULL)
*ret_nrt = rt;
RT_UNLOCK(rt);
/* Update generation id to reflect rtable change */
rnh->rnh_gen++;
rib_notify(rnh, RIB_NOTIFY_IMMEDIATE, rc);
RIB_WUNLOCK(rnh);
nhop_free(nh_orig);
@ -571,7 +451,7 @@ change_route_one(struct rib_head *rnh, struct rt_addrinfo *info,
int
change_route(struct rib_head *rnh, struct rt_addrinfo *info,
struct rib_cmd_info *rc)
struct rtentry **ret_nrt)
{
int error;
@ -588,7 +468,7 @@ change_route(struct rib_head *rnh, struct rt_addrinfo *info,
* multiple times before failing.
*/
for (int i = 0; i < RIB_MAX_RETRIES; i++) {
error = change_route_one(rnh, info, rc);
error = change_route_one(rnh, info, ret_nrt);
if (error != EAGAIN)
break;
}
@ -701,62 +581,4 @@ rib_walk_del(u_int fibnum, int family, rt_filter_f_t *filter_f, void *arg, bool
}
}
static void
rib_notify(struct rib_head *rnh, enum rib_subscription_type type,
struct rib_cmd_info *rc)
{
struct rib_subscription *rs;
CK_STAILQ_FOREACH(rs, &rnh->rnh_subscribers, next) {
if (rs->type == type)
rs->func(rnh, rc, rs->arg);
}
}
struct rib_subscription *
rib_subscribe(uint32_t fibnum, int family, rib_subscription_cb_t *f, void *arg,
enum rib_subscription_type type, int waitok)
{
struct rib_head *rnh;
struct rib_subscription *rs;
int flags = M_ZERO | (waitok ? M_WAITOK : 0);
NET_EPOCH_ASSERT();
KASSERT((fibnum < rt_numfibs), ("%s: bad fibnum", __func__));
rnh = rt_tables_get_rnh(fibnum, family);
rs = malloc(sizeof(struct rib_subscription), M_RTABLE, flags);
if (rs == NULL)
return (NULL);
rs->func = f;
rs->arg = arg;
rs->type = type;
RIB_WLOCK(rnh);
CK_STAILQ_INSERT_TAIL(&rnh->rnh_subscribers, rs, next);
RIB_WUNLOCK(rnh);
return (rs);
}
int
rib_unsibscribe(uint32_t fibnum, int family, struct rib_subscription *rs)
{
struct rib_head *rnh;
NET_EPOCH_ASSERT();
KASSERT((fibnum < rt_numfibs), ("%s: bad fibnum", __func__));
rnh = rt_tables_get_rnh(fibnum, family);
if (rnh == NULL)
return (ENOENT);
RIB_WLOCK(rnh);
CK_STAILQ_REMOVE(&rnh->rnh_subscribers, rs, rib_subscription, next);
RIB_WUNLOCK(rnh);
free(rs, M_RTABLE);
return (0);
}

View File

@ -1,90 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2020 Alexander V. Chernikov
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
* This header file contains public functions and structures used for
* routing table manipulations.
*/
#ifndef _NET_ROUTE_ROUTE_CTL_H_
#define _NET_ROUTE_ROUTE_CTL_H_
struct rib_cmd_info {
uint8_t rc_cmd; /* RTM_ADD|RTM_DEL|RTM_CHANGE */
uint8_t spare[3];
uint32_t rc_nh_weight; /* new nhop weight */
struct rtentry *rc_rt; /* Target entry */
struct nhop_object *rc_nh_old; /* Target nhop OR mpath */
struct nhop_object *rc_nh_new; /* Target nhop OR mpath */
};
int rib_add_route(uint32_t fibnum, struct rt_addrinfo *info,
struct rib_cmd_info *rc);
int rib_del_route(uint32_t fibnum, struct rt_addrinfo *info,
struct rib_cmd_info *rc);
int rib_change_route(uint32_t fibnum, struct rt_addrinfo *info,
struct rib_cmd_info *rc);
int rib_add_redirect(u_int fibnum, struct sockaddr *dst,
struct sockaddr *gateway, struct sockaddr *author, struct ifnet *ifp,
int flags, int expire_sec);
typedef int rt_walktree_f_t(struct rtentry *, void *);
void rib_walk(int af, u_int fibnum, rt_walktree_f_t *wa_f, void *arg);
void rib_walk_del(u_int fibnum, int family, rt_filter_f_t *filter_f,
void *arg, bool report);
typedef void rt_setwarg_t(struct rib_head *, uint32_t, int, void *);
void rt_foreach_fib_walk(int af, rt_setwarg_t *, rt_walktree_f_t *, void *);
void rt_foreach_fib_walk_del(int af, rt_filter_f_t *filter_f, void *arg);
enum rib_subscription_type {
RIB_NOTIFY_IMMEDIATE,
RIB_NOTIFY_DELAYED
};
typedef void rib_subscription_cb_t(struct rib_head *rnh, struct rib_cmd_info *rc,
void *arg);
struct rib_subscription {
CK_STAILQ_ENTRY(rib_subscription) next;
rib_subscription_cb_t *func;
void *arg;
enum rib_subscription_type type;
};
struct rib_subscription *rib_subscribe(uint32_t fibnum, int family,
rib_subscription_cb_t *f, void *arg, enum rib_subscription_type type,
int waitok);
int rib_unsibscribe(uint32_t fibnum, int family, struct rib_subscription *rs);
#endif

View File

@ -50,7 +50,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_dl.h>
#include <net/route.h>
#include <net/route/nhop.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
/*

View File

@ -50,7 +50,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_var.h>
#include <net/if_dl.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
#include <net/route/nhop_utils.h>
#include <net/route/nhop.h>

View File

@ -38,13 +38,11 @@ __FBSDID("$FreeBSD$");
#include <sys/socket.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/ck.h>
#include <sys/rmlock.h>
#include <sys/callout.h>
#include <net/if.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
#include <net/vnet.h>

View File

@ -35,7 +35,6 @@
#ifndef RNF_NORMAL
#include <net/radix.h>
#endif
#include <sys/ck.h>
#include <sys/epoch.h>
#include <netinet/in.h> /* struct sockaddr_in */
#include <sys/counter.h>
@ -64,7 +63,6 @@ struct rib_head {
struct callout expire_callout; /* Callout for expiring dynamic routes */
time_t next_expire; /* Next expire run ts */
struct nh_control *nh_control; /* nexthop subsystem data */
CK_STAILQ_HEAD(, rib_subscription) rnh_subscribers;/* notification subscribers */
};
#define RIB_RLOCK_TRACKER struct rm_priotracker _rib_tracker
@ -112,13 +110,12 @@ void rt_setmetrics(const struct rt_addrinfo *info, struct rtentry *rt);
struct radix_node *rt_mpath_unlink(struct rib_head *rnh,
struct rt_addrinfo *info, struct rtentry *rto, int *perror);
#endif
struct rib_cmd_info;
int add_route(struct rib_head *rnh, struct rt_addrinfo *info,
struct rib_cmd_info *rc);
struct rtentry **ret_nrt);
int del_route(struct rib_head *rnh, struct rt_addrinfo *info,
struct rib_cmd_info *rc);
struct rtentry **ret_nrt);
int change_route(struct rib_head *, struct rt_addrinfo *,
struct rib_cmd_info *rc);
struct rtentry **);
VNET_PCPUSTAT_DECLARE(struct rtstat, rtstat);
#define RTSTAT_ADD(name, val) \

View File

@ -42,7 +42,6 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_var.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
#include <net/route/nhop.h>
#include <net/route/shared.h>

View File

@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_var.h>
#include <net/if_types.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/nhop.h>
#include <net/vnet.h>

View File

@ -93,7 +93,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_llatbl.h>
#include <net/if_types.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/nhop.h>
#include <net/vnet.h>

View File

@ -81,7 +81,6 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_var.h>
#include <net/route.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
#include <net/route/nhop.h>
#include <net/route/shared.h>

View File

@ -60,7 +60,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_dl.h>
#include <net/route.h>
#include <net/route/nhop.h>
#include <net/route/route_ctl.h>
#include <net/route/route_var.h>
#include <net/radix.h>
#include <net/vnet.h>