reply to LkUp

This commit is contained in:
Josh Deprez 2024-04-14 14:22:31 +10:00
parent b30d6fdef1
commit 05215af5f7
Signed by: josh
SSH key fingerprint: SHA256:zZji7w1Ilh2RuUpbQcqkLPrqmRwpiCSycbF2EfKm6Kw

58
main.go
View file

@ -278,7 +278,7 @@ func main() {
rtmpCh <- ddpkt rtmpCh <- ddpkt
case 2: // The NIS (name information socket / NBP socket) case 2: // The NIS (name information socket / NBP socket)
if err := handleNBP(pcapHandle, myHWAddr, cfg, ddpkt); err != nil { if err := handleNBP(pcapHandle, myHWAddr, ethFrame.Src, myAddr, cfg, ddpkt); err != nil {
log.Printf("NBP: Couldn't handle: %v", err) log.Printf("NBP: Couldn't handle: %v", err)
} }
@ -434,7 +434,7 @@ func main() {
} }
} }
func handleNBP(pcapHandle *pcap.Handle, myHWAddr ethernet.Addr, cfg *config, ddpkt *ddp.ExtPacket) error { func handleNBP(pcapHandle *pcap.Handle, myHWAddr, srcHWAddr ethernet.Addr, myAddr aarp.AddrPair, cfg *config, ddpkt *ddp.ExtPacket) error {
if ddpkt.Proto != ddp.ProtoNBP { if ddpkt.Proto != ddp.ProtoNBP {
return fmt.Errorf("invalid DDP type %d on socket 2", ddpkt.Proto) return fmt.Errorf("invalid DDP type %d on socket 2", ddpkt.Proto)
} }
@ -446,11 +446,57 @@ func handleNBP(pcapHandle *pcap.Handle, myHWAddr ethernet.Addr, cfg *config, ddp
log.Printf("NBP: Got %v id %d with tuples %v", nbpkt.Function, nbpkt.NBPID, nbpkt.Tuples) log.Printf("NBP: Got %v id %d with tuples %v", nbpkt.Function, nbpkt.NBPID, nbpkt.Tuples)
// Is it a BrRq? switch nbpkt.Function {
if nbpkt.Function != nbp.FunctionBrRq { case nbp.FunctionLkUp:
// when in AppleTalk, do as Apple Internet Router does...
tuple := nbpkt.Tuples[0]
if tuple.Object != "jrouter" && tuple.Object != "=" {
return nil return nil
} }
if tuple.Type != "AppleRouter" && tuple.Type != "=" {
return nil
}
if tuple.Zone != cfg.EtherTalk.ZoneName && tuple.Zone != "*" && tuple.Zone != "" {
return nil
}
respPkt := &nbp.Packet{
Function: nbp.FunctionLkUpReply,
NBPID: nbpkt.NBPID,
Tuples: []nbp.Tuple{
{
Network: myAddr.Proto.Network,
Node: myAddr.Proto.Node,
Socket: 253,
Enumerator: 0,
Object: "jrouter",
Type: "AppleRouter",
Zone: cfg.EtherTalk.ZoneName,
},
},
}
respRaw, err := respPkt.Marshal()
if err != nil {
return fmt.Errorf("couldn't marshal LkUp-Reply: %v", err)
}
ddpkt.DstNet = ddpkt.SrcNet
ddpkt.DstNode = ddpkt.SrcNode
ddpkt.DstSocket = ddpkt.SrcSocket
ddpkt.SrcNet = myAddr.Proto.Network
ddpkt.SrcNode = myAddr.Proto.Node
ddpkt.SrcSocket = 2
ddpkt.Data = respRaw
outFrame, err := ethertalk.AppleTalk(myHWAddr, *ddpkt)
if err != nil {
return err
}
outFrame.Dst = srcHWAddr
outFrameRaw, err := ethertalk.Marshal(*outFrame)
if err != nil {
return err
}
return pcapHandle.WritePacketData(outFrameRaw)
case nbp.FunctionBrRq:
// There must be 1! // There must be 1!
tuple := nbpkt.Tuples[0] tuple := nbpkt.Tuples[0]
@ -487,6 +533,10 @@ func handleNBP(pcapHandle *pcap.Handle, myHWAddr ethernet.Addr, cfg *config, ddp
return err return err
} }
return pcapHandle.WritePacketData(outFrameRaw) return pcapHandle.WritePacketData(outFrameRaw)
default:
return fmt.Errorf("TODO: handle function %v", nbpkt.Function)
}
} }
func handleZIP(pcapHandle *pcap.Handle, srcHWAddr, myHWAddr ethernet.Addr, myAddr aarp.AddrPair, cfg *config, ddpkt *ddp.ExtPacket) error { func handleZIP(pcapHandle *pcap.Handle, srcHWAddr, myHWAddr ethernet.Addr, myAddr aarp.AddrPair, cfg *config, ddpkt *ddp.ExtPacket) error {