Page MenuHomeFreeBSD

D25909.id75258.diff
No OneTemporary

D25909.id75258.diff

Index: sys/netinet/tcp_syncache.h
===================================================================
--- sys/netinet/tcp_syncache.h
+++ sys/netinet/tcp_syncache.h
@@ -63,8 +63,8 @@
struct mbuf *sc_ipopts; /* source route */
u_int16_t sc_peer_mss; /* peer's MSS */
u_int16_t sc_wnd; /* advertised window */
- u_int8_t sc_ip_ttl; /* IPv4 TTL */
- u_int8_t sc_ip_tos; /* IPv4 TOS */
+ u_int8_t sc_ip_ttl; /* TTL / Hop Limit */
+ u_int8_t sc_ip_tos; /* TOS / Traffic Class */
u_int8_t sc_requested_s_scale:4,
sc_requested_r_scale:4;
u_int16_t sc_flags;
Index: sys/netinet/tcp_syncache.c
===================================================================
--- sys/netinet/tcp_syncache.c
+++ sys/netinet/tcp_syncache.c
@@ -828,6 +828,8 @@
inp->inp_vflag &= ~INP_IPV6;
inp->inp_vflag |= INP_IPV4;
#endif
+ inp->inp_ip_ttl = sc->sc_ip_ttl;
+ inp->inp_ip_tos = sc->sc_ip_tos;
inp->inp_laddr = sc->sc_inc.inc_laddr;
#ifdef INET6
}
@@ -863,6 +865,7 @@
if (oinp->in6p_outputopts)
inp->in6p_outputopts =
ip6_copypktopts(oinp->in6p_outputopts, M_NOWAIT);
+ inp->in6p_hops = oinp->in6p_hops;
}
if (sc->sc_inc.inc_flags & INC_ISIPV6) {
@@ -1386,12 +1389,28 @@
cred = crhold(so->so_cred);
#ifdef INET6
- if ((inc->inc_flags & INC_ISIPV6) &&
- (inp->inp_flags & IN6P_AUTOFLOWLABEL))
- autoflowlabel = 1;
+ if (inc->inc_flags & INC_ISIPV6) {
+ if (inp->inp_flags & IN6P_AUTOFLOWLABEL) {
+ autoflowlabel = 1;
+ }
+ ip_ttl = in6_selecthlim(inp, NULL);
+ if ((inp->in6p_outputopts == NULL) ||
+ (inp->in6p_outputopts->ip6po_tclass == -1)) {
+ ip_tos = 0;
+ } else {
+ ip_tos = inp->in6p_outputopts->ip6po_tclass;
+ }
+ }
#endif
- ip_ttl = inp->inp_ip_ttl;
- ip_tos = inp->inp_ip_tos;
+#if defined(INET6) && defined(INET)
+ else
+#endif
+#ifdef INET
+ {
+ ip_ttl = inp->inp_ip_ttl;
+ ip_tos = inp->inp_ip_tos;
+ }
+#endif
win = so->sol_sbrcv_hiwat;
ltflags = (tp->t_flags & (TF_NOOPT | TF_SIGNATURE));
@@ -1589,13 +1608,8 @@
cred = NULL;
sc->sc_ipopts = ipopts;
bcopy(inc, &sc->sc_inc, sizeof(struct in_conninfo));
-#ifdef INET6
- if (!(inc->inc_flags & INC_ISIPV6))
-#endif
- {
- sc->sc_ip_tos = ip_tos;
- sc->sc_ip_ttl = ip_ttl;
- }
+ sc->sc_ip_tos = ip_tos;
+ sc->sc_ip_ttl = ip_ttl;
#ifdef TCP_OFFLOAD
sc->sc_tod = tod;
sc->sc_todctx = todctx;
@@ -1797,6 +1811,7 @@
/* Zero out traffic class and flow label. */
ip6->ip6_flow &= ~IPV6_FLOWINFO_MASK;
ip6->ip6_flow |= sc->sc_flowlabel;
+ ip6->ip6_flow |= htonl(sc->sc_ip_tos << 20);
th = (struct tcphdr *)(ip6 + 1);
}
@@ -1925,7 +1940,7 @@
m->m_pkthdr.csum_flags = CSUM_TCP_IPV6;
th->th_sum = in6_cksum_pseudo(ip6, tlen + optlen - hlen,
IPPROTO_TCP, 0);
- ip6->ip6_hlim = in6_selecthlim(NULL, NULL);
+ ip6->ip6_hlim = sc->sc_ip_ttl;
#ifdef TCP_OFFLOAD
if (ADDED_BY_TOE(sc)) {
struct toedev *tod = sc->sc_tod;

File Metadata

Mime Type
text/plain
Expires
Wed, May 27, 12:15 AM (19 h, 25 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33541740
Default Alt Text
D25909.id75258.diff (2 KB)

Event Timeline