#
636b19ea |
| 14-Feb-2023 |
Mark Johnston <markj@FreeBSD.org> |
tcp: Disallow re-connection of a connected socket
soconnectat() tries to ensure that one cannot connect a connected socket. However, the check is racy and does not really prevent two threads from a
tcp: Disallow re-connection of a connected socket
soconnectat() tries to ensure that one cannot connect a connected socket. However, the check is racy and does not really prevent two threads from attempting to connect the same TCP socket.
Modify tcp_connect() and tcp6_connect() to perform the check again, this time synchronized by the inpcb lock, under which we call soisconnecting().
Reported by: syzkaller Reviewed by: glebius MFC after: 2 weeks Sponsored by: Klara, Inc. Sponsored by: Modirum MDPay Differential Revision: https://reviews.freebsd.org/D38507
show more ...
|
#
775da7f8 |
| 13-Feb-2023 |
Mark Johnston <markj@FreeBSD.org> |
tcp: Remove a redundant net_epoch entry in tcp6_connect()
tcp6_connect() is always called in a net_epoch read section.
Fixes: 3d76be28ec60 ("netinet6: require network epoch for in6_pcbconnect()")
tcp: Remove a redundant net_epoch entry in tcp6_connect()
tcp6_connect() is always called in a net_epoch read section.
Fixes: 3d76be28ec60 ("netinet6: require network epoch for in6_pcbconnect()") Reviewed by: tuexen, glebius Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D38506
show more ...
|
#
dfc4d218 |
| 07-Feb-2023 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: use straight in_pcbconnect() in tcp_connect()
This brings tcp_connect() par with tcp6_connect(). The code removed now is a remnant of "truncating old TIME-WAIT" removed back in 2004 in c94c54e
tcp: use straight in_pcbconnect() in tcp_connect()
This brings tcp_connect() par with tcp6_connect(). The code removed now is a remnant of "truncating old TIME-WAIT" removed back in 2004 in c94c54e4df9a.
Reviewed by: markj, tuexen Differential Revision: https://reviews.freebsd.org/D38405
show more ...
|
#
fb8f221a |
| 06-Feb-2023 |
Maxim Konovalov <maxim@FreeBSD.org> |
db_printf: fix a typo
PR: 269377
|
#
9e46ff4d |
| 03-Feb-2023 |
Gleb Smirnoff <glebius@FreeBSD.org> |
netinet: don't return conflicting inpcb in in_pcbconnect_setup()
Last time this inpcb was actually used was in tcp_connect() before c94c54e4df9a.
|
#
a9afe086 |
| 03-Feb-2023 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: bring comment for tcp_connect() up to date
We no longer use in_pcbbind() since 25102351509. The comment about truncating old TIME-WAIT describes a code that had been removed back in 2004 in c9
tcp: bring comment for tcp_connect() up to date
We no longer use in_pcbbind() since 25102351509. The comment about truncating old TIME-WAIT describes a code that had been removed back in 2004 in c94c54e4df9a.
show more ...
|
#
a9d22cce |
| 03-Feb-2023 |
Gleb Smirnoff <glebius@FreeBSD.org> |
inpcb: use family specific sockaddr argument for connect functions
Do the cast from sockaddr to either IPv4 or IPv6 sockaddr in the protocol's pr_connect method and from there on go down the call st
inpcb: use family specific sockaddr argument for connect functions
Do the cast from sockaddr to either IPv4 or IPv6 sockaddr in the protocol's pr_connect method and from there on go down the call stack with family specific argument.
Reviewed by: markj Differential revision: https://reviews.freebsd.org/D38356
show more ...
|
#
3d76be28 |
| 03-Feb-2023 |
Gleb Smirnoff <glebius@FreeBSD.org> |
netinet6: require network epoch for in6_pcbconnect()
This removes recursive epoch entry in the syncache case. Fixes unprotected access to V_in6_ifaddrhead in in6_pcbladdr(), as well as access to pr
netinet6: require network epoch for in6_pcbconnect()
This removes recursive epoch entry in the syncache case. Fixes unprotected access to V_in6_ifaddrhead in in6_pcbladdr(), as well as access to prison IP address lists. It also matches what IPv4 in_pcbconnect() does.
Reviewed by: markj Differential revision: https://reviews.freebsd.org/D38355
show more ...
|
#
221b9e3d |
| 03-Feb-2023 |
Gleb Smirnoff <glebius@FreeBSD.org> |
inpcb: merge two versions of in6_pcbconnect() into one
No functional change.
Reviewed by: markj Differential revision: https://reviews.freebsd.org/D38354
|
#
76f1499f |
| 03-Feb-2023 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: retire net.inet.tcp.tcp_require_unique_port
It was a safe belt just in case if the new port allocation behaviour introduced in 25102351509 would cause a problem.
Reviewed by: markj, rscheff,
tcp: retire net.inet.tcp.tcp_require_unique_port
It was a safe belt just in case if the new port allocation behaviour introduced in 25102351509 would cause a problem.
Reviewed by: markj, rscheff, tuexen Differential revision: https://reviews.freebsd.org/D38353
show more ...
|
#
18b83b62 |
| 26-Jan-2023 |
Richard Scheffenegger <rscheff@FreeBSD.org> |
tcp: reduce the size of t_rttupdated in tcpcb
During tcp session start, various mechanisms need to track a few initial RTTs before becoming active. Prevent overflows of the corresponding tracking co
tcp: reduce the size of t_rttupdated in tcpcb
During tcp session start, various mechanisms need to track a few initial RTTs before becoming active. Prevent overflows of the corresponding tracking counter and reduce the size of tcpcb simultaneously.
Reviewed By: #transport, tuexen, guest-ccui Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D21117
show more ...
|
#
eaabc937 |
| 14-Dec-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: retire TCPDEBUG
This subsystem is superseded by modern debugging facilities, e.g. DTrace probes and TCP black box logging.
We intentionally leave SO_DEBUG in place, as many utilities may set i
tcp: retire TCPDEBUG
This subsystem is superseded by modern debugging facilities, e.g. DTrace probes and TCP black box logging.
We intentionally leave SO_DEBUG in place, as many utilities may set it on a socket. Also the tcp::debug DTrace probes look at this flag on a socket.
Reviewed by: gnn, tuexen Discussed with: rscheff, rrs, jtl Differential revision: https://reviews.freebsd.org/D37694
show more ...
|
#
446ccdd0 |
| 07-Dec-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: use single locked callout per tcpcb for the TCP timers
Use only one callout structure per tcpcb that is responsible for handling all five TCP timeouts. Use locked version of callout, of course
tcp: use single locked callout per tcpcb for the TCP timers
Use only one callout structure per tcpcb that is responsible for handling all five TCP timeouts. Use locked version of callout, of course. The callout function tcp_timer_enter() chooses soonest timer and executes it with lock held. Unless the timer reports that the tcpcb has been freed, the callout is rescheduled for next soonest timer, if there is any.
With single callout per tcpcb on connection teardown we should be able to fully stop the callout and immediately free it, avoiding use of callout_async_drain(). There is one gotcha here: callout_stop() can actually touch our memory when a rare race condition happens. See comment above tcp_timer_stop(). Synchronous stop of the callout makes tcp_discardcb() the single entry point for tcpcb destructor, merging the tcp_freecb() to the end of the function.
While here, also remove lots of lingering checks in the beginning of TCP timer functions. With a locked callout they are unnecessary.
While here, clean unused parts of timer KPI for the pluggable TCP stacks.
While here, remove TCPDEBUG from tcp_timer.c, as this allows for more simplification of TCP timers. The TCPDEBUG is scheduled for removal.
Move the DTrace probes in timers to the beginning of a function, where a tcpcb is always existing.
Discussed with: rrs, tuexen, rscheff (the TCP part of the diff) Reviewed by: hselasky, kib, mav (the callout part) Differential revision: https://reviews.freebsd.org/D37321
show more ...
|
#
e68b3792 |
| 07-Dec-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: embed inpcb into tcpcb
For the TCP protocol inpcb storage specify allocation size that would provide space to most of the data a TCP connection needs, embedding into struct tcpcb several struct
tcp: embed inpcb into tcpcb
For the TCP protocol inpcb storage specify allocation size that would provide space to most of the data a TCP connection needs, embedding into struct tcpcb several structures, that previously were allocated separately.
The most import one is the inpcb itself. With embedding we can provide strong guarantee that with a valid TCP inpcb the tcpcb is always valid and vice versa. Also we reduce number of allocs/frees per connection. The embedded inpcb is placed in the beginning of the struct tcpcb, since in_pcballoc() requires that. However, later we may want to move it around for cache line efficiency, and this can be done with a little effort. The new intotcpcb() macro is ready for such move.
The congestion algorithm data, the TCP timers and osd(9) data are also embedded into tcpcb, and temprorary struct tcpcb_mem goes away. There was no extra allocation here, but we went through extra pointer every time we accessed this data.
One interesting side effect is that now TCP data is allocated from SMR-protected zone. Potentially this allows the TCP stacks or other TCP related modules to utilize that for their own synchronization.
Large part of the change was done with sed script:
s/tp->ccv->/tp->t_ccv./g s/tp->ccv/\&tp->t_ccv/g s/tp->cc_algo/tp->t_cc/g s/tp->t_timers->tt_/tp->tt_/g s/CCV\(ccv, osd\)/\&CCV(ccv, t_osd)/g
Dependency side effect is that code that needs to know struct tcpcb should also know struct inpcb, that added several <netinet/in_pcb.h>.
Differential revision: https://reviews.freebsd.org/D37127
show more ...
|
Revision tags: release/12.4.0 |
|
#
bd4f9866 |
| 16-Nov-2022 |
Michael Tuexen <tuexen@FreeBSD.org> |
tcp: remove unused t_rttbest
No functional change intended.
Reviewed by: rscheff@ Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D37401
|
#
9eb0e832 |
| 08-Nov-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: provide macros to access inpcb and socket from a tcpcb
There should be no functional changes with this commit.
Reviewed by: rscheff Differential revision: https://reviews.freebsd.org/D37123
|
#
22c81cc5 |
| 06-Nov-2022 |
Richard Scheffenegger <rscheff@FreeBSD.org> |
tcp: add AccECN CE packet counters to tcpinfo
Provide diagnostics information around AccECN into the tcpinfo struct.
Event: IETF 115 Hackathon Reviewed By: tuexen, #transport Sponsored by: NetA
tcp: add AccECN CE packet counters to tcpinfo
Provide diagnostics information around AccECN into the tcpinfo struct.
Event: IETF 115 Hackathon Reviewed By: tuexen, #transport Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D37280
show more ...
|
#
53af6903 |
| 07-Oct-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: remove INP_TIMEWAIT flag
Mechanically cleanup INP_TIMEWAIT from the kernel sources. After 0d7445193ab, this commit shall not cause any functional changes.
Note: this flag was very often check
tcp: remove INP_TIMEWAIT flag
Mechanically cleanup INP_TIMEWAIT from the kernel sources. After 0d7445193ab, this commit shall not cause any functional changes.
Note: this flag was very often checked together with INP_DROPPED. If we modify in_pcblookup*() not to return INP_DROPPED pcbs, we will be able to remove most of this checks and turn them to assertions. Some of them can be turned into assertions right now, but that should be carefully done on a case by case basis.
Differential revision: https://reviews.freebsd.org/D36400
show more ...
|
#
9c3507f9 |
| 07-Oct-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: in tcp_usr_detach() remove special handling of compressed time-wait
Differential revision: https://reviews.freebsd.org/D36399
|
#
08af8aac |
| 27-Sep-2022 |
Randall Stewart <rrs@FreeBSD.org> |
Tcp progress timeout
Rack has had the ability to timeout connections that just sit idle automatically. This feature of course is off by default and requires the user set it on (though the socket opt
Tcp progress timeout
Rack has had the ability to timeout connections that just sit idle automatically. This feature of course is off by default and requires the user set it on (though the socket option has been missing in tcp_usrreq.c). Lets get the progress timeout fully supported in the base stack as well as rack.
Reviewed by: tuexen Sponsored by: Netflix Inc Differential Revision: https://reviews.freebsd.org/D36716
show more ...
|
#
493105c2 |
| 21-Sep-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: fix simultaneous open and refine e80062a2d43
- The soisconnected() call on transition from SYN_RCVD to ESTABLISHED is also necessary for a half-synchronized connection. Fix that just setti
tcp: fix simultaneous open and refine e80062a2d43
- The soisconnected() call on transition from SYN_RCVD to ESTABLISHED is also necessary for a half-synchronized connection. Fix that just setting the flag, when we transfer SYN-SENT -> SYN-RECEIVED. - Provide a comment that explains at what conditions the call to soisconnected() is necessary. - Hence mechanically rename the TF_INCQUEUE flag to TF_SONOTCONN. - Extend the change to the BBR and RACK stacks.
Note: the interaction between the accept_filter(9) and the socket layer is not fully consistent, yet. For most accept filters this call to soisconnected() will not move the connection from the incomplete queue to the complete. The move would happen only when the filter has received the desired data, and soisconnected() would be called once again from sorwakeup(). Ideally, we should mark socket as connected only there, and leave the soisconnected() from SYN_RCVD->ESTABLISHED only for the simultaneous open case. However, this doesn't yet work.
Reviewed by: rscheff, tuexen, rrs Differential revision: https://reviews.freebsd.org/D36641
show more ...
|
#
e80062a2 |
| 08-Sep-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: avoid call to soisconnected() on transition to ESTABLISHED
This call existed since pre-FreeBSD times, and it is hard to understand why it was there in the first place. After 6f3caa6d815 it def
tcp: avoid call to soisconnected() on transition to ESTABLISHED
This call existed since pre-FreeBSD times, and it is hard to understand why it was there in the first place. After 6f3caa6d815 it definitely became necessary always and commit message from f1ee30ccd60 confirms that. Now that 6f3caa6d815 is effectively backed out by 07285bb4c22, the call appears to be useful only for sockets that landed on the incomplete queue, e.g. sockets that have accept_filter(9) enabled on them.
Provide a new TCP flag to mark connections that are known to be on the incomplete queue, and call soisconnected() only for those connections.
Reviewed by: rrs, tuexen Differential revision: https://reviews.freebsd.org/D36488
show more ...
|
#
0773b44e |
| 05-Sep-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
tcp: tcp6_connect() requires net epoch
PR: 262663 Reported & tested by: dch MFC after: 2 weeks
|
#
e7d02be1 |
| 17-Aug-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
protosw: refactor protosw and domain static declaration and load
o Assert that every protosw has pr_attach. Now this structure is only for socket protocols declarations and nothing else. o Merge
protosw: refactor protosw and domain static declaration and load
o Assert that every protosw has pr_attach. Now this structure is only for socket protocols declarations and nothing else. o Merge struct pr_usrreqs into struct protosw. This was suggested in 1996 by wollman@ (see 7b187005d18ef), and later reiterated in 2006 by rwatson@ (see 6fbb9cf860dcd). o Make struct domain hold a variable sized array of protosw pointers. For most protocols these pointers are initialized statically. Those domains that may have loadable protocols have spacers. IPv4 and IPv6 have 8 spacers each (andre@ dff3237ee54ea). o For inetsw and inet6sw leave a comment noting that many protosw entries very likely are dead code. o Refactor pf_proto_[un]register() into protosw_[un]register(). o Isolate pr_*_notsupp() methods into uipc_domain.c
Reviewed by: melifaro Differential revision: https://reviews.freebsd.org/D36232
show more ...
|
#
d9f6ac88 |
| 17-Aug-2022 |
Gleb Smirnoff <glebius@FreeBSD.org> |
protosw: retire PRU_ flags and their char names
For many years only TCP debugging used them, but relatively recently TCP DTrace probes also start to use them. Move their declarations into tcp_debug
protosw: retire PRU_ flags and their char names
For many years only TCP debugging used them, but relatively recently TCP DTrace probes also start to use them. Move their declarations into tcp_debug.h, but start including tcp_debug.h unconditionally, so that compilation with DTrace and without TCPDEBUG is possible.
show more ...
|