mirror of
https://github.com/Quad4-Software/Reticulum-Go
synced 2026-08-29 23:48:44 -04:00
86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
// SPDX-License-Identifier: Apache-2.0
|
|
// Copyright (c) 2024-2026 Quad4.io
|
|
|
|
package node
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"quad4/reticulum-go/pkg/buffer"
|
|
"quad4/reticulum-go/pkg/channel"
|
|
"quad4/reticulum-go/pkg/common"
|
|
"quad4/reticulum-go/pkg/debug"
|
|
"quad4/reticulum-go/pkg/packet"
|
|
"quad4/reticulum-go/pkg/transport"
|
|
)
|
|
|
|
func (n *Node) handleInterface(iface common.NetworkInterface) {
|
|
debug.Log(debug.DebugInfo, "Setting up interface", "name", iface.GetName())
|
|
ch := channel.NewChannel(&transportWrapper{n.transport})
|
|
n.channels[iface.GetName()] = ch
|
|
rw := buffer.CreateBidirectionalBuffer(
|
|
1,
|
|
2,
|
|
ch,
|
|
func(size int) {
|
|
data := make([]byte, size)
|
|
iface.ProcessIncoming(data)
|
|
if len(data) > 0 {
|
|
n.transport.HandlePacket(data, iface)
|
|
}
|
|
},
|
|
)
|
|
n.buffers[iface.GetName()] = &buffer.Buffer{ReadWriter: rw}
|
|
}
|
|
|
|
func (n *Node) unregisterInterfaceBuffers(name string) {
|
|
delete(n.channels, name)
|
|
delete(n.buffers, name)
|
|
}
|
|
|
|
type transportWrapper struct {
|
|
*transport.Transport
|
|
}
|
|
|
|
func (tw *transportWrapper) GetRTT() float64 { return 0.1 }
|
|
func (tw *transportWrapper) RTT() float64 { return tw.GetRTT() }
|
|
func (tw *transportWrapper) GetStatus() byte { return transport.StatusActive }
|
|
|
|
func (tw *transportWrapper) Send(data []byte) any {
|
|
p := &packet.Packet{
|
|
PacketType: packet.PacketTypeData,
|
|
Hops: 0,
|
|
Data: data,
|
|
HeaderType: packet.HeaderType1,
|
|
}
|
|
if err := tw.Transport.SendPacket(p); err != nil {
|
|
return nil
|
|
}
|
|
return p
|
|
}
|
|
|
|
func (tw *transportWrapper) Resend(p any) error {
|
|
if pkt, ok := p.(*packet.Packet); ok {
|
|
return tw.Transport.SendPacket(pkt)
|
|
}
|
|
return fmt.Errorf("invalid packet type")
|
|
}
|
|
|
|
func (tw *transportWrapper) SetPacketTimeout(packet any, callback func(any), timeout time.Duration) {
|
|
time.AfterFunc(timeout, func() { callback(packet) })
|
|
}
|
|
|
|
func (tw *transportWrapper) SetPacketDelivered(packet any, callback func(any)) {
|
|
callback(packet)
|
|
}
|
|
|
|
func (tw *transportWrapper) GetLinkID() []byte { return nil }
|
|
|
|
func (tw *transportWrapper) HandleInbound(pkt *packet.Packet) error { return nil }
|
|
|
|
func (tw *transportWrapper) ValidateLinkProof(pkt *packet.Packet, networkIface common.NetworkInterface) error {
|
|
return nil
|
|
}
|
|
|
|
func (tw *transportWrapper) LinkedNetworkInterface() common.NetworkInterface { return nil }
|