diff -cr ip_fil3.4.33pre2/fil.c ipf34/fil.c *** ip_fil3.4.33pre2/fil.c Sat Nov 15 23:36:30 2003 --- ipf34/fil.c Mon Dec 1 15:59:25 2003 *************** *** 145,151 **** #ifdef _KERNEL static void frsynclist __P((frentry_t *)); # ifndef __sgi ! static void *ipf_pullup __P((mb_t *, fr_info_t *, int)); # endif #endif --- 145,151 ---- #ifdef _KERNEL static void frsynclist __P((frentry_t *)); # ifndef __sgi ! static void *ipf_pullup __P((mb_t *, fr_info_t *, int, void *)); # endif #endif *************** *** 306,312 **** case ICMP6_PARAM_PROB : # if defined(KERNEL) && !defined(__sgi) if ((m != NULL) && (M_BLEN(m) < plen)) { ! ip = ipf_pullup(m, fin, plen); if (ip == NULL) return -1; } --- 306,312 ---- case ICMP6_PARAM_PROB : # if defined(KERNEL) && !defined(__sgi) if ((m != NULL) && (M_BLEN(m) < plen)) { ! ip = ipf_pullup(m, fin, plen, ip); if (ip == NULL) return -1; } *************** *** 374,380 **** case ICMP_PARAMPROB : #if defined(KERNEL) && !defined(__sgi) if ((m != NULL) && (M_BLEN(m) < plen)) { ! ip = ipf_pullup(m, fin, plen); if (ip == NULL) return -1; tcp = (tcphdr_t *)((char *)ip + hlen); --- 374,380 ---- case ICMP_PARAMPROB : #if defined(KERNEL) && !defined(__sgi) if ((m != NULL) && (M_BLEN(m) < plen)) { ! ip = ipf_pullup(m, fin, plen, ip); if (ip == NULL) return -1; tcp = (tcphdr_t *)((char *)ip + hlen); *************** *** 413,419 **** int tlen = hlen + (tcp->th_off << 2); if ((m != NULL) && (M_BLEN(m) < tlen)) { ! ip = ipf_pullup(m, fin, tlen); if (ip == NULL) return -1; tcp = (tcphdr_t *)((char *)ip + hlen); --- 413,419 ---- int tlen = hlen + (tcp->th_off << 2); if ((m != NULL) && (M_BLEN(m) < tlen)) { ! ip = ipf_pullup(m, fin, tlen, ip); if (ip == NULL) return -1; tcp = (tcphdr_t *)((char *)ip + hlen); *************** *** 1014,1020 **** if ((MLEN > up) && (len > up)) up = MIN(len, MLEN); # endif ! ip = ipf_pullup(m, fin, up); if (ip == NULL) return -1; m = *mp; --- 1014,1020 ---- if ((MLEN > up) && (len > up)) up = MIN(len, MLEN); # endif ! ip = ipf_pullup(m, fin, up, ip); if (ip == NULL) return -1; m = *mp; *************** *** 2359,2386 **** #if defined(_KERNEL) && !defined(__sgi) ! void *ipf_pullup(m, fin, len) mb_t *m; fr_info_t *fin; int len; { # if SOLARIS qif_t *qf = fin->fin_qif; # endif ! int out = fin->fin_out; char *ip; if (m == NULL) return NULL; if (M_BLEN(m) < len) { # if SOLARIS qif_t *qf = fin->fin_qif; int inc; ! if (qf->qf_off > 0) { ! if ((qf->qf_off & 3) != 0) { ! inc = 4 - (qf->qf_off & 3); if (m->b_rptr - inc >= m->b_datap->db_base) m->b_rptr -= inc; else --- 2359,2393 ---- #if defined(_KERNEL) && !defined(__sgi) ! void *ipf_pullup(m, fin, len, ipin) mb_t *m; fr_info_t *fin; int len; + void *ipin; { # if SOLARIS qif_t *qf = fin->fin_qif; # endif ! int out = fin->fin_out, dpoff, ipoff; char *ip; if (m == NULL) return NULL; + ipoff = (char *)ipin - MTOD(m, char *); + if (fin->fin_dp != NULL) + dpoff = (char *)fin->fin_dp - (char *)ipin; + else + dpoff = 0; + if (M_BLEN(m) < len) { # if SOLARIS qif_t *qf = fin->fin_qif; int inc; ! if (ipoff > 0) { ! if ((ipoff & 3) != 0) { ! inc = 4 - (ipoff & 3); if (m->b_rptr - inc >= m->b_datap->db_base) m->b_rptr -= inc; else *************** *** 2387,2400 **** inc = 0; } } ! if (!pullupmsg(m, len + qf->qf_off + inc)) { ATOMIC_INCL(frstats[out].fr_pull[1]); return NULL; } m->b_rptr += inc; ATOMIC_INCL(frstats[out].fr_pull[0]); ! ip = MTOD(m, char *) + qf->qf_off; ! qf->qf_data = ip; # else m = m_pullup(m, len); *fin->fin_mp = m; --- 2394,2406 ---- inc = 0; } } ! if (!pullupmsg(m, len + ipoff + inc)) { ATOMIC_INCL(frstats[out].fr_pull[1]); return NULL; } m->b_rptr += inc; ATOMIC_INCL(frstats[out].fr_pull[0]); ! qf->qf_data = MTOD(m, char *) + ipoff; # else m = m_pullup(m, len); *fin->fin_mp = m; *************** *** 2403,2417 **** return NULL; } ATOMIC_INCL(frstats[out].fr_pull[0]); - ip = MTOD(m, char *); # endif /* SOLARIS */ - } else { - # if SOLARIS - ip = MTOD(m, char *) + qf->qf_off; - # else - ip = MTOD(m, char *); - # endif } return ip; } #endif /* _KERNEL */ --- 2409,2419 ---- return NULL; } ATOMIC_INCL(frstats[out].fr_pull[0]); # endif /* SOLARIS */ } + ip = MTOD(m, char *) + ipoff; + if (fin->fin_dp != NULL) + fin->fin_dp = (char *)ip + dpoff; return ip; } #endif /* _KERNEL */