blob: 3ddb557b332d2b4cb7b117a4d09981a7b211d811 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package filter
import (
"log"
"app/context"
"syscall/zx"
"fidl/fuchsia/net/filter"
)
type filterImpl struct {
filter *Filter
}
var filterService filter.FilterService
func AddOutgoingService(ctx *context.Context, f *Filter) error {
ctx.OutgoingService.AddService(filter.FilterName, func(c zx.Channel) error {
_, err := filterService.Add(&filterImpl{filter: f}, c, nil)
return err
})
return nil
}
func (fi *filterImpl) Enable(trueOrFalse bool) (filter.Status, error) {
fi.filter.Enable(trueOrFalse)
return 0, nil
}
func (fi *filterImpl) IsEnabled() (bool, error) {
return fi.filter.IsEnabled(), nil
}
func (fi *filterImpl) GetRules() ([]filter.Rule, uint32, filter.Status, error) {
fi.filter.rulesetMain.RLock()
nrs, err := fromRules(fi.filter.rulesetMain.v)
generation := fi.filter.rulesetMain.generation
fi.filter.rulesetMain.RUnlock()
if err != nil {
// This error should not happen.
log.Printf("GetRules error %v", err)
return []filter.Rule{}, 0, filter.StatusErrInternal, nil
}
return nrs, generation, filter.StatusOk, nil
}
func (fi *filterImpl) UpdateRules(nrs []filter.Rule, generation uint32) (filter.Status, error) {
rs, err := toRules(nrs)
if err != nil {
return filter.StatusErrBadRule, nil
}
fi.filter.rulesetMain.Lock()
defer fi.filter.rulesetMain.Unlock()
if generation != fi.filter.rulesetMain.generation {
return filter.StatusErrGenerationMismatch, nil
}
fi.filter.rulesetMain.v = rs
fi.filter.rulesetMain.generation = generation + 1
return filter.StatusOk, nil
}
func (fi *filterImpl) GetNatRules() ([]filter.Nat, uint32, filter.Status, error) {
fi.filter.rulesetNAT.RLock()
nns, err := fromNATs(fi.filter.rulesetNAT.v)
generation := fi.filter.rulesetNAT.generation
fi.filter.rulesetNAT.RUnlock()
if err != nil {
// This error should not happen.
log.Printf("GetNATRules error %v", err)
return []filter.Nat{}, 0, filter.StatusErrInternal, nil
}
return nns, generation, filter.StatusOk, nil
}
func (fi *filterImpl) UpdateNatRules(nns []filter.Nat, generation uint32) (filter.Status, error) {
ns, err := toNATs(nns)
if err != nil {
return filter.StatusErrBadRule, nil
}
fi.filter.rulesetNAT.Lock()
defer fi.filter.rulesetNAT.Unlock()
if generation != fi.filter.rulesetNAT.generation {
return filter.StatusErrGenerationMismatch, nil
}
fi.filter.rulesetNAT.v = ns
fi.filter.rulesetNAT.generation = generation + 1
return filter.StatusOk, nil
}
func (fi *filterImpl) GetRdrRules() ([]filter.Rdr, uint32, filter.Status, error) {
fi.filter.rulesetRDR.RLock()
nrs, err := fromRDRs(fi.filter.rulesetRDR.v)
generation := fi.filter.rulesetRDR.generation
fi.filter.rulesetRDR.RUnlock()
if err != nil {
// This error should not happen.
log.Printf("GetRdrRules error %v", err)
return []filter.Rdr{}, 0, filter.StatusErrInternal, nil
}
return nrs, generation, filter.StatusOk, nil
}
func (fi *filterImpl) UpdateRdrRules(nrs []filter.Rdr, generation uint32) (filter.Status, error) {
rs, err := toRDRs(nrs)
if err != nil {
return filter.StatusErrBadRule, nil
}
fi.filter.rulesetRDR.Lock()
defer fi.filter.rulesetRDR.Unlock()
if generation != fi.filter.rulesetRDR.generation {
return filter.StatusErrGenerationMismatch, nil
}
fi.filter.rulesetRDR.v = rs
fi.filter.rulesetRDR.generation = generation + 1
return 0, nil
}