Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 414
b: refs/heads/master
c: c5c13fa
h: refs/heads/master
v: v3
  • Loading branch information
Thomas Graf authored and David S. Miller committed Apr 25, 2005
1 parent 7ab53b8 commit 9251096
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0d3d077cd4f1154e63a9858e47fe3fb1ad0c03e5
refs/heads/master: c5c13fafd6548fe36b8fe9285c1912fcf96379f4
31 changes: 27 additions & 4 deletions trunk/net/sched/cls_fw.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,11 @@
#include <net/act_api.h>
#include <net/pkt_cls.h>

#define HTSIZE (PAGE_SIZE/sizeof(struct fw_filter *))

struct fw_head
{
struct fw_filter *ht[256];
struct fw_filter *ht[HTSIZE];
};

struct fw_filter
Expand All @@ -69,7 +71,28 @@ static struct tcf_ext_map fw_ext_map = {

static __inline__ int fw_hash(u32 handle)
{
return handle&0xFF;
if (HTSIZE == 4096)
return ((handle >> 24) & 0xFFF) ^
((handle >> 12) & 0xFFF) ^
(handle & 0xFFF);
else if (HTSIZE == 2048)
return ((handle >> 22) & 0x7FF) ^
((handle >> 11) & 0x7FF) ^
(handle & 0x7FF);
else if (HTSIZE == 1024)
return ((handle >> 20) & 0x3FF) ^
((handle >> 10) & 0x3FF) ^
(handle & 0x3FF);
else if (HTSIZE == 512)
return (handle >> 27) ^
((handle >> 18) & 0x1FF) ^
((handle >> 9) & 0x1FF) ^
(handle & 0x1FF);
else if (HTSIZE == 256) {
u8 *t = (u8 *) &handle;
return t[0] ^ t[1] ^ t[2] ^ t[3];
} else
return handle & (HTSIZE - 1);
}

static int fw_classify(struct sk_buff *skb, struct tcf_proto *tp,
Expand Down Expand Up @@ -152,7 +175,7 @@ static void fw_destroy(struct tcf_proto *tp)
if (head == NULL)
return;

for (h=0; h<256; h++) {
for (h=0; h<HTSIZE; h++) {
while ((f=head->ht[h]) != NULL) {
head->ht[h] = f->next;
fw_delete_filter(tp, f);
Expand Down Expand Up @@ -291,7 +314,7 @@ static void fw_walk(struct tcf_proto *tp, struct tcf_walker *arg)
if (arg->stop)
return;

for (h = 0; h < 256; h++) {
for (h = 0; h < HTSIZE; h++) {
struct fw_filter *f;

for (f = head->ht[h]; f; f = f->next) {
Expand Down

0 comments on commit 9251096

Please sign in to comment.