RTMP handling in machine
This commit is contained in:
parent
e75639a317
commit
aa0268e08e
2 changed files with 64 additions and 2 deletions
33
main.go
33
main.go
|
@ -164,7 +164,8 @@ func main() {
|
||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
pcapHandle: pcapHandle,
|
pcapHandle: pcapHandle,
|
||||||
}
|
}
|
||||||
go rtmpMachine.Run(ctx)
|
rtmpCh := make(chan *ddp.ExtPacket, 1024)
|
||||||
|
go rtmpMachine.Run(ctx, rtmpCh)
|
||||||
|
|
||||||
// ---------- Raw AppleTalk/AARP inbound ----------
|
// ---------- Raw AppleTalk/AARP inbound ----------
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -217,6 +218,36 @@ func main() {
|
||||||
aarpMachine.Learn(srcAddr, ethFrame.Src)
|
aarpMachine.Learn(srcAddr, ethFrame.Src)
|
||||||
log.Printf("DDP: Gleaned that %v -> %v", srcAddr, ethFrame.Src)
|
log.Printf("DDP: Gleaned that %v -> %v", srcAddr, ethFrame.Src)
|
||||||
|
|
||||||
|
// Packet for us? First, who am I?
|
||||||
|
myAddr, ok := aarpMachine.Address()
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Our network?
|
||||||
|
// "The network number 0 is reserved to mean unknown; by default
|
||||||
|
// it specifies the local network to which the node is
|
||||||
|
// connected. Packets whose destination network number is 0 are
|
||||||
|
// addressed to a node on the local network."
|
||||||
|
if ddpkt.DstNet != 0 && ddpkt.DstNet != myAddr.Proto.Network {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// To me?
|
||||||
|
// "Node ID 0 indicates any router on the network"- I'm a router
|
||||||
|
// "node ID $FF indicates either a network-wide or zone-specific
|
||||||
|
// broadcast"- that's relevant
|
||||||
|
if ddpkt.DstNode != 0 && ddpkt.DstNode != 0xff && ddpkt.DstNode != myAddr.Proto.Node {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ddpkt.DstSocket {
|
||||||
|
case 1: // The RTMP socket
|
||||||
|
rtmpCh <- &ddpkt
|
||||||
|
default:
|
||||||
|
log.Printf("DDP: No handler for socket %d", ddpkt.DstSocket)
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
log.Printf("Read unknown packet %s -> %s with payload %x", ethFrame.Src, ethFrame.Dst, ethFrame.Payload)
|
log.Printf("Read unknown packet %s -> %s with payload %x", ethFrame.Src, ethFrame.Dst, ethFrame.Payload)
|
||||||
|
|
||||||
|
|
33
rtmp.go
33
rtmp.go
|
@ -18,7 +18,7 @@ type RTMPMachine struct {
|
||||||
pcapHandle *pcap.Handle
|
pcapHandle *pcap.Handle
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *RTMPMachine) Run(ctx context.Context) error {
|
func (m *RTMPMachine) Run(ctx context.Context, incomingCh <-chan *ddp.ExtPacket) error {
|
||||||
bcastTicker := time.NewTicker(10 * time.Second)
|
bcastTicker := time.NewTicker(10 * time.Second)
|
||||||
defer bcastTicker.Stop()
|
defer bcastTicker.Stop()
|
||||||
|
|
||||||
|
@ -86,6 +86,37 @@ func (m *RTMPMachine) Run(ctx context.Context) error {
|
||||||
if err := m.pcapHandle.WritePacketData(ethFrameRaw); err != nil {
|
if err := m.pcapHandle.WritePacketData(ethFrameRaw); err != nil {
|
||||||
log.Printf("RTMP: Couldn't write frame: %v", err)
|
log.Printf("RTMP: Couldn't write frame: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case pkt := <-incomingCh:
|
||||||
|
switch pkt.Proto {
|
||||||
|
case ddp.ProtoRTMPReq:
|
||||||
|
// I can answer RTMP requests!
|
||||||
|
req, err := rtmp.UnmarshalRequestPacket(pkt.Data)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("RTMP: Couldn't unmarshal Request packet: %v", err)
|
||||||
|
}
|
||||||
|
switch req.Function {
|
||||||
|
case 1: // RTMP Request
|
||||||
|
// TODO
|
||||||
|
log.Print("RTMP: Got Request")
|
||||||
|
|
||||||
|
case 2: // RTMP RDR with split-horizon processing
|
||||||
|
// TODO
|
||||||
|
log.Print("RTMP: Got RDR with split-horizon")
|
||||||
|
|
||||||
|
case 3: // RTMP RDR for whole table
|
||||||
|
// TODO
|
||||||
|
log.Print("RTMP: Got RDR without split-horizon")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case ddp.ProtoRTMPResp:
|
||||||
|
// It's a peer router on the AppleTalk network!
|
||||||
|
// TODO
|
||||||
|
log.Print("RTMP: Got Response or ")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue