From ce3aa5faf555f8c9a0fe60d12b02210a9112f790 Mon Sep 17 00:00:00 2001 From: Josh Deprez Date: Fri, 12 Apr 2024 13:09:04 +1000 Subject: [PATCH] Add NBP machine (WIP) --- atalk/nbp/nbp.go | 9 +++++++++ main.go | 11 +++++++++++ nbp.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 nbp.go diff --git a/atalk/nbp/nbp.go b/atalk/nbp/nbp.go index a72563c..dc4ed89 100644 --- a/atalk/nbp/nbp.go +++ b/atalk/nbp/nbp.go @@ -35,6 +35,15 @@ const ( FunctionFwdReq Function = 4 ) +func (f Function) String() string { + return map[Function]string{ + FunctionBrRq: "BrRq", + FunctionLkUp: "LkUp", + FunctionLkUpReply: "LkUp-Reply", + FunctionFwdReq: "FwdReq", + }[f] +} + // Packet represents an NBP packet. type Packet struct { Function Function // top 4 bits of first byte diff --git a/main.go b/main.go index a61571a..e961139 100644 --- a/main.go +++ b/main.go @@ -169,6 +169,14 @@ func main() { rtmpCh := make(chan *ddp.ExtPacket, 1024) go rtmpMachine.Run(ctx, rtmpCh) + // --------------------- NBP -------------------- + nbpMachine := &NBPMachine{ + aarp: aarpMachine, + pcapHandle: pcapHandle, + } + nbpCh := make(chan *ddp.ExtPacket, 1024) + go nbpMachine.Run(ctx, nbpCh) + // ---------- Raw AppleTalk/AARP inbound ---------- go func() { for { @@ -247,6 +255,9 @@ func main() { case 1: // The RTMP socket rtmpCh <- &ddpkt + case 2: // The NIS (NBP socket) + nbpCh <- &ddpkt + case 4: // The AEP socket if err := handleAEP(pcapHandle, myHWAddr, ethFrame.Src, &ddpkt); err != nil { log.Printf("AEP: Couldn't handle: %v", err) diff --git a/nbp.go b/nbp.go new file mode 100644 index 0000000..9e39c29 --- /dev/null +++ b/nbp.go @@ -0,0 +1,33 @@ +package main + +import ( + "context" + "log" + + "gitea.drjosh.dev/josh/jrouter/atalk/nbp" + "github.com/google/gopacket/pcap" + "github.com/sfiera/multitalk/pkg/ddp" +) + +type NBPMachine struct { + aarp *AARPMachine + pcapHandle *pcap.Handle +} + +func (NBPMachine) Run(ctx context.Context, incoming <-chan *ddp.ExtPacket) error { + for { + select { + case <-ctx.Done(): + return ctx.Err() + + case ddpkt := <-incoming: + pkt, err := nbp.Unmarshal(ddpkt.Data) + if err != nil { + log.Printf("NBP: invalid packet: %v", err) + continue + } + // TODO: + log.Printf("NBP: Got %v", pkt.Function) + } + } +}