Page MenuHomeFreeBSD

D22436.diff
No OneTemporary

D22436.diff

Index: head/sys/dev/cxgbe/tom/t4_listen.c
===================================================================
--- head/sys/dev/cxgbe/tom/t4_listen.c
+++ head/sys/dev/cxgbe/tom/t4_listen.c
@@ -988,7 +988,7 @@
static void
pass_accept_req_to_protohdrs(struct adapter *sc, const struct mbuf *m,
- struct in_conninfo *inc, struct tcphdr *th)
+ struct in_conninfo *inc, struct tcphdr *th, uint8_t *iptos)
{
const struct cpl_pass_accept_req *cpl = mtod(m, const void *);
const struct ether_header *eh;
@@ -1005,6 +1005,21 @@
tcp = (const void *)(l3hdr + G_IP_HDR_LEN(hlen));
}
+ /* extract TOS (DiffServ + ECN) byte for AccECN */
+ if (iptos) {
+ if (((struct ip *)l3hdr)->ip_v == IPVERSION) {
+ const struct ip *ip = (const void *)l3hdr;
+ *iptos = ip->ip_tos;
+ }
+#ifdef INET6
+ else
+ if (((struct ip *)l3hdr)->ip_v == (IPV6_VERSION >> 4)) {
+ const struct ip6_hdr *ip6 = (const void *)l3hdr;
+ *iptos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
+ }
+#endif /* INET */
+ }
+
if (inc) {
bzero(inc, sizeof(*inc));
inc->inc_fport = tcp->th_sport;
@@ -1150,6 +1165,7 @@
unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl)));
#endif
struct offload_settings settings;
+ uint8_t iptos;
KASSERT(opcode == CPL_PASS_ACCEPT_REQ,
("%s: unexpected opcode 0x%x", __func__, opcode));
@@ -1208,7 +1224,7 @@
if (lctx->vnet != ifp->if_vnet)
REJECT_PASS_ACCEPT_REQ(true);
- pass_accept_req_to_protohdrs(sc, m, &inc, &th);
+ pass_accept_req_to_protohdrs(sc, m, &inc, &th, &iptos);
if (inc.inc_flags & INC_ISIPV6) {
/* Don't offload if the ifcap isn't enabled */
@@ -1284,7 +1300,7 @@
* syncache_add. Note that syncache_add releases the pcb lock.
*/
t4opt_to_tcpopt(&cpl->tcpopt, &to);
- toe_syncache_add(&inc, &to, &th, inp, tod, synqe);
+ toe_syncache_add(&inc, &to, &th, inp, tod, synqe, iptos);
if (atomic_load_int(&synqe->ok_to_respond) > 0) {
uint64_t opt0;
@@ -1350,9 +1366,10 @@
struct tcphdr *th, struct tcpopt *to)
{
uint16_t tcp_opt = be16toh(cpl->tcp_opt);
+ uint8_t iptos;
/* start off with the original SYN */
- pass_accept_req_to_protohdrs(sc, synqe->syn, inc, th);
+ pass_accept_req_to_protohdrs(sc, synqe->syn, inc, th, &iptos);
/* modify parts to make it look like the ACK to our SYN|ACK */
th->th_flags = TH_ACK;
Index: head/sys/netinet/tcp_input.c
===================================================================
--- head/sys/netinet/tcp_input.c
+++ head/sys/netinet/tcp_input.c
@@ -1282,7 +1282,7 @@
#endif
TCP_PROBE3(debug__input, tp, th, m);
tcp_dooptions(&to, optp, optlen, TO_SYN);
- if (syncache_add(&inc, &to, th, inp, &so, m, NULL, NULL))
+ if (syncache_add(&inc, &to, th, inp, &so, m, NULL, NULL, iptos))
goto tfo_socket_result;
/*
Index: head/sys/netinet/tcp_syncache.h
===================================================================
--- head/sys/netinet/tcp_syncache.h
+++ head/sys/netinet/tcp_syncache.h
@@ -45,7 +45,7 @@
struct tcphdr *, struct socket **, struct mbuf *);
int syncache_add(struct in_conninfo *, struct tcpopt *,
struct tcphdr *, struct inpcb *, struct socket **, struct mbuf *,
- void *, void *);
+ void *, void *, uint8_t);
void syncache_chkrst(struct in_conninfo *, struct tcphdr *, struct mbuf *);
void syncache_badack(struct in_conninfo *);
int syncache_pcblist(struct sysctl_req *);
Index: head/sys/netinet/tcp_syncache.c
===================================================================
--- head/sys/netinet/tcp_syncache.c
+++ head/sys/netinet/tcp_syncache.c
@@ -1369,7 +1369,7 @@
int
syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
struct inpcb *inp, struct socket **lsop, struct mbuf *m, void *tod,
- void *todctx)
+ void *todctx, uint8_t iptos)
{
struct tcpcb *tp;
struct socket *so;
Index: head/sys/netinet/toecore.h
===================================================================
--- head/sys/netinet/toecore.h
+++ head/sys/netinet/toecore.h
@@ -135,7 +135,7 @@
void toe_connect_failed(struct toedev *, struct inpcb *, int);
void toe_syncache_add(struct in_conninfo *, struct tcpopt *, struct tcphdr *,
- struct inpcb *, void *, void *);
+ struct inpcb *, void *, void *, uint8_t);
int toe_syncache_expand(struct in_conninfo *, struct tcpopt *, struct tcphdr *,
struct socket **);
Index: head/sys/netinet/toecore.c
===================================================================
--- head/sys/netinet/toecore.c
+++ head/sys/netinet/toecore.c
@@ -346,13 +346,13 @@
void
toe_syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
- struct inpcb *inp, void *tod, void *todctx)
+ struct inpcb *inp, void *tod, void *todctx, uint8_t iptos)
{
struct socket *lso = inp->inp_socket;
INP_WLOCK_ASSERT(inp);
- syncache_add(inc, to, th, inp, &lso, NULL, tod, todctx);
+ syncache_add(inc, to, th, inp, &lso, NULL, tod, todctx, iptos);
}
int

File Metadata

Mime Type
text/plain
Expires
Mon, Feb 3, 3:41 AM (21 h, 41 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16424437
Default Alt Text
D22436.diff (4 KB)

Event Timeline