Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_ecn.c
Show First 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include "opt_inet.h" | #include "opt_inet.h" | ||||
#include "opt_inet6.h" | #include "opt_inet6.h" | ||||
#include "opt_tcpdebug.h" | #include "opt_tcpdebug.h" | ||||
#include "opt_accecn.h" | |||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/sysctl.h> | #include <sys/sysctl.h> | ||||
#include <sys/malloc.h> | #include <sys/malloc.h> | ||||
#include <sys/mbuf.h> | #include <sys/mbuf.h> | ||||
#include <sys/socket.h> | #include <sys/socket.h> | ||||
Show All 31 Lines | |||||
/* | /* | ||||
* Process incoming SYN,ACK packet | * Process incoming SYN,ACK packet | ||||
*/ | */ | ||||
void | void | ||||
tcp_ecn_input_syn_sent(struct tcpcb *tp, uint16_t thflags, int iptos) | tcp_ecn_input_syn_sent(struct tcpcb *tp, uint16_t thflags, int iptos) | ||||
{ | { | ||||
if (V_tcp_do_ecn == 0) | if (V_tcp_do_ecn == 0) | ||||
return; | return; | ||||
if ((V_tcp_do_ecn == 1) || | if ((V_tcp_do_ecn == 1) || | ||||
(V_tcp_do_ecn == 2)) { | (V_tcp_do_ecn == 2)) { | ||||
/* RFC3168 ECN handling */ | /* RFC3168 ECN handling */ | ||||
if ((thflags & (TH_CWR | TH_ECE)) == (0 | TH_ECE)) { | if ((thflags & (TH_CWR | TH_ECE)) == (0 | TH_ECE)) { | ||||
tp->t_flags2 |= TF2_ECN_PERMIT; | tp->t_flags2 |= TF2_ECN_PERMIT; | ||||
TCPSTAT_INC(tcps_ecn_shs); | TCPSTAT_INC(tcps_ecn_shs); | ||||
▲ Show 20 Lines • Show All 135 Lines • ▼ Show 20 Lines | if ((V_tcp_do_ecn == 3) || | ||||
} | } | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* TCP ECN processing. | * TCP ECN processing. | ||||
*/ | */ | ||||
int | int | ||||
#if defined(TCP_ACCECNOPT) | |||||
tcp_ecn_input_segment(struct tcpcb *tp, uint16_t thflags, int tlen, int iptos) | |||||
#else | |||||
tcp_ecn_input_segment(struct tcpcb *tp, uint16_t thflags, int iptos) | tcp_ecn_input_segment(struct tcpcb *tp, uint16_t thflags, int iptos) | ||||
#endif /* TCP_ACCECNOPT */ | |||||
{ | { | ||||
int delta_ace = 0; | int delta_ace = 0; | ||||
if (tp->t_flags2 & (TF2_ECN_PERMIT | TF2_ACE_PERMIT)) { | if (tp->t_flags2 & (TF2_ECN_PERMIT | TF2_ACE_PERMIT)) { | ||||
switch (iptos & IPTOS_ECN_MASK) { | switch (iptos & IPTOS_ECN_MASK) { | ||||
case IPTOS_ECN_CE: | case IPTOS_ECN_CE: | ||||
#if defined(TCP_ACCECNOPT) | |||||
tp->t_flags2 |= TF2_ACO_CE; | |||||
tp->t_rceb += tlen; | |||||
#endif /* TCP_ACCECNOPT */ | |||||
TCPSTAT_INC(tcps_ecn_ce); | TCPSTAT_INC(tcps_ecn_ce); | ||||
break; | break; | ||||
case IPTOS_ECN_ECT0: | case IPTOS_ECN_ECT0: | ||||
#if defined(TCP_ACCECNOPT) | |||||
tp->t_flags2 |= TF2_ACO_E0; | |||||
tp->t_re0b += tlen; | |||||
#endif /* TCP_ACCECNOPT */ | |||||
TCPSTAT_INC(tcps_ecn_ect0); | TCPSTAT_INC(tcps_ecn_ect0); | ||||
break; | break; | ||||
case IPTOS_ECN_ECT1: | case IPTOS_ECN_ECT1: | ||||
#if defined(TCP_ACCECNOPT) | |||||
tp->t_flags2 |= TF2_ACO_E1; | |||||
tp->t_re1b += tlen; | |||||
#endif /* TCP_ACCECNOPT */ | |||||
TCPSTAT_INC(tcps_ecn_ect1); | TCPSTAT_INC(tcps_ecn_ect1); | ||||
break; | break; | ||||
} | } | ||||
if (tp->t_flags2 & TF2_ACE_PERMIT) { | if (tp->t_flags2 & TF2_ACE_PERMIT) { | ||||
if ((iptos & IPTOS_ECN_MASK) == IPTOS_ECN_CE) | if ((iptos & IPTOS_ECN_MASK) == IPTOS_ECN_CE) | ||||
tp->t_rcep += 1; | tp->t_rcep += 1; | ||||
if (tp->t_flags2 & TF2_ECN_PERMIT) { | if (tp->t_flags2 & TF2_ECN_PERMIT) { | ||||
▲ Show 20 Lines • Show All 290 Lines • Show Last 20 Lines |