diff --git a/router/aep.go b/router/aep.go index 1a8f9b4..8a3d99b 100644 --- a/router/aep.go +++ b/router/aep.go @@ -47,7 +47,7 @@ func (rtr *Router) HandleAEP(ctx context.Context, ddpkt *ddp.ExtPacket) error { ddpkt.DstSocket, ddpkt.SrcSocket = ddpkt.SrcSocket, ddpkt.DstSocket ddpkt.Data[0] = byte(aep.EchoReply) - return rtr.Forward(ctx, ddpkt) + return rtr.Output(ctx, ddpkt) default: return fmt.Errorf("invalid AEP function %d", ep.Function) diff --git a/router/nbp.go b/router/nbp.go index 5af2afc..ad72e3d 100644 --- a/router/nbp.go +++ b/router/nbp.go @@ -65,7 +65,7 @@ func (rtr *Router) handleNBPFwdReq(ctx context.Context, ddpkt *ddp.ExtPacket, nb if err != nil || outDDP == nil { return err } - if err := rtr.Forward(ctx, outDDP); err != nil { + if err := rtr.Output(ctx, outDDP); err != nil { return err } } @@ -200,7 +200,7 @@ func (port *EtherTalkPort) handleNBPBrRq(ctx context.Context, ddpkt *ddp.ExtPack Data: nbpRaw, } - if err := port.Router.Forward(ctx, outDDP); err != nil { + if err := port.Router.Output(ctx, outDDP); err != nil { return err } } diff --git a/router/route.go b/router/route.go index ffaf259..a399836 100644 --- a/router/route.go +++ b/router/route.go @@ -142,7 +142,7 @@ func (rt *RouteTable) UpdateAURPRouteDistance(peer *AURPPeer, network ddp.Networ } } -func (rt *RouteTable) UpsertEthRoute(peer *EtherTalkPeer, extended bool, netStart, netEnd ddp.Network, metric uint8) error { +func (rt *RouteTable) UpsertEtherTalkRoute(peer *EtherTalkPeer, extended bool, netStart, netEnd ddp.Network, metric uint8) error { if netStart > netEnd { return fmt.Errorf("invalid network range [%d, %d]", netStart, netEnd) } diff --git a/router/router.go b/router/router.go index e7afdc5..7295076 100644 --- a/router/router.go +++ b/router/router.go @@ -30,9 +30,8 @@ type Router struct { Ports []*EtherTalkPort } -// Forward routes a packet towards the right destination. -// It increments the hop count, then looks up the best route for the network, -// then transmits the packet according to the route. +// Forward increments the hop count, then outputs the packet in the direction +// of the destination. func (rtr *Router) Forward(ctx context.Context, ddpkt *ddp.ExtPacket) error { // Check and adjust the Hop Count // Note the ddp package doesn't make this simple @@ -44,6 +43,12 @@ func (rtr *Router) Forward(ctx context.Context, ddpkt *ddp.ExtPacket) error { ddpkt.Size &^= 0x3C00 ddpkt.Size |= hopCount << 10 + return rtr.Output(ctx, ddpkt) +} + +// Output outputs the packet in the direction of the destination. +// (It does not check or adjust the hop count.) +func (rtr *Router) Output(ctx context.Context, ddpkt *ddp.ExtPacket) error { switch route := rtr.RouteTable.LookupRoute(ddpkt.DstNet); { case route == nil: return fmt.Errorf("no route for packet (dstnet %d); dropping packet", ddpkt.DstNet) diff --git a/router/rtmp.go b/router/rtmp.go index 8a55b03..547b53f 100644 --- a/router/rtmp.go +++ b/router/rtmp.go @@ -67,7 +67,7 @@ func (port *EtherTalkPort) HandleRTMP(ctx context.Context, pkt *ddp.ExtPacket) e Data: respPktRaw, } - if err := port.Router.Forward(ctx, ddpPkt); err != nil { + if err := port.Router.Output(ctx, ddpPkt); err != nil { return fmt.Errorf("send Response: %w", err) } @@ -95,7 +95,7 @@ func (port *EtherTalkPort) HandleRTMP(ctx context.Context, pkt *ddp.ExtPacket) e Data: dataPktRaw, } - if err := port.Router.Forward(ctx, ddpPkt); err != nil { + if err := port.Router.Output(ctx, ddpPkt); err != nil { return fmt.Errorf("send Data: %w", err) } } @@ -119,7 +119,7 @@ func (port *EtherTalkPort) HandleRTMP(ctx context.Context, pkt *ddp.ExtPacket) e } for _, rt := range dataPkt.NetworkTuples { - if err := port.Router.RouteTable.UpsertEthRoute(peer, rt.Extended, rt.RangeStart, rt.RangeEnd, rt.Distance+1); err != nil { + if err := port.Router.RouteTable.UpsertEtherTalkRoute(peer, rt.Extended, rt.RangeStart, rt.RangeEnd, rt.Distance+1); err != nil { log.Printf("RTMP: Couldn't upsert EtherTalk route: %v", err) } } @@ -150,7 +150,7 @@ func (port *EtherTalkPort) RunRTMP(ctx context.Context) (err error) { log.Printf("RTMP: Couldn't broadcast Data: %v", err) } - setStatus("Starting packet loop") + setStatus("Starting broadcast loop") bcastTicker := time.NewTicker(10 * time.Second) defer bcastTicker.Stop() @@ -163,7 +163,9 @@ func (port *EtherTalkPort) RunRTMP(ctx context.Context) (err error) { case <-bcastTicker.C: setStatus("Broadcasting RTMP Data") if err := port.broadcastRTMPData(); err != nil { - log.Printf("RTMP: Couldn't broadcast Data: %v", err) + st := fmt.Sprintf("Couldn't broadcast Data: %v", err) + setStatus(st) + log.Print(st) } } }