package main import ( "encoding/binary" "github.com/meshnet-gophers/meshtastic-go" pb "github.com/meshnet-gophers/meshtastic-go/meshtastic" "google.golang.org/protobuf/proto" ) const ( FlagViaMQTT = (1 << 4) FlagWantACK = (1 << 3) ) var ( broadcastID = meshtastic.BroadcastNodeID.Uint32() ) var pkcChan = &pb.ChannelSettings{ ChannelNum: 0xFFFFFFFF, Name: "[PKC]", Psk: nil, } type MeshIf interface { Open() error ReadMeshPacket() (*pb.MeshPacket, uint64, error) WriteMeshPacket(*pb.MeshPacket) error Close() error } type RadioHeaderFlag uint8 func (r RadioHeaderFlag) WantACK() uint8 { return uint8(r>>3) & 1 } func (r RadioHeaderFlag) MQTT() uint8 { return uint8(r>>4) & 1 } func (r RadioHeaderFlag) HopStart() uint8 { return uint8(r>>5) & 0b111 } func (r RadioHeaderFlag) HopLimit() uint8 { return uint8(r & 0b111) } type PacketTruncated struct { To uint32 From uint32 ID uint32 } func buildRoutingReply(p *pb.MeshPacket, err pb.Routing_Error) *pb.MeshPacket { cb, _ := proto.Marshal(&pb.Routing{ Variant: &pb.Routing_ErrorReason{ErrorReason: err}, }) return &pb.MeshPacket{ // Reversed To: p.From, From: p.To, PkiEncrypted: p.PkiEncrypted, PublicKey: p.PublicKey, // (N)ACK Priority: pb.MeshPacket_ACK, HopLimit: p.HopStart, Channel: p.Channel, PayloadVariant: &pb.MeshPacket_Decoded{ Decoded: &pb.Data{ Portnum: pb.PortNum_ROUTING_APP, RequestId: p.Id, Payload: cb, }, }, } } func buildPkcNonce(id uint32, extra uint32, from uint32) []byte { var buf [13]byte // zero-init binary.LittleEndian.PutUint32(buf[0:4], id) binary.LittleEndian.PutUint32(buf[4:8], extra) binary.LittleEndian.PutUint32(buf[8:12], from) buf[12] = 0 // last byte is zero return buf[:] }