--- /usr/src/2547/net/sched/cls_u32.c 2002/11/12 03:21:28 1.1 +++ /usr/src/2547/net/sched/cls_u32.c 2002/11/12 03:24:35 @@ -124,6 +124,13 @@ if (n) { struct tc_u32_key *key = n->sel.keys; + if (n->sel.flags&(TC_U32_OFFSET|TC_U32_VAROFFSET)) { + off2 = n->sel.off + 3; + if (n->sel.flags&TC_U32_VAROFFSET) + off2 += ntohs(n->sel.offmask & *(u16*)(ptr+n->sel.offoff)) >>n->sel.offshift; + off2 &= ~3; + } + for (i = n->sel.nkeys; i>0; i--, key++) { if ((*(u32*)(ptr+key->off+(off2&key->offmask))^key->val)&key->mask) { n = n->next; @@ -158,16 +165,6 @@ sel = 0; if (ht->divisor) sel = ht->divisor&u32_hash_fold(*(u32*)(ptr+n->sel.hoff), &n->sel); - - if (!(n->sel.flags&(TC_U32_VAROFFSET|TC_U32_OFFSET|TC_U32_EAT))) - goto next_ht; - - if (n->sel.flags&(TC_U32_OFFSET|TC_U32_VAROFFSET)) { - off2 = n->sel.off + 3; - if (n->sel.flags&TC_U32_VAROFFSET) - off2 += ntohs(n->sel.offmask & *(u16*)(ptr+n->sel.offoff)) >>n->sel.offshift; - off2 &= ~3; - } if (n->sel.flags&TC_U32_EAT) { ptr += off2; off2 = 0;