diff --git a/atalk/raw.go b/atalk/raw.go index 1106399..6ec3f19 100644 --- a/atalk/raw.go +++ b/atalk/raw.go @@ -4,11 +4,8 @@ import ( "fmt" "github.com/google/gopacket/pcap" - "github.com/sfiera/multitalk/pkg/ethernet" ) -var MulticastDst = ethernet.Addr{0x09, 0x00, 0x07, 0xff, 0xff, 0xff} - // StartPcap opens an AppleTalk and AARP listening session on a network device. func StartPcap(device string) (*pcap.Handle, error) { handle, err := pcap.OpenLive(device, 4096, true, pcap.BlockForever) diff --git a/main.go b/main.go index a531b1b..36d5adf 100644 --- a/main.go +++ b/main.go @@ -202,6 +202,29 @@ func main() { amt.Learn(aapkt.Src.Proto, aapkt.Src.Hardware) log.Printf("AARP: Gleaned that %v -> %v", aapkt.Src.Proto, aapkt.Src.Hardware) + if aapkt.Dst.Proto != localDDPAddr { + continue + } + // Respond! + respFrame, err := ethertalk.AARP(localMAC, aarp.Response(aapkt.Src, aarp.AddrPair{ + Proto: localDDPAddr, + Hardware: localMAC, + })) + if err != nil { + log.Printf("Couldn't construct AARP Response: %v", err) + continue + } + respFrame.Dst = ethFrame.Src + respFrameRaw, err := ethertalk.Marshal(*respFrame) + if err != nil { + log.Printf("Couldn't marshal AARP Response: %v", err) + continue + } + if err := handle.WritePacketData(respFrameRaw); err != nil { + log.Printf("Couldn't write packet data: %v", err) + continue + } + case aarp.ResponseOp: log.Printf("AARP: %v is at %v", aapkt.Dst.Proto, aapkt.Dst.Hardware) amt.Learn(aapkt.Dst.Proto, aapkt.Dst.Hardware)