pf dealt poorly with certain types of IPV6 icmp packets. Apply by doing: cd /usr/src patch -p0 < 006_pf.patch And then rebuild your kernel. Index: sys/net/pf.c =================================================================== RCS file: /cvs/src/sys/net/pf.c,v retrieving revision 1.163 diff -u -r1.163 pf.c --- sys/net/pf.c 15 Oct 2001 16:22:21 -0000 1.163 +++ sys/net/pf.c 13 Nov 2001 18:08:05 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: pf.c,v 1.163 2001/10/15 16:22:21 dhartmei Exp $ */ +/* $OpenBSD: pf.c,v 1.166 2001/11/13 17:45:26 frantzen Exp $ */ /* * Copyright (c) 2001 Daniel Hartmeier @@ -3953,12 +3953,8 @@ pd2.src = (struct pf_addr *)&h2_6.ip6_src; pd2.dst = (struct pf_addr *)&h2_6.ip6_dst; pd2.ip_sum = NULL; + off2 = ipoff2 + sizeof(h2_6); do { - while (off >= m->m_len) { - off -= m->m_len; - m = m->m_next; - } - switch (pd2.proto) { case IPPROTO_FRAGMENT: /* XXX we don't handle fagments yet */ @@ -3968,11 +3964,16 @@ case IPPROTO_ROUTING: case IPPROTO_DSTOPTS: { /* get next header and header length */ - struct _opt6 *opt6; + struct _opt6 opt6; - opt6 = (struct _opt6 *)(mtod(m, caddr_t) + off2); - pd2.proto = opt6->opt6_nxt; - off2 += (opt6->opt6_hlen + 1) * 8; + if (!pf_pull_hdr(m, off2, &opt6, + sizeof(opt6), NULL, NULL, pd2.af)) { + DPFPRINTF(PF_DEBUG_MISC, + ("pf: ICMPv6 short opt\n")); + return(PF_DROP); + } + pd2.proto = opt6.opt6_nxt; + off2 += (opt6.opt6_hlen + 1) * 8; /* goto the next header */ break; }