Hmm...
Can you please use tcpdump to capture the contents of the data session
up to the
point where this problem occurs. I'd like the actual packet data, so:
tcpdump -w state-window -s 1536 -ni nic0 host bar and host foo
There's also a new diff attached that brings back the printfs.
I'm quite interested to see what they show.
Thanks
Darren
Index: ip_state.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_state.c,v
retrieving revision 2.186.2.50
diff -c -r2.186.2.50 ip_state.c
*** ip_state.c 18 Dec 2006 15:53:40 -0000 2.186.2.50
--- ip_state.c 20 Dec 2006 19:35:54 -0000
***************
*** 1425,1438 ****
if (flags == (TH_SYN|TH_ACK)) {
is->is_s0[source] = ntohl(tcp->th_ack);
is->is_s0[!source] = ntohl(tcp->th_seq) + 1;
! if ((TCP_OFF(tcp) > (sizeof(tcphdr_t) >> 2)) &&
! (tdata->td_winflags & TCP_WSCALE_SEEN)) {
if (fr_tcpoptions(fin, tcp, fdata) == -1)
fin->fin_flx |= FI_BAD;
- if (!(fdata->td_winflags & TCP_WSCALE_SEEN)) {
- fdata->td_winscale = 0;
- tdata->td_winscale = 0;
- }
}
if ((fin->fin_out != 0) && (is->is_pass & FR_NEWISN))
fr_checknewisn(fin, is);
--- 1425,1433 ----
if (flags == (TH_SYN|TH_ACK)) {
is->is_s0[source] = ntohl(tcp->th_ack);
is->is_s0[!source] = ntohl(tcp->th_seq) + 1;
! if ((TCP_OFF(tcp) > (sizeof(tcphdr_t) >> 2))) {
if (fr_tcpoptions(fin, tcp, fdata) == -1)
fin->fin_flx |= FI_BAD;
}
if ((fin->fin_out != 0) && (is->is_pass & FR_NEWISN))
fr_checknewisn(fin, is);
***************
*** 1546,1562 ****
* the receiver also does window scaling)
*/
if (!(tcpflags & TH_SYN) && (fdata->td_winflags & TCP_WSCALE_FIRST)) {
! if (tdata->td_winflags & TCP_WSCALE_SEEN) {
! fdata->td_winflags &= ~TCP_WSCALE_FIRST;
! fdata->td_maxwin = win;
! } else {
! fdata->td_winscale = 0;
! fdata->td_winflags &= ~(TCP_WSCALE_FIRST|
! TCP_WSCALE_SEEN);
! tdata->td_winscale = 0;
! tdata->td_winflags &= ~(TCP_WSCALE_FIRST|
! TCP_WSCALE_SEEN);
! }
}
end = seq + dsize;
--- 1541,1549 ----
* the receiver also does window scaling)
*/
if (!(tcpflags & TH_SYN) && (fdata->td_winflags & TCP_WSCALE_FIRST)) {
! fdata->td_winflags &= ~TCP_WSCALE_FIRST;
! fdata->td_maxend += win - fdata->td_maxend;
! fdata->td_maxwin = win;
}
end = seq + dsize;
***************
*** 1592,1597 ****
--- 1579,1586 ----
}
}
+ /* TRACE(fdata, tdata, seq, end, ack, ackskew, win, maxwin) */
+
#define SEQ_GE(a,b) ((int)((a) - (b)) >= 0)
#define SEQ_GT(a,b) ((int)((a) - (b)) > 0)
inseq = 0;
***************
*** 1599,1605 ****
(SEQ_GE(seq, fdata->td_end - maxwin)) &&
/* XXX what about big packets */
#define MAXACKWINDOW 66000
! (-ackskew <= (MAXACKWINDOW << fdata->td_winscale)) &&
( ackskew <= (MAXACKWINDOW << fdata->td_winscale))) {
inseq = 1;
/*
--- 1588,1594 ----
(SEQ_GE(seq, fdata->td_end - maxwin)) &&
/* XXX what about big packets */
#define MAXACKWINDOW 66000
! (-ackskew <= (MAXACKWINDOW)) &&
( ackskew <= (MAXACKWINDOW << fdata->td_winscale))) {
inseq = 1;
/*
***************
*** 1672,1677 ****
--- 1661,1673 ----
tdata->td_maxend = ack + win;
return 1;
}
+
+ printf("fdata:maxend %u end %u winflags %x winscale %d\n",
+ fdata->td_maxend, fdata->td_end, fdata->td_winflags, fdata->td_winscale);
+ printf("tdata:maxend %u end %u winflags %x winscale %d\n",
+ tdata->td_maxend, tdata->td_end, tdata->td_winflags, tdata->td_winscale);
+ printf("win %u end %u seq %u ack %u ackskew %d maxwin %d dsize %d flags %x\n",
+ ntohs(tcp->th_win), end, seq, ack, ackskew, maxwin, dsize, tcpflags);
return 0;
}