diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-02-08 08:13:40 +0000 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-02-08 10:51:26 +0200 |
commit | d22129e9feab6a7aa57d9512d73d2cf6a5088afb (patch) | |
tree | 5dc4f39c94ea616ee1e5b6b6a416a39b8805b422 | |
parent | c609c91fe3b2640f4714360f1d93170b775e2171 (diff) | |
download | awall-d22129e9feab6a7aa57d9512d73d2cf6a5088afb.tar.bz2 awall-d22129e9feab6a7aa57d9512d73d2cf6a5088afb.tar.xz |
now works also for reversed rules
-rw-r--r-- | awall/model.lua | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/awall/model.lua b/awall/model.lua index 95c18f1..c234bb8 100644 --- a/awall/model.lua +++ b/awall/model.lua @@ -377,37 +377,41 @@ function Rule:trules() local addrofrags = combinations(self:create(Zone, {addr=self.src}):optfrags(self:direction('in')), self:destoptfrags()) + local combined = res if addrofrags then addrofrags = ffilter(addrofrags) setfamilies(addrofrags) res = ffilter(res) - end - local addrchain = false - for i, ofrag in ipairs(res) do - if not ofrag.chain then ofrag.chain = ofrag.fchain end - addrchain = addrchain or (self.src and ofrag.src) or (self.dest and ofrag.dest) + combined = {} + for i, ofrag in ipairs(res) do + local cc = combinations({ofrag}, addrofrags) + if #cc < #addrofrags then + combined = nil + break + end + util.extend(combined, cc) + end end local target - if addrchain then - target = self:newchain('address') - else + if combined then target = self:target() - res = combinations(res, addrofrags) + res = combined + else + target = self:newchain('address') end tag(res, 'position', self:position()) res = combinations(res, {{target=target}}) - if addrchain then - for i, ofrag in ipairs(addrofrags) do - ofrag.chain = target - ofrag.target = self:target() - table.insert(res, ofrag) - end + if not combined then + util.extend( + res, + combinations(addrofrags, {{chain=target, target=self:target()}}) + ) end local ofrags = {} |