svn commit: r356974 - in head/sys: netinet netinet/tcp_stacks netinet6
Gleb Smirnoff
glebius at FreeBSD.org
Wed Jan 22 05:51:25 UTC 2020
Author: glebius
Date: Wed Jan 22 05:51:22 2020
New Revision: 356974
URL: https://svnweb.freebsd.org/changeset/base/356974
Log:
Make ip6_output() and ip_output() require network epoch.
All callers that before may called into these functions
without network epoch now must enter it.
Modified:
head/sys/netinet/ip_carp.c
head/sys/netinet/ip_divert.c
head/sys/netinet/ip_output.c
head/sys/netinet/raw_ip.c
head/sys/netinet/tcp_output.c
head/sys/netinet/tcp_stacks/bbr.c
head/sys/netinet/tcp_stacks/rack.c
head/sys/netinet/tcp_syncache.c
head/sys/netinet/tcp_timer.c
head/sys/netinet6/ip6_mroute.c
head/sys/netinet6/ip6_output.c
head/sys/netinet6/raw_ip6.c
Modified: head/sys/netinet/ip_carp.c
==============================================================================
--- head/sys/netinet/ip_carp.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/ip_carp.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -904,6 +904,7 @@ carp_send_ad_locked(struct carp_softc *sc)
{
struct carp_header ch;
struct timeval tv;
+ struct epoch_tracker et;
struct ifaddr *ifa;
struct carp_header *ch_ptr;
struct mbuf *m;
@@ -972,8 +973,10 @@ carp_send_ad_locked(struct carp_softc *sc)
CARPSTATS_INC(carps_opackets);
+ NET_EPOCH_ENTER(et);
carp_send_ad_error(sc, ip_output(m, NULL, NULL, IP_RAWOUTPUT,
&sc->sc_carpdev->if_carp->cif_imo, NULL));
+ NET_EPOCH_EXIT(et);
}
#endif /* INET */
#ifdef INET6
@@ -1031,8 +1034,10 @@ carp_send_ad_locked(struct carp_softc *sc)
CARPSTATS_INC(carps_opackets6);
+ NET_EPOCH_ENTER(et);
carp_send_ad_error(sc, ip6_output(m, NULL, NULL, 0,
&sc->sc_carpdev->if_carp->cif_im6o, NULL, NULL));
+ NET_EPOCH_EXIT(et);
}
#endif /* INET6 */
Modified: head/sys/netinet/ip_divert.c
==============================================================================
--- head/sys/netinet/ip_divert.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/ip_divert.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -307,6 +307,7 @@ static int
div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
struct mbuf *control)
{
+ struct epoch_tracker et;
struct ip *const ip = mtod(m, struct ip *);
struct m_tag *mtag;
struct ipfw_rule_ref *dt;
@@ -440,6 +441,7 @@ div_output(struct socket *so, struct mbuf *m, struct s
}
INP_RUNLOCK(inp);
+ NET_EPOCH_ENTER(et);
switch (ip->ip_v) {
case IPVERSION:
error = ip_output(m, options, NULL,
@@ -452,6 +454,7 @@ div_output(struct socket *so, struct mbuf *m, struct s
break;
#endif
}
+ NET_EPOCH_EXIT(et);
if (options != NULL)
m_freem(options);
} else {
Modified: head/sys/netinet/ip_output.c
==============================================================================
--- head/sys/netinet/ip_output.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/ip_output.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -304,7 +304,6 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct rou
struct ip_moptions *imo, struct inpcb *inp)
{
struct rm_priotracker in_ifa_tracker;
- struct epoch_tracker et;
struct ip *ip;
struct ifnet *ifp = NULL; /* keep compiler happy */
struct mbuf *m0;
@@ -323,6 +322,7 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct rou
#endif
M_ASSERTPKTHDR(m);
+ NET_EPOCH_ASSERT();
if (inp != NULL) {
INP_LOCK_ASSERT(inp);
@@ -375,7 +375,6 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct rou
dst->sin_addr = ip->ip_dst;
}
gw = dst;
- NET_EPOCH_ENTER(et);
again:
/*
* Validate route against routing table additions;
@@ -837,7 +836,6 @@ sendit:
IPSTAT_INC(ips_fragmented);
done:
- NET_EPOCH_EXIT(et);
return (error);
bad:
m_freem(m);
Modified: head/sys/netinet/raw_ip.c
==============================================================================
--- head/sys/netinet/raw_ip.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/raw_ip.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -445,6 +445,7 @@ rip_input(struct mbuf **mp, int *offp, int proto)
int
rip_output(struct mbuf *m, struct socket *so, ...)
{
+ struct epoch_tracker et;
struct ip *ip;
int error;
struct inpcb *inp = sotoinpcb(so);
@@ -584,8 +585,10 @@ rip_output(struct mbuf *m, struct socket *so, ...)
mac_inpcb_create_mbuf(inp, m);
#endif
+ NET_EPOCH_ENTER(et);
error = ip_output(m, inp->inp_options, NULL, flags,
inp->inp_moptions, inp);
+ NET_EPOCH_EXIT(et);
INP_RUNLOCK(inp);
return (error);
}
Modified: head/sys/netinet/tcp_output.c
==============================================================================
--- head/sys/netinet/tcp_output.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/tcp_output.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -193,6 +193,7 @@ cc_after_idle(struct tcpcb *tp)
int
tcp_output(struct tcpcb *tp)
{
+ struct epoch_tracker et;
struct socket *so = tp->t_inpcb->inp_socket;
int32_t len;
uint32_t recwin, sendwin;
@@ -1371,6 +1372,7 @@ send:
* m->m_pkthdr.len should have been set before checksum calculation,
* because in6_cksum() need it.
*/
+ NET_EPOCH_ENTER(et);
#ifdef INET6
if (isipv6) {
/*
@@ -1456,6 +1458,7 @@ send:
mtu = tp->t_inpcb->inp_route.ro_rt->rt_mtu;
}
#endif /* INET */
+ NET_EPOCH_EXIT(et);
out:
/*
Modified: head/sys/netinet/tcp_stacks/bbr.c
==============================================================================
--- head/sys/netinet/tcp_stacks/bbr.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/tcp_stacks/bbr.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -12091,6 +12091,7 @@ bbr_window_update_needed(struct tcpcb *tp, struct sock
static int
bbr_output_wtime(struct tcpcb *tp, const struct timeval *tv)
{
+ struct epoch_tracker et;
struct socket *so;
int32_t len;
uint32_t cts;
@@ -13937,6 +13938,7 @@ send:
* m->m_pkthdr.len should have been set before cksum calcuration,
* because in6_cksum() need it.
*/
+ NET_EPOCH_ENTER(et);
#ifdef INET6
if (isipv6) {
/*
@@ -14014,6 +14016,7 @@ send:
mtu = inp->inp_route.ro_rt->rt_mtu;
}
#endif /* INET */
+ NET_EPOCH_EXIT(et);
out:
if (lgb) {
Modified: head/sys/netinet/tcp_stacks/rack.c
==============================================================================
--- head/sys/netinet/tcp_stacks/rack.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/tcp_stacks/rack.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -8091,6 +8091,7 @@ old_method:
static int
rack_output(struct tcpcb *tp)
{
+ struct epoch_tracker et;
struct socket *so;
uint32_t recwin, sendwin;
uint32_t sb_offset;
@@ -9733,6 +9734,7 @@ send:
* m->m_pkthdr.len should have been set before cksum calcuration,
* because in6_cksum() need it.
*/
+ NET_EPOCH_ENTER(et);
#ifdef INET6
if (isipv6) {
/*
@@ -9810,6 +9812,7 @@ send:
mtu = inp->inp_route.ro_rt->rt_mtu;
}
#endif /* INET */
+ NET_EPOCH_EXIT(et);
out:
if (lgb) {
Modified: head/sys/netinet/tcp_syncache.c
==============================================================================
--- head/sys/netinet/tcp_syncache.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/tcp_syncache.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -467,6 +467,7 @@ syncache_timer(void *xsch)
{
struct syncache_head *sch = (struct syncache_head *)xsch;
struct syncache *sc, *nsc;
+ struct epoch_tracker et;
int tick = ticks;
char *s;
bool paused;
@@ -526,7 +527,9 @@ syncache_timer(void *xsch)
free(s, M_TCPLOG);
}
+ NET_EPOCH_ENTER(et);
syncache_respond(sc, NULL, TH_SYN|TH_ACK);
+ NET_EPOCH_EXIT(et);
TCPSTAT_INC(tcps_sc_retransmitted);
syncache_timeout(sc, sch, 0);
}
Modified: head/sys/netinet/tcp_timer.c
==============================================================================
--- head/sys/netinet/tcp_timer.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet/tcp_timer.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -452,9 +452,11 @@ tcp_timer_keep(void *xtp)
TCPSTAT_INC(tcps_keepprobe);
t_template = tcpip_maketemplate(inp);
if (t_template) {
+ NET_EPOCH_ENTER(et);
tcp_respond(tp, t_template->tt_ipgen,
&t_template->tt_t, (struct mbuf *)NULL,
tp->rcv_nxt, tp->snd_una - 1, 0);
+ NET_EPOCH_EXIT(et);
free(t_template, M_TEMP);
}
callout_reset(&tp->t_timers->tt_keep, TP_KEEPINTVL(tp),
Modified: head/sys/netinet6/ip6_mroute.c
==============================================================================
--- head/sys/netinet6/ip6_mroute.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet6/ip6_mroute.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -1559,13 +1559,16 @@ phyint_send(struct ip6_hdr *ip6, struct mif6 *mifp, st
*/
if (m->m_pkthdr.rcvif == NULL) {
struct ip6_moptions im6o;
+ struct epoch_tracker et;
im6o.im6o_multicast_ifp = ifp;
/* XXX: ip6_output will override ip6->ip6_hlim */
im6o.im6o_multicast_hlim = ip6->ip6_hlim;
im6o.im6o_multicast_loop = 1;
+ NET_EPOCH_ENTER(et);
error = ip6_output(mb_copy, NULL, NULL, IPV6_FORWARDING, &im6o,
NULL, NULL);
+ NET_EPOCH_EXIT(et);
MRT6_DLOG(DEBUG_XMIT, "mif %u err %d",
(uint16_t)(mifp - mif6table), error);
Modified: head/sys/netinet6/ip6_output.c
==============================================================================
--- head/sys/netinet6/ip6_output.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet6/ip6_output.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -384,7 +384,6 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt,
struct mbuf *m = m0;
struct mbuf *mprev = NULL;
int hlen, tlen, len;
- struct epoch_tracker et;
struct route_in6 ip6route;
struct rtentry *rt = NULL;
struct sockaddr_in6 *dst, src_sa, dst_sa;
@@ -405,7 +404,7 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt,
struct m_tag *fwd_tag = NULL;
uint32_t id;
- NET_EPOCH_ENTER(et);
+ NET_EPOCH_ASSERT();
if (inp != NULL) {
INP_LOCK_ASSERT(inp);
@@ -1189,7 +1188,6 @@ sendorfree:
IP6STAT_INC(ip6s_fragmented);
done:
- NET_EPOCH_EXIT(et);
if (ro == &ip6route)
RO_RTFREE(ro);
return (error);
Modified: head/sys/netinet6/raw_ip6.c
==============================================================================
--- head/sys/netinet6/raw_ip6.c Wed Jan 22 05:47:59 2020 (r356973)
+++ head/sys/netinet6/raw_ip6.c Wed Jan 22 05:51:22 2020 (r356974)
@@ -389,6 +389,7 @@ rip6_ctlinput(int cmd, struct sockaddr *sa, void *d)
int
rip6_output(struct mbuf *m, struct socket *so, ...)
{
+ struct epoch_tracker et;
struct mbuf *control;
struct m_tag *mtag;
struct sockaddr_in6 *dstsock;
@@ -536,7 +537,9 @@ rip6_output(struct mbuf *m, struct socket *so, ...)
}
}
+ NET_EPOCH_ENTER(et);
error = ip6_output(m, optp, NULL, 0, inp->in6p_moptions, &oifp, inp);
+ NET_EPOCH_EXIT(et);
if (so->so_proto->pr_protocol == IPPROTO_ICMPV6) {
if (oifp)
icmp6_ifoutstat_inc(oifp, type, code);
More information about the svn-src-all
mailing list