Multi-port refactor #1
5 changed files with 19 additions and 12 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue