--- zzzz-none-000/linux-4.4.271/net/ipv4/tcp_output.c 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/net/ipv4/tcp_output.c 2023-04-19 10:22:30.000000000 +0000 @@ -456,48 +456,53 @@ u16 options = opts->options; /* mungable copy */ if (unlikely(OPTION_MD5 & options)) { - *ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | - (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG); + net_hdr_word(ptr++) = + htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | + (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG); /* overload cookie hash location */ opts->hash_location = (__u8 *)ptr; ptr += 4; } if (unlikely(opts->mss)) { - *ptr++ = htonl((TCPOPT_MSS << 24) | - (TCPOLEN_MSS << 16) | - opts->mss); + net_hdr_word(ptr++) = + htonl((TCPOPT_MSS << 24) | (TCPOLEN_MSS << 16) | + opts->mss); } if (likely(OPTION_TS & options)) { if (unlikely(OPTION_SACK_ADVERTISE & options)) { - *ptr++ = htonl((TCPOPT_SACK_PERM << 24) | - (TCPOLEN_SACK_PERM << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + net_hdr_word(ptr++) = + htonl((TCPOPT_SACK_PERM << 24) | + (TCPOLEN_SACK_PERM << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); options &= ~OPTION_SACK_ADVERTISE; } else { - *ptr++ = htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); + net_hdr_word(ptr++) = + htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_TIMESTAMP << 8) | + TCPOLEN_TIMESTAMP); } - *ptr++ = htonl(opts->tsval); - *ptr++ = htonl(opts->tsecr); + net_hdr_word(ptr++) = htonl(opts->tsval); + net_hdr_word(ptr++) = htonl(opts->tsecr); } if (unlikely(OPTION_SACK_ADVERTISE & options)) { - *ptr++ = htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_SACK_PERM << 8) | - TCPOLEN_SACK_PERM); + net_hdr_word(ptr++) = + htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_SACK_PERM << 8) | + TCPOLEN_SACK_PERM); } if (unlikely(OPTION_WSCALE & options)) { - *ptr++ = htonl((TCPOPT_NOP << 24) | - (TCPOPT_WINDOW << 16) | - (TCPOLEN_WINDOW << 8) | - opts->ws); + net_hdr_word(ptr++) = + htonl((TCPOPT_NOP << 24) | + (TCPOPT_WINDOW << 16) | + (TCPOLEN_WINDOW << 8) | + opts->ws); } if (unlikely(opts->num_sack_blocks)) { @@ -505,16 +510,17 @@ tp->duplicate_sack : tp->selective_acks; int this_sack; - *ptr++ = htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_SACK << 8) | - (TCPOLEN_SACK_BASE + (opts->num_sack_blocks * + net_hdr_word(ptr++) = + htonl((TCPOPT_NOP << 24) | + (TCPOPT_NOP << 16) | + (TCPOPT_SACK << 8) | + (TCPOLEN_SACK_BASE + (opts->num_sack_blocks * TCPOLEN_SACK_PERBLOCK))); for (this_sack = 0; this_sack < opts->num_sack_blocks; ++this_sack) { - *ptr++ = htonl(sp[this_sack].start_seq); - *ptr++ = htonl(sp[this_sack].end_seq); + net_hdr_word(ptr++) = htonl(sp[this_sack].start_seq); + net_hdr_word(ptr++) = htonl(sp[this_sack].end_seq); } tp->rx_opt.dsack = 0; @@ -527,13 +533,14 @@ if (foc->exp) { len = TCPOLEN_EXP_FASTOPEN_BASE + foc->len; - *ptr = htonl((TCPOPT_EXP << 24) | (len << 16) | + net_hdr_word(ptr) = + htonl((TCPOPT_EXP << 24) | (len << 16) | TCPOPT_FASTOPEN_MAGIC); p += TCPOLEN_EXP_FASTOPEN_BASE; } else { len = TCPOLEN_FASTOPEN_BASE + foc->len; - *p++ = TCPOPT_FASTOPEN; - *p++ = len; + net_hdr_word(p++) = TCPOPT_FASTOPEN; + net_hdr_word(p++) = len; } memcpy(p, foc->val, foc->len); @@ -960,6 +967,9 @@ skb_orphan(skb); skb->sk = sk; skb->destructor = skb_is_tcp_pure_ack(skb) ? sock_wfree : tcp_wfree; +#ifdef CONFIG_NET_SCHED + skb->tc_index = sk->sk_tc_index; +#endif skb_set_hash_from_sk(skb, sk); atomic_add(skb->truesize, &sk->sk_wmem_alloc); @@ -1217,6 +1227,10 @@ buff->ip_summed = skb->ip_summed; +#ifdef CONFIG_NET_SCHED + skb->tc_index = sk->sk_tc_index; +#endif + buff->tstamp = skb->tstamp; tcp_fragment_tstamp(skb, buff);