mirror of
https://github.com/opnsense/src.git
synced 2026-06-03 13:58:30 -04:00
tcp: move tcp_drain() verbatim before tcp_init()
This commit is contained in:
parent
81a34d374e
commit
a6b982e265
1 changed files with 50 additions and 52 deletions
|
|
@ -1402,6 +1402,56 @@ deregister_tcp_functions(struct tcp_function_block *blk, bool quiesce,
|
|||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
tcp_drain(void)
|
||||
{
|
||||
struct epoch_tracker et;
|
||||
VNET_ITERATOR_DECL(vnet_iter);
|
||||
|
||||
if (!do_tcpdrain)
|
||||
return;
|
||||
|
||||
NET_EPOCH_ENTER(et);
|
||||
VNET_LIST_RLOCK_NOSLEEP();
|
||||
VNET_FOREACH(vnet_iter) {
|
||||
CURVNET_SET(vnet_iter);
|
||||
struct inpcb_iterator inpi = INP_ALL_ITERATOR(&V_tcbinfo,
|
||||
INPLOOKUP_WLOCKPCB);
|
||||
struct inpcb *inpb;
|
||||
struct tcpcb *tcpb;
|
||||
|
||||
/*
|
||||
* Walk the tcpbs, if existing, and flush the reassembly queue,
|
||||
* if there is one...
|
||||
* XXX: The "Net/3" implementation doesn't imply that the TCP
|
||||
* reassembly queue should be flushed, but in a situation
|
||||
* where we're really low on mbufs, this is potentially
|
||||
* useful.
|
||||
*/
|
||||
while ((inpb = inp_next(&inpi)) != NULL) {
|
||||
if (inpb->inp_flags & INP_TIMEWAIT)
|
||||
continue;
|
||||
if ((tcpb = intotcpcb(inpb)) != NULL) {
|
||||
tcp_reass_flush(tcpb);
|
||||
tcp_clean_sackreport(tcpb);
|
||||
#ifdef TCP_BLACKBOX
|
||||
tcp_log_drain(tcpb);
|
||||
#endif
|
||||
#ifdef TCPPCAP
|
||||
if (tcp_pcap_aggressive_free) {
|
||||
/* Free the TCP PCAP queues. */
|
||||
tcp_pcap_drain(&(tcpb->t_inpkts));
|
||||
tcp_pcap_drain(&(tcpb->t_outpkts));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
CURVNET_RESTORE();
|
||||
}
|
||||
VNET_LIST_RUNLOCK_NOSLEEP();
|
||||
NET_EPOCH_EXIT(et);
|
||||
}
|
||||
|
||||
static void
|
||||
tcp_vnet_init(void *arg __unused)
|
||||
{
|
||||
|
|
@ -1448,8 +1498,6 @@ tcp_vnet_init(void *arg __unused)
|
|||
VNET_SYSINIT(tcp_vnet_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH,
|
||||
tcp_vnet_init, NULL);
|
||||
|
||||
static void tcp_drain(void);
|
||||
|
||||
static void
|
||||
tcp_init(void *arg __unused)
|
||||
{
|
||||
|
|
@ -2517,56 +2565,6 @@ tcp_close(struct tcpcb *tp)
|
|||
return (tp);
|
||||
}
|
||||
|
||||
static void
|
||||
tcp_drain(void)
|
||||
{
|
||||
struct epoch_tracker et;
|
||||
VNET_ITERATOR_DECL(vnet_iter);
|
||||
|
||||
if (!do_tcpdrain)
|
||||
return;
|
||||
|
||||
NET_EPOCH_ENTER(et);
|
||||
VNET_LIST_RLOCK_NOSLEEP();
|
||||
VNET_FOREACH(vnet_iter) {
|
||||
CURVNET_SET(vnet_iter);
|
||||
struct inpcb_iterator inpi = INP_ALL_ITERATOR(&V_tcbinfo,
|
||||
INPLOOKUP_WLOCKPCB);
|
||||
struct inpcb *inpb;
|
||||
struct tcpcb *tcpb;
|
||||
|
||||
/*
|
||||
* Walk the tcpbs, if existing, and flush the reassembly queue,
|
||||
* if there is one...
|
||||
* XXX: The "Net/3" implementation doesn't imply that the TCP
|
||||
* reassembly queue should be flushed, but in a situation
|
||||
* where we're really low on mbufs, this is potentially
|
||||
* useful.
|
||||
*/
|
||||
while ((inpb = inp_next(&inpi)) != NULL) {
|
||||
if (inpb->inp_flags & INP_TIMEWAIT)
|
||||
continue;
|
||||
if ((tcpb = intotcpcb(inpb)) != NULL) {
|
||||
tcp_reass_flush(tcpb);
|
||||
tcp_clean_sackreport(tcpb);
|
||||
#ifdef TCP_BLACKBOX
|
||||
tcp_log_drain(tcpb);
|
||||
#endif
|
||||
#ifdef TCPPCAP
|
||||
if (tcp_pcap_aggressive_free) {
|
||||
/* Free the TCP PCAP queues. */
|
||||
tcp_pcap_drain(&(tcpb->t_inpkts));
|
||||
tcp_pcap_drain(&(tcpb->t_outpkts));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
CURVNET_RESTORE();
|
||||
}
|
||||
VNET_LIST_RUNLOCK_NOSLEEP();
|
||||
NET_EPOCH_EXIT(et);
|
||||
}
|
||||
|
||||
/*
|
||||
* Notify a tcp user of an asynchronous error;
|
||||
* store error as soft error, but wake up user
|
||||
|
|
|
|||
Loading…
Reference in a new issue