summaryrefslogtreecommitdiff
path: root/bpf/filter/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'bpf/filter/main.go')
-rw-r--r--bpf/filter/main.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/bpf/filter/main.go b/bpf/filter/main.go
new file mode 100644
index 0000000..4df312c
--- /dev/null
+++ b/bpf/filter/main.go
@@ -0,0 +1,95 @@
+package filter
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "net"
+
+ "github.com/cilium/ebpf/link"
+ "sinanmohd.com/redq/db"
+)
+
+type Filter struct {
+ ctxDb context.Context
+ queries *db.Queries
+ objs bpfObjects
+ xdpLink link.Link
+}
+
+func Close(f *Filter) {
+ f.objs.Close()
+ f.xdpLink.Close()
+}
+
+func New(iface *net.Interface, queries *db.Queries, ctxDb context.Context) (*Filter, error) {
+ var err error
+ var f Filter
+
+ if err := loadBpfObjects(&f.objs, nil); err != nil {
+ log.Printf("loading objects: %s", err)
+ return nil, err
+ }
+ defer func() {
+ if err != nil {
+ f.objs.Close()
+ }
+ }()
+
+ f.xdpLink, err = link.AttachXDP(link.XDPOptions{
+ Interface: iface.Index,
+ Program: f.objs.MacFilter,
+ })
+ if err != nil {
+ log.Printf("could not attach TCx program: %s", err)
+ return nil, err
+ }
+ defer func() {
+ if err != nil {
+ f.xdpLink.Close()
+ }
+ }()
+
+ blackList, err := queries.GetMacBlackList(ctxDb)
+ zeros := make([]uint16, len(blackList))
+ _, err = f.objs.bpfMaps.MacBlacklistMap.BatchUpdate(blackList[:], zeros, nil)
+ if err != nil {
+ log.Printf("loading mac blacklist: %s", err)
+ return nil, err
+ }
+
+ f.queries = queries
+ return &f, nil
+}
+
+func (f *Filter) Block(mac uint64) error {
+ err := f.queries.EnterMacBlackList(f.ctxDb, int64(mac))
+ if err != nil {
+ log.Printf("adding mac blacklist: %s", err)
+ return err
+ }
+
+ err = f.objs.bpfMaps.MacBlacklistMap.Put(mac, true)
+ if err != nil {
+ log.Printf("adding mac blacklist: %s", err)
+ return err
+ }
+
+ return nil
+}
+
+func (f *Filter) Unblock(mac uint64) error {
+ err := f.queries.DeleteDnsBlackList(f.ctxDb, fmt.Sprintf("%v", mac))
+ if err != nil {
+ log.Printf("adding mac blacklist: %s", err)
+ return err
+ }
+
+ err = f.objs.bpfMaps.MacBlacklistMap.Delete(mac)
+ if err != nil {
+ log.Printf("adding mac blacklist: %s", err)
+ return err
+ }
+
+ return nil
+}