From ad75934761665d8cf838a1ff61dbd8f4aed57aac Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Tue, 28 Jan 2025 01:54:37 +0200 Subject: [PATCH] begin implementing dns frontend --- node/lux_dns.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ node/lux_node.go | 14 +++++++++++ 2 files changed, 77 insertions(+) create mode 100644 node/lux_dns.go diff --git a/node/lux_dns.go b/node/lux_dns.go new file mode 100644 index 0000000..bcc286d --- /dev/null +++ b/node/lux_dns.go @@ -0,0 +1,63 @@ +package node + +import "net" + +type LuxDnsServer struct { + node *LuxNode + stopChan chan bool +} + +func NewLuxDnsServer(node *LuxNode) LuxDnsServer { + return LuxDnsServer{ + node: node, + stopChan: make(chan bool), + } +} + +func (sv *LuxDnsServer) HandleRequest(req []byte) []byte { + return nil +} + +func (sv *LuxDnsServer) CreateFrontend(udpListen string) error { + listenAddr, err := net.ResolveUDPAddr("udp", udpListen) + if err != nil { + return err + } + + conn, err := net.ListenUDP("udp", listenAddr) + if err != nil { + return err + } + + go func(sv *LuxDnsServer) { + defer conn.Close() + + buf := make([]byte, 512) + + for { + select { + case <-sv.stopChan: + return + default: + n, addr, err := conn.ReadFromUDP(buf) + if err != nil { + log.Debugf("failed to recv dns udp: %v\n", err) + } + + res := sv.HandleRequest(buf[:n]) + if len(res) > 0 { + _, err := conn.WriteToUDP(res, addr) + if err != nil { + log.Debugf("failed to send dns reply: %v\n", err) + } + } + } + } + }(sv) + + return nil +} + +func (sv *LuxDnsServer) Stop() { + sv.stopChan <- true +} diff --git a/node/lux_node.go b/node/lux_node.go index e3d5406..8a60c0a 100644 --- a/node/lux_node.go +++ b/node/lux_node.go @@ -89,6 +89,20 @@ func (node *LuxNode) GetStateLock() *sync.RWMutex { return &node.stateLock } +func (node *LuxNode) GetHostByName(name string) (LuxHostState, bool) { + node.stateLock.RLock() + defer node.stateLock.RUnlock() + + for _, host := range node.state.hosts { + if host.State.Hostname == name { + // explicitly make a copy to avoid concurrency problems + return *host, true + } + } + + return LuxHostState{}, false +} + func (node *LuxNode) GetHostStateChannel() <-chan LuxHostState { return node.state.GetStateChannel() }