tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: TCP PMTU/SACK/timer problem



> it seems like a bug to me.
Although I'm happy my analysis seems to be correct, I'm still not sure I
fully undestand what's happening. The retransmit timer is in this messed-up
state where it's considered armed but will not go off. We have a SACK hole
that apparently has been retransmitted. We have new data in the socket buffer,
but why will tcp_output() refuse to send (I checked with tcpdump that nothing
is sent; I can't drop into DDB)?

AFAICT, we have sack_rxmit == 0 and sack_bytes_rxmt == 0. We also have
tp->t_partialacks == 0 so the code around netinet/tcp_input.c:833 should
find there's data in the socket buffer it can send, shouldn't it?

Could someone please prove me wrong on the following data or tell me
there's another bug?

I printed out the pcb twice since some fields changed in between.

Thanks in advance for any hints.

I can probably temporarily work around the problem by setting an MTU
on the route from the file server trough the tunnel. So the retransmit
timer shouldn't be messed up any more by PMTU discovery and I can go
ahead enjoing my vacation.

(gdb) print *(struct tcpcb *)0xffff80000914e238
$1 = {t_family = 2, segq = {tqh_first = 0x0, tqh_last = 0xffff80000914e240}, 
  t_segqlen = 0, t_timer = {{c_list = {cq_next = {elem = 0xffffffff80606020, 
          list = 0xffffffff80606020}, cq_prev = {elem = 0xffffffff806a8800, 
          list = 0xffffffff806a8800}}, 
      c_func = 0xffffffff801393e0 <tcp_timer_rexmt>, 
      c_arg = 0xffff80000914e238, c_time = 828374206, c_flags = 4}, {c_list = {
        cq_next = {elem = 0x0, list = 0x0}, cq_prev = {elem = 0x0, 
          list = 0x0}}, c_func = 0xffffffff801392f0 <tcp_timer_persist>, 
      c_arg = 0xffff80000914e238, c_time = 0, c_flags = 0}, {c_list = {
        cq_next = {elem = 0xffff800009885708, list = 0xffff800009885708}, 
        cq_prev = {elem = 0xffff8000091662d8, list = 0xffff8000091662d8}}, 
      c_func = 0xffffffff80139140 <tcp_timer_keep>, 
      c_arg = 0xffff80000914e238, c_time = 829784260, c_flags = 2}, {c_list = {
        cq_next = {elem = 0x0, list = 0x0}, cq_prev = {elem = 0x0, 
          list = 0x0}}, c_func = 0xffffffff80138f60 <tcp_timer_2msl>, 
      c_arg = 0xffff80000914e238, c_time = 0, c_flags = 0}}, t_state = 4, 
  t_rxtshift = 0, t_rxtcur = 3, t_dupacks = 3, t_partialacks = 0, 
  t_peermss = 1460, t_ourmss = 1460, t_segsz = 1448, t_force = 0 '\0', 
  t_flags = 2532, t_template = 0xffff800009ac9000, 
  t_inpcb = 0xffff80000cd352d0, t_in6pcb = 0x0, t_delack_ch = {c_list = {
      cq_next = {elem = 0xffff80004e3458d8, list = 0xffff80004e3458d8}, 
      cq_prev = {elem = 0xffff800011d426e8, list = 0xffff800011d426e8}}, 
    c_func = 0xffffffff801390c0 <tcp_delack>, c_arg = 0xffff80000914e238, 
    c_time = 829064280, c_flags = 0}, snd_una = 1869460940, 
  snd_nxt = 1869460940, snd_up = 1869460940, snd_wl1 = 2357157762, 
  snd_wl2 = 1869460940, iss = 1857980151, snd_wnd = 138112, 
  snd_recover = 1869494764, snd_high = 1869460940, rcv_wnd = 65948, 
  rcv_nxt = 2357158522, rcv_up = 2357157762, irs = 2336413453, 
  rcv_adv = 2357223710, snd_max = 1869494764, snd_cwnd = 4380, 
  snd_ssthresh = 65001, t_rcvtime = 16581286, t_rtttime = 0, 
  t_rtseq = 1869460940, t_srtt = 39, t_rttvar = 3, t_rttmin = 2, 
  max_sndwnd = 138112, t_oobflags = 0 '\0', t_iobc = 0 '\0', t_softerror = 0, 
  snd_scale = 7 '\a', rcv_scale = 0 '\0', request_r_scale = 0 '\0', 
  requested_s_scale = 7 '\a', ts_recent = 17944682, ts_recent_age = 16581286, 
  ts_timebase = 16566161, last_ack_sent = 2357158522, t_bytes_acked = 753, 
  rcv_sack_flags = 0 '\0', rcv_dsack_block = {left = 0, right = 0}, timeq = {
    tqh_first = 0x0, tqh_last = 0xffff80000914e3f8}, snd_holes = {
    tqh_first = 0xffff80000cd22f98, tqh_last = 0xffff80000cd22fa8}, 
  snd_numholes = 1, rcv_lastsack = 1869494764, sack_newdata = 1869494764, 
  snd_fack = 1869494764, t_sc = {lh_first = 0x0}, 
  t_lastm = 0xffff800009952a00, t_inoff = 2670, t_lastoff = 32398, 
  t_lastlen = 94, t_mtudisc = 1, t_pmtud_mss_acked = 2766, 
  t_pmtud_mtu_sent = 1500, t_pmtud_th_seq = 1869460940, 
  t_pmtud_nextmtu = 39685, t_pmtud_ip_len = 56325, t_pmtud_ip_hl = 5, 
  t_ecn_retries = 0 '\0', t_congctl = 0xffffffff805ff6c0}
(gdb) print *((struct tcpcb *)0xffff80000914e238)->snd_holes->tqh_first
$2 = {start = 1869460940, end = 1869462388, rxmit = 1869462388, sackhole_q = {
    tqe_next = 0x0, tqe_prev = 0xffff80000914e408}}
(gdb) print *(*(struct tcpcb 
*)0xffff80000914e238)->t_inpcb->inp_head.inph_socket
$3 = {so_type = 1, so_options = 12, so_linger = 0, so_state = 2, 
  so_pcb = 0xffff80000cd352d0, so_proto = 0xffffffff80459660, so_head = 0x0, 
  so_onq = 0x0, so_q0 = {tqh_first = 0x0, tqh_last = 0x0}, so_q = {
    tqh_first = 0x0, tqh_last = 0x0}, so_qe = {tqe_next = 0x0, 
    tqe_prev = 0xffff8000098801b8}, so_q0len = 0, so_qlen = 0, so_qlimit = 0, 
  so_timeo = 0, so_error = 0, so_pgid = 0, so_oobmark = 0, so_snd = {sb_sel = {
      sel_klist = {slh_first = 0x0}, sel_pid = 0, sel_collision = 0 '\0'}, 
    sb_mowner = 0x0, sb_cc = 63420, sb_hiwat = 65948, sb_mbcnt = 115200, 
    sb_mbmax = 131896, sb_lowat = 4096, sb_mb = 0xffff800011c68200, 
    sb_mbtail = 0xffff800011c7ee00, sb_lastrecord = 0xffff800011c68200, 
    sb_flags = 4, sb_timeo = 0, sb_overflowed = 0}, so_rcv = {sb_sel = {
      sel_klist = {slh_first = 0x0}, sel_pid = 0, sel_collision = 0 '\0'}, 
    sb_mowner = 0x0, sb_cc = 0, sb_hiwat = 65948, sb_mbcnt = 0, 
    sb_mbmax = 131896, sb_lowat = 1, sb_mb = 0x0, sb_mbtail = 0x0, 
    sb_lastrecord = 0x0, sb_flags = 32, sb_timeo = 0, sb_overflowed = 0}, 
  so_internal = 0x0, so_upcall = 0xffffffff8023e510 <nfsrv_rcv>, 
  so_upcallarg = 0xffff800009cf5400 "", so_send = 0xffffffff8031a490 <sosend>, 
  so_receive = 0xffffffff80319390 <soreceive>, so_mowner = 0x0, 
  so_uidinfo = 0xffff800007ecdfc0}
(gdb) print *(struct tcpcb *)0xffff80000914e238
$4 = {t_family = 2, segq = {tqh_first = 0x0, tqh_last = 0xffff80000914e240}, 
  t_segqlen = 0, t_timer = {{c_list = {cq_next = {elem = 0xffffffff80606020, 
          list = 0xffffffff80606020}, cq_prev = {elem = 0xffffffff806a8800, 
          list = 0xffffffff806a8800}}, 
      c_func = 0xffffffff801393e0 <tcp_timer_rexmt>, 
      c_arg = 0xffff80000914e238, c_time = 828374206, c_flags = 4}, {c_list = {
        cq_next = {elem = 0x0, list = 0x0}, cq_prev = {elem = 0x0, 
          list = 0x0}}, c_func = 0xffffffff801392f0 <tcp_timer_persist>, 
      c_arg = 0xffff80000914e238, c_time = 0, c_flags = 0}, {c_list = {
        cq_next = {elem = 0xffff800009885708, list = 0xffff800009885708}, 
        cq_prev = {elem = 0xffff8000091662d8, list = 0xffff8000091662d8}}, 
      c_func = 0xffffffff80139140 <tcp_timer_keep>, 
      c_arg = 0xffff80000914e238, c_time = 829789467, c_flags = 2}, {c_list = {
        cq_next = {elem = 0x0, list = 0x0}, cq_prev = {elem = 0x0, 
          list = 0x0}}, c_func = 0xffffffff80138f60 <tcp_timer_2msl>, 
      c_arg = 0xffff80000914e238, c_time = 0, c_flags = 0}}, t_state = 4, 
  t_rxtshift = 0, t_rxtcur = 3, t_dupacks = 3, t_partialacks = 0, 
  t_peermss = 1460, t_ourmss = 1460, t_segsz = 1448, t_force = 0 '\0', 
  t_flags = 2532, t_template = 0xffff800009ac9000, 
  t_inpcb = 0xffff80000cd352d0, t_in6pcb = 0x0, t_delack_ch = {c_list = {
      cq_next = {elem = 0xffffffff80606020, list = 0xffffffff80606020}, 
      cq_prev = {elem = 0xffffffff806a8800, list = 0xffffffff806a8800}}, 
    c_func = 0xffffffff801390c0 <tcp_delack>, c_arg = 0xffff80000914e238, 
    c_time = 829069487, c_flags = 0}, snd_una = 1869460940, 
  snd_nxt = 1869460940, snd_up = 1869460940, snd_wl1 = 2357158522, 
  snd_wl2 = 1869460940, iss = 1857980151, snd_wnd = 138112, 
  snd_recover = 1869494764, snd_high = 1869460940, rcv_wnd = 65948, 
  rcv_nxt = 2357158666, rcv_up = 2357158522, irs = 2336413453, 
  rcv_adv = 2357224201, snd_max = 1869494764, snd_cwnd = 4380, 
  snd_ssthresh = 65001, t_rcvtime = 16581390, t_rtttime = 0, 
  t_rtseq = 1869460940, t_srtt = 39, t_rttvar = 3, t_rttmin = 2, 
  max_sndwnd = 138112, t_oobflags = 0 '\0', t_iobc = 0 '\0', t_softerror = 0, 
  snd_scale = 7 '\a', rcv_scale = 0 '\0', request_r_scale = 0 '\0', 
  requested_s_scale = 7 '\a', ts_recent = 17996741, ts_recent_age = 16581390, 
  ts_timebase = 16566161, last_ack_sent = 2357158666, t_bytes_acked = 753, 
  rcv_sack_flags = 0 '\0', rcv_dsack_block = {left = 0, right = 0}, timeq = {
    tqh_first = 0x0, tqh_last = 0xffff80000914e3f8}, snd_holes = {
    tqh_first = 0xffff80000cd22f98, tqh_last = 0xffff80000cd22fa8}, 
  snd_numholes = 1, rcv_lastsack = 1869494764, sack_newdata = 1869494764, 
  snd_fack = 1869494764, t_sc = {lh_first = 0x0}, 
  t_lastm = 0xffff800009952a00, t_inoff = 2670, t_lastoff = 32398, 
  t_lastlen = 94, t_mtudisc = 1, t_pmtud_mss_acked = 2766, 
  t_pmtud_mtu_sent = 1500, t_pmtud_th_seq = 1869460940, 
  t_pmtud_nextmtu = 39685, t_pmtud_ip_len = 56325, t_pmtud_ip_hl = 5, 
  t_ecn_retries = 0 '\0', t_congctl = 0xffffffff805ff6c0}


Home | Main Index | Thread Index | Old Index