Steve Clark wrote:
> Hi Darren,
I am now getting the following panic:
Fatal trap 12: page fault while in kernel mode
cpuid = 0; apic id = 00
fault virtual address = 0x1c
fault code = supervisor write, page not present
instruction pointer = 0x20:0xc06404ba
stack pointer = 0x28:0xc75169f8
frame pointer = 0x28:0xc75169f8
code segment = base 0x0, limit 0xfffff, type 0x1b
= DPL 0, pres 1, def32 1, gran 1
processor eflags = interrupt enabled, resume, IOPL = 0
current process = 13 (swi1: net)
trap number = 12
panic: page fault
cpuid = 0
Uptime: 1h4m48s
Dumping 111 MB (2 chunks)
chunk 0: 1MB (159 pages) ... ok
chunk 1: 111MB (28400 pages) 95 79 63 47 31 15
#0 doadump () at pcpu.h:165
165 __asm __volatile("movl %%fs:0,%0" : "=r" (td));
(kgdb) add-symbol-file
/mnt/src/ip_fil4.1.26/BSD/FreeBSD-6.1-STABLE-i386/ipf.ko 0xc0b3b084
add symbol table from file
"/mnt/src/ip_fil4.1.26/BSD/FreeBSD-6.1-STABLE-i386/ipf.ko" at
.text_addr = 0xc0b3b084
(y or n) y
Reading symbols from
/mnt/src/ip_fil4.1.26/BSD/FreeBSD-6.1-STABLE-i386/ipf.ko...done.
(kgdb) bt
#0 doadump () at pcpu.h:165
#1 0xc06492b2 in boot (howto=260) at ../../../kern/kern_shutdown.c:409
#2 0xc06495d9 in panic (fmt=0xc0910386 "%s") at
./../../kern/kern_shutdown.c:565
#3 0xc082d99c in trap_fatal (frame=0xc75169b8, eva=28) at
./../../i386/i386/trap.c:837
#4 0xc082d6db in trap_pfault (frame=0xc75169b8, usermode=0, eva=28)
at ../../../i386/i386/trap.c:745
#5 0xc082d335 in trap (frame=
{tf_fs = 8, tf_es = 40, tf_ds = 40, tf_edi = 0, tf_esi =
-1061813396, tf_ebp = -950965768, tf_isp = -950965788, tf_ebx =
-1032953240, tf_edx = -1048515968, tf_ecx = 0, tf_eax = 4, tf_trapno =
12, tf_err = 2, tf_eip = -1067187014, tf_cs = 32, tf_eflags = 590466,
tf_esp = -950965720, tf_ss = -1061944816}) at
./../../i386/i386/trap.c:435
#6 0xc08198fa in calltrap () at ../../../i386/i386/exception.s:139
#7 0xc06404ba in _mtx_lock_flags (m=0x0, opts=0, file=0xc0b5a16f
"../../fil.c", line=5222) at atomic.h:146
#8 0xc0b40210 in fr_movequeue (tqe=0xc26e6268, oifq=0x0,
nifq=0xc0b6036c) at ../../fil.c:5222
#9 0xc0b4d81b in fr_tcp_age (tqe=0xc26e6268, fin=0x4, tqtab=0x4,
flags=0, seqnext=0) at ../../ip_state.c:3605
#10 0xc0b468aa in nat_update (fin=0xc7516b40, nat=0xc26e6200,
np=0xc94d76c) at ../../ip_nat.c:3666
..
Not unexpected.
See below for the patch I should have sent you the first time.
Darren
Index: ip_nat.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_nat.c,v
retrieving revision 2.195.2.105
diff -c -r2.195.2.105 ip_nat.c
*** ip_nat.c 21 Dec 2007 23:03:24 -0000 2.195.2.105
--- ip_nat.c 7 Feb 2008 01:41:35 -0000
***************
*** 2587,2593 ****
nat->nat_ptr = np;
nat->nat_p = fin->fin_p;
nat->nat_mssclamp = np->in_mssclamp;
! if (nat->nat_p == IPPROTO_TCP)
nat->nat_seqnext[0] = ntohl(tcp->th_seq);
if ((np->in_apr != NULL) && ((ni->nai_flags & NAT_SLAVE) == 0))
--- 2587,2593 ----
nat->nat_ptr = np;
nat->nat_p = fin->fin_p;
nat->nat_mssclamp = np->in_mssclamp;
! if (nat->nat_p == IPPROTO_TCP && tcp != NULL)
nat->nat_seqnext[0] = ntohl(tcp->th_seq);
if ((np->in_apr != NULL) && ((ni->nai_flags & NAT_SLAVE) == 0))
***************
*** 3678,3704 ****
ifq2 = NULL;
if (nat->nat_p == IPPROTO_TCP && ifq2 == NULL) {
! u_32_t end, ack;
! u_char tcpflags;
! tcphdr_t *tcp;
! int dsize;
! tcp = fin->fin_dp;
! tcpflags = tcp->th_flags;
! dsize = fin->fin_dlen - (TCP_OFF(tcp) << 2) +
! ((tcpflags & TH_SYN) ? 1 : 0) +
! ((tcpflags & TH_FIN) ? 1 : 0);
! ack = ntohl(tcp->th_ack);
! end = ntohl(tcp->th_seq) + dsize;
! if (SEQ_GT(ack, nat->nat_seqnext[1 - fin->fin_rev]))
! nat->nat_seqnext[1 - fin->fin_rev] = ack;
! if (nat->nat_seqnext[fin->fin_rev] == 0)
! nat->nat_seqnext[fin->fin_rev] = end;
! (void) fr_tcp_age(&nat->nat_tqe, fin, nat_tqb, 0);
} else {
if (ifq2 == NULL) {
if (nat->nat_p == IPPROTO_UDP)
--- 3678,3706 ----
ifq2 = NULL;
if (nat->nat_p == IPPROTO_TCP && ifq2 == NULL) {
! if (!fin->fin_off) {
! u_32_t end, ack;
! u_char tcpflags;
! tcphdr_t *tcp;
! int dsize;
! tcp = fin->fin_dp;
! tcpflags = tcp->th_flags;
! dsize = fin->fin_dlen - (TCP_OFF(tcp) << 2) +
! ((tcpflags & TH_SYN) ? 1 : 0) +
! ((tcpflags & TH_FIN) ? 1 : 0);
! ack = ntohl(tcp->th_ack);
! end = ntohl(tcp->th_seq) + dsize;
! if (SEQ_GT(ack, nat->nat_seqnext[1 - fin->fin_rev]))
! nat->nat_seqnext[1 - fin->fin_rev] = ack;
! if (nat->nat_seqnext[fin->fin_rev] == 0)
! nat->nat_seqnext[fin->fin_rev] = end;
! (void) fr_tcp_age(&nat->nat_tqe, fin, nat_tqb, 0);
! }
} else {
if (ifq2 == NULL) {
if (nat->nat_p == IPPROTO_UDP)