1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
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[:]
}
|