summaryrefslogtreecommitdiff
path: root/fw/src/fw.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/src/fw.c')
-rw-r--r--fw/src/fw.c87
1 files changed, 46 insertions, 41 deletions
diff --git a/fw/src/fw.c b/fw/src/fw.c
index 70bcc5c..3c13182 100644
--- a/fw/src/fw.c
+++ b/fw/src/fw.c
@@ -190,23 +190,27 @@ int
revalidate(void)
{
Flow *f, **pp;
- uchar *peer;
- int i, port, lport, n;
+ Match m;
+ int i, n;
n = 0;
+ memset(&m, 0, sizeof m);
+ m.count = 0; /* re-checking a flow is not traffic */
lock(&flowlock);
for(i = 0; i < Nflow; i++)
for(pp = &flowtab[i]; (f = *pp) != nil; ){
+ m.verb = f->verb;
+ m.proto = protonum2name(f->proto);
if(f->verb == Vout){
- peer = f->dst;
- port = f->dport;
- lport = f->sport;
+ m.ip = f->dst;
+ m.port = f->dport;
+ m.lport = f->sport;
}else{
- peer = f->src;
- port = f->sport;
- lport = f->dport;
+ m.ip = f->src;
+ m.port = f->sport;
+ m.lport = f->dport;
}
- if(matchrule(f->verb, protonum2name(f->proto), peer, 0, port, lport, nil) != nil){
+ if(!matchrule(&m)){
*pp = f->next;
free(f);
n++;
@@ -397,11 +401,9 @@ static void
relay(Wire *from, Wire *to, int verb)
{
uchar *buf;
- char *e;
- uchar *peer;
- Rule *rule;
+ Match m;
Pkt p;
- int n, port, lport;
+ int n;
/*
* On the heap, not the stack: these run as libthread procs with a
@@ -424,14 +426,18 @@ relay(Wire *from, Wire *to, int verb)
}
p.verb = verb;
+ memset(&m, 0, sizeof m);
+ m.count = 1;
+ m.verb = verb;
+ m.proto = protonum2name(p.proto);
if(verb == Vout){
- peer = p.dst;
- port = p.dport;
- lport = p.sport;
+ m.ip = p.dst;
+ m.port = p.dport;
+ m.lport = p.sport;
}else{
- peer = p.src;
- port = p.sport;
- lport = p.dport;
+ m.ip = p.src;
+ m.port = p.sport;
+ m.lport = p.dport;
}
if(flowseen(&p)){
@@ -446,24 +452,23 @@ relay(Wire *from, Wire *to, int verb)
continue;
}
- e = matchrule(verb, protonum2name(p.proto), peer, 0, port, lport, &rule);
- if(e != nil){
- if(rule != nil && rule->log)
+ if(!matchrule(&m)){
+ if(m.log)
syslog(0, "fw", "drop %s %s %I!%d -> %I!%d: %s",
verb == Vout ? "out" : "in",
protonum2name(p.proto),
- p.src, p.sport, p.dst, p.dport, e);
+ p.src, p.sport, p.dst, p.dport, m.err);
ndeny++;
if(debug)
fprint(2, "drop %s %s %I!%d -> %I!%d: %s\n",
verb == Vout ? "out" : "in",
protonum2name(p.proto),
- p.src, p.sport, p.dst, p.dport, e);
+ p.src, p.sport, p.dst, p.dport, m.err);
continue;
}
nallow++;
- if(rule != nil && rule->log)
+ if(m.log)
syslog(0, "fw", "pass %s %s %I!%d -> %I!%d",
verb == Vout ? "out" : "in",
protonum2name(p.proto),
@@ -925,10 +930,7 @@ relayproc(void *a)
static int
permitted(uchar *buf, int n, int verb, Pkt *p)
{
- Rule *rule;
- uchar *peer;
- char *e;
- int port, lport;
+ Match m;
parsepkt(buf, n, p);
if(!p->ok){
@@ -939,34 +941,37 @@ permitted(uchar *buf, int n, int verb, Pkt *p)
return 0;
}
p->verb = verb;
+ memset(&m, 0, sizeof m);
+ m.count = 1;
+ m.verb = verb;
+ m.proto = protonum2name(p->proto);
if(verb == Vout){
- peer = p->dst;
- port = p->dport;
- lport = p->sport;
+ m.ip = p->dst;
+ m.port = p->dport;
+ m.lport = p->sport;
}else{
- peer = p->src;
- port = p->sport;
- lport = p->dport;
+ m.ip = p->src;
+ m.port = p->sport;
+ m.lport = p->dport;
}
if(flowseen(p)){
nallow++;
return 1;
}
- e = matchrule(verb, protonum2name(p->proto), peer, 0, port, lport, &rule);
- if(e != nil){
+ if(!matchrule(&m)){
ndeny++;
- if(rule != nil && rule->log)
+ if(m.log)
syslog(0, "fw", "drop %s %s %I!%d -> %I!%d: %s",
verb == Vout ? "out" : "in", protonum2name(p->proto),
- p->src, p->sport, p->dst, p->dport, e);
+ p->src, p->sport, p->dst, p->dport, m.err);
if(debug)
fprint(2, "drop %s %s %I!%d -> %I!%d: %s\n",
verb == Vout ? "out" : "in", protonum2name(p->proto),
- p->src, p->sport, p->dst, p->dport, e);
+ p->src, p->sport, p->dst, p->dport, m.err);
return 0;
}
nallow++;
- if(rule != nil && rule->log)
+ if(m.log)
syslog(0, "fw", "pass %s %s %I!%d -> %I!%d",
verb == Vout ? "out" : "in", protonum2name(p->proto),
p->src, p->sport, p->dst, p->dport);