11package protocol
22
33import (
4- "bytes"
5- "encoding/binary"
64"log"
75"net"
8- "strconv"
96"time"
107)
118
@@ -24,87 +21,10 @@ func (g *gateway) Listen(ds serialInterface) {
2421
2522g .session .Add (2 )
2623go g .rxSerial (g .dropGateway )
27- go g .packetReader ( )
24+ go g .packetParser ( g . handleRxPacket , g . dropLink )
2825g .session .Wait ()
2926}
3027
31- // Parse RX buffer for legitimate packets.
32- func (g * gateway ) packetReader () {
33- defer g .session .Done ()
34- timeouts := 0
35- PACKET_RX_LOOP:
36- for {
37- if timeouts >= 5 {
38- if g .state == Connected {
39- log .Println ("Downstream RX timeout. Disconnecting client" )
40- g .txBuff <- Packet {command : disconnect }
41- g .dropLink ()
42- return
43- }
44- timeouts = 0
45- }
46-
47- p := Packet {}
48- var ok bool
49-
50- // Length byte
51- p .length , ok = <- g .rxBuff
52- if ! ok {
53- return
54- }
55-
56- // Command byte
57- select {
58- case p .command , ok = <- g .rxBuff :
59- if ! ok {
60- return
61- }
62- case <- time .After (time .Millisecond * 100 ):
63- timeouts ++
64- continue PACKET_RX_LOOP // discard
65- }
66-
67- // Payload
68- for i := 0 ; i < int (p .length )- 5 ; i ++ {
69- select {
70- case payloadByte , ok := <- g .rxBuff :
71- if ! ok {
72- return
73- }
74- p .payload = append (p .payload , payloadByte )
75- case <- time .After (time .Millisecond * 100 ):
76- timeouts ++
77- continue PACKET_RX_LOOP
78- }
79- }
80-
81- // CRC32
82- rxCrc := make ([]byte , 0 , 4 )
83- for i := 0 ; i < 4 ; i ++ {
84- select {
85- case crcByte , ok := <- g .rxBuff :
86- if ! ok {
87- return
88- }
89- rxCrc = append (rxCrc , crcByte )
90- case <- time .After (time .Millisecond * 100 ):
91- timeouts ++
92- continue PACKET_RX_LOOP
93- }
94- }
95- p .crc = binary .LittleEndian .Uint32 (rxCrc )
96-
97- // Integrity Checking
98- if p .calcCrc () != p .crc {
99- log .Println ("Downstream packet RX CRCFAIL" )
100- timeouts ++
101- continue PACKET_RX_LOOP
102- }
103- timeouts = 0
104- g .handleRxPacket (& p )
105- }
106- }
107-
10828// Packet RX done. Handle it.
10929func (g * gateway ) handleRxPacket (packet * Packet ) {
11030var rxSeqFlag bool = (packet .command & 0x80 ) > 0
@@ -135,17 +55,7 @@ func (g *gateway) handleRxPacket(packet *Packet) {
13555return
13656}
13757
138- port := binary .LittleEndian .Uint16 (packet .payload [4 :])
139-
140- var dst bytes.Buffer
141- for i := 0 ; i < 3 ; i ++ {
142- dst .WriteString (strconv .Itoa (int (packet .payload [i ])))
143- dst .WriteByte ('.' )
144- }
145- dst .WriteString (strconv .Itoa (int (packet .payload [3 ])))
146- dst .WriteByte (':' )
147- dst .WriteString (strconv .Itoa (int (port )))
148- dstStr := dst .String ()
58+ dstStr := makeTCPConnString (packet .payload )
14959
15060g .txBuff = make (chan Packet , 2 )
15161g .expectedRxSeqFlag = false
0 commit comments